/** * Copyright (c) 2002-2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation */ package org.eclipse.emf.common.notify.impl; import java.util.List; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.BasicEList; /** * An extensible notification implementation. */ public class NotificationImpl implements Notification, NotificationChain { /** * An {@link #primitiveType indicator} that the feature is not a primitive type. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_OBJECT = -1; /** * An {@link #primitiveType indicator} that the feature is a <code>boolean</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_BOOLEAN = 0; /** * An {@link #primitiveType indicator} that the feature is a <code>byte</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_BYTE = 1; /** * An {@link #primitiveType indicator} that the feature is a <code>char</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_CHAR = 2; /** * An {@link #primitiveType indicator} that the feature is a <code>double</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_DOUBLE = 3; /** * An {@link #primitiveType indicator} that the feature is a <code>float</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_FLOAT = 4; /** * An {@link #primitiveType indicator} that the feature is a <code>int</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_INT = 5; /** * An {@link #primitiveType indicator} that the feature is a <code>long</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_LONG = 6; /** * An {@link #primitiveType indicator} that the feature is a <code>short</code>. * @see #primitiveType */ public static final int PRIMITIVE_TYPE_SHORT = 7; /** * A {@link #position position} value which indicates that {@link #isTouch} should return <code>false</code>. * @see #primitiveType */ protected static final int IS_SET_CHANGE_INDEX = NO_INDEX - 1; /** * The type of the feature. * @see #PRIMITIVE_TYPE_OBJECT * @see #PRIMITIVE_TYPE_BOOLEAN * @see #PRIMITIVE_TYPE_BYTE * @see #PRIMITIVE_TYPE_CHAR * @see #PRIMITIVE_TYPE_DOUBLE * @see #PRIMITIVE_TYPE_FLOAT * @see #PRIMITIVE_TYPE_INT * @see #PRIMITIVE_TYPE_LONG * @see #PRIMITIVE_TYPE_SHORT */ protected int primitiveType; /** * The type of the change. * @see #getEventType() */ protected int eventType; /** * The old value for the case of {@link #PRIMITIVE_TYPE_OBJECT}. * @see #getOldValue() */ protected Object oldValue; /** * The new value for the case of {@link #PRIMITIVE_TYPE_OBJECT}. * @see #getNewValue() */ protected Object newValue; /** * The old value for the case of * {@link #PRIMITIVE_TYPE_BOOLEAN}, * {@link #PRIMITIVE_TYPE_BYTE}, * {@link #PRIMITIVE_TYPE_CHAR}, * {@link #PRIMITIVE_TYPE_INT}, * {@link #PRIMITIVE_TYPE_LONG}, * and {@link #PRIMITIVE_TYPE_SHORT}. * @see #getOldValue() * @see #getOldBooleanValue() * @see #getOldByteValue() * @see #getOldCharValue() * @see #getOldIntValue() * @see #getOldLongValue() * @see #getOldShortValue() */ protected long oldSimplePrimitiveValue; /** * The new value for the case of * {@link #PRIMITIVE_TYPE_BOOLEAN}, * {@link #PRIMITIVE_TYPE_BYTE}, * {@link #PRIMITIVE_TYPE_CHAR}, * {@link #PRIMITIVE_TYPE_INT}, * {@link #PRIMITIVE_TYPE_LONG}, * and {@link #PRIMITIVE_TYPE_SHORT}. * @see #getNewValue() * @see #getNewBooleanValue() * @see #getNewByteValue() * @see #getNewCharValue() * @see #getNewIntValue() * @see #getNewLongValue() * @see #getNewShortValue() */ protected long newSimplePrimitiveValue; /** * The old value for the case of * {@link #PRIMITIVE_TYPE_DOUBLE}, * and {@link #PRIMITIVE_TYPE_FLOAT}. * @see #getOldValue() * @see #getOldDoubleValue() * @see #getOldFloatValue() */ protected double oldIEEEPrimitiveValue; /** * The old value for the case of * {@link #PRIMITIVE_TYPE_DOUBLE}, * and {@link #PRIMITIVE_TYPE_FLOAT}. * @see #getOldValue() * @see #getOldDoubleValue() * @see #getOldFloatValue() */ protected double newIEEEPrimitiveValue; /** * The position. * @see #getPosition() */ protected int position; /** * The internal chain. */ protected NotificationChain next; /** * Creates an instance. * @param eventType the type of the change. * @param oldValue the old value before the change. * @param newValue the new value after the change. */ public NotificationImpl(int eventType, Object oldValue, Object newValue) { this(eventType, oldValue, newValue, NO_INDEX); } /** * Creates an instance. * @param eventType the type of the change. * @param oldValue the old value before the change. * @param newValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, Object oldValue, Object newValue, boolean isSetChange) { this(eventType, oldValue, newValue, isSetChange ? IS_SET_CHANGE_INDEX : NO_INDEX); } /** * Creates an instance. * @param eventType the type of the change. * @param oldValue the old value before the change. * @param newValue the new value after the change. */ public NotificationImpl(int eventType, Object oldValue, Object newValue, int position) { this.eventType = eventType; this.oldValue = oldValue; this.newValue = newValue; this.position = position; this.primitiveType = PRIMITIVE_TYPE_OBJECT; } /** * Creates an instance. * @param eventType the type of the change. * @param oldValue the old value before the change. * @param newValue the new value after the change. * @param wasSet whether the feature was set before the change. */ public NotificationImpl(int eventType, Object oldValue, Object newValue, int position, boolean wasSet) { this.eventType = eventType; this.oldValue = oldValue; this.newValue = newValue; this.position = position; this.primitiveType = PRIMITIVE_TYPE_OBJECT; if (!wasSet) { this.position = IS_SET_CHANGE_INDEX - position - 1; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldBooleanValue the old value before the change. * @param newBooleanValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, boolean oldBooleanValue, boolean newBooleanValue, boolean isSetChange) { this(eventType, oldBooleanValue, newBooleanValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldBooleanValue the old value before the change. * @param newBooleanValue the new value after the change. */ public NotificationImpl(int eventType, boolean oldBooleanValue, boolean newBooleanValue) { this.eventType = eventType; this.oldSimplePrimitiveValue = oldBooleanValue ? 1 : 0; this.newSimplePrimitiveValue = newBooleanValue ? 1 : 0; this.position = NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_BOOLEAN; } /** * Creates an instance. * @param eventType the type of the change. * @param oldByteValue the old value before the change. * @param newByteValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, byte oldByteValue, byte newByteValue, boolean isSetChange) { this(eventType, oldByteValue, newByteValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldByteValue the old value before the change. * @param newByteValue the new value after the change. */ public NotificationImpl(int eventType, byte oldByteValue, byte newByteValue) { this.eventType = eventType; this.oldSimplePrimitiveValue = oldByteValue; this.newSimplePrimitiveValue = newByteValue; this.position = Notification.NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_BYTE; } /** * Creates an instance. * @param eventType the type of the change. * @param oldCharValue the old value before the change. * @param newCharValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, char oldCharValue, char newCharValue, boolean isSetChange) { this(eventType, oldCharValue, newCharValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldCharValue the old value before the change. * @param newCharValue the new value after the change. */ public NotificationImpl(int eventType, char oldCharValue, char newCharValue) { this.eventType = eventType; this.oldSimplePrimitiveValue = oldCharValue; this.newSimplePrimitiveValue = newCharValue; this.position = Notification.NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_CHAR; } /** * Creates an instance. * @param eventType the type of the change. * @param oldDoubleValue the old value before the change. * @param newDoubleValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, double oldDoubleValue, double newDoubleValue, boolean isSetChange) { this(eventType, oldDoubleValue, newDoubleValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldDoubleValue the old value before the change. * @param newDoubleValue the new value after the change. */ public NotificationImpl(int eventType, double oldDoubleValue, double newDoubleValue) { this.eventType = eventType; this.oldIEEEPrimitiveValue = oldDoubleValue; this.newIEEEPrimitiveValue = newDoubleValue; this.position = Notification.NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_DOUBLE; } /** * Creates an instance. * @param eventType the type of the change. * @param oldFloatValue the old value before the change. * @param newFloatValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, float oldFloatValue, float newFloatValue, boolean isSetChange) { this(eventType, oldFloatValue, newFloatValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldFloatValue the old value before the change. * @param newFloatValue the new value after the change. */ public NotificationImpl(int eventType, float oldFloatValue, float newFloatValue) { this.eventType = eventType; this.oldIEEEPrimitiveValue = oldFloatValue; this.newIEEEPrimitiveValue = newFloatValue; this.position = Notification.NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_FLOAT; } /** * Creates an instance. * @param eventType the type of the change. * @param oldIntValue the old value before the change. * @param newIntValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, int oldIntValue, int newIntValue, boolean isSetChange) { this(eventType, oldIntValue, newIntValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldIntValue the old value before the change. * @param newIntValue the new value after the change. */ public NotificationImpl(int eventType, int oldIntValue, int newIntValue) { this.eventType = eventType; this.oldSimplePrimitiveValue = oldIntValue; this.newSimplePrimitiveValue = newIntValue; this.position = Notification.NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_INT; } /** * Creates an instance. * @param eventType the type of the change. * @param oldLongValue the old value before the change. * @param newLongValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, long oldLongValue, long newLongValue, boolean isSetChange) { this(eventType, oldLongValue, newLongValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldLongValue the old value before the change. * @param newLongValue the new value after the change. */ public NotificationImpl(int eventType, long oldLongValue, long newLongValue) { this.eventType = eventType; this.oldSimplePrimitiveValue = oldLongValue; this.newSimplePrimitiveValue = newLongValue; this.position = Notification.NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_LONG; } /** * Creates an instance. * @param eventType the type of the change. * @param oldShortValue the old value before the change. * @param newShortValue the new value after the change. * @param isSetChange the indication of whether the state has changed. */ public NotificationImpl(int eventType, short oldShortValue, short newShortValue, boolean isSetChange) { this(eventType, oldShortValue, newShortValue); if (isSetChange) { this.position = IS_SET_CHANGE_INDEX; } } /** * Creates an instance. * @param eventType the type of the change. * @param oldShortValue the old value before the change. * @param newShortValue the new value after the change. */ public NotificationImpl(int eventType, short oldShortValue, short newShortValue) { this.eventType = eventType; this.oldSimplePrimitiveValue = oldShortValue; this.newSimplePrimitiveValue = newShortValue; this.position = Notification.NO_INDEX; this.primitiveType = PRIMITIVE_TYPE_SHORT; } public Object getNotifier() { return null; } public int getEventType() { return eventType; } public Object getFeature() { return null; } public int getFeatureID(Class<?> expectedClass) { return NO_FEATURE_ID; } public Object getOldValue() { if (oldValue == null) { switch (primitiveType) { case PRIMITIVE_TYPE_BOOLEAN: oldValue = getOldBooleanValue() ? Boolean.TRUE : Boolean.FALSE; break; case PRIMITIVE_TYPE_BYTE: oldValue = getOldByteValue(); break; case PRIMITIVE_TYPE_CHAR: oldValue = getOldCharValue(); break; case PRIMITIVE_TYPE_DOUBLE: oldValue = getOldDoubleValue(); break; case PRIMITIVE_TYPE_FLOAT: oldValue = getOldFloatValue(); break; case PRIMITIVE_TYPE_LONG: oldValue = getOldLongValue(); break; case PRIMITIVE_TYPE_INT: oldValue = getOldIntValue(); break; case PRIMITIVE_TYPE_SHORT: oldValue = getOldShortValue(); break; } } return oldValue; } public Object getNewValue() { if (newValue == null) { switch (primitiveType) { case PRIMITIVE_TYPE_BOOLEAN: newValue = getNewBooleanValue() ? Boolean.TRUE : Boolean.FALSE; break; case PRIMITIVE_TYPE_BYTE: newValue = getNewByteValue(); break; case PRIMITIVE_TYPE_CHAR: newValue = getNewCharValue(); break; case PRIMITIVE_TYPE_DOUBLE: newValue = getNewDoubleValue(); break; case PRIMITIVE_TYPE_FLOAT: newValue = getNewFloatValue(); break; case PRIMITIVE_TYPE_LONG: newValue = getNewLongValue(); break; case PRIMITIVE_TYPE_INT: newValue = getNewIntValue(); break; case PRIMITIVE_TYPE_SHORT: newValue = getNewShortValue(); break; } } return newValue; } public boolean isTouch() { switch (eventType) { case Notification.RESOLVE: case Notification.REMOVING_ADAPTER: { return true; } case Notification.ADD: case Notification.ADD_MANY: case Notification.REMOVE: case Notification.REMOVE_MANY: { return false; } case Notification.MOVE: { return (Integer)getOldValue() == position; } case Notification.SET: case Notification.UNSET: { if (position == IS_SET_CHANGE_INDEX) { return false; } else { switch (primitiveType) { case PRIMITIVE_TYPE_BOOLEAN: case PRIMITIVE_TYPE_BYTE: case PRIMITIVE_TYPE_CHAR: case PRIMITIVE_TYPE_LONG: case PRIMITIVE_TYPE_INT: case PRIMITIVE_TYPE_SHORT: { return oldSimplePrimitiveValue == newSimplePrimitiveValue; } case PRIMITIVE_TYPE_DOUBLE: case PRIMITIVE_TYPE_FLOAT: { return oldIEEEPrimitiveValue == newIEEEPrimitiveValue; } default: { return oldValue == null ? newValue == null : oldValue.equals(newValue); } } } } default: { return false; } } } public boolean isReset() { switch (eventType) { case Notification.SET: Object defaultValue = getFeatureDefaultValue(); switch (primitiveType) { case PRIMITIVE_TYPE_BOOLEAN: return defaultValue != null && (Boolean)defaultValue == (newSimplePrimitiveValue != 0); case PRIMITIVE_TYPE_BYTE: return defaultValue != null && (Byte)defaultValue == (byte)newSimplePrimitiveValue; case PRIMITIVE_TYPE_CHAR: return defaultValue != null && (Character)defaultValue == (char)newSimplePrimitiveValue; case PRIMITIVE_TYPE_LONG: return defaultValue != null && (Long)defaultValue == newSimplePrimitiveValue; case PRIMITIVE_TYPE_INT: return defaultValue != null && (Integer)defaultValue == (int)newSimplePrimitiveValue; case PRIMITIVE_TYPE_SHORT: return defaultValue != null && (Short)defaultValue == (short)newSimplePrimitiveValue; case PRIMITIVE_TYPE_DOUBLE: return defaultValue != null && (Double)defaultValue == newIEEEPrimitiveValue; case PRIMITIVE_TYPE_FLOAT: return defaultValue != null && (Float)defaultValue == (float)newIEEEPrimitiveValue; default: return defaultValue == null ? newValue == null : defaultValue.equals(newValue); } case Notification.UNSET: return true; default: return false; } } public boolean wasSet() { switch (eventType) { case Notification.SET: { if (isFeatureUnsettable()) { return position != IS_SET_CHANGE_INDEX; } break; } case Notification.UNSET: { if (isFeatureUnsettable()) { return position == IS_SET_CHANGE_INDEX; } break; } case Notification.ADD: case Notification.ADD_MANY: case Notification.REMOVE: case Notification.REMOVE_MANY: case Notification.MOVE: { return position > IS_SET_CHANGE_INDEX; } default: { return false; } } Object defaultValue = getFeatureDefaultValue(); switch (primitiveType) { case PRIMITIVE_TYPE_BOOLEAN: return defaultValue != null && (Boolean)defaultValue != (oldSimplePrimitiveValue != 0); case PRIMITIVE_TYPE_BYTE: return defaultValue != null && (Byte)defaultValue != (byte)oldSimplePrimitiveValue; case PRIMITIVE_TYPE_CHAR: return defaultValue != null && (Character)defaultValue != (char)oldSimplePrimitiveValue; case PRIMITIVE_TYPE_LONG: return defaultValue != null && (Long)defaultValue != oldSimplePrimitiveValue; case PRIMITIVE_TYPE_INT: return defaultValue != null && (Integer)defaultValue != (int)oldSimplePrimitiveValue; case PRIMITIVE_TYPE_SHORT: return defaultValue != null && (Short)defaultValue != (short)oldSimplePrimitiveValue; case PRIMITIVE_TYPE_DOUBLE: return defaultValue != null && (Double)defaultValue != oldIEEEPrimitiveValue; case PRIMITIVE_TYPE_FLOAT: return defaultValue != null && (Float)defaultValue != (float)oldIEEEPrimitiveValue; default: return defaultValue == null ? oldValue != null : !defaultValue.equals(oldValue); } } protected boolean isFeatureUnsettable() { return false; } protected Object getFeatureDefaultValue() { return null; } public int getPosition() { return position < 0 ? position < IS_SET_CHANGE_INDEX ? IS_SET_CHANGE_INDEX - position - 1 : NO_INDEX : position; } public boolean merge(Notification notification) { switch (eventType) { case Notification.SET: case Notification.UNSET: { int notificationEventType = notification.getEventType(); switch (notificationEventType) { case Notification.SET: case Notification.UNSET: { Object notificationNotifier = notification.getNotifier(); if (notificationNotifier == getNotifier() && getFeatureID(null) == notification.getFeatureID(null)) { newValue = notification.getNewValue(); if (notification.getEventType() == Notification.SET) { eventType = Notification.SET; } return true; } } } } case Notification.REMOVE: { int notificationEventType = notification.getEventType(); switch (notificationEventType) { case Notification.REMOVE: { Object notificationNotifier = notification.getNotifier(); if (notificationNotifier == getNotifier() && getFeatureID(null) == notification.getFeatureID(null)) { boolean originalWasSet = wasSet(); int originalPosition = getPosition(); int notificationPosition = notification.getPosition(); eventType = Notification.REMOVE_MANY; BasicEList<Object> removedValues = new BasicEList<Object>(2); if (originalPosition <= notificationPosition) { removedValues.add(oldValue); removedValues.add(notification.getOldValue()); newValue = new int [] { position = originalPosition, notificationPosition + 1 }; } else { removedValues.add(notification.getOldValue()); removedValues.add(oldValue); newValue = new int [] { position = notificationPosition, originalPosition }; } oldValue = removedValues; if (!originalWasSet) { position = IS_SET_CHANGE_INDEX - position - 1; } return true; } break; } } break; } case Notification.REMOVE_MANY: { int notificationEventType = notification.getEventType(); switch (notificationEventType) { case Notification.REMOVE: { Object notificationNotifier = notification.getNotifier(); if (notificationNotifier == getNotifier() && getFeatureID(null) == notification.getFeatureID(null)) { boolean originalWasSet = wasSet(); int notificationPosition = notification.getPosition(); int [] positions = (int [])newValue; int [] newPositions = new int [positions.length + 1]; int index = 0; while (index < positions.length) { int oldPosition = positions[index]; if (oldPosition <= notificationPosition) { newPositions[index++] = oldPosition; ++notificationPosition; } else { break; } } @SuppressWarnings("unchecked") List<Object> list = (List<Object>)oldValue; list.add(index, notification.getOldValue()); newPositions[index] = notificationPosition; while (++index < newPositions.length) { newPositions[index] = positions[index - 1]; } newValue = newPositions; if (!originalWasSet) { position = IS_SET_CHANGE_INDEX - newPositions[0]; } return true; } break; } } break; } } return false; } public boolean getOldBooleanValue() { if (primitiveType != PRIMITIVE_TYPE_BOOLEAN) throw new IllegalStateException(); return oldSimplePrimitiveValue != 0; } public boolean getNewBooleanValue() { if (primitiveType != PRIMITIVE_TYPE_BOOLEAN) throw new IllegalStateException(); return newSimplePrimitiveValue != 0; } public byte getOldByteValue() { if (primitiveType != PRIMITIVE_TYPE_BYTE) throw new IllegalStateException(); return (byte)oldSimplePrimitiveValue; } public byte getNewByteValue() { if (primitiveType != PRIMITIVE_TYPE_BYTE) throw new IllegalStateException(); return (byte)newSimplePrimitiveValue; } public char getOldCharValue() { if (primitiveType != PRIMITIVE_TYPE_CHAR) throw new IllegalStateException(); return (char)oldSimplePrimitiveValue; } public char getNewCharValue() { if (primitiveType != PRIMITIVE_TYPE_CHAR) throw new IllegalStateException(); return (char)newSimplePrimitiveValue; } public double getOldDoubleValue() { if (primitiveType != PRIMITIVE_TYPE_DOUBLE) throw new IllegalStateException(); return oldIEEEPrimitiveValue; } public double getNewDoubleValue() { if (primitiveType != PRIMITIVE_TYPE_DOUBLE) throw new IllegalStateException(); return newIEEEPrimitiveValue; } public float getOldFloatValue() { if (primitiveType != PRIMITIVE_TYPE_FLOAT) throw new IllegalStateException(); return (float)oldIEEEPrimitiveValue; } public float getNewFloatValue() { if (primitiveType != PRIMITIVE_TYPE_FLOAT) throw new IllegalStateException(); return (float)newIEEEPrimitiveValue; } public int getOldIntValue() { if (primitiveType != PRIMITIVE_TYPE_INT) throw new IllegalStateException(); return (int)oldSimplePrimitiveValue; } public int getNewIntValue() { if (primitiveType != PRIMITIVE_TYPE_INT) throw new IllegalStateException(); return (int)newSimplePrimitiveValue; } public long getOldLongValue() { if (primitiveType != PRIMITIVE_TYPE_LONG) throw new IllegalStateException(); return oldSimplePrimitiveValue; } public long getNewLongValue() { if (primitiveType != PRIMITIVE_TYPE_LONG) throw new IllegalStateException(); return newSimplePrimitiveValue; } public short getOldShortValue() { if (primitiveType != PRIMITIVE_TYPE_SHORT) throw new IllegalStateException(); return (short)oldSimplePrimitiveValue; } public short getNewShortValue() { if (primitiveType != PRIMITIVE_TYPE_SHORT) throw new IllegalStateException(); return (short)newSimplePrimitiveValue; } public String getOldStringValue() { return oldValue == null ? null : oldValue.toString(); } public String getNewStringValue() { return newValue == null ? null : newValue.toString(); } /** * Adds or merges a new notification. * @param newNotification a notification. * @return <code>true</code> when the notification is added and <code>false</code> when it is merged. */ public boolean add(Notification newNotification) { if (newNotification == null) { return false; } else { if (merge(newNotification)) { return false; } if (next == null) { if (newNotification instanceof NotificationImpl) { next = (NotificationImpl)newNotification; return true; } else { next = new NotificationChainImpl(); return next.add(newNotification); } } else { return next.add(newNotification); } } } /* * Javadoc copied from interface. */ public void dispatch() { Object notifier = getNotifier(); if (notifier != null && getEventType() != -1) { ((Notifier)notifier).eNotify(this); } if (next != null) { next.dispatch(); } } @Override public String toString() { StringBuffer result = new StringBuffer(super.toString()); result.append(" (eventType: "); switch (eventType) { case Notification.SET: { result.append("SET"); break; } case Notification.UNSET: { result.append("UNSET"); break; } case Notification.ADD: { result.append("ADD"); break; } case Notification.ADD_MANY: { result.append("ADD_MANY"); break; } case Notification.REMOVE: { result.append("REMOVE"); break; } case Notification.REMOVE_MANY: { result.append("REMOVE_MANY"); break; } case Notification.MOVE: { result.append("MOVE"); break; } case Notification.REMOVING_ADAPTER: { result.append("REMOVING_ADAPTER"); break; } case Notification.RESOLVE: { result.append("RESOLVE"); break; } default: { result.append(eventType); break; } } if (isTouch()) { result.append(", touch: true"); } result.append(", position: "); result.append(getPosition()); result.append(", notifier: "); result.append(getNotifier()); result.append(", feature: "); result.append(getFeature()); result.append(", oldValue: "); result.append(getOldValue()); result.append(", newValue: "); if (eventType == Notification.REMOVE_MANY && newValue instanceof int []) { int [] positions = (int [])newValue; result.append("["); for (int i = 0; i < positions.length; ) { result.append(positions[i]); if (++i < positions.length) { result.append(", "); } } result.append("]"); } else { result.append(getNewValue()); } result.append(", isTouch: "); result.append(isTouch()); result.append(", wasSet: "); result.append(wasSet()); result.append(")"); return result.toString(); } }