package org.zend.php.zendserver.deployment.core.internal.descriptor;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.zend.php.zendserver.deployment.core.descriptor.ChangeEvent;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorChangeListener;
import org.zend.php.zendserver.deployment.core.descriptor.IModelContainer;
import org.zend.php.zendserver.deployment.core.descriptor.IModelObject;
public abstract class ModelObject implements IModelObject {
private IModelContainer parent;
protected List<IDescriptorChangeListener> listeners;
protected Feature[] properties;
private int[] offsets;
public ModelObject(Feature[] properties) {
this.properties = properties;
offsets = new int[properties.length];
}
public void copy(IModelObject source) {
throw new UnsupportedOperationException(MessageFormat.format(
"Can't copy {0}", this)); //$NON-NLS-1$
}
public void set(Feature key, boolean value) {
throw new IllegalArgumentException(MessageFormat.format(
"Can't set feature {0} to value {1} in {2}", key, value, this)); //$NON-NLS-1$
}
public boolean getBoolean(Feature key) {
throw new IllegalArgumentException(MessageFormat.format(
"Can't get feature {0} from {1}", key, this)); //$NON-NLS-1$
}
public Feature[] getPropertyNames() {
return properties;
}
public void addListener(IDescriptorChangeListener listener) {
if (listeners == null) {
listeners = Collections
.synchronizedList(new ArrayList<IDescriptorChangeListener>());
}
synchronized (listeners) {
listeners.add(listener);
}
}
public void removeListener(IDescriptorChangeListener listener) {
synchronized (listeners) {
listeners.remove(listener);
}
}
protected void fireChange(ChangeEvent event) {
if (listeners != null) {
synchronized (listeners) {
if (listeners != null) {
for (IDescriptorChangeListener l : listeners) {
l.descriptorChanged(event);
}
}
if (parent != null) {
((ModelObject) parent).fireChange(event);
}
}
}
}
protected void fireChange(IModelObject target, Feature key, int type,
Object newValue, Object oldValue) {
if ((newValue == null && oldValue != null)
|| (newValue != null && oldValue == null)
|| (newValue != null && !newValue.equals(oldValue))) {
fireChange(new ChangeEvent(target, key, type, newValue, oldValue));
}
}
protected void fireChange(Feature key, Object newValue, Object oldValue) {
fireChange(this, key, IDescriptorChangeListener.SET, newValue, oldValue); // for
// basic
// properties,
// oldValue
// is
// always
// null
}
public void setParent(IModelContainer container) {
this.parent = container;
}
public int getOffset(Feature f) {
return offsets[Arrays.asList(properties).indexOf(f)];
}
public void setOffset(Feature f, int offset) {
offsets[Arrays.asList(properties).indexOf(f)] = offset;
}
public boolean isChildrenFirst() {
// by default add children after properties
return false;
}
}