/**
* Miroslav Popov, Apr 6, 2006 miroslav.popov@gmail.com
*/
package org.enhydra.shark.xpdl;
import java.util.Iterator;
import java.util.List;
import org.enhydra.shark.xpdl.elements.Condition;
import org.enhydra.shark.xpdl.elements.Deadline;
import org.enhydra.shark.xpdl.elements.DeadlineLimit;
import org.enhydra.shark.xpdl.elements.Deadlines;
import org.enhydra.shark.xpdl.elements.ExtendedAttribute;
import org.enhydra.shark.xpdl.elements.ImplementationTypes;
import org.enhydra.shark.xpdl.elements.Namespace;
import org.enhydra.shark.xpdl.elements.Namespaces;
import org.enhydra.shark.xpdl.elements.Package;
import org.enhydra.shark.xpdl.elements.SchemaType;
import org.enhydra.shark.xpdl.elements.Tools;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author Miroslav Popov
*/
public class XPDLRepositoryHandler {
protected static boolean logging = false;
protected String xpdlPrefix = "";
public void setXPDLPrefixEnabled(boolean enable) {
if (enable) {
this.xpdlPrefix = "xpdl:";
} else {
this.xpdlPrefix = "";
}
}
public boolean isXPDLPrefixEnabled() {
return "xpdl:".equals(this.xpdlPrefix);
}
public void fromXML(Element node, Package pkg) {
NamedNodeMap attribs = node.getAttributes();
Namespaces nss = pkg.getNamespaces();
for (int i = 0; i < attribs.getLength(); i++) {
Node n = attribs.item(i);
String nn = n.getNodeName();
if (nn.startsWith("xmlns:") && !nn.equals("xmlns:xsi")) {
Namespace ns = (Namespace) nss.generateNewElement();
ns.setName(nn.substring(6, nn.length()));
fromXML(n, (XMLAttribute) ns.get("location"));
nss.add(ns);
}
}
fromXML(node, (XMLComplexElement) pkg);
}
public void fromXML(Node node, XMLCollection cel) {
if (node == null || !node.hasChildNodes()) {
return;
}
String nameSpacePrefix = XMLUtil.getNameSpacePrefix(node);
XMLElement newOne = cel.generateNewElement();
String elName = newOne.toName();
NodeList children = node.getChildNodes();
int lng = children.getLength();
if (logging) {
System.out.println("FROMXML for " + cel.toName() + ", c=" + cel.getClass().getName());
}
for (int i = 0; i < lng; i++) {
Node child = children.item(i);
if (child.getNodeName().equals(nameSpacePrefix + elName)) {
newOne = cel.generateNewElement();
if (newOne instanceof XMLComplexElement) {
fromXML(children.item(i), (XMLComplexElement) newOne);
} else {
fromXML(children.item(i), (XMLSimpleElement) newOne);
}
cel.add(newOne);
// CUSTOM
// remove additional columns for Deadlines
if (newOne instanceof Deadline) {
((Deadline)newOne).hideCustomElements();
}
// END CUSTOM
}
}
}
public void fromXML(Node node, XMLComplexElement cel) {
if (node == null || (!node.hasChildNodes() && !node.hasAttributes())) {
return;
}
String nameSpacePrefix = node.getPrefix();
if (nameSpacePrefix != null) {
nameSpacePrefix += ":";
} else {
nameSpacePrefix = "";
}
if (logging) {
System.out.println("FROMXML for " + cel.toName() + ", c=" + cel.getClass().getName());
}
if (node.hasAttributes()) {
NamedNodeMap attribs = node.getAttributes();
for (int i = 0; i < attribs.getLength(); ++i) {
Node attrib = attribs.item(i);
try {
fromXML(attrib, (XMLAttribute) cel.get(attrib.getNodeName()));
} catch (NullPointerException npe) {
}
}
}
// getting elements
if (node.hasChildNodes()) {
// Specific code for handling Condition element - we don't support Xpression
// element
if (cel instanceof Condition) {
String newVal = node.getChildNodes().item(0).getNodeValue();
if (newVal != null) {
cel.setValue(newVal);
}
}
// Specific code for handling SchemaType element
if (cel instanceof SchemaType) {
NodeList nl = node.getChildNodes();
for (int j = 0; j < nl.getLength(); j++) {
Node sn = nl.item(j);
if (sn instanceof Element) {
cel.setValue(XMLUtil.getContent(sn, true));
break;
}
}
}
// Specific code for handling ExtendedAttribute element
if (cel instanceof ExtendedAttribute) {
cel.setValue(XMLUtil.getChildNodesContent(node));
}
Iterator it = cel.getXMLElements().iterator();
while (it.hasNext()) {
XMLElement el = (XMLElement) it.next();
String elName = el.toName();
if (el instanceof XMLComplexElement) {
Node child = XMLUtil.getChildByName(node, nameSpacePrefix + elName);
fromXML(child, (XMLComplexElement) el);
// Specific case if element is Deadlines
} else if (el instanceof Deadlines) {
fromXML(node, (XMLCollection) el);
} else if (el instanceof XMLCollection) {
Node child = XMLUtil.getChildByName(node, nameSpacePrefix + elName);
fromXML(child, (XMLCollection) el);
} else if (el instanceof XMLComplexChoice) {
fromXML(node, (XMLComplexChoice) el);
} else if (el instanceof XMLSimpleElement) {
Node child = XMLUtil.getChildByName(node, nameSpacePrefix + elName);
fromXML(child, (XMLSimpleElement) el);
}
}
}
}
public void fromXML(Node node, XMLComplexChoice el) {
String nameSpacePrefix = XMLUtil.getNameSpacePrefix(node);
List ch = el.getChoices();
if (logging) {
System.out.println("FROMXML for " + el.toName() + ", c=" + el.getClass().getName());
}
for (int i = 0; i < ch.size(); i++) {
XMLElement chc = (XMLElement) ch.get(i);
String chname = chc.toName();
// Specific code for handling Tools
if (chname.equals("Tools")) {
chname = "Tool";
}
Node child = XMLUtil.getChildByName(node, nameSpacePrefix + chname);
if (child != null) {
if (chc instanceof XMLComplexElement) {
fromXML(child, (XMLComplexElement) chc);
} else { // it is XMLCollection
// Specific code for handling Tools
if (chc instanceof Tools) {
fromXML(node, (XMLCollection) chc);
} else {
fromXML(child, (XMLCollection) chc);
}
}
el.setChoosen(chc);
break;
}
}
}
public void fromXML(Node node, XMLSimpleElement el) {
fromXMLBasic(node, el);
}
public void fromXML(Node node, XMLAttribute el) {
fromXMLBasic(node, el);
}
public void fromXMLBasic(Node node, XMLElement el) {
if (node != null) {
if (logging) {
System.out.println("FROMXML for " + el.toName() + ", c=" + el.getClass().getName());
}
String newVal;
if (node.hasChildNodes()) {
newVal = node.getChildNodes().item(0).getNodeValue();
// should never happen
} else {
newVal = node.getNodeValue();
}
// CUSTOM: catch exception for non-supported values
if (el != null && newVal != null) {
try {
el.setValue(newVal);
}
catch(RuntimeException re) {
// ignore
System.out.println("Error setting value for el: " + newVal + "; " + re.toString());
re.printStackTrace();
}
}
// END CUSTOM
}
}
public void toXML(Document parent, Package pkg) {
Node node = parent.createElement(xpdlPrefix + pkg.toName());
((Element) node).setAttribute("xmlns", XMLUtil.XMLNS);
// save additional namespaces
Iterator itNs = pkg.getNamespaces().toElements().iterator();
while (itNs.hasNext()) {
Namespace ns = (Namespace) itNs.next();
((Element) node).setAttribute("xmlns:" + ns.getName(), ns.getLocation());
}
((Element) node).setAttribute("xmlns:xsi", XMLUtil.XMLNS_XSI);
((Element) node).setAttribute("xsi:schemaLocation", XMLUtil.XSI_SCHEMA_LOCATION);
toXML(node, pkg);
parent.appendChild(node);
}
public void toXML(Node parent, XMLCollection cel) {
if (!cel.isEmpty() || cel.isRequired()) {
if (parent != null) {
if (logging) {
System.out.println("TOXML for " + cel.toName() + ", c=" + cel.getClass().getName() + ", parent=" + cel.getParent() + ", size=" + cel.size());
}
String elName = cel.toName();
Node node = parent;
// Specific code for handling Deadlines and Tools
if (!(elName.equals("Deadlines") || elName.equals("Tools"))) {
node = (parent.getOwnerDocument()).createElement(xpdlPrefix + elName);
}
for (Iterator it = cel.toElements().iterator(); it.hasNext();) {
XMLElement el = (XMLElement) it.next();
if (el instanceof XMLSimpleElement) {
toXML(node, (XMLSimpleElement) el);
} else {
toXML(node, (XMLComplexElement) el);
}
}
// If Deadlines or Tools are handled, node==parent
if (node != parent) {
parent.appendChild(node);
}
}
}
}
// CUSTOM: toXML to handle Deadlines
public void toXML(Node parent, Deadlines cel) {
if (cel.isEmpty() && !cel.isRequired()) {
return;
}
if (parent != null) {
if (logging) {
System.out.println("TOXML for " + cel.toName() + ", c=" + cel.getClass().getName() + ", parent=" + cel.getParent());
}
Node node = parent;
if (cel.toValue() != null && cel.toValue().length() > 0) {
}
for (Iterator it = cel.toElements().iterator(); it.hasNext();) {
XMLElement el = (XMLElement) it.next();
if (el instanceof DeadlineLimit) {
continue;
}
if (el instanceof XMLComplexElement) {
toXML(node, (XMLComplexElement) el);
} else if (el instanceof XMLCollection) {
toXML(node, (XMLCollection) el);
} else if (el instanceof XMLComplexChoice) {
toXML(node, (XMLComplexChoice) el);
} else if (el instanceof XMLSimpleElement) {
toXML(node, (XMLSimpleElement) el);
} else { // it's XMLAttribute
toXML(node, (XMLAttribute) el);
}
}
// If Package is handled, parent==node
if (node != parent) {
parent.appendChild(node);
}
}
}
// END CUSTOM
public void toXML(Node parent, XMLComplexElement cel) {
if (cel.isEmpty() && !cel.isRequired()) {
return;
}
if (parent != null) {
if (logging) {
System.out.println("TOXML for " + cel.toName() + ", c=" + cel.getClass().getName() + ", parent=" + cel.getParent());
}
Node node = parent;
// Specific code for handling Package
if (!(cel instanceof Package)) {
node = (parent.getOwnerDocument()).createElement(xpdlPrefix + cel.toName());
}
if (cel.toValue() != null && cel.toValue().length() > 0) {
// Specific code for handling Condition
if (cel instanceof Condition) {
if (!cel.toValue().equals("")) {
Node textNode = node.getOwnerDocument().createTextNode(cel.toValue());
node.appendChild(textNode);
}
}
// Specific code for handling SchemaType
if (cel instanceof SchemaType) {
Node schema = XMLUtil.parseSchemaNode(cel.toValue(), false);
if (schema != null) {
node.appendChild(node.getOwnerDocument().importNode(schema, true));
}
}
// Specific code for handling ExtendedAttribute
if (cel instanceof ExtendedAttribute) {
try {
Node n = XMLUtil.parseExtendedAttributeContent(cel.toValue());
NodeList nl = n.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
node.appendChild(parent.getOwnerDocument().importNode(nl.item(i),
true));
}
} catch (Exception ex) {
}
}
}
for (Iterator it = cel.toElements().iterator(); it.hasNext();) {
XMLElement el = (XMLElement) it.next();
if (el instanceof XMLComplexElement) {
toXML(node, (XMLComplexElement) el);
} else if (el instanceof XMLCollection) {
toXML(node, (XMLCollection) el);
} else if (el instanceof XMLComplexChoice) {
toXML(node, (XMLComplexChoice) el);
} else if (el instanceof XMLSimpleElement) {
toXML(node, (XMLSimpleElement) el);
} else { // it's XMLAttribute
toXML(node, (XMLAttribute) el);
}
}
// If Package is handled, parent==node
if (node != parent) {
parent.appendChild(node);
}
}
}
public void toXML(Node parent, XMLComplexChoice el) {
XMLElement choosen = el.getChoosen();
if (logging) {
System.out.println("TOXML for " + el.toName() + ", c=" + el.getClass().getName() + ", parent=" + el.getParent());
}
if (choosen != null) {
if (choosen instanceof XMLComplexElement) {
toXML(parent, (XMLComplexElement) choosen);
} else {
if (choosen.toName().equals("Tools") && ((Tools) choosen).size() == 0) {
toXML(parent, ((ImplementationTypes) el).getNo());
} else {
toXML(parent, (XMLCollection) choosen);
}
}
}
}
public void toXML(Node parent, XMLSimpleElement el) {
if (!el.isEmpty() || el.isRequired()) {
if (parent != null) {
if (logging) {
System.out.println("TOXML for " + el.toName() + ", c=" + el.getClass().getName() + ", parent=" + el.getParent() + ", val=" + el.toValue());
}
Node node = (parent.getOwnerDocument()).createElement(xpdlPrefix + el.toName());
node.appendChild(parent.getOwnerDocument().createTextNode(el.toValue().trim()));
parent.appendChild(node);
}
}
}
public void toXML(Node parent, XMLAttribute el) {
if (!el.isEmpty() || el.isRequired()) {
if (parent != null) {
if (logging) {
System.out.println("TOXML for " + el.toName() + ", c=" + el.getClass().getName() + ", parent=" + el.getParent() + ", val=" + el.toValue());
}
Attr node = (parent.getOwnerDocument()).createAttribute(el.toName());
node.setValue(el.toValue().trim());
((Element) parent).setAttributeNode(node);
}
}
}
}