package org.zend.php.zendserver.deployment.core.internal.descriptor; import java.text.MessageFormat; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.zend.php.zendserver.deployment.core.Messages; 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 ModelContainer extends ModelObject implements IModelContainer { private Map<Feature, List<Object>> mmap; public ModelContainer(Feature[] properties, Feature[] children) { super(properties); addListener(new IDescriptorChangeListener() { public void descriptorChanged(ChangeEvent event) { if (event.target != ModelContainer.this) { return; } if (event.feature.type != IModelObject.class) { return; } if (event.newValue != null) { ((IModelObject)event.newValue).setParent(ModelContainer.this); } if (event.oldValue != null) { ((IModelObject)event.oldValue).setParent(null); } } }); mmap = new LinkedHashMap<Feature, List<Object>>(); for (Feature s : children) { mmap.put(s, new ObservableList<Object>(this, s)); } } public void copy(IModelObject source) { ModelContainer src = (ModelContainer) source; for (Map.Entry<Feature, List<Object>> entry : src.mmap.entrySet()) { for (int i = 0; i < entry.getValue().size(); i++) { set(entry.getKey(), i, entry.getValue().get(i)); } } } public List getList(Feature key) { List list = mmap.get(key); if (list == null) { throw new IllegalArgumentException(MessageFormat.format( Messages.ModelContainer_UnknownList, key)); } return list; } public Object add(Feature key, Object o) { if (getList(key).add(o)) { return o; } return null; } public void remove(Feature key, int index) { getList(key).remove(index); } public void set(Feature key, int index, Object value) { List list = getList(key); if (index < list.size()) { list.set(index, value); } else { list.add(value); } } public Feature[] getChildNames() { return mmap.keySet().toArray(new Feature[mmap.keySet().size()]); } public List<Object> getChildren(Feature key) { return mmap.get(key); } }