package org.jbpm.gd.common.registry; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.jbpm.gd.common.xml.XmlElementMapper; import org.jbpm.gd.jpdl.Logger; import org.w3c.dom.Node; public class XmlAdapterRegistry { Map xmlElementMap = new HashMap(); Map semanticElementIdMap = new HashMap(); public XmlAdapterRegistry(Set elementIds) { initializeMaps(elementIds); } private void initializeMaps(Set elementIds) { IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint("org.jbpm.gd.jpdl.xmlMappings"); IExtension[] extensions = extensionPoint.getExtensions(); for (int i = 0; i < extensions.length; i++) { IConfigurationElement[] configElements = extensions[i].getConfigurationElements(); for (int j = 0; j < configElements.length; j++) { String semanticElement = configElements[j].getAttribute("semanticElement"); if (!elementIds.contains(semanticElement)) continue; semanticElementIdMap.put(semanticElement, configElements[j]); String xmlElement = configElements[j].getAttribute("xmlElement"); if (xmlElement != null) { SortedSet set = (SortedSet)xmlElementMap.get(xmlElement); if (set == null) { set = new TreeSet(PriorityComparator.INSTANCE); xmlElementMap.put(xmlElement, set); } set.add(configElements[j]); } } } } public IConfigurationElement getConfigurationElementByXmlNode(Node node) { String nodeName = node.getNodeName(); SortedSet set = (SortedSet)xmlElementMap.get(nodeName); if (set == null) { return null; } Iterator iterator = set.iterator(); while (iterator.hasNext()) { IConfigurationElement element = (IConfigurationElement)iterator.next(); if (element.getAttribute("mapperClass") == null) { return element; } if (createXmlElementMapper(element).accept(node)) { return element; } } return null; } private XmlElementMapper createXmlElementMapper(IConfigurationElement element) { XmlElementMapper result = null; try { result = (XmlElementMapper)element.createExecutableExtension("mapperClass"); } catch (CoreException e) { Logger.logError("Could not create mapper class", e); } return result; } public IConfigurationElement getConfigurationElementBySemanticElementId(String semanticElementId) { return (IConfigurationElement)semanticElementIdMap.get(semanticElementId); } private static class PriorityComparator implements Comparator { private static PriorityComparator INSTANCE = new PriorityComparator(); public int compare(Object left, Object right) { int result = getPriority(right) - getPriority(left); if (result == 0) { result = right.hashCode() - left.hashCode(); } return result; } private int getPriority(Object object) { int result = 0; String priority = ((IConfigurationElement)object).getAttribute("mapperClassPriority"); if (priority != null) { result = Integer.valueOf(priority).intValue(); } return result; } } }