/* Copyright (c) 2001 - 2011 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.wps.executor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.opengis.wps10.DocumentOutputDefinitionType;
import net.opengis.wps10.ExecuteType;
import net.opengis.wps10.InputType;
import org.eclipse.emf.common.util.EList;
import org.geoserver.ows.Ows11Util;
import org.geoserver.wps.WPSException;
import org.geoserver.wps.ppio.ProcessParameterIO;
import org.geotools.data.Parameter;
import org.geotools.process.ProcessFactory;
import org.geotools.process.Processors;
import org.opengis.feature.type.Name;
/**
* Centralizes some common request parsing activities
*
* @author Andrea Aime - GeoSolutions
*
*/
public class ExecuteRequest {
ExecuteType request;
public ExecuteRequest(ExecuteType request) {
this.request = request;
}
/**
* The wrapped WPS 1.0 request
*
* @return
*/
public ExecuteType getRequest() {
return request;
}
/**
* True if the request is asynchronous
*
* @return
*/
public boolean isAsynchronous() {
return request.getResponseForm() != null
&& request.getResponseForm().getResponseDocument() != null
&& request.getResponseForm().getResponseDocument().isStoreExecuteResponse();
}
/**
* Returns true if status update is requested
*
* @return
*/
public boolean isStatusEnabled() {
return isAsynchronous() && request.getResponseForm().getResponseDocument().isStatus();
}
/**
* Returns the process name according to the GeoTools API
*
* @return
*/
public Name getProcessName() {
return Ows11Util.name(request.getIdentifier());
}
/**
* Returns the process inputs according to the GeoTools API expectations
*
* @param request
* @return
*/
public LazyInputMap getProcessInputs(WPSExecutionManager manager) {
// get the input descriptors
Name processName = Ows11Util.name(request.getIdentifier());
ProcessFactory pf = Processors.createProcessFactory(processName);
if(pf == null) {
throw new WPSException("Unknown process " + processName);
}
final Map<String, Parameter<?>> parameters = pf.getParameterInfo(processName);
// turn them into a map of input providers
Map<String, InputProvider> providers = new HashMap<String, InputProvider>();
for (Iterator i = request.getDataInputs().getInput().iterator(); i.hasNext();) {
InputType input = (InputType) i.next();
String inputId = input.getIdentifier().getValue();
// locate the parameter for this request
Parameter p = parameters.get(inputId);
if (p == null) {
throw new WPSException("No such parameter: " + inputId);
}
// find the ppio
String mime = null;
if (input.getData() != null && input.getData().getComplexData() != null) {
mime = input.getData().getComplexData().getMimeType();
} else if (input.getReference() != null) {
mime = input.getReference().getMimeType();
}
ProcessParameterIO ppio = ProcessParameterIO.find(p, manager.applicationContext, mime);
if (ppio == null) {
throw new WPSException("Unable to decode input: " + inputId);
}
// build the provider
InputProvider provider = new SimpleInputProvider(input, ppio, manager,
manager.applicationContext);
// store the input
if (p.maxOccurs > 1) {
ListInputProvider lp = (ListInputProvider) providers.get(p.key);
if (lp == null) {
lp = new ListInputProvider(provider);
providers.put(p.key, lp);
} else {
lp.add(provider);
}
} else {
providers.put(p.key, provider);
}
}
return new LazyInputMap(providers);
}
public boolean isLineageRequested() {
return request.getResponseForm() != null
&& request.getResponseForm().getResponseDocument() != null
&& request.getResponseForm().getResponseDocument().isLineage();
}
/**
* Returns null if nothing specific was requested, the list otherwise
* @return
*/
public List<DocumentOutputDefinitionType> getRequestedOutputs() {
// in case nothing specific was requested
if (request.getResponseForm() == null
|| request.getResponseForm().getResponseDocument() == null
|| request.getResponseForm().getResponseDocument().getOutput() == null) {
return null;
}
List<DocumentOutputDefinitionType> result = new ArrayList<DocumentOutputDefinitionType>();
EList outputs = request.getResponseForm().getResponseDocument().getOutput();
for (Object output : outputs) {
result.add((DocumentOutputDefinitionType) output);
}
return result;
}
}