/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.cismap.commons; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import java.io.StringReader; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.logging.Level; /** * The XMLObjectFactory factory recreates arbitrary objects from xml documents.<br/> * * @author Pascal Dihé * @version $Revision$, $Date$ */ public class XMLObjectFactory { //~ Methods ---------------------------------------------------------------- // private final static Logger logger = Logger.getLogger(XMLObjectFactory.class); /** * DOCUMENT ME! * * @param element DOCUMENT ME! * * @return DOCUMENT ME! * * @throws ClassNotFoundException DOCUMENT ME! * @throws InstantiationException DOCUMENT ME! * @throws IllegalAccessException DOCUMENT ME! * @throws IllegalArgumentException DOCUMENT ME! * @throws InvocationTargetException DOCUMENT ME! * @throws Exception DOCUMENT ME! */ public static Object restoreObjectfromElement(final Element element) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, Exception { final String type = element.getAttributeValue(ConvertableToXML.TYPE_ATTRIBUTE); if (type == null) { // logger.error("unsupported xml element, type attribute is missing"); throw new Exception("unsupported xml element, type attribute is missing"); } // logger.info("creating new instance of '" + type + "' class"); final Class objectType = Class.forName(type); final Constructor objectConstructor; try { objectConstructor = objectType.getConstructor(Element.class); // logger.debug("constructing '" + objectType.getSimpleName() + "' using supported constructor"); return objectConstructor.newInstance(element); } catch (NoSuchMethodException ex) { // logger.debug("constructing '" + objectType.getSimpleName() + "' using empty constructor"); final Object object = objectType.newInstance(); ((ConvertableToXML)object).initFromElement(element); return object; } } /** * DOCUMENT ME! * * @param xmlString DOCUMENT ME! * * @return DOCUMENT ME! * * @throws ClassNotFoundException DOCUMENT ME! * @throws InstantiationException DOCUMENT ME! * @throws IllegalAccessException DOCUMENT ME! * @throws IllegalArgumentException DOCUMENT ME! * @throws InvocationTargetException DOCUMENT ME! * @throws Exception DOCUMENT ME! */ public static Object restoreObjectfromXml(final String xmlString) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, Exception { final SAXBuilder saxBuilder = new SAXBuilder(false); final StringReader stringReader = new StringReader(xmlString); final Document document = saxBuilder.build(stringReader); return XMLObjectFactory.restoreObjectfromElement(document.getRootElement()); } }