Implement gis client Execute method

Improve client get Input/Output ports
Moved the code to create ports to PortDataDescriptorFactory


Project: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/commit/24e3b9d0
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/tree/24e3b9d0
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/diff/24e3b9d0

Branch: refs/heads/taverna2
Commit: 24e3b9d066f636b4bae5e5e7a61aea7f88802797
Parents: 00f882b
Author: edikaradumi <[email protected]>
Authored: Sat Aug 6 00:12:35 2016 +0100
Committer: edikaradumi <[email protected]>
Committed: Sat Aug 6 00:12:35 2016 +0100

----------------------------------------------------------------------
 .../ui/serviceprovider/GisServiceProvider.java  |  35 +-
 .../org/apache/taverna/gis/GisActivity.java     | 203 ++++----
 .../apache/taverna/gis/client/IGisClient.java   |   8 +-
 .../gis/client/impl/GisClientNorthImpl.java     | 466 ++++++++-----------
 4 files changed, 308 insertions(+), 404 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/blob/24e3b9d0/apache-taverna-plugin-gis-activity-ui/src/main/java/org/apache/taverna/gis/ui/serviceprovider/GisServiceProvider.java
----------------------------------------------------------------------
diff --git 
a/apache-taverna-plugin-gis-activity-ui/src/main/java/org/apache/taverna/gis/ui/serviceprovider/GisServiceProvider.java
 
b/apache-taverna-plugin-gis-activity-ui/src/main/java/org/apache/taverna/gis/ui/serviceprovider/GisServiceProvider.java
index 61e466e..0fff6d9 100644
--- 
a/apache-taverna-plugin-gis-activity-ui/src/main/java/org/apache/taverna/gis/ui/serviceprovider/GisServiceProvider.java
+++ 
b/apache-taverna-plugin-gis-activity-ui/src/main/java/org/apache/taverna/gis/ui/serviceprovider/GisServiceProvider.java
@@ -61,40 +61,15 @@ public class GisServiceProvider extends 
AbstractConfigurableServiceProvider<GisS
                                service.setDescription(processID);
                                
                                // Get input ports
-                               List<PortTypeDescriptor> inputList = 
gisServiceClient.getTaverna2InputPorts(processID);
-
-                       List<ActivityInputPortDefinitionBean> 
inputPortDefinitions = new ArrayList<ActivityInputPortDefinitionBean>();
-
-                       for (PortTypeDescriptor input : inputList) {
-                               ActivityInputPortDefinitionBean newInputPort = 
new ActivityInputPortDefinitionBean();
-                               newInputPort.setName(input.getName());
-                               newInputPort.setDepth(input.getDepth());
-                               
newInputPort.setAllowsLiteralValues(input.isAllowLiteralValues());
-                               newInputPort.setHandledReferenceSchemes(null);
-                               
newInputPort.setTranslatedElementType(input.getTranslatedElementType());
-                               
-                               inputPortDefinitions.add(newInputPort);
-                               
-                       }
-                       
-                       service.setInputPortDefinitions(inputPortDefinitions);
+                               List<IPortDataDescriptor> inputList = 
gisServiceClient.getTaverna2InputPorts(processID);
+
+                       service.setInputPortDefinitions(inputList);
                                
                        // Get output ports
                        
-                       List<PortTypeDescriptor> outputList = 
gisServiceClient.getTaverna2OutputPorts(processID);
-                       List<ActivityOutputPortDefinitionBean> 
outputPortDefinitions = new ArrayList<ActivityOutputPortDefinitionBean>();
+                       List<IPortDataDescriptor> outputList = 
gisServiceClient.getTaverna2OutputPorts(processID);
                        
-                       for( PortTypeDescriptor output : outputList )
-                       {
-                               ActivityOutputPortDefinitionBean newOutputPort 
= new ActivityOutputPortDefinitionBean();
-                               newOutputPort.setName(output.getName());
-                               newOutputPort.setDepth(output.getDepth());
-                               
-                               outputPortDefinitions.add(newOutputPort);
-                               
-                       }
-                       
-                       service.setOutputPortDefinitions(outputPortDefinitions);
+                       service.setOutputPortDefinitions(outputList);
                        
                        results.add(service);
 

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/blob/24e3b9d0/apache-taverna-plugin-gis-activity/src/main/java/org/apache/taverna/gis/GisActivity.java
----------------------------------------------------------------------
diff --git 
a/apache-taverna-plugin-gis-activity/src/main/java/org/apache/taverna/gis/GisActivity.java
 
b/apache-taverna-plugin-gis-activity/src/main/java/org/apache/taverna/gis/GisActivity.java
index 1c468ce..6f58548 100644
--- 
a/apache-taverna-plugin-gis-activity/src/main/java/org/apache/taverna/gis/GisActivity.java
+++ 
b/apache-taverna-plugin-gis-activity/src/main/java/org/apache/taverna/gis/GisActivity.java
@@ -1,19 +1,15 @@
 package org.apache.taverna.gis;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.n52.wps.client.ExecuteRequestBuilder;
-import org.n52.wps.client.ExecuteResponseAnalyser;
-import org.n52.wps.client.WPSClientException;
-import org.n52.wps.client.WPSClientSession;
+import org.apache.log4j.Logger;
+import org.apache.taverna.gis.client.ComplexDataFormat;
+import org.apache.taverna.gis.client.ComplexPortDataDescriptor;
+import org.apache.taverna.gis.client.GisClientFactory;
+import org.apache.taverna.gis.client.IGisClient;
+import org.apache.taverna.gis.client.IPortDataDescriptor;
 
