diff gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java @ 558:8032da9e8b70

Added further business logic for the MapViewer-Interface gnv/trunk@654 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Mon, 01 Feb 2010 15:08:39 +0000
parents b88e881e8e94
children 3f39756e0c8a
line wrap: on
line diff
--- a/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java	Wed Jan 27 14:26:30 2010 +0000
+++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java	Mon Feb 01 15:08:39 2010 +0000
@@ -10,22 +10,19 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
 import org.apache.log4j.Logger;
-
 import org.restlet.Client;
-
+import org.restlet.data.ClientInfo;
+import org.restlet.data.Language;
 import org.restlet.data.Method;
+import org.restlet.data.Preference;
 import org.restlet.data.Protocol;
 import org.restlet.data.Request;
 import org.restlet.data.Response;
-import org.restlet.data.Preference;
-import org.restlet.data.Language;
-import org.restlet.data.ClientInfo;
-
 import org.restlet.representation.Representation;
 import org.restlet.representation.StringRepresentation;
 import org.w3c.dom.Document;
@@ -46,6 +43,9 @@
 import de.intevation.gnv.artifactdatabase.objects.InputParameter;
 import de.intevation.gnv.artifactdatabase.objects.OutputMode;
 import de.intevation.gnv.artifactdatabase.objects.OutputParameter;
+import de.intevation.gnv.artifactdatabase.objects.ParametrizedArtifactFactory;
+import de.intevation.gnv.artifactdatabase.objects.ParametrizedArtifactObject;
+import de.intevation.gnv.artifactdatabase.objects.map.Layer;
 import de.intevation.gnv.artifactdatabase.objects.map.MapService;
 import de.intevation.gnv.propertiesreader.PropertiesReader;
 import de.intevation.gnv.propertiesreader.PropertiesReaderFactory;
@@ -139,9 +139,31 @@
                         "@art:name");
                 String description = xmlUtils.getStringXPath(
                         artifactFactoryNode, "@art:description");
-                ArtifactFactory artifactFactory = new ArtifactFactory(name,
-                        description, server);
-                resultValues.add(artifactFactory);
+                
+                NodeList parameterNodeList = xmlUtils.getNodeSetXPath(
+                                                            artifactFactoryNode,
+                                                            "art:parameter");
+               
+                if (parameterNodeList != null && 
+                    parameterNodeList.getLength() > 0){
+                    Collection<String> parameters = 
+                          new ArrayList<String>(parameterNodeList.getLength());
+                    for (int j = 0; j < parameterNodeList.getLength(); j++){
+                        Element parameterNode = (Element)parameterNodeList.item(j);
+                        parameters.add(parameterNode.getAttribute("id"));
+                    }
+                    ParametrizedArtifactObject pao = 
+                                    new ParametrizedArtifactFactory(name, 
+                                                                    description,
+                                                                    server);
+                    pao.addParameters("parameter", parameters);
+                    resultValues.add(pao);
+                }else{
+                    ArtifactObject artifactFactory  = new ArtifactFactory(name,
+                                                                    description,
+                                                                    server);
+                    resultValues.add(artifactFactory);
+                }
             }
         }
         log.debug("Artifact Factories: " + resultValues.size());
