@Override @SuppressWarnings({"nls", "boxing"}) protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder enc) { super.initialize(type, oldInstance, newInstance, enc); List list = (List) oldInstance; Statement setterStm = new Statement(oldInstance, "setSize", new Object[] {list.getSize()}); enc.writeStatement(setterStm); int count = list.getItemCount(); Expression getterExp = null; for (int i = 0; i < count; i++) { getterExp = new Expression(list, "getItem", new Object[] {i}); try { // Calculate the old value of the property Object oldVal = getterExp.getValue(); // Write the getter expression to the encoder enc.writeExpression(getterExp); // Get the target value that exists in the new environment Object targetVal = enc.get(oldVal); // Get the current property value in the new environment Object newVal = null; try { newVal = new Expression(newInstance, "getItem", new Object[] {i}).getValue(); } catch (IndexOutOfBoundsException ex) { // The newInstance has no elements, so current property // value remains null } /* * Make the target value and current property value equivalent * in the new environment */ if (null == targetVal) { if (null != newVal) { // Set to null setterStm = new Statement(oldInstance, "add", new Object[] {null}); enc.writeStatement(setterStm); } } else { PersistenceDelegate pd = enc.getPersistenceDelegate(targetVal.getClass()); if (!pd.mutatesTo(targetVal, newVal)) { setterStm = new Statement(oldInstance, "add", new Object[] {oldVal}); enc.writeStatement(setterStm); } } } catch (Exception ex) { enc.getExceptionListener().exceptionThrown(ex); } } }
@Override protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out) { assert oldInstance != null && oldInstance.getClass().isArray() : oldInstance; assert newInstance != null && newInstance.getClass().isArray() : newInstance; int length = Array.getLength(oldInstance); Class<?> componentType = type.getComponentType(); Object nullValue = Array.get(Array.newInstance(componentType, 1), 0); for (int i = 0; i < length; ++i) { Object oldValue = Array.get(oldInstance, i); Object newValue = Array.get(newInstance, i); if (!deepEquals(oldValue, newValue)) { Statement s = new Statement( oldInstance, "set", //$NON-NLS-1$ new Object[] {Integer.valueOf(i), oldValue}); out.writeStatement(s); } } }