/* Copyright (c) 2001 - 2013 OpenPlans - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wps.response;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;
import org.geoserver.ows.Response;
import org.geoserver.platform.Operation;
import org.geoserver.wps.GetExecutionResultType;
import org.geoserver.wps.GetExecutionStatusType;
import org.geoserver.wps.WPSException;
import org.geoserver.wps.WPSStorageCleaner;
/**
* Stored file response (for the status and resource operations)
*
* @author Andrea Aime - GeoSolutions
*/
public class StoredFileResponse extends Response {
WPSStorageCleaner cleaner;
public StoredFileResponse(WPSStorageCleaner cleaner) {
super(File.class);
this.cleaner = cleaner;
}
@Override
public boolean canHandle(Operation operation) {
String operationId = operation.getId();
return ("GetExecutionStatus".equalsIgnoreCase(operationId) || "GetExecutionResult"
.equalsIgnoreCase(operationId))
&& operation.getService().getId().equals("wps");
}
public String getMimeType(Object value, Operation operation) {
Object request = operation.getParameters()[0];
if(request instanceof GetExecutionStatusType) {
return "text/xml";
} else if(request instanceof GetExecutionResultType) {
GetExecutionResultType ger = (GetExecutionResultType) request;
if(ger.getMimeType() != null) {
return ger.getMimeType();
} else {
// generic binary output...
return "application/octet-stream";
}
} else {
throw new WPSException("Trying to get a mime type for a unknown operation, " +
"we should not have got here in the first place");
}
}
@Override
public String getAttachmentFileName(Object value, Operation operation) {
Object request = operation.getParameters()[0];
if(request instanceof GetExecutionStatusType) {
return "text/xml";
} else if(request instanceof GetExecutionResultType) {
GetExecutionResultType ger = (GetExecutionResultType) request;
if(ger.getOutputId() != null) {
return ger.getOutputId();
} else {
// we should really never get here, the request should fail before
return "result.dat";
}
} else {
throw new WPSException("Trying to get a file name for a unknown operation, " +
"we should not have got here in the first place");
}
}
public void write(Object value, OutputStream output, Operation operation) throws IOException {
File file = (File) value;
FileInputStream fos = null;
try {
cleaner.lock(file);
fos = new FileInputStream(file);
IOUtils.copy(fos, output);
} finally {
cleaner.unlock(file);
IOUtils.closeQuietly(fos);
}
}
}