Mercurial > dive4elements > framework
diff artifact-database/src/main/java/de/intevation/artifactdatabase/ArtifactDatabaseImpl.java @ 79:f69e5b87f05f
Implementation to export artifacts as xml (applied patch from issue208 by SLT).
artifacts/trunk@792 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 16 Mar 2010 16:03:06 +0000 |
parents | d4c4c23847f5 |
children | 8447467cef86 |
line wrap: on
line diff
--- a/artifact-database/src/main/java/de/intevation/artifactdatabase/ArtifactDatabaseImpl.java Thu Mar 11 10:53:59 2010 +0000 +++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/ArtifactDatabaseImpl.java Tue Mar 16 16:03:06 2010 +0000 @@ -1,24 +1,34 @@ package de.intevation.artifactdatabase; +import de.intevation.artifactdatabase.Backend.PersistentArtifact; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactDatabase; +import de.intevation.artifacts.ArtifactDatabaseException; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; +import de.intevation.artifacts.Service; +import de.intevation.artifacts.ServiceFactory; + import java.io.IOException; import java.io.OutputStream; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import org.apache.log4j.Logger; -import org.w3c.dom.Document; +import org.apache.commons.codec.binary.Base64; -import de.intevation.artifactdatabase.Backend.PersistentArtifact; -import de.intevation.artifacts.Artifact; -import de.intevation.artifacts.ArtifactDatabase; -import de.intevation.artifacts.ArtifactDatabaseException; -import de.intevation.artifacts.ArtifactFactory; -import de.intevation.artifacts.CallContext; -import de.intevation.artifacts.CallMeta; -import de.intevation.artifacts.Service; -import de.intevation.artifacts.ServiceFactory; +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; /** * @author Sascha L. Teichmann @@ -50,6 +60,9 @@ public static final String NO_SUCH_SERVICE = "No such service"; + public static final String DIGEST_ALGORITHM = + "SHA-1"; + public class CallContextImpl implements CallContext { @@ -171,6 +184,8 @@ protected Backend backend; protected Object context; + protected byte [] exportSecret; + protected HashSet backgroundIds; public ArtifactDatabaseImpl() { @@ -187,7 +202,8 @@ setupArtifactFactories(bootstrap); setupServices(bootstrap); - context = bootstrap.getContext(); + context = bootstrap.getContext(); + exportSecret = bootstrap.getExportSecret(); wireWithBackend(backend); } @@ -422,6 +438,82 @@ return new DeferredOutputImpl(artifact, format, callMeta); } + public Document exportArtifact(String artifact, CallMeta callMeta) + throws ArtifactDatabaseException + { + final String [] factoryName = new String[1]; + + byte [] bytes = (byte [])backend.loadArtifact( + artifact, + new Backend.ArtifactLoader() { + public Object load( + ArtifactFactory factory, + byte [] bytes, + int id + ) { + factoryName[0] = factory.getName(); + return bytes; + } + }); + + if (bytes == null) { + throw new ArtifactDatabaseException(NO_SUCH_ARTIFACT); + } + + return createExportDocument( + factoryName[0], + bytes, + exportSecret); + } + + protected static Document createExportDocument( + String factoryName, + byte [] artifact, + byte [] secret + ) { + Document document = XMLUtils.newDocument(); + + MessageDigest md; + try { + md = MessageDigest.getInstance(DIGEST_ALGORITHM); + } + catch (NoSuchAlgorithmException nsae) { + logger.error(nsae.getLocalizedMessage(), nsae); + return document; + } + + md.update(artifact); + md.update(secret); + + String checksum = StringUtils.toHex(md.digest()); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element root = ec.create("result"); + document.appendChild(root); + + Element type = ec.create("type"); + ec.addAttr(type, "name", "export"); + root.appendChild(type); + + Element data = ec.create("data"); + ec.addAttr(data, "checksum", checksum); + data.setTextContent(Base64.encodeBase64String(artifact)); + + root.appendChild(data); + + return document; + } + + public Document importArtifact(Document data, CallMeta callMeta) + throws ArtifactDatabaseException + { + return null; + } + public String [][] serviceNamesAndDescriptions() { return serviceNamesAndDescription; } @@ -442,4 +534,4 @@ return service.process(input, context, callMeta); } } -// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :