Author: glandais Date: 2007-12-17 11:00:36 +0000 (Mon, 17 Dec 2007) New Revision: 70 Modified: trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/service/StorageService.java trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/MetaDataParser.java trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/Parser.java Log: Aspect service Modified: trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/service/StorageService.java =================================================================== --- trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/service/StorageService.java 2007-12-17 10:59:58 UTC (rev 69) +++ trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/service/StorageService.java 2007-12-17 11:00:36 UTC (rev 70) @@ -1,18 +1,41 @@ package fr.cemagref.simexplorer.is.storage.service; import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import org.w3c.dom.Document; +import org.w3c.dom.Element; import fr.cemagref.simexplorer.is.storage.engine.StorageEngine; -import fr.cemagref.simexplorer.is.storage.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.storage.entities.metadata.MetaDataEntity; +import fr.cemagref.simexplorer.is.storage.factories.BaseEntityFactory; +import fr.cemagref.simexplorer.is.storage.factories.MetaDataEntityFactory; import fr.cemagref.simexplorer.is.storage.xml.MetaDataParser; +import fr.cemagref.simexplorer.is.storage.xml.Parser; public class StorageService { private StorageEngine storageEngine; + // FIXME centralized + private static String KEY_METADATA = "metadata"; + private static String KEY_XML = "xml"; + private static String KEY_ATTACHMENT = "attachment"; + private static String KEY_TYPE_EA = "EA"; + private static String KEY_COMPONENT = "C"; + private static String KEY_ED = "ED"; + private static String KEY_RESULT = "R"; + private static String KEY_FILE = "FILE"; + + private static String FILE_XML = "data.xml"; + private static String FILE_DATA_PREFIX = "attachment"; + public StorageService() { super(); storageEngine = new StorageEngine(); @@ -26,19 +49,167 @@ storageEngine.close(); } - public LoggableElement saveElement(InputStream xmlFile, - InputStream attachment) throws Exception { + public MetaDataEntity saveElement(InputStream zipStream) throws Exception { + String xmlFile = null; + Map<String, String> attachments = null; + + ZipInputStream zis = new ZipInputStream(zipStream); + + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) { + if (!entry.isDirectory()) { + String entryName = entry.getName(); + if (entryName.equals(FILE_XML)) { + xmlFile = storageEngine.storeTempData(zis); + } else { + if (entryName.startsWith(FILE_DATA_PREFIX)) { + String fileName = entryName.replace(FILE_DATA_PREFIX + + "/", ""); + String idFile = storageEngine.storeTempData(zis); + attachments.put(fileName, idFile); + } + } + } + } + + return saveElement(xmlFile, attachments); + } + + public MetaDataEntity saveElement(InputStream xmlFile, + Map<String, InputStream> attachments) throws Exception { + // Store temporary data String idxml = storageEngine.storeTempData(xmlFile); - String idattachment = null; - if (attachment != null) { - idattachment = storageEngine.storeTempData(attachment); + Map<String, String> idsattachment = new HashMap<String, String>(); + for (Map.Entry<String, InputStream> entry : attachments.entrySet()) { + String idattachment = storageEngine.storeTempData(entry.getValue()); + idsattachment.put(entry.getKey(), idattachment); } + return saveElement(idxml, idsattachment); + } + public MetaDataEntity saveElement(String idxml, + Map<String, String> idsattachment) throws Exception { + // Load xml metadata MetaDataEntity metaData = MetaDataParser.parse(storageEngine .retrieveTempData(idxml)); - LoggableElement result = null; - return result; + String uuid = metaData.getUuid(); + + // If element is an EA, save inner Components and Data + + if (metaData.getType().equals(KEY_TYPE_EA)) { + + List<String> components = new ArrayList<String>(); + List<String[]> explorationDatas = new ArrayList<String[]>(); + + // Retrieve elements + extractChildren(idxml, idsattachment, components, explorationDatas); + + // For each exploration data + for (String[] explorationData : explorationDatas) { + // where is stored xml + String idxmlED = explorationData[0]; + + // where is stored result + Map<String, String> attachmentsED = new HashMap<String, String>(); + if (explorationData.length > 1) { + attachmentsED.put(explorationData[1], idsattachment + .get(explorationData[1])); + } + // recursive save + saveElement(idxmlED, attachmentsED); + + } + + // For each component + for (String idComponent : components) { + saveElement(idComponent, new HashMap<String, String>()); + } + + // Don't save any file for an EA + idsattachment = new HashMap<String, String>(); + + } + + // Check existing version in storage + MetaDataEntity previousVersion = storageEngine.getElementVersion(uuid, + metaData.getVersion()); + /* + * MetaDataEntity parentData = storageEngine.getElementVersion(metaData + * .getParentData().getUuid(), metaData.getParentData() .getVersion()); + * MetaDataEntity parentVersion = + * storageEngine.getElementVersion(metaData + * .getParentVersion().getUuid(), metaData.getParentVersion() + * .getVersion()); + */ + + // Version rules + if (previousVersion != null) { + /* + * metaData.setParentVersion(storageEngine.getElementVersion(uuid, + * previousVersion.getVersion())); + */ + metaData.setVersion(previousVersion.getVersion().incVersion(0) + .toString()); + } + + // Prepare saving + Map<String, InputStream> attachments = new HashMap<String, InputStream>(); + + attachments.put(KEY_XML, storageEngine.retrieveTempData(idxml)); + for (Map.Entry<String, String> entry : idsattachment.entrySet()) { + attachments.put(KEY_ATTACHMENT + "." + entry.getKey(), + storageEngine.retrieveTempData(entry.getValue())); + } + storageEngine.saveElement(metaData, attachments); + + return metaData; } + private void extractChildren(String idxml, + Map<String, String> idsattachment, List<String> components, + List<String[]> explorationDatas) throws Exception { + MetaDataEntityFactory<MetaDataEntity> elementFactory = (MetaDataEntityFactory<MetaDataEntity>) BaseEntityFactory + .getFactory("MetaDataEntity"); + + Document document = BaseEntityFactory.getBuilder().parse( + storageEngine.retrieveTempData(idxml)); + + Element rootElement = (Element) document.getFirstChild(); + + // Components + Set<Element> componentElements = elementFactory.getElementsByTagName( + rootElement, KEY_COMPONENT); + for (Element element : componentElements) { + components.add(storageEngine.storeTempData(Parser + .serializeElement(element))); + } + + Set<Element> applicationDataElements = elementFactory + .getElementsByTagName(rootElement, KEY_ED); + for (Element elementAD : applicationDataElements) { + + Element element = elementFactory.getElementByTagName(elementAD, + KEY_RESULT); + String result = elementFactory.getProperty(element, KEY_FILE); + + String[] explorationDataArray = null; + if (result != null) { + explorationDataArray = new String[2]; + explorationDataArray[1] = result; + } else { + explorationDataArray = new String[1]; + } + explorationDataArray[0] = storageEngine.storeTempData(Parser + .serializeElement(elementAD)); + + } + + } + + /* + * public MetaDataEntity loadElement(String idxml, Map<String, String> + * idsattachment) throws Exception { } + */ + } Modified: trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/MetaDataParser.java =================================================================== --- trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/MetaDataParser.java 2007-12-17 10:59:58 UTC (rev 69) +++ trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/MetaDataParser.java 2007-12-17 11:00:36 UTC (rev 70) @@ -5,26 +5,50 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; +import fr.cemagref.simexplorer.is.storage.entities.BaseEntity; +import fr.cemagref.simexplorer.is.storage.entities.data.Code; import fr.cemagref.simexplorer.is.storage.entities.metadata.MetaDataEntity; +import fr.cemagref.simexplorer.is.storage.factories.BaseEntityFactory; +import fr.cemagref.simexplorer.is.storage.factories.MetaDataEntityFactory; public class MetaDataParser extends Parser { private static String KEY_METADATA = "metadata"; - private static String KEY_UUID = "metadata"; + private static String KEY_UUID = "uuid"; private static String KEY_VERSION = "version"; - + + /* + * @Override public static MetaDataEntity parse(InputStream xmlStream) + * throws Exception { MetaDataEntity mde = new MetaDataEntity(); + * + * Document document = getBuilder().parse(xmlStream); Element rootElement = + * (Element) document.getFirstChild(); Element metadataElement = + * getElementByTagName(rootElement, KEY_METADATA); + * + * mde.setUuid(getProperty(metadataElement, KEY_UUID)); + * mde.setVersion(getProperty(metadataElement, KEY_VERSION)); + * + * return mde; } + */ + public static MetaDataEntity parse(InputStream xmlStream) throws Exception { - MetaDataEntity mde = new MetaDataEntity(); + MetaDataEntityFactory<MetaDataEntity> elementFactory = (MetaDataEntityFactory<MetaDataEntity>) BaseEntityFactory + .getFactory("MetaDataEntity"); - Document document = getBuilder().parse(xmlStream); + Document document = elementFactory.getBuilder().parse(xmlStream); Element rootElement = (Element) document.getFirstChild(); - Element metadataElement = getElementByTagName(rootElement, KEY_METADATA); + Element metadataElement = elementFactory.getElementByTagName( + rootElement, KEY_METADATA); - mde.setUuid(getProperty(metadataElement, KEY_UUID)); - mde.setVersion(getProperty(metadataElement, KEY_VERSION)); - - return mde; + MetaDataEntity metaData = elementFactory + .loadXMLElement(metadataElement); + return metaData; } - + + public static void save(Document document, Element xmlElement, + MetaDataEntity element) throws Exception { + + } + } Modified: trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/Parser.java =================================================================== --- trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/Parser.java 2007-12-17 10:59:58 UTC (rev 69) +++ trunk/simexplorer-si-storage/src/java/fr/cemagref/simexplorer/is/storage/xml/Parser.java 2007-12-17 11:00:36 UTC (rev 70) @@ -1,10 +1,17 @@ package fr.cemagref.simexplorer.is.storage.xml; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; import java.util.HashSet; import java.util.Set; 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.w3c.dom.Document; import org.w3c.dom.Element; @@ -26,7 +33,7 @@ return documentBuilder; } - protected static String getProperty(Element xmlElement, String tagName) { + public static String getProperty(Element xmlElement, String tagName) { Element element = getElementByTagName(xmlElement, tagName); if (element != null) { return element.getFirstChild().getNodeValue(); @@ -35,7 +42,7 @@ } } - protected static void setProperty(Document document, Element xmlElement, + public static void setProperty(Document document, Element xmlElement, String tagName, Object value) { if (value != null) { Element xmlProperty = document.createElement(tagName); @@ -45,7 +52,7 @@ } } - protected static Element getElementByTagName(Element xmlElement, String tagName) { + public static Element getElementByTagName(Element xmlElement, String tagName) { Set<Element> elements = getElementsByTagName(xmlElement, tagName); if (elements.size() > 0) { return elements.iterator().next(); @@ -54,7 +61,7 @@ } } - protected static Set<Element> getElementsByTagName(Element xmlElement, + public static Set<Element> getElementsByTagName(Element xmlElement, String tagName) { Set<Element> elements = new HashSet<Element>(); @@ -69,4 +76,57 @@ return elements; } + public static InputStream serializeElement(Element element) + throws Exception { + 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() + .getSimpleName()); + + racine.appendChild(element); + + xmlDocument.appendChild(racine); + DOMSource domSource = new DOMSource(xmlDocument); + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + StreamResult result = new StreamResult(os); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.transform(domSource, result); + + ByteArrayInputStream inputStream = new ByteArrayInputStream(os + .toByteArray()); + + return inputStream; + } + + /* + * public static BaseEntity parse(InputStream xmlStream) throws Exception { + * return null; } + * + * public static void save(Document document, Element xmlElement, + * MetaDataEntity element) throws Exception { } /* public static void + * save(BaseEntity element, OutputStream os) throws Exception { + * 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() + * .getSimpleName()); + * + * save(xmlDocument, racine, element); + * + * xmlDocument.appendChild(racine); DOMSource domSource = new + * DOMSource(xmlDocument); StreamResult result = new StreamResult(os); + * TransformerFactory tf = TransformerFactory.newInstance(); Transformer + * transformer = tf.newTransformer(); transformer.transform(domSource, + * result); } + * + * public static String save(BaseEntity element) throws Exception { + * ByteArrayOutputStream writer = new ByteArrayOutputStream(); save(element, + * writer); return writer.toString(); } + */ + }
participants (1)
-
glandais@users.labs.libre-entreprise.org