Author: glandais Date: 2007-12-04 18:30:44 +0000 (Tue, 04 Dec 2007) New Revision: 35 Added: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/EntityFactory.java trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationDataFactory.java trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/LoggableElementFactory.java Removed: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/EntityFactory.java trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/LoggableElementFactory.java Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/ElementDAOFactory.java trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/DescriptorFactory.java trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationApplicationFactory.java Log: Refactoring factories Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/ElementDAOFactory.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/ElementDAOFactory.java 2007-12-03 17:39:05 UTC (rev 34) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/ElementDAOFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -2,36 +2,46 @@ import java.util.HashMap; import java.util.Map; +import java.util.StringTokenizer; +import org.cemagref.simexplorer.si.storage.dao.factories.EntityFactory; +import org.cemagref.simexplorer.si.storage.entities.Entity; + public class ElementDAOFactory { - private final static String PACKAGE_DAO = "org.cemagref.simexplorer.si.storage.dao"; - private final static String PACKAGE_DAO_FACTORIES = "org.cemagref.simexplorer.si.storage.dao.factories"; + private final static String PACKAGE_DAO = "org.cemagref.simexplorer.si.storage.dao.factories"; private static Map<String, EntityFactory> factories = new HashMap<String, EntityFactory>(); - - public static EntityFactory getFactory(Class entityClass) throws Throwable { - EntityFactory elementFactory; - String elementFactoryClassName = entityClass.getSimpleName() - + "Factory"; - Class elementFactoryClass = Class.forName(PACKAGE_DAO + "." - + elementFactoryClassName); - if (elementFactoryClass == null) { - elementFactoryClass = Class.forName(PACKAGE_DAO_FACTORIES + "." + + public static EntityFactory getFactory(String entityClassName) + throws Throwable { + EntityFactory entityFactory = factories.get(entityClassName); + if (entityFactory == null) { + + StringTokenizer st = new StringTokenizer(entityClassName, "."); + String simpleClassName = null; + while (st.hasMoreTokens()) { + simpleClassName = st.nextToken(); + } + + String elementFactoryClassName = simpleClassName + "Factory"; + + Class elementFactoryClass = Class.forName(PACKAGE_DAO + "." + elementFactoryClassName); + + entityFactory = (EntityFactory) elementFactoryClass.newInstance(); + factories.put(entityClassName, entityFactory); } - - if (elementFactoryClass == null) { - return null; - } - - elementFactory = factories.get(elementFactoryClassName); - if (elementFactory == null) { - elementFactory = (EntityFactory) elementFactoryClass.newInstance(); - factories.put(elementFactoryClassName, elementFactory); - } - return elementFactory; + return entityFactory; } + /** + * @param entityClass + * @return + * @throws Throwable + */ + public static EntityFactory getFactory(Class entityClass) throws Throwable { + return getFactory(entityClass.getName()); + } } Deleted: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/EntityFactory.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/EntityFactory.java 2007-12-03 17:39:05 UTC (rev 34) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/EntityFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -1,41 +0,0 @@ -package org.cemagref.simexplorer.si.storage.dao; - -import java.util.Set; - -import org.cemagref.simexplorer.si.storage.entities.Entity; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -public abstract class EntityFactory<E extends Entity> { - - public E loadXMLElement(Element xmlElement) throws Throwable { - E element = createInstance(); - return element; - } - - public abstract void saveXMLElement(Document document, Element xmlElement, - E element) throws Throwable; - - public abstract E createInstance(); - - public Set<Entity> loadCollection() { - return null; - } - - public void saveCollection(Set entities, String tagSetName, - String tagName, Class clazz, Document document, Element xmlElement) - throws Throwable { - if (entities != null && entities.size() > 0) { - Element xmlCollection = document.createElement(tagSetName); - EntityFactory elementFactory = (EntityFactory) ElementDAOFactory - .getFactory(clazz); - for (Object entity : entities) { - Element childElement = document.createElement(tagName); - elementFactory.saveXMLElement(document, childElement, (Entity) entity); - xmlCollection.appendChild(childElement); - } - xmlElement.appendChild(xmlCollection); - } - } - -} Deleted: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/LoggableElementFactory.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/LoggableElementFactory.java 2007-12-03 17:39:05 UTC (rev 34) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/LoggableElementFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -1,89 +0,0 @@ -package org.cemagref.simexplorer.si.storage.dao; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.StringWriter; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.cemagref.simexplorer.si.storage.entities.LoggableElement; -import org.w3c.dom.Element; -import org.w3c.dom.Node; - -public abstract class LoggableElementFactory<E extends LoggableElement> - extends EntityFactory<E> { - - private DocumentBuilder documentBuilder = null; - - private DocumentBuilder getBuilder() throws Throwable { - if (documentBuilder == null) { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - documentBuilder = factory.newDocumentBuilder(); - return documentBuilder; - } - return documentBuilder; - } - - @Override - public E loadXMLElement(Element xmlElement) throws Throwable { - E element = super.loadXMLElement(xmlElement); - // FIXME load all properties - - return element; - } - - @Override - public void saveXMLElement(org.w3c.dom.Document document, Element xmlElement, - E element) throws Throwable { - // FIXME save all fields - Element xmlDescription = document.createElement("description"); - xmlDescription.setNodeValue(element.getDescription()); - xmlElement.appendChild(xmlDescription); - } - - public E loadLuceneElement(Document document) throws Throwable { - String strXMLElement = document.get("xmlElement"); - - InputStream is = new ByteArrayInputStream(strXMLElement.getBytes()); - org.w3c.dom.Document xmlDocument = getBuilder().parse(is); - - // FIXME check first element, document is a not an element - E element = loadXMLElement((Element) xmlDocument.getFirstChild()); - - return element; - } - - public Document saveLuceneElement(E element) throws Throwable { - Document document = new Document(); - - // FIXME save searchable/metadata fields - document.add(new Field("description", element.getDescription(), - Field.Store.YES, Field.Index.UN_TOKENIZED)); - - org.w3c.dom.Document xmlDocument = getBuilder().newDocument(); - // Propriétés du DOM - xmlDocument.setXmlVersion("1.0"); - xmlDocument.setXmlStandalone(true); - // Création de l'arborescence du DOM - Element racine = xmlDocument.createElement(element.getClass().getName()); - saveXMLElement(xmlDocument, racine, element); - DOMSource domSource = new DOMSource(xmlDocument); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - transformer.transform(domSource, result); - String stringResult = writer.toString(); - document.add(new Field("xmlElement", stringResult, Field.Store.COMPRESS, Field.Index.NO)); - - return document; - } - -} Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/DescriptorFactory.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/DescriptorFactory.java 2007-12-03 17:39:05 UTC (rev 34) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/DescriptorFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -1,26 +1,28 @@ package org.cemagref.simexplorer.si.storage.dao.factories; -import org.cemagref.simexplorer.si.storage.dao.EntityFactory; import org.cemagref.simexplorer.si.storage.entities.Descriptor; import org.w3c.dom.Element; import org.w3c.dom.Node; public class DescriptorFactory<E extends Descriptor> extends EntityFactory<Descriptor> { + public static final String KEY_NAME = "name"; + public static final String KEY_VALUE = "value"; + public Descriptor createInstance() { return new Descriptor(); } public Descriptor loadXMLElement(Element xmlElement) throws Throwable { Descriptor descriptor = createInstance(); - descriptor.setName(xmlElement.getAttribute("name")); - descriptor.setValue(xmlElement.getAttribute("value")); + descriptor.setName(xmlElement.getAttribute(KEY_NAME)); + descriptor.setValue(xmlElement.getAttribute(KEY_VALUE)); return descriptor; } public void saveXMLElement(org.w3c.dom.Document document, Element xmlElement, Descriptor element) throws Throwable { - xmlElement.setAttribute("name", element.getName()); - xmlElement.setAttribute("value", element.getValue()); + xmlElement.setAttribute(KEY_NAME, element.getName()); + xmlElement.setAttribute(KEY_VALUE, element.getValue()); } } Copied: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/EntityFactory.java (from rev 31, trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/EntityFactory.java) =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/EntityFactory.java (rev 0) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/EntityFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -0,0 +1,90 @@ +package org.cemagref.simexplorer.si.storage.dao.factories; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.cemagref.simexplorer.si.storage.dao.ElementDAOFactory; +import org.cemagref.simexplorer.si.storage.entities.Entity; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public abstract class EntityFactory<E extends Entity> { + + public abstract E createInstance(); + + public E loadXMLElement(Element xmlElement) throws Throwable { + E element = createInstance(); + return element; + } + + protected Set<Element> getElementsByTagName(Element xmlElement, + String tagName) { + Set<Element> elements = new HashSet<Element>(); + + NodeList nodes = xmlElement.getChildNodes(); + for (int i = 0; i < nodes.getLength(); i++) { + Node node = nodes.item(i); + if (node instanceof Element + && tagName.equals(((Element) node).getTagName())) { + elements.add((Element) node); + } + } + return elements; + } + + protected Element getElementByTagName(Element xmlElement,String tagName) { + Set<Element> elements = getElementsByTagName(xmlElement, tagName); + if (elements.size() > 0) { + return elements.iterator().next(); + } else { + return null; + } + } + + public abstract void saveXMLElement(Document document, Element xmlElement, + E element) throws Throwable; + + public Set loadCollection(String tagSetName, String tagName, Class clazz, + Element xmlElement) throws Throwable { + Set entities = new HashSet(); + + Element xmlCollection = getElementByTagName(xmlElement, tagSetName); + if (xmlCollection != null) { + EntityFactory elementFactory = (EntityFactory) ElementDAOFactory + .getFactory(clazz); + + Set<Element> list = getElementsByTagName(xmlCollection, tagName); + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + Element element = (Element) iterator.next(); + Entity entity = elementFactory.loadXMLElement(element); + entities.add(entity); + } + } + + return entities; + } + + public void saveCollection(Set entities, String tagSetName, String tagName, + Class clazz, Document document, Element xmlElement) + throws Throwable { + if (entities != null && entities.size() > 0) { + Element xmlCollection = document.createElement(tagSetName); + EntityFactory elementFactory = (EntityFactory) ElementDAOFactory + .getFactory(clazz); + for (Object entity : entities) { + Element childElement = document.createElement(tagName); + // TODO + // if (entity instanceof LoggableElement) { + // elementFactory.saveXMLElementByReference + elementFactory.saveXMLElement(document, childElement, + (Entity) entity); + xmlCollection.appendChild(childElement); + } + xmlElement.appendChild(xmlCollection); + } + } + +} Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationApplicationFactory.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationApplicationFactory.java 2007-12-03 17:39:05 UTC (rev 34) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationApplicationFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -1,30 +1,39 @@ package org.cemagref.simexplorer.si.storage.dao.factories; -import java.util.Set; - -import org.cemagref.simexplorer.si.storage.dao.ElementDAOFactory; -import org.cemagref.simexplorer.si.storage.dao.EntityFactory; -import org.cemagref.simexplorer.si.storage.dao.LoggableElementFactory; import org.cemagref.simexplorer.si.storage.entities.Component; -import org.cemagref.simexplorer.si.storage.entities.Entity; import org.cemagref.simexplorer.si.storage.entities.ExplorationApplication; import org.cemagref.simexplorer.si.storage.entities.ExplorationData; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.w3c.dom.Node; -public class ExplorationApplicationFactory extends LoggableElementFactory<ExplorationApplication> { +public class ExplorationApplicationFactory extends + LoggableElementFactory<ExplorationApplication> { + public static final String KEY_DATA = "data"; + public static final String KEY_DATA_NODE = "explorationdata"; + public static final String KEY_COMPONENTS = "components"; + public static final String KEY_COMPONENT_NODE = "component"; + @Override - public void saveXMLElement(Document document, Element xmlElement, ExplorationApplication element) throws Throwable { + public void saveXMLElement(Document document, Element xmlElement, + ExplorationApplication element) throws Throwable { super.saveXMLElement(document, xmlElement, element); - saveCollection(element.getExplorations(), "data", "explorationData", ExplorationData.class.getClass(), document, xmlElement); - saveCollection(element.getComponents(), "components", "component", Component.class.getClass(), document, xmlElement); + saveCollection(element.getExplorations(), KEY_DATA, KEY_DATA_NODE, + ExplorationData.class.getClass(), document, xmlElement); + saveCollection(element.getComponents(), KEY_COMPONENTS, + KEY_COMPONENT_NODE, Component.class.getClass(), document, + xmlElement); } @Override - public ExplorationApplication loadXMLElement(Element xmlElement) throws Throwable { - ExplorationApplication explorationApplication = super.loadXMLElement(xmlElement); + public ExplorationApplication loadXMLElement(Element xmlElement) + throws Throwable { + ExplorationApplication explorationApplication = super + .loadXMLElement(xmlElement); + explorationApplication.setExplorations(loadCollection(KEY_DATA, + KEY_DATA_NODE, ExplorationData.class.getClass(), xmlElement)); + explorationApplication.setComponents(loadCollection(KEY_COMPONENTS, + KEY_COMPONENT_NODE, Component.class.getClass(), xmlElement)); return explorationApplication; } Added: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationDataFactory.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationDataFactory.java (rev 0) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/ExplorationDataFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -0,0 +1,13 @@ +package org.cemagref.simexplorer.si.storage.dao.factories; + +import org.cemagref.simexplorer.si.storage.entities.ExplorationData; + +public class ExplorationDataFactory extends + LoggableElementFactory<ExplorationData> { + + @Override + public ExplorationData createInstance() { + return new ExplorationData(); + } + +} Copied: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/LoggableElementFactory.java (from rev 31, trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/LoggableElementFactory.java) =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/LoggableElementFactory.java (rev 0) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/dao/factories/LoggableElementFactory.java 2007-12-04 18:30:44 UTC (rev 35) @@ -0,0 +1,48 @@ +package org.cemagref.simexplorer.si.storage.dao.factories; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.cemagref.simexplorer.si.storage.database.lucene.LuceneConstants; +import org.cemagref.simexplorer.si.storage.entities.LoggableElement; +import org.w3c.dom.Element; +import org.w3c.dom.Text; + +public abstract class LoggableElementFactory<E extends LoggableElement> extends + EntityFactory<E> implements LuceneConstants { + + private static final String KEY_DESCRIPTION = "description"; + + private static DocumentBuilder documentBuilder = null; + + public static synchronized DocumentBuilder getBuilder() throws Throwable { + if (documentBuilder == null) { + DocumentBuilderFactory factory = DocumentBuilderFactory + .newInstance(); + documentBuilder = factory.newDocumentBuilder(); + return documentBuilder; + } + return documentBuilder; + } + + @Override + public E loadXMLElement(Element xmlElement) throws Throwable { + E element = super.loadXMLElement(xmlElement); + // FIXME load all properties + element.setDescription(getElementByTagName(xmlElement, KEY_DESCRIPTION) + .getNodeValue()); + + return element; + } + + @Override + public void saveXMLElement(org.w3c.dom.Document document, + Element xmlElement, E element) throws Throwable { + // FIXME save all fields + Element xmlDescription = document.createElement(KEY_DESCRIPTION); + Text xmlDescriptionText = document.createTextNode(element.getDescription()); + xmlDescription.appendChild(xmlDescriptionText); + xmlElement.appendChild(xmlDescription); + } + +}