diff gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java @ 13:2535158e2687

Chartoutput Added to the View gnv/trunk@95 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Wed, 16 Sep 2009 12:41:27 +0000
parents 4ebe57b170d3
children 1557bea6cb55
line wrap: on
line diff
--- a/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java	Wed Sep 16 07:44:26 2009 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java	Wed Sep 16 12:41:27 2009 +0000
@@ -5,6 +5,7 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -112,10 +113,14 @@
      * @throws IOException
      */
     private Document doGetRequest(String requestUrl) throws IOException {
+        return this.doGetRequest(requestUrl, null);
+    }
+    /**
+     * @throws IOException
+     */
+    private Document doGetRequest(String requestUrl, Document requestBody) throws IOException {
         XMLUtils xmlUtils = new XMLUtils();
-        Client client = new Client(Protocol.HTTP);
-        Response response = client.get(requestUrl);
-        Representation output = response.getEntity();
+        Representation output = doGetRequestInternal(requestUrl, requestBody);
         Document document = xmlUtils.readDocument(output.getStream());
         log.debug(xmlUtils.writeDocument2String(document));
         return document;
@@ -124,6 +129,39 @@
     /**
      * @throws IOException
      */
+    private void doGetRequest(OutputStream outputStream, String requestUrl, Document requestBody) throws IOException {
+        Representation output = doGetRequestInternal(requestUrl, requestBody);
+        InputStream inputStream = output.getStream();
+        
+        byte[] buffer = new byte[4096];
+        while (inputStream.read(buffer) > 0){
+            outputStream.write(buffer);
+        }
+        
+    }
+
+    /**
+     * @param requestUrl
+     * @param requestBody
+     * @return
+     */
+    private Representation doGetRequestInternal(String requestUrl,
+            Document requestBody) {
+        Client client = new Client(Protocol.HTTP);
+        Request request = new Request(Method.GET, requestUrl);
+        if (requestBody != null){
+            String documentBody = new XMLUtils().writeDocument2String(requestBody);
+            Representation representation = new StringRepresentation(documentBody);
+            request.setEntity(representation);
+        }
+        Response response = client.handle(request);
+        Representation output = response.getEntity();
+        return output;
+    }
+    
+    /**
+     * @throws IOException
+     */
     private InputStream doPostRequest(String requestUrl, Document requestBody) throws IOException {
         Client client = new Client(Protocol.HTTP);
         Request request = new Request(Method.POST, requestUrl);
@@ -314,11 +352,9 @@
         
         try {
             // 1 Feed
-            Document feedDocument = this.createFeedRequestBody(currentArtifact, inputParameter);
+            this.doFeed(artifactFactory, currentArtifact, inputParameter);
+             // 2 Advance
             String url = this.getArtifactUrl(artifactFactory, currentArtifact);
-            InputStream feedResult = this.doPostRequest(url, feedDocument);
-            // TODO feedResult auswerten und ggf. Fehler werfen.
-            // 2 Advance
             Document advanceDocument = this.createAdvanceRequestBody(currentArtifact, target);
             log.debug(new XMLUtils().writeDocument2String(advanceDocument));
             InputStream advanceResult = this.doPostRequest(url, advanceDocument);
@@ -348,8 +384,20 @@
         hashNode.setAttribute("value", currentArtifact.getHash());
         rootNode.appendChild(hashNode);
         
-        Element dataNode = this.createArtifactElement(document, "data");
+        Node dataNode = this.createParameterNodes(inputParameter, document, "data");
         rootNode.appendChild(dataNode);
+        
+        return document;
+    }
+
+    /**
+     * @param inputParameter
+     * @param document
+     * @param rootNode
+     */
+    private Node createParameterNodes(Collection<InputParameter> inputParameter, Document document, String nodeName) {
+        Element dataNode = this.createArtifactElement(document, nodeName);
+        
         if (inputParameter != null){
             Iterator<InputParameter> it = inputParameter.iterator();
             while(it.hasNext()){
@@ -367,9 +415,7 @@
                 }
             }
         }
-        
-        
-        return document;
+        return dataNode;
     }
     
     private Document createAdvanceRequestBody(ArtifactObject currentArtifact, String target){
@@ -392,4 +438,80 @@
             rootNode.appendChild(targetNode);
             return document;
     }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doOutput(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, de.intevation.gnv.artifactdatabase.objects.ArtifactObject, java.io.OutputStream, java.lang.String, java.lang.String, java.util.Collection)
+     */
+    public void doOutput(ArtifactObject artifactFactory,
+            ArtifactObject currentArtifact, OutputStream stream,
+            String targetName, String mimeType,
+            Collection<InputParameter> inputParameter)
+            throws ArtifactDatabaseClientException {
+        try {
+            XMLUtils xmlUtils = new XMLUtils();
+            Document requestBody = this.createOutRequestBody(currentArtifact, targetName, mimeType, inputParameter);
+            log.debug(xmlUtils.writeDocument2String(requestBody));
+            
+            String requestUrl = this.getArtifactUrl(artifactFactory, currentArtifact)+"/"+targetName;
+            InputStream is = this.doPostRequest( requestUrl, requestBody);
+            
+            byte[] b = new byte[4096];
+            int i = -1 ;
+            while ((i = is.read(b)) > 0)
+            {
+                stream.write(b, 0, i);
+            }
+            } catch (IOException e) {
+            log.error(e,e);
+            throw new ArtifactDatabaseClientException(e);
+        }
+    }
+    
+    private Document createOutRequestBody(ArtifactObject currentArtifact, String target, String mimeType, Collection<InputParameter> inputParameter){
+        Document document = new XMLUtils().newDocument();
+        Node rootNode  = this.createRootNode(document);
+        
+        Element typeNode = this.createArtifactElement(document, "type");
+        typeNode.setAttribute("name", "out");
+        rootNode.appendChild(typeNode);
+        
+        Element uuidNode = this.createArtifactElement(document, "uuid");
+        uuidNode.setAttribute("value", currentArtifact.getId());
+        rootNode.appendChild(uuidNode);
+        
+        Element hashNode = this.createArtifactElement(document, "hash");
+        hashNode.setAttribute("value", currentArtifact.getHash());
+        rootNode.appendChild(hashNode);
+        
+        Element outNode = this.createArtifactElement(document, "out");
+        outNode.setAttribute("name", target);
+        rootNode.appendChild(outNode);
+      
+        Element mimeTypeNode = this.createArtifactElement(document, "out");
+        mimeTypeNode.setAttribute("value", mimeType);
+        outNode.appendChild(mimeTypeNode);
+        
+        Node parameterNode = this.createParameterNodes(inputParameter, document, "params");
+        outNode.appendChild(parameterNode);
+        
+        return document;
 }
+
+    /**
+     * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doFeed(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, de.intevation.gnv.artifactdatabase.objects.ArtifactObject, java.util.Collection)
+     */
+    public void doFeed(ArtifactObject artifactFactory,
+            ArtifactObject currentArtifact,
+            Collection<InputParameter> inputParameter)
+            throws ArtifactDatabaseClientException {
+        
+        try {
+            Document feedDocument = this.createFeedRequestBody(currentArtifact, inputParameter);
+            String url = this.getArtifactUrl(artifactFactory, currentArtifact);
+            InputStream feedResult = this.doPostRequest(url, feedDocument);
+            // TODO feedResult auswerten und ggf. Fehler werfen.
+        } catch (IOException e) {
+            log.error(e,e);
+        }
+    }
+}

http://dive4elements.wald.intevation.org