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; } - }