@@ -255,8 +277,7 @@
                                                                            throws ArtifactDatabaseClientException {
 
         try {
-            Document request = this.createCreateRequestBody(artifactFactory
-                    .getId());
+            Document request = this.createCreateRequestBody(artifactFactory);
             Document result = doPostRequest(artifactFactory, request, "create");
             return this.getArtifact(result);
         } catch (IOException e) {
@@ -273,17 +294,36 @@
         return new Artifact(uuid, hash);
     }
 
-    private Document createCreateRequestBody(String artifactFactoryName) {
+    private Document createCreateRequestBody(ArtifactObject artifactFactory) {
         Document document = new XMLUtils().newDocument();
         Node rootNode = this.createRootNode(document);
         Element typeNode = this.createArtifactElement(document, "type");
         typeNode.setAttribute("name", "create");
         rootNode.appendChild(typeNode);
 
-        Element factoyNode = this.createArtifactElement(document, "factory");
-        factoyNode.setAttribute("name", artifactFactoryName);
-        rootNode.appendChild(factoyNode);
-
+        Element factoryNode = this.createArtifactElement(document, "factory");
+        factoryNode.setAttribute("name", artifactFactory.getId());
+        rootNode.appendChild(factoryNode);
+        
+        if (artifactFactory instanceof ParametrizedArtifactObject){
+            Map<String, Collection<String>> parameterMap = 
+                ((ParametrizedArtifactObject)artifactFactory).getParameters();
+            if (parameterMap != null && !parameterMap.isEmpty() ){
+                Iterator<String> keyIt = parameterMap.keySet().iterator();
+                while (keyIt.hasNext()){
+                    String key = keyIt.next();
+                    Iterator<String> valueIt = parameterMap.get(key).iterator();
+                    while (valueIt.hasNext()){
+                        String value = valueIt.next();
+                        Element parameterNode = 
+                             this.createArtifactElement(document, "parameter");
+                        parameterNode.setAttribute("name", key);
+                        parameterNode.setAttribute("value", value);
+                        factoryNode.appendChild(parameterNode);
+                    }
+                }
+            }
+        }
         return document;
     }
 
@@ -763,12 +803,80 @@
     /**
      * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getArtifactFactoryMetaInformation(java.util.Collection, java.lang.String, java.lang.String)
      */
-    public Collection<ArtifactFactory> getArtifactFactoryMetaInformation(
+    public Collection<ArtifactObject> getArtifactFactoryMetaInformation(
                                                                 Collection<MapService> mapServices,
                                                                 String geometry,
                                                                 String srs)
                                                                            throws ArtifactDatabaseClientException {
-         // TODO: Implement me
-        return null;
+        log.debug("DefaultArtifactDatabaseClient.getArtifactFactories");
+        Collection<ArtifactObject> resultValues = null;
+        try {
+            this.initialize();
+            Iterator<String> it = artifactDatabases.iterator();
+            Document requestBody = this.createMetaDataRequestBody(mapServices, 
+                                                                  geometry, 
+                                                                  srs);
+            while (it.hasNext()) {
+                String server = it.next();
+                String url = server + "/service/metadata/";
+                log.debug(url);
+                
+                InputStream resultStream = this.doPostRequest(url, requestBody);
+                resultValues = this.parseMetaDataResult(resultStream, server);
+            }
+        } catch (IOException e) {
+            log.error(e,e);
+        }
+        return resultValues;
+    }
+    
+    private Collection<ArtifactObject> parseMetaDataResult(
+              InputStream inputStream, 
+              String server) throws ArtifactDatabaseClientException{
+        XMLUtils xmlUtils = new XMLUtils();
+        Document document = xmlUtils.readDocument(inputStream);
+        this.check4ExceptionReport(document);
+        return this.getArtifactFactories(document, server);
+    }
+    
+    private Document createMetaDataRequestBody(Collection<MapService> mapServices,
+                                               String geometry,
+                                               String srs){
+        log.debug("DefaultArtifactDatabaseClient.createMetaDataRequestBody");
+        Document document = new XMLUtils().newDocument();
+        Node rootNode = this.createArtifactElement(document, "GetMetaData");
+        document.appendChild(rootNode);
+        
+        Element locationNode = this.createArtifactElement(document, "location");
+        locationNode.setAttribute("srs", srs);
+        locationNode.appendChild(document.createTextNode(geometry));
+        rootNode.appendChild(locationNode);
+        
+        Element mapServicesNode = this.createArtifactElement(document,
+                                                             "mapservices");
+        Iterator<MapService> it = mapServices.iterator();
+        while (it.hasNext()){
+            MapService mapService = it.next();
+            Element mapServiceNode = this.createArtifactElement(document,
+                                                                "mapservice");
+            mapServiceNode.setAttribute("id", mapService.getID());
+            mapServiceNode.setAttribute("type", mapService.getType());
+            mapServiceNode.setAttribute("url", mapService.getURL());
+            Iterator<Layer> layer = mapService.getLayer().iterator();
+            while (layer.hasNext()){
+                Layer tmpLayer = layer.next();
+                Element layerNode = this.createArtifactElement(document,
+                                                               "layer");
+                layerNode.setAttribute("id", tmpLayer.getID());
+                layerNode.setAttribute("name", tmpLayer.getName());
+                layerNode.setAttribute("isgrouplayer",
+                                       ""+tmpLayer.isGroupLayer());
+                layerNode.setAttribute("parentid", tmpLayer.parentID());
+                mapServiceNode.appendChild(layerNode);
+            }
+            mapServicesNode.appendChild(mapServiceNode);
+        }
+        rootNode.appendChild(mapServicesNode);
+        return document;
     }
 }

http://dive4elements.wald.intevation.org