if ( data.getLiteralData() != null ) {
LiteralDataType literal = data.getLiteralData();
decoded = ((LiteralPPIO)ppio).decode( literal.getValue() );
}
else if ( data.getComplexData() != null ) {
ComplexDataType complex = data.getComplexData();
decoded = complex.getData().get( 0 );
try {
decoded = ((ComplexPPIO)ppio).decode( decoded );
}
catch (Exception e) {
throw new WPSException( "Unable to decode input: " + input.getIdentifier().getValue() );
}
}
}
//decode the input
inputs.put( p.key, decoded );
}
//execute the process
Map<String,Object> result = null;
Throwable error = null;
try {
Process p = pf.create(processName);
result = p.execute( inputs, null );
}
catch( Throwable t ) {
//save the error to report back
error = t;
}
//build the response
Wps10Factory f = Wps10Factory.eINSTANCE;
ExecuteResponseType response = f.createExecuteResponseType();
response.setLang("en");
response.setServiceInstance(ResponseUtils.appendQueryString(ResponseUtils.buildURL(request.getBaseUrl(), "ows", null, URLType.SERVICE), ""));
//process
final ProcessBriefType process = f.createProcessBriefType();
response.setProcess( process );
process.setIdentifier(ct);
process.setProcessVersion(pf.getVersion(processName));
process.setTitle( Ows11Util.languageString( pf.getTitle(processName).toString() ) );
process.setAbstract( Ows11Util.languageString( pf.getDescription(processName).toString() ) );
//status
response.setStatus( f.createStatusType() );
response.getStatus().setCreationTime( Converters.convert( started, XMLGregorianCalendar.class ));
if ( error != null ) {
ProcessFailedType failure = f.createProcessFailedType();
response.getStatus().setProcessFailed( failure );
failure.setExceptionReport( Ows11Util.exceptionReport( new ServiceException( error ), wps.getGeoServer().getGlobal().isVerboseExceptions()) );
}
else {
response.getStatus().setProcessSucceeded( "Process succeeded.");
}
//inputs
response.setDataInputs( f.createDataInputsType1() );
for ( Iterator i = request.getDataInputs().getInput().iterator(); i.hasNext(); ) {
InputType input = (InputType) i.next();
response.getDataInputs().getInput().add( EMFUtils.clone( input, f, true ) );
}
//output definitions
OutputDefinitionsType outputs = f.createOutputDefinitionsType();
response.setOutputDefinitions( outputs );
Map<String,Parameter<?>> outs = pf.getResultInfo(processName, null);
Map<String,ProcessParameterIO> ppios = new HashMap();
for ( String key : result.keySet() ) {
Parameter p = pf.getResultInfo(processName, null).get( key );
if ( p == null ) {
throw new WPSException( "No such output: " + key );
}
//find the ppio
ProcessParameterIO ppio = ProcessParameterIO.find( p, context );
if ( ppio == null ) {
throw new WPSException( "Unable to encode output: " + p.key );
}
ppios.put( p.key, ppio );
DocumentOutputDefinitionType output = f.createDocumentOutputDefinitionType();
outputs.getOutput().add( output );
output.setIdentifier( Ows11Util.code( p.key ) );
if ( ppio instanceof ComplexPPIO ) {
output.setMimeType( ((ComplexPPIO) ppio).getMimeType() );
}
//TODO: encoding + schema
}
//process outputs
ProcessOutputsType1 processOutputs = f.createProcessOutputsType1();
response.setProcessOutputs( processOutputs );
for ( String key : result.keySet() ) {
OutputDataType output = f.createOutputDataType();
output.setIdentifier(Ows11Util.code(key));
output.setTitle(Ows11Util.languageString(pf.getResultInfo(processName, null).get( key ).description));
processOutputs.getOutput().add( output );
final Object o = result.get( key );
ProcessParameterIO ppio = ppios.get( key );
if ( ppio instanceof ReferencePPIO ) {
//encode as a reference
OutputReferenceType ref = f.createOutputReferenceType();
output.setReference( ref );
//TODO: mime type
ref.setHref( ((ReferencePPIO) ppio).encode(o).toString() );
}
else {
//encode as data
DataType data = f.createDataType();
output.setData( data );
if ( ppio instanceof LiteralPPIO ) {
LiteralDataType literal = f.createLiteralDataType();
data.setLiteralData( literal );
literal.setValue( ((LiteralPPIO) ppio).encode( o ) );
}
else if ( ppio instanceof ComplexPPIO ) {
ComplexDataType complex = f.createComplexDataType();
data.setComplexData( complex );
ComplexPPIO cppio = (ComplexPPIO) ppio;
complex.setMimeType( cppio.getMimeType() );
if ( cppio instanceof XMLPPIO ) {
//encode directly
complex.getData().add(
new ComplexDataEncoderDelegate( (XMLPPIO) cppio, o )
);
}
else {
//TODO: handle other content types, perhaps as CDATA