package org.jbpm.gd.common.xml;
import java.beans.PropertyChangeEvent;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.jbpm.gd.common.model.GenericElement;
import org.jbpm.gd.common.model.SemanticElement;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
public class GenericElementXmlAdapter extends XmlAdapter {
private static HashMap NODE_TYPES = null;
protected Map getNodeTypes() {
if (NODE_TYPES == null) {
NODE_TYPES = new HashMap();
NODE_TYPES.put("genericElement", "genericElement");
}
return NODE_TYPES;
}
protected String getNodeType(String elementType) {
return "genericElement";
}
public void initialize(SemanticElement jpdlElement) {
super.initialize(jpdlElement);
if (jpdlElement == null || !(jpdlElement instanceof GenericElement)) return;
GenericElement genericElement = (GenericElement)jpdlElement;
genericElement.setName(getNode().getNodeName());
genericElement.setValue(getTextContent());
NamedNodeMap attributes = getNode().getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
Node node = attributes.item(i);
genericElement.addGenericAttribute(node.getNodeName(), node.getNodeValue());
}
genericElement.addPropertyChangeListener(this);
}
protected void initialize() {
super.initialize();
GenericElement genericElement = (GenericElement)getSemanticElement();
if (genericElement != null ) {
GenericElement[] genericElements = genericElement.getGenericElements();
for (int i = 0; i < genericElements.length; i++) {
addElement(genericElements[i]);
}
Map attributes = genericElement.getGenericAttibutes();
Iterator iter = attributes.keySet().iterator();
while (iter.hasNext()) {
String name = (String)iter.next();
String value = (String)attributes.get(name);
setAttribute(name, value);
}
setTextContent(genericElement.getValue());
}
}
protected void doPropertyChange(PropertyChangeEvent evt) {
if ("value".equals(evt.getPropertyName())) {
setTextContent((String)evt.getNewValue());
} else if ("genericElementAdd".equals(evt.getPropertyName())) {
addElement((GenericElement)evt.getNewValue());
} else if ("genericElementRemove".equals(evt.getPropertyName())) {
removeElement((GenericElement)evt.getOldValue());
} else {
setAttribute(evt.getPropertyName(), (String)evt.getNewValue());
}
}
protected void doModelUpdate(String name, String newValue) {
GenericElement genericElement = (GenericElement)getSemanticElement();
if (genericElement != null && "#text".equals(name)) {
genericElement.setValue(newValue);
}
}
protected void doModelAdd(XmlAdapter child) {
String type = child.getElementType();
if (getElementType().equals(type)) {
SemanticElement jpdlElement = getSemanticElementFactory().createById("org.jbpm.gd.jpdl.genericElement");
child.initialize(jpdlElement);
SemanticElement parent = getSemanticElement();
if (parent instanceof GenericElement) {
GenericElement genericElement= (GenericElement )getSemanticElement();
genericElement.addGenericElement((GenericElement)jpdlElement);
}
}
}
protected void doModelRemove(XmlAdapter child) {
// a controller cannot have any child nodes
}
public String getElementType() {
return "genericElement";
}
}