/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jbpm.gd.common.xml;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.jbpm.gd.common.model.SemanticElement;
import org.jbpm.gd.common.model.SemanticElementFactory;
import org.jbpm.gd.common.registry.RegistryRegistry;
import org.jbpm.gd.common.registry.XmlAdapterRegistry;
import org.jbpm.gd.jpdl.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public class XmlAdapterFactory extends AbstractAdapterFactory {
private SemanticElementFactory semanticElementFactory;
private XmlAdapterRegistry xmlAdapterRegistry;
private Map adapterRegistry = new HashMap();
private Document document;
public XmlAdapterFactory(Document document, SemanticElementFactory elementFactory) {
super();
this.document = document;
this.semanticElementFactory = elementFactory;
xmlAdapterRegistry = RegistryRegistry.getXmlAdapterRegistry(elementFactory.getEditorId());
setAdapterKey(this);
setShouldRegisterAdapter(true);
}
public XmlAdapter adapt(Node node) {
return (XmlAdapter)super.adapt((INodeNotifier)node);
}
protected INodeAdapter createAdapter(INodeNotifier target) {
if (document == null) throw new RuntimeException("The document property of the JpdlElementDomAdapterFactory is not initialized");
XmlAdapter result = null;
try {
IConfigurationElement element = xmlAdapterRegistry.getConfigurationElementByXmlNode((Node)target);
if (element != null) {
result = (XmlAdapter)element.createExecutableExtension("adapterClass");
} else if (((Node)target).getNodeType() != Node.TEXT_NODE){
result = new GenericElementXmlAdapter();
}
if (result != null) {
result.setNode((Node)target);
result.setFactory(this);
}
} catch (CoreException e) {
throw new RuntimeException("Creation of executable extension failed", e);
}
return result;
}
private String calculateElementName(IConfigurationElement configurationElement, SemanticElement semanticElement) {
String elementName = configurationElement.getAttribute("xmlElement");
if (elementName == null) {
String nameProviderClass = configurationElement.getAttribute("nameProvider");
if (nameProviderClass != null) {
try {
XmlAdapterNameProvider nameProvider = (XmlAdapterNameProvider)configurationElement.createExecutableExtension("nameProvider");
if (nameProvider != null) {
elementName = nameProvider.getName(semanticElement);
}
}
catch (CoreException e) {
Logger.logError("Problem creating nameProvider for " + semanticElement.getElementId(), e);
}
}
}
return elementName;
}
private XmlAdapter createAdapter(IConfigurationElement configurationElement, String elementName) {
XmlAdapter result = null;
try {
result = (XmlAdapter) configurationElement.createExecutableExtension("adapterClass");
INodeNotifier element = (INodeNotifier)document.createElement(elementName);
element.addAdapter(result);
result.setFactory(this);
result = (XmlAdapter)adapt(element);
result.setNode((Node)element);
} catch (CoreException e) {
Logger.logError("Unable to create XML Adapter for " + elementName, e);
}
return result;
}
public XmlAdapter createAdapterFromModel(SemanticElement semanticElement) {
IConfigurationElement configurationElement =
xmlAdapterRegistry.getConfigurationElementBySemanticElementId(semanticElement.getElementId());
String elementName = calculateElementName(configurationElement, semanticElement);
if (elementName != null) {
return createAdapter(configurationElement, elementName);
} else {
return null;
}
}
void register(XmlAdapter jpdlElementDomAdapter) {
adapterRegistry.put(jpdlElementDomAdapter.getSemanticElement(), jpdlElementDomAdapter);
}
void unregister(XmlAdapter jpdlElementDomAdapter) {
adapterRegistry.remove(jpdlElementDomAdapter.getSemanticElement());
}
XmlAdapter getRegisteredAdapterFor(SemanticElement jpdlElement) {
return (XmlAdapter)adapterRegistry.get(jpdlElement);
}
SemanticElementFactory getSemanticElementFactory() {
return semanticElementFactory;
}
XmlAdapterRegistry getXmlAdapterRegistry() {
return xmlAdapterRegistry;
}
}