mimeType = getOutputMimeType(key);
}
ProcessParameterIO ppio = ProcessParameterIO.find(outputParam, context, mimeType);
if (ppio == null) {
throw new WPSException("Don't know how to encode output " + key + " in mime type "
+ mimeType);
}
try {
if (reference && ppio instanceof ComplexPPIO) {
// encode as reference
OutputReferenceType outputReference = f.createOutputReferenceType();
output.setReference(outputReference);
ComplexPPIO cppio = (ComplexPPIO) ppio;
File file = resourceManager.getOutputFile(executionId, key + "." + cppio.getFileExtension());
// write out the file
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
cppio.encode(o, fos);
} finally {
IOUtils.closeQuietly(fos);
}
// create the link
Map<String, String> kvp = new LinkedHashMap<String, String>();
kvp.put("service", "WPS");
kvp.put("version", "1.0.0");
kvp.put("request", "GetExecutionResult");
kvp.put("executionId", executionId);
kvp.put("outputId", file.getName());
if(o instanceof RawData) {
RawData rawData = (RawData) o;
kvp.put("mimetype", rawData.getMimeType());
} else {
kvp.put("mimetype", cppio.getMimeType());
}
outputReference.setHref(ResponseUtils.buildURL(request.getBaseUrl(), "ows", kvp, URLType.SERVICE));
outputReference.setMimeType(cppio.getMimeType());
} 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 BoundingBoxPPIO) {
BoundingBoxType bbox = ((BoundingBoxPPIO) ppio).encode(o);
data.setBoundingBoxData(bbox);
} else if (ppio instanceof ComplexPPIO) {
ComplexDataType complex = f.createComplexDataType();
data.setComplexData(complex);
ComplexPPIO cppio = (ComplexPPIO) ppio;
complex.setMimeType(cppio.getMimeType());
if (cppio instanceof RawDataPPIO) {
RawData rawData = (RawData) o;
complex.setMimeType(rawData.getMimeType());
complex.setEncoding("base64");
complex.getData().add(new RawDataEncoderDelegate(rawData));
} else if (cppio instanceof XMLPPIO) {
// encode directly
complex.getData().add(new XMLEncoderDelegate((XMLPPIO) cppio, o));
} else if (cppio instanceof CDataPPIO) {
complex.getData().add(new CDataEncoderDelegate((CDataPPIO) cppio, o));
} else if (cppio instanceof BinaryPPIO) {
complex.setEncoding("base64");
complex.getData().add(new BinaryEncoderDelegate((BinaryPPIO) cppio, o));
} else {
throw new WPSException("Don't know how to encode an output whose PPIO is "
+ cppio);
}
}
}
} catch (Exception e) {
throw new WPSException("Failed to encode the " + key + " output", e);
}
return output;
}