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 :

http://dive4elements.wald.intevation.org