diff gnv/src/main/java/de/intevation/gnv/action/LoadAction.java @ 673:93b4dedc4e37

Implemented a mechanism to import artifacts from xml structured documents. gnv/trunk@801 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 19 Mar 2010 10:04:28 +0000
parents b89b31293772
children d49e8695786c
line wrap: on
line diff
--- a/gnv/src/main/java/de/intevation/gnv/action/LoadAction.java	Fri Mar 19 08:51:45 2010 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/action/LoadAction.java	Fri Mar 19 10:04:28 2010 +0000
@@ -1,10 +1,17 @@
 package de.intevation.gnv.action;
 
-import de.intevation.gnv.propertiesreader.PropertiesReaderFactory;
-import de.intevation.gnv.propertiesreader.PropertiesReader;
+import de.intevation.gnv.action.sessionmodel.SessionModel;
+import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
+import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
+import de.intevation.gnv.artifactdatabase.objects.Artifact;
+import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory;
+import de.intevation.gnv.util.ArtifactNamespaceContext;
 import de.intevation.gnv.util.XMLUtils;
 
 import java.io.InputStream;
+import java.io.IOException;
+import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -17,7 +24,7 @@
 
 import org.apache.struts.action.ActionForm;
 import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;        
+import org.apache.struts.action.ActionMapping;
 
 import org.w3c.dom.Document;
 
@@ -26,7 +33,8 @@
  */
 public class LoadAction extends ArtifactDatabaseActionBase {
 
-    public static final String RESOURCE_UPLOAD_FAILURE = "upload.failure";
+    public static final String RESOURCE_UPLOAD_FAILURE   = "upload.failure";
+    public static final String RESOURCE_INVALID_ARTIFACT = "invalid.artifact";
 
     private static Logger logger = Logger.getLogger(LoadAction.class);
 
@@ -46,32 +54,88 @@
         ServletFileUpload upload  = new ServletFileUpload();
         Document artifactDocument = null;
 
-        FileItemIterator iter = upload.getItemIterator(request);
-        while (iter.hasNext()) {
-            FileItemStream item = (FileItemStream) iter.next();
-            String name         = item.getFieldName();
+        try {
+            FileItemIterator iter = upload.getItemIterator(request);
+            while (iter.hasNext()) {
+                FileItemStream item = (FileItemStream) iter.next();
+                String name         = item.getFieldName();
 
-            if (name.equals("document")) {
-                InputStream stream = item.openStream();
-                artifactDocument   = XMLUtils.readDocument(stream);
+                // the file input field of our form is named 'document'
+                if (name.equals("document")) {
+                    InputStream stream = item.openStream();
+
+                    if (stream.available() == 0) {
+                        logger.error("No artifact document found.");
+                        request.setAttribute(
+                            CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
+                            RESOURCE_UPLOAD_FAILURE);
+
+                        return super.getExceptionForward(mapping);
+                    }
+
+                    artifactDocument   = XMLUtils.readDocument(stream);
+                    if (artifactDocument == null) {
+                        request.setAttribute(
+                            CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
+                            RESOURCE_INVALID_ARTIFACT);
+
+                        return super.getExceptionForward(mapping);
+                    }
+
+                    ArtifactDatabaseClientFactory adcf =
+                        ArtifactDatabaseClientFactory.getInstance();
+                    ArtifactDatabaseClient adc =
+                        adcf.getArtifactDatabaseClient(getLocale(request));
+                    ArtifactFactory factory = (ArtifactFactory)
+                        (( List)adc.getArtifactFactories()).get(0);
+
+                    SessionModelFactory sf = SessionModelFactory.getInstance();
+                    SessionModel        sm = sf.getSessionModel(request);
+                    sm.selectArtifactFactory(factory.getId());
+
+                    Document describe = adc.doImport(
+                        factory,
+                        artifactDocument);
+
+                    String uuid = XMLUtils.xpathString(
+                        describe,
+                        "/art:result/art:uuid/@value",
+                        ArtifactNamespaceContext.INSTANCE);
+                    String hash = XMLUtils.xpathString(
+                        describe,
+                        "/art:result/art:hash/@value",
+                        ArtifactNamespaceContext.INSTANCE);
+
+                    Artifact artifact = new Artifact(uuid, hash);
+                    sm.setCurrentArtifact(artifact);
+
+                    if (logger.isDebugEnabled()) {
+                        logger.debug("Imported artifact UUID: "+artifact.getId());
+                        logger.debug("Imported artifact HASH: "+artifact.getHash());
+                    }
+
+                    return new DescribeUIAction().execute(
+                        mapping, form, request, response);
+                }
             }
         }
-
-        // no document found or not valid
-        if (artifactDocument == null) {
-            logger.error("Upload failure: No document found or invalid.");
-
+        catch (IOException ioe) {
+            logger.error(ioe, ioe);
             request.setAttribute(
                 CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
-                RESOURCE_UPLOAD_FAILURE);
+                ioe.getMessage());
 
             return super.getExceptionForward(mapping);
         }
 
-        // TODO Do something with our nice xml document
-        // Use DescribeUI Action to set required attributes which are parsed in
-        // jsp files.
-        return super.execute(mapping, form, request, response);
+        // no document found or not valid
+        logger.error("Upload failure: No document found or invalid.");
+
+        request.setAttribute(
+            CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
+            RESOURCE_UPLOAD_FAILURE);
+
+        return super.getExceptionForward(mapping);
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org