package org.compass.core.converter.xsem;
import org.compass.core.config.CompassConfigurable;
import org.compass.core.config.CompassEnvironment;
import org.compass.core.config.CompassSettings;
import org.compass.core.config.ConfigurationException;
import org.compass.core.util.ClassUtils;
import org.compass.core.xml.dom4j.converter.SAXReaderXmlContentConverter;
import org.compass.core.xml.dom4j.converter.STAXReaderXmlContentConverter;
import org.compass.core.xml.dom4j.converter.XPP3ReaderXmlContentConverter;
import org.compass.core.xml.dom4j.converter.XPPReaderXmlContentConverter;
import org.compass.core.xml.javax.converter.NodeXmlContentConverter;
import org.compass.core.xml.javax.converter.StaxNodeXmlContentConverter;
import org.compass.core.xml.jdom.converter.SAXBuilderXmlContentConverter;
import org.compass.core.xml.jdom.converter.STAXBuilderXmlContentConverter;
/**
* A set of utilities for {@link XmlContentConverter}.
*
* @author kimchy
*/
public abstract class XmlContentConverterUtils {
/**
* Creates a new {@link XmlContentConverter} based on the given settings.
*/
public static XmlContentConverter createXmlContentConverter(CompassSettings settings) throws ConfigurationException {
String type = settings.getGloablSettings().getSetting(CompassEnvironment.Xsem.XmlContent.TYPE);
if (type == null) {
throw new ConfigurationException("[" + CompassEnvironment.Xsem.XmlContent.TYPE + "] configuration can not be found, please set it in the configuration settings");
}
XmlContentConverter xmlContentConverter;
if (CompassEnvironment.Xsem.XmlContent.JDom.TYPE_SAX.equals(type)) {
xmlContentConverter = new SAXBuilderXmlContentConverter();
} else if (CompassEnvironment.Xsem.XmlContent.JDom.TYPE_STAX.equals(type)) {
xmlContentConverter = new STAXBuilderXmlContentConverter();
} else if (CompassEnvironment.Xsem.XmlContent.Dom4j.TYPE_STAX.equals(type)) {
xmlContentConverter = new STAXReaderXmlContentConverter();
} else if (CompassEnvironment.Xsem.XmlContent.Dom4j.TYPE_SAX.equals(type)) {
xmlContentConverter = new SAXReaderXmlContentConverter();
} else if (CompassEnvironment.Xsem.XmlContent.Dom4j.TYPE_XPP.equals(type)) {
xmlContentConverter = new XPPReaderXmlContentConverter();
} else if (CompassEnvironment.Xsem.XmlContent.Dom4j.TYPE_XPP3.equals(type)) {
xmlContentConverter = new XPP3ReaderXmlContentConverter();
} else if (CompassEnvironment.Xsem.XmlContent.Javax.TYPE_NODE.equals(type)) {
xmlContentConverter = new NodeXmlContentConverter();
} else if (CompassEnvironment.Xsem.XmlContent.Javax.TYPE_STAX.equals(type)) {
xmlContentConverter = new StaxNodeXmlContentConverter();
} else {
try {
xmlContentConverter = (XmlContentConverter) ClassUtils.forName(type, settings.getClassLoader()).newInstance();
} catch (Exception e) {
throw new ConfigurationException("Failed to create xmlContent [" + type + "]", e);
}
}
if (xmlContentConverter instanceof CompassConfigurable) {
((CompassConfigurable) xmlContentConverter).configure(settings);
}
if (xmlContentConverter instanceof SupportsXmlContentWrapper) {
String wrapper = settings.getGloablSettings().getSetting(CompassEnvironment.Xsem.XmlContent.WRAPPER, CompassEnvironment.Xsem.XmlContent.WRAPPER_PROTOTYPE);
if (!((SupportsXmlContentWrapper) xmlContentConverter).supports(wrapper)) {
throw new SupportsXmlContentWrapper.NotSupportedXmlContentWrapperException(xmlContentConverter, wrapper);
}
}
return xmlContentConverter;
}
}