-import net.opengis.wps.x100.DataType;
-import net.opengis.wps.x100.ExecuteDocument;
-import net.opengis.wps.x100.ExecuteResponseDocument;
-import net.opengis.wps.x100.OutputDataType;
-import net.opengis.wps.x100.ProcessDescriptionType;
 import net.sf.taverna.t2.invocation.InvocationContext;
 import net.sf.taverna.t2.reference.ReferenceService;
 import net.sf.taverna.t2.reference.T2Reference;
@@ -21,14 +17,14 @@ import 
net.sf.taverna.t2.workflowmodel.processor.activity.AbstractAsynchronousAc
 import 
net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
 import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivity;
 import 
net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback;
-import 
net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean;
-import 
net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean;
 
 public class GisActivity extends 
AbstractAsynchronousActivity<GisActivityConfigurationBean>
                implements AsynchronousActivity<GisActivityConfigurationBean> {
        
        private GisActivityConfigurationBean configBean;
 
+       private static Logger logger = Logger.getLogger(GisActivity.class);
+       
        @Override
        public void configure(GisActivityConfigurationBean configBean) throws 
ActivityConfigurationException {
 
@@ -50,36 +46,28 @@ public class GisActivity extends 
AbstractAsynchronousActivity<GisActivityConfigu
                removeOutputs();
 
                // Add input ports
-               for(ActivityInputPortDefinitionBean inputPort : 
configBean.getInputPortDefinitions())
+               for(IPortDataDescriptor inputPort : 
configBean.getInputPortDefinitions())
                {
-                       if (inputPort.getName()=="polygon")
-                       {
-                               addInput("polygon_schema",0,true, null, null);
-                               addInput("polygon_encoding",0,true, null, null);
-                               addInput("polygon_mimetype",0,true, null, null);
-                               
-                       }
-                       
-                       if (inputPort.getName()=="line")
+                       if (inputPort instanceof ComplexPortDataDescriptor)
                        {
-                               addInput("line_schema",0,true, null, null);
-                               addInput("line_encoding",0,true, null, null);
-                               addInput("line_mimetype",0,true, null, null);
+                               addInput( inputPort.getName() + 
"_schema",0,true, null, null);
+                               addInput(inputPort.getName() + 
"_encoding",0,true, null, null);
+                               addInput(inputPort.getName() + 
"_mimetype",0,true, null, null);
                        }
                        
-                       
addInput(inputPort.getName(),inputPort.getDepth(),inputPort.getAllowsLiteralValues(),inputPort.getHandledReferenceSchemes(),
 inputPort.getTranslatedElementType());
+                       
addInput(inputPort.getName(),inputPort.getDepth(),inputPort.isAllowLiteralValues(),null,
 inputPort.getTranslatedElementType());
                }
                
                // Add output ports
-               for(ActivityOutputPortDefinitionBean outputPort : 
configBean.getOutputPortDefinitions())
+               for(IPortDataDescriptor outputPort : 
configBean.getOutputPortDefinitions())
                {
                        addOutput(outputPort.getName(),outputPort.getDepth());
                        
-                       if (outputPort.getName()=="result")
+                       if (outputPort instanceof ComplexPortDataDescriptor)
                        {
-                               addOutput("result_schema",0);
-                               addOutput("result_encoding",0);
-                               addOutput("result_mimetype",0);
+                               addOutput(outputPort.getName() + "_schema",0);
+                               addOutput(outputPort.getName() + "_encoding",0);
+                               addOutput(outputPort.getName() + "_mimetype",0);
                        }
                        
                }
@@ -101,86 +89,111 @@ public class GisActivity extends 
AbstractAsynchronousActivity<GisActivityConfigu
                                try {
                                        
                                        // prepare the execute object
-                                       WPSClientSession wpsClient = 
WPSClientSession.getInstance();
+                                       IGisClient gisClient = 
GisClientFactory.getInstance().getGisClient(
+                                                       
configBean.getOgcServiceUri().toString());
 
-                                       ProcessDescriptionType 
processDescription = 
wpsClient.getProcessDescription(configBean.getOgcServiceUri().toString(), 
configBean.getProcessIdentifier());
+                                       HashMap<String, IPortDataDescriptor> 
serviceInputs = new HashMap<String, IPortDataDescriptor>();
                                        
-                                       ExecuteRequestBuilder executeBuilder = 
new ExecuteRequestBuilder(processDescription);
-
-                                       for (ActivityInputPortDefinitionBean 
activityInputPort : configBean.getInputPortDefinitions()) {
-                                               String portValue = (String) 
referenceService.renderIdentifier(inputs.get(activityInputPort.getName()), 
String.class, context);
-                                               
-                                               if 
(activityInputPort.getName().equals("polygon") || 
activityInputPort.getName().equals("line"))
+                                       for (IPortDataDescriptor 
activityInputPort : configBean.getInputPortDefinitions()) 
+                                       {
+                                               // Optional inputs are not 
stored in the map if no value is provided, hence they are skipped  
+                                               if 
(inputs.containsKey(activityInputPort.getName())) 
                                                {
-                                                       String schema = 
"application/wkt";
-                                                       String encoding = null;
-                                                       String mimeType = 
"application/wkt";
+                                                       Object inputValue = 
referenceService.renderIdentifier(inputs.get(activityInputPort.getName()), 
String.class, context);
+                                               
+                                                       
activityInputPort.setValue(inputValue);
                                                        
-                                                       
executeBuilder.addComplexData(activityInputPort.getName(),
-                                                                       
portValue, schema, encoding, mimeType);
+                                                       if (activityInputPort 
instanceof ComplexPortDataDescriptor)
+                                                       {
+                                                               //TODO: set 
format
+                                                               
ComplexDataFormat complexFormat = new ComplexDataFormat();
+                                                               
+                                                               
complexFormat.setEncoding(null);
+                                                               
complexFormat.setMimeType("application/wkt");
+                                                               
complexFormat.setSchema(null);
+                                                               
+                                                               
((ComplexPortDataDescriptor) activityInputPort).setComplexFormat(complexFormat);
+                                                       }
                                                        
-                                               }else
-                                               {
-                                                       
executeBuilder.addLiteralData(activityInputPort.getName(), portValue);
+                                                       
serviceInputs.put(activityInputPort.getName(), activityInputPort);
                                                }
                                                
                                        }
-                               
-                                       ExecuteDocument execute = 
executeBuilder.getExecute();
-                       
-                                       execute.getExecute().setService("WPS");
                                        
-                                       Object responseObject = null;
+                                       // Execute process
+                                       HashMap<String, String> serviceOutput = 
gisClient.executeProcess(configBean.getProcessIdentifier().toString(), 
serviceInputs);
                                        
-                                       try {
-                                               // execute service
-                                               responseObject = 
wpsClient.execute(configBean.getOgcServiceUri().toString(), execute);
-                                       } catch (WPSClientException e) {
-                                               // if the an error return from 
service
-                                               
callback.fail(e.getServerException().xmlText());
-                                       }
-
-                                       // Register outputs
                                        outputs = new HashMap<String, 
T2Reference>();
                                        T2Reference simpleRef = null;
                                        
-                                       if (responseObject instanceof 
ExecuteResponseDocument) {
-                                   ExecuteResponseDocument response = 
(ExecuteResponseDocument) responseObject;
-                                   
-                                   // analyser is used to get complex data
-                                   ExecuteResponseAnalyser analyser = new 
ExecuteResponseAnalyser(
-                                           execute, response, 
processDescription);
-                                   
-                                   for(OutputDataType output : 
response.getExecuteResponse().getProcessOutputs().getOutputArray())
-                                               {
-                                       DataType data = output.getData();
-                                       
-                                       if (data.isSetLiteralData())
-                                                       {
-                                               simpleRef = 
referenceService.register(data.getLiteralData().getStringValue(), 0, true, 
context);
-
-                                                               
outputs.put(output.getIdentifier().getStringValue(), simpleRef);
-                                                       }
-                                       else
-                                       {
-                                       
-                                               simpleRef = 
referenceService.register(data.getComplexData().toString(), 0, true, context);
-                                               
-                                               
outputs.put(output.getIdentifier().getStringValue(), simpleRef);
-                                               
-                                       }
-                                       
-                                               }
-                                   
-                               }
+                                       for (Map.Entry<String, String> entry : 
serviceOutput.entrySet()) {
+                                           String key = entry.getKey();
+                                           String value = entry.getValue();
+                                           
+                                           simpleRef = 
referenceService.register(value, 0, true, context);
+                                               outputs.put(key, simpleRef);
+                                           
+                                       }
                                        
+//                                             
+//                                     
+//                                     Object responseObject = null;
+//                                     
+//                                     try {
+//                                             // execute service
+//                                             responseObject = 
wpsClient.execute(configBean.getOgcServiceUri().toString(), execute);
+//                                     } catch (WPSClientException e) {
+//                                             // if the an error return from 
service
+//                                             
callback.fail(e.getServerException().xmlText());
+//                                     }
+//
+//                                     // Register outputs
+//                                     outputs = new HashMap<String, 
T2Reference>();
+//                                     T2Reference simpleRef = null;
+//                                     
+//                                     if (responseObject instanceof 
ExecuteResponseDocument) {
+//                                 ExecuteResponseDocument response = 
(ExecuteResponseDocument) responseObject;
+//                                 
+//                                 // analyser is used to get complex data
+//                                 ExecuteResponseAnalyser analyser = new 
ExecuteResponseAnalyser(
+//                                         execute, response, 
processDescription);
+//                                 
+//                                 for(OutputDataType output : 
response.getExecuteResponse().getProcessOutputs().getOutputArray())
+//                                             {
+//                                     DataType data = output.getData();
+//                                     
+//                                     if (data.isSetLiteralData())
+//                                                     {
+//                                             simpleRef = 
referenceService.register(data.getLiteralData().getStringValue(), 0, true, 
context);
+//
+//                                                             
outputs.put(output.getIdentifier().getStringValue(), simpleRef);
+//                                                     }
+//                                     else
+//                                     {
+//                                     
+//                                             simpleRef = 
referenceService.register(data.getComplexData().toString(), 0, true, context);
+//                                             
+//                                             
outputs.put(output.getIdentifier().getStringValue(), simpleRef);
+//                                             
+//                                     }
+//                                     
+//                                             }
+//                                 
+//                             }
+//                                     
+//                                     
+//                             } catch (WPSClientException e) {
+//                                     callback.fail(e.getMessage());
+//                             } catch (IOException e) {
+//                                     callback.fail(e.getMessage());
+//                             }
                                        
-                               } catch (WPSClientException e) {
-                                       callback.fail(e.getMessage());
-                               } catch (IOException e) {
-                                       callback.fail(e.getMessage());
+                               } catch (Exception e) {
+                                       logger.error("Error executing 
service/process: "
+                                                       + 
configBean.getOgcServiceUri().toString() + "/" + 
configBean.getProcessIdentifier().toString(), e);
+                                       callback.fail("Unable to execute 
service", e);
                                }
-
+                               
                                callback.receiveResult(outputs, new int[0]);
                        }
                });

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/blob/24e3b9d0/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/IGisClient.java
----------------------------------------------------------------------
diff --git 
a/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/IGisClient.java
 
