Author: glandais Date: 2008-02-12 18:16:40 +0000 (Tue, 12 Feb 2008) New Revision: 870 Modified: trunk/simexplorer-is/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/MetaDataFactory.java Log: - replace metadata information in a LE xml stream - compute hash of a xml stream without metadatas Modified: trunk/simexplorer-is/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/MetaDataFactory.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/MetaDataFactory.java 2008-02-12 18:15:41 UTC (rev 869) +++ trunk/simexplorer-is/simexplorer-is-entities/src/java/fr/cemagref/simexplorer/is/factories/MetaDataFactory.java 2008-02-12 18:16:40 UTC (rev 870) @@ -18,6 +18,8 @@ package fr.cemagref.simexplorer.is.factories; import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -26,8 +28,14 @@ import java.util.Map; import java.util.Set; +import javax.xml.transform.dom.DOMSource; + +import org.codelutin.util.DigestGenerator; +import org.codelutin.util.MD5; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import fr.cemagref.simexplorer.is.attachment.Attachment; import fr.cemagref.simexplorer.is.attachment.ContentType; @@ -37,8 +45,7 @@ /** * A factory for creating MetaData objects. * - * @param <E> - * MetaData + * @param <E> MetaData */ public class MetaDataFactory<E extends MetaData> extends BaseEntityFactory<MetaData> { @@ -58,16 +65,13 @@ /** * Gets the factory. * - * @param <E> - * Metadata + * @param <E> Metadata * - * @param entityClass - * the entity class + * @param entityClass the entity class * * @return the factory * - * @throws Exception - * the exception + * @throws Exception the exception */ @SuppressWarnings( { "unchecked" }) public static <E extends MetaData> MetaDataFactory<E> getFactory( @@ -254,16 +258,14 @@ } /** - * As metadata is stored inside an entity, this method loads metadata with - * parsing stream and retrieve metadata node. + * As metadata is stored inside an entity, this method loads metadata with parsing stream and retrieve metadata + * node. * - * @param xmlStream - * the xml stream + * @param xmlStream the xml stream * * @return the meta data * - * @throws Exception - * the exception + * @throws Exception the exception */ public MetaData loadElementFromParentXML(InputStream xmlStream) throws Exception { @@ -275,4 +277,66 @@ return mde; } + /** + * Replace element in parent xml. + * + * @param xmlStream the xml stream + * @param newMetadata the new metadata + * + * @return the input stream + * + * @throws Exception the exception + */ + public InputStream replaceElementInParentXML(InputStream xmlStream, + MetaData newMetadata) throws Exception { + Document document = getXMLBuilder().parse(xmlStream); + Element rootElement = (Element) document.getFirstChild(); + + Element newElement = document.createElement(KEY_METADATA); + this.saveElement(document, newElement, newMetadata); + + Element oldElement = getXMLElementByTagName(rootElement, KEY_METADATA); + rootElement.replaceChild(newElement, oldElement); + + DOMSource domSource = new DOMSource(document); + + PipedOutputStream os = new PipedOutputStream(); + PipedInputStream is = new PipedInputStream(os); + + XMLStreamEncoder xse = new XMLStreamEncoder(domSource, os); + xse.start(); + + return is; + } + + public String computeHash(InputStream xmlStream) throws Exception { + Document document = getXMLBuilder().parse(xmlStream); + + DigestGenerator digestGenerator = new DigestGenerator(); + byte[] digest = digestGenerator.getDigest(document, + DigestGenerator.sha1DigestAlgorithm); + + return MD5.asHex(digest); + } + + private int removeMetadatas(Document document, Node node) { + int tot = 0; + NodeList childNodes = node.getChildNodes(); + List<Node> toRemove = new ArrayList<Node>(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node child = childNodes.item(i); + if (child instanceof Element + && KEY_METADATA.equals(((Element) child).getTagName())) { + toRemove.add(child); + } else { + tot = tot + removeMetadatas(document, child); + } + } + for (Node metadata : toRemove) { + node.removeChild(metadata); + tot++; + } + return tot; + } + }