b/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/IGisClient.java
index 316961e..0fdbafc 100644
--- 
a/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/IGisClient.java
+++ 
b/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/IGisClient.java
@@ -20,6 +20,7 @@
  */
 package org.apache.taverna.gis.client;
 
+import java.io.IOException;
 import java.net.URI;
 import java.util.HashMap;
 import java.util.List;
@@ -42,8 +43,11 @@ public interface IGisClient {
        
        public HashMap<String, Integer> getProcessOutputPorts(String processID);
        
-       public List<PortTypeDescriptor> getTaverna2InputPorts(String processID);
+       public List<IPortDataDescriptor> getTaverna2InputPorts(String 
processID);
        
-       public List<PortTypeDescriptor> getTaverna2OutputPorts(String 
processID);
+       public List<IPortDataDescriptor> getTaverna2OutputPorts(String 
processID);
+       
+       public HashMap<String, String> executeProcess(String processID, 
HashMap<String, IPortDataDescriptor> inputs) 
+                       throws Exception;
        
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-gis/blob/24e3b9d0/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/impl/GisClientNorthImpl.java
----------------------------------------------------------------------
diff --git 
a/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/impl/GisClientNorthImpl.java
 
b/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/impl/GisClientNorthImpl.java
index 514a54b..8d168c3 100644
--- 
a/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/impl/GisClientNorthImpl.java
+++ 
b/apache-taverna-plugin-gis-client/src/main/java/org/apache/taverna/gis/client/impl/GisClientNorthImpl.java
@@ -28,45 +28,48 @@ import java.util.HashMap;
 import java.util.List;
 
 import org.apache.log4j.Logger;
-import org.apache.taverna.gis.client.ComplexDataTypeDescriptor;
+import org.apache.taverna.gis.client.ComplexDataFormat;
+import org.apache.taverna.gis.client.ComplexPortDataDescriptor;
 import org.apache.taverna.gis.client.IGisClient;
-import org.apache.taverna.gis.client.PortDataType;
-import org.apache.taverna.gis.client.PortTypeDescriptor;
+import org.apache.taverna.gis.client.IPortDataDescriptor;
+import org.apache.taverna.gis.client.PortDataDescriptorFactory;
+import org.n52.wps.client.ExecuteRequestBuilder;
+import org.n52.wps.client.ExecuteResponseAnalyser;
 import org.n52.wps.client.WPSClientException;
 import org.n52.wps.client.WPSClientSession;
 
 import net.opengis.ows.x11.LanguageStringType;
-import net.opengis.wps.x100.CRSsType;
 import net.opengis.wps.x100.CapabilitiesDocument;
-import net.opengis.wps.x100.ComplexDataCombinationType;
-import net.opengis.wps.x100.ComplexDataCombinationsType;
-import net.opengis.wps.x100.ComplexDataDescriptionType;
+import net.opengis.wps.x100.DataType;
 import net.opengis.wps.x100.InputDescriptionType;
+import net.opengis.wps.x100.OutputDataType;
 import net.opengis.wps.x100.OutputDescriptionType;
 import net.opengis.wps.x100.ProcessBriefType;
 import net.opengis.wps.x100.ProcessDescriptionType;
 import net.opengis.wps.x100.ProcessDescriptionType.DataInputs;
 import net.opengis.wps.x100.WPSCapabilitiesType;
+import net.opengis.wps.x100.ExecuteDocument;
+import net.opengis.wps.x100.ExecuteResponseDocument;
 
 public class GisClientNorthImpl implements IGisClient {
 
        private Logger logger = Logger.getLogger(GisClientNorthImpl.class);
-       
+
        private URI serviceURI = null;
        private WPSClientSession wpsClient;
-       
+
        public GisClientNorthImpl(String serviceURL) {
                this.serviceURI = URI.create(serviceURL);
                wpsClient = WPSClientSession.getInstance();
-               
+
                try {
                        wpsClient.connect(serviceURI.toString());
                } catch (WPSClientException ex) {
                        logger.error("Failed to connect to service: " + 
serviceURI, ex);
                }
-               
+
        }
-       
+
        @Override
        public String getServiceCapabilities(URI serviceURI) {
 
@@ -74,7 +77,7 @@ public class GisClientNorthImpl implements IGisClient {
 
                LanguageStringType[] serviceAbstract = 
capabilities.getCapabilities().getServiceIdentification()
                                .getTitleArray();
-       
+
                if (serviceAbstract != null && serviceAbstract.length > 0)
                        return serviceAbstract[0].getStringValue();
                else
@@ -84,112 +87,101 @@ public class GisClientNorthImpl implements IGisClient {
        @Override
        public HashMap<String, Integer> getProcessInputPorts(String processID) {
                HashMap<String, Integer> inputPorts = new HashMap<String, 
Integer>();
-               
+
                ProcessDescriptionType processDescription = null;
-               
+
                try {
                        processDescription = 
wpsClient.getProcessDescription(serviceURI.toString(), processID);
                } catch (IOException ex) {
                        logger.error("Failed to list input ports for process: " 
+ processID, ex);
                }
 
-               if (processDescription==null)
+               if (processDescription == null)
                        return inputPorts;
-               
+
                DataInputs dataInputs = processDescription.getDataInputs();
-               
+
                if (dataInputs == null)
                        return inputPorts;
-               
+
                InputDescriptionType[] inputList = dataInputs.getInputArray();
 
                for (InputDescriptionType input : inputList) {
 
-                       // if compareTo returns 1 then first value is greater 
than 1. it means that there is more than one occurrence therefore the depth is 
more than 0
-                       int depth = 
((input.getMaxOccurs().compareTo(BigInteger.valueOf(1))==1) ? 1 : 0);
-                       
+                       // if compareTo returns 1 then first value is greater 
than 1. it
+                       // means that there is more than one occurrence 
therefore the depth
+                       // is more than 0
+                       int depth = 
((input.getMaxOccurs().compareTo(BigInteger.valueOf(1)) == 1) ? 1 : 0);
+
                        inputPorts.put(input.getIdentifier().getStringValue(), 
depth);
                }
-               
+
                return inputPorts;
-               
+
        }
 
        @Override
        public HashMap<String, Integer> getProcessOutputPorts(String processID) 
{
                HashMap<String, Integer> outputPorts = new HashMap<String, 
Integer>();
-               
+
                ProcessDescriptionType processDescription = null;
-               
+
                try {
                        processDescription = 
wpsClient.getProcessDescription(serviceURI.toString(), processID);
                } catch (IOException ex) {
                        logger.error("Failed to list processe output port for 
process: " + processID, ex);
                }
 
-               if (processDescription==null)
+               if (processDescription == null)
                        return outputPorts;
-               
+
                OutputDescriptionType[] outputList = 
processDescription.getProcessOutputs().getOutputArray();
 
                for (OutputDescriptionType output : outputList) {
 
                        // TODO: Calculate output depth
                        int depth = 0;
-                       
+
                        
outputPorts.put(output.getIdentifier().getStringValue(), depth);
                }
-               
+
                return outputPorts;
        }
-       
-       public List<PortTypeDescriptor> getTaverna2InputPorts(String processID)
-       {
-        
-               List<PortTypeDescriptor> inputPorts = new 
ArrayList<PortTypeDescriptor>();
-               
+
+       public List<IPortDataDescriptor> getTaverna2InputPorts(String 
processID) {
+
+               List<IPortDataDescriptor> inputPorts = new 
ArrayList<IPortDataDescriptor>();
+
                ProcessDescriptionType processDescription = null;
-               
+
                try {
                        processDescription = 
wpsClient.getProcessDescription(serviceURI.toString(), processID);
                } catch (IOException ex) {
                        logger.error("Failed to get process description for 
process: " + processID, ex);
                }
 
-               if (processDescription==null)
+               if (processDescription == null)
                        return inputPorts;
-               
+
                DataInputs dataInputs = processDescription.getDataInputs();
-               
+
                if (dataInputs == null)
                        return inputPorts;
-                                       
+
                InputDescriptionType[] inputList = dataInputs.getInputArray();
 
                for (InputDescriptionType input : inputList) {
-                       PortTypeDescriptor myNewInputPort = new 
PortTypeDescriptor();
-                       
-                       
myNewInputPort.setName(input.getIdentifier().getStringValue());
-                       myNewInputPort.setDepth(getInputPortDepth(input));
-                       myNewInputPort.setAllowLiteralValues(true);
-                       myNewInputPort.setHandledReferenceSchemes(null); // is 
not used in Taverna
-                       myNewInputPort.setTranslatedElementType(String.class);
-                       myNewInputPort.setPortDataType(getPortDataType(input));
-                       
myNewInputPort.setRequired(input.getMinOccurs().compareTo(BigInteger.valueOf(1))>0?true:false);
-                       
myNewInputPort.setSupportedComplexFormats(getInputPortSupportedComplexFormats(input));
-                       
myNewInputPort.setDefaultComplexFormat(getInputPortDefaultComplexFormat(input));
-                       
myNewInputPort.setSupportedBoundingBoxFormats(getInputPortSupportedBoundingBoxFormats(input));
-                       
myNewInputPort.setDefaultBoundingBoxFormat(getInputPortDefaultBoundingBoxFormats(input));
-                       
+                       IPortDataDescriptor myNewInputPort = 
PortDataDescriptorFactory.getInstance().getPortDataDescriptor(input);
+
                        inputPorts.add(myNewInputPort);
                }
-       
+
                return inputPorts;
        }
 
        @Override
-       public List<PortTypeDescriptor> getTaverna2OutputPorts(String 
processID) {
-               List<PortTypeDescriptor> outputPorts = new 
ArrayList<PortTypeDescriptor>();
+       public List<IPortDataDescriptor> getTaverna2OutputPorts(String 
processID) {
+               List<IPortDataDescriptor> outputPorts = new 
ArrayList<IPortDataDescriptor>();
 
                ProcessDescriptionType processDescription = null;
 
@@ -205,18 +197,7 @@ public class GisClientNorthImpl implements IGisClient {
                OutputDescriptionType[] outputList = 
processDescription.getProcessOutputs().getOutputArray();
 
                for (OutputDescriptionType output : outputList) {
-                       PortTypeDescriptor myNewOutputPort = new 
PortTypeDescriptor();
-
-                       
myNewOutputPort.setName(output.getIdentifier().getStringValue());
-                       myNewOutputPort.setDepth(0); // output port depth is 
always 1
-                       
-                       
myNewOutputPort.setPortDataType(getPortDataType(output));
-                       myNewOutputPort.setRequired(false);
-                       
myNewOutputPort.setSupportedComplexFormats(getOutputPortSupportedComplexFormats(output));
-                       
myNewOutputPort.setDefaultComplexFormat(getOutputPortDefaultComplexFormat(output));
-                       
myNewOutputPort.setSupportedBoundingBoxFormats(getOutputPortSupportedBoundingBoxFormats(output));
-                       
myNewOutputPort.setDefaultBoundingBoxFormat(getOutputPortDefaultBoundingBoxFormats(output));
-                       
+                       IPortDataDescriptor myNewOutputPort = 
PortDataDescriptorFactory.getInstance().getPortDataDescriptor(output);
                        outputPorts.add(myNewOutputPort);
                }
 
@@ -228,229 +209,160 @@ public class GisClientNorthImpl implements IGisClient {
                List<String> results = new ArrayList<String>();
 
                WPSCapabilitiesType wpsCapabilities = 
wpsClient.getWPSCaps(serviceURI.toString()).getCapabilities();
-               
+
                ProcessBriefType[] processList = 
wpsCapabilities.getProcessOfferings().getProcessArray();
-               
-               for( ProcessBriefType process: processList)
-               {
+
+               for (ProcessBriefType process : processList) {
                        results.add(process.getIdentifier().getStringValue());
                }
-               
+
                return results;
-               
-       }
 
-       private PortDataType getPortDataType(InputDescriptionType inputPort)
-       {
-               // set default dataType to literal data
-               PortDataType portDataType = PortDataType.LITERAL_DATA;
-               
-               if (inputPort.getLiteralData()!=null)
-                       return portDataType;
-               
-               if(inputPort.getComplexData()!=null)
-                       return PortDataType.COMPLEX_DATA;
-               
-               if(inputPort.getBoundingBoxData()!=null)
-                       return PortDataType.BOUNDING_BOX_DATA;
-               
-               return portDataType;
-               
        }
+
+       @Override
+       public HashMap<String, String> executeProcess(String processID, 
HashMap<String, IPortDataDescriptor> inputs)
+                       throws Exception {
+
+               HashMap<String, String> executeOutput = new HashMap<String, 
String>();
+
+               ProcessDescriptionType processDescription = null;
+
+               // Get process description
+               try {
+                       processDescription = 
wpsClient.getProcessDescription(serviceURI.toString(), processID);
+               } catch (IOException ex) {
+                       throw new Exception("Failed to get process description 
for process: " + processID, ex);
+               }
+
+               // Initialise execute builder
+               ExecuteRequestBuilder executeBuilder = new 
ExecuteRequestBuilder(processDescription);
+
+               boolean hasInput = true;
+
+               DataInputs dataInputs = processDescription.getDataInputs();
+
+               if (dataInputs == null)
+                       hasInput = false;
+
+               if (hasInput) {
+
+                       InputDescriptionType[] inputList = 
dataInputs.getInputArray();
+
+                       // TODO: Handle input when depth > 0
+                       // Provide user values for each service input
+                       for (InputDescriptionType input : inputList) {
+                               String inputName = 
input.getIdentifier().getStringValue();
+                               Object inputValue = 
inputs.containsKey(inputName)?inputs.get(inputName).getValue():null;
+
+                               // Check if input is required but not provided
+                               if (inputValue == null && 
input.getMinOccurs().intValue() > 0) {
+                                       throw new IOException("Required Input 
not set: " + inputName);
+                               }
+
+                               // Skip not user supplied optional inputs
+                               if (inputValue!=null)
+                               {
+                                       if (input.getLiteralData() != null) {
+                                               if (inputValue instanceof 
String) {
+                                                       
executeBuilder.addLiteralData(inputName, (String) inputValue);
+                                               }
        
-       private PortDataType getPortDataType(OutputDescriptionType outputPort)
-       {
-               // set default dataType to literal data
-               PortDataType portDataType = PortDataType.LITERAL_DATA;
-               
-               if (outputPort.getLiteralOutput()!=null)
-                       return portDataType;
-               
-               if(outputPort.getComplexOutput()!=null)
-                       return PortDataType.COMPLEX_DATA;
-               
-               if(outputPort.getBoundingBoxOutput()!=null)
-                       return PortDataType.BOUNDING_BOX_DATA;
-               
-               return portDataType;
-               
-       }
+                                       } else if (input.getComplexData() != 
null) {
        
-       /**
-        * @param input port
-        * @return List of supported formats
-        */
-       private List<ComplexDataTypeDescriptor> 
getInputPortSupportedComplexFormats(InputDescriptionType inputPort)
-       {
-               List<ComplexDataTypeDescriptor> supportedComplexFormats = new 
ArrayList<ComplexDataTypeDescriptor>();
-               
-               if (inputPort.getComplexData()==null)
-                       return supportedComplexFormats;
-               else
-               {
-                       ComplexDataCombinationsType complexDataSupportedTypes = 
inputPort.getComplexData().getSupported();
-                       
-                       if (complexDataSupportedTypes.sizeOfFormatArray()==0)
-                               return supportedComplexFormats;
-                       
-                       for(ComplexDataDescriptionType format : 
complexDataSupportedTypes.getFormatArray())
-                       {
-                               supportedComplexFormats.add(new 
ComplexDataTypeDescriptor(format.getMimeType(),format.getEncoding(), 
format.getSchema()));
-                       }
-               }
-               
-               return supportedComplexFormats;
-       }
+                                               // Check if the selected format 
(mimeType, encoding, schema)
+                                               // is supported by the service
+                                               ComplexPortDataDescriptor 
complexData = (ComplexPortDataDescriptor) inputs.get(inputName);
+                                               ComplexDataFormat 
selectedFormat = complexData.getComplexFormat();
        
-       private ComplexDataTypeDescriptor 
getInputPortDefaultComplexFormat(InputDescriptionType inputPort)
-       {
-               ComplexDataTypeDescriptor defaultFormat = null;
-               
-               if (inputPort.getComplexData()==null)
-                       if (inputPort.getComplexData().getDefault()!=null)
-                               
if(inputPort.getComplexData().getDefault().getFormat()!=null)
-                               {
-                                       ComplexDataDescriptionType 
outputDefaultFormat = inputPort.getComplexData().getDefault().getFormat();
-                                       defaultFormat = new 
ComplexDataTypeDescriptor(outputDefaultFormat.getMimeType(),outputDefaultFormat.getEncoding(),outputDefaultFormat.getSchema());
-                               }
-                                       
-               return defaultFormat;
-               
-       }
+                                               if 
(!complexData.getSupportedComplexFormats().contains(selectedFormat)) {
+                                                       throw new 
IllegalArgumentException(
+                                                                       
"Unsupported format: " + complexData.getComplexFormat().toString());
+                                               }
        
-       private List<String> 
getInputPortSupportedBoundingBoxFormats(InputDescriptionType inputPort)
-       {
-               List<String> supportedBoundingBoxFormats = new 
ArrayList<String>();
-               
-               if (inputPort.getBoundingBoxData()==null)
-                       return supportedBoundingBoxFormats;
-               else
-               {
-                       CRSsType boundingBoxDataSupportedTypes = 
inputPort.getBoundingBoxData().getSupported();
-                       
-                       if (boundingBoxDataSupportedTypes.sizeOfCRSArray()==0)
-                               return supportedBoundingBoxFormats;
-                       
-                       for(String format : 
boundingBoxDataSupportedTypes.getCRSArray())
-                       {
-                               supportedBoundingBoxFormats.add(format);
-                       }
-                       
-               }
-               
-               return supportedBoundingBoxFormats;
-
-       }
+                                               if (inputValue instanceof 
String) {
+                                                       // Check if complex 
data is provided by reference or by
+                                                       // value
+                                                       boolean isReference = 
true;
        
-       private String 
getInputPortDefaultBoundingBoxFormats(InputDescriptionType inputPort)
-       {
-               String defaultFormat = null;
-               
-               if (inputPort.getBoundingBoxData()==null)
-                       if (inputPort.getBoundingBoxData().getDefault()!=null)
-                               
if(inputPort.getBoundingBoxData().getDefault().getCRS()!=null)
-                               {
-                                       defaultFormat = 
inputPort.getBoundingBoxData().getDefault().getCRS();
-                               }
-                                       
-               return defaultFormat;
-               
-       }
+                                                       try {
+                                                               
URI.create((String) inputValue);
+                                                       } catch 
(IllegalArgumentException ex) {
+                                                               isReference = 
false;
+                                                       }
        
-       /**
-        * @param input port
-        * @return List of supported formats
-        */
-       private List<ComplexDataTypeDescriptor> 
getOutputPortSupportedComplexFormats(OutputDescriptionType outputPort)
-       {
-               List<ComplexDataTypeDescriptor> supportedComplexFormats = new 
ArrayList<ComplexDataTypeDescriptor>();
-               
-               if (outputPort.getComplexOutput()==null)
-                       return supportedComplexFormats;
-               else
-               {
-                       ComplexDataCombinationsType complexDataSupportedTypes = 
outputPort.getComplexOutput().getSupported();
-                       
-                       if (complexDataSupportedTypes.sizeOfFormatArray()==0)
-                               return supportedComplexFormats;
-                       
-                       for(ComplexDataDescriptionType format : 
complexDataSupportedTypes.getFormatArray())
-                       {
-                               supportedComplexFormats.add(new 
ComplexDataTypeDescriptor(format.getMimeType(),format.getEncoding(), 
format.getSchema()));
-                       }
-               }
-               
-               return supportedComplexFormats;
-       }
+                                                       if (isReference) {
+                                                               // complex data 
by reference
+                                                               
executeBuilder.addComplexDataReference(inputName, (String) inputValue,
+                                                                               
selectedFormat.getSchema(), selectedFormat.getEncoding(),
+                                                                               
selectedFormat.getMimeType());
+                                                       } else {
        
-       private ComplexDataTypeDescriptor 
getOutputPortDefaultComplexFormat(OutputDescriptionType outputPort)
-       {
-               ComplexDataTypeDescriptor defaultFormat = null;
-               
-               if (outputPort.getComplexOutput()==null)
-                       if (outputPort.getComplexOutput().getDefault()!=null)
-                               
if(outputPort.getComplexOutput().getDefault().getFormat()!=null)
-                               {
-                                       ComplexDataDescriptionType 
outputDefaultFormat = outputPort.getComplexOutput().getDefault().getFormat();
-                                       defaultFormat = new 
ComplexDataTypeDescriptor(outputDefaultFormat.getMimeType(),outputDefaultFormat.getEncoding(),outputDefaultFormat.getSchema());
-                               }
-                                       
-               return defaultFormat;
-               
-       }
+                                                               // complex data 
by value
+                                                               try {
        
-       private List<String> 
getOutputPortSupportedBoundingBoxFormats(OutputDescriptionType outputPort)
-       {
-               List<String> supportedBoundingBoxFormats = new 
ArrayList<String>();
-               
-               if (outputPort.getBoundingBoxOutput()==null)
-                       return supportedBoundingBoxFormats;
-               else
-               {
-                       CRSsType boundingBoxDataSupportedTypes = 
outputPort.getBoundingBoxOutput().getSupported();
-                       
-                       if (boundingBoxDataSupportedTypes.sizeOfCRSArray()==0)
-                               return supportedBoundingBoxFormats;
-                       
-                       for(String format : 
boundingBoxDataSupportedTypes.getCRSArray())
-                       {
-                               supportedBoundingBoxFormats.add(format);
-                       }
-                       
+                                                                       
executeBuilder.addComplexData(inputName, (String) inputValue,
+                                                                               
        selectedFormat.getSchema(), selectedFormat.getEncoding(),
+                                                                               
        selectedFormat.getMimeType());
+       
+                                                               } catch 
(WPSClientException e) {
+                                                                       throw 
new Exception("Failed to set complex data: " + processID, e);
+                                                               }
+                                                       }
+                                               }
+                                       } else if (input.getBoundingBoxData() 
!= null) {
+                                               // TODO: Handle BBox data
+                                       }
+                               }
+                               
+
+                       } // End input loop
+
                }
-               
-               return supportedBoundingBoxFormats;
+               ExecuteDocument execute = executeBuilder.getExecute();
+
+               execute.getExecute().setService("WPS");
+
+               Object responseObject = null;
+
+               try {
+                       // Execute service
+                       responseObject = 
wpsClient.execute(serviceURI.toString(), execute);
+               } catch (WPSClientException e) {
+                       throw new Exception(e.getServerException().xmlText());
+               }
+
+               // Register outputs
+               if (responseObject instanceof ExecuteResponseDocument) {
+                       ExecuteResponseDocument response = 
(ExecuteResponseDocument) responseObject;
+
+                       // analyser is used to get complex data
+                       ExecuteResponseAnalyser analyser = new 
ExecuteResponseAnalyser(execute, response, processDescription);
+
+                       for (OutputDataType output : 
response.getExecuteResponse().getProcessOutputs().getOutputArray()) {
+                               DataType data = output.getData();
+
+                               if (data.isSetLiteralData()) {
+
+                                       // simpleRef =
+                                       // 
referenceService.register(data.getLiteralData().getStringValue(),
+                                       // 0, true, context);
+
+                                       
executeOutput.put(output.getIdentifier().getStringValue(), 
data.getLiteralData().getStringValue());
+                               } else {
+
+                                       // simpleRef =
+                                       // 
referenceService.register(data.getComplexData().toString(),
+                                       // 0, true, context);
+
+                                       
executeOutput.put(output.getIdentifier().getStringValue(), 
data.getComplexData().toString());
 
-       }
-       
-       private String 
getOutputPortDefaultBoundingBoxFormats(OutputDescriptionType outputPort)
-       {
-               String defaultFormat = null;
-               
-               if (outputPort.getBoundingBoxOutput()==null)
-                       if 
(outputPort.getBoundingBoxOutput().getDefault()!=null)
-                               
if(outputPort.getBoundingBoxOutput().getDefault().getCRS()!=null)
-                               {
-                                       defaultFormat = 
outputPort.getBoundingBoxOutput().getDefault().getCRS();
                                }
-                                       
-               return defaultFormat;
-               
-       }
-       
-       /**
-        * @param inputPort
-        * @return
-        */
-       private int getInputPortDepth(InputDescriptionType inputPort)
-       {
-               // The input has cardinality (Min/Max Occurs) of 1 when it 
returns 1 value and greater than 1  when it 
-               // returns multiple values 
-               // if compareTo returns 1 then first value (MaxOccurs) is 
greater than 1. it means that there is more than one occurrence 
-               // therefore the depth is greater than 0
-               int depth = 
((inputPort.getMaxOccurs().compareTo(BigInteger.valueOf(1))==1) ? 1 : 0);
-               
-               return depth;
+
+                       }
+
+               }
+
+               return executeOutput;
        }
-       
 }


Reply via email to