/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wps.executor;
import net.opengis.wcs11.GetCoverageType;
import net.opengis.wps10.InputReferenceType;
import net.opengis.wps10.InputType;
import net.opengis.wps10.MethodType;
import org.geoserver.ows.KvpRequestReader;
import org.geoserver.wcs.WebCoverageService100;
import org.geoserver.wcs.WebCoverageService111;
import org.geoserver.wcs2_0.WebCoverageService20;
import org.geoserver.wps.WPSException;
import org.geoserver.wps.ppio.ProcessParameterIO;
import org.opengis.util.ProgressListener;
import org.springframework.context.ApplicationContext;
/**
* Handles an internal reference to a local Coverage by a WCS request
*
* @author Andrea Aime - GeoSolutions
*/
public class InternalWCSInputProvider extends AbstractInputProvider {
private ApplicationContext context;
public InternalWCSInputProvider(InputType input, ProcessParameterIO ppio,
ApplicationContext context) {
super(input, ppio);
this.context = context;
}
@Override
protected Object getValueInternal(ProgressListener listener) throws Exception {
// first parse the request, it might be a WCS 1.0 or a WCS 1.1 one
Object getCoverage = null;
InputReferenceType ref = input.getReference();
if (ref.getMethod() == MethodType.POST_LITERAL) {
getCoverage = ref.getBody();
} else {
// what WCS version?
String version = getVersion(ref.getHref());
KvpRequestReader reader;
if ("1.0.0".equals(version) || "1.0".equals(version)) {
reader = (KvpRequestReader) context.getBean("wcs100GetCoverageRequestReader");
} else if ("2.0.1".equals(version) || "2.0.0".equals(version)) {
reader = (KvpRequestReader) context.getBean("wcs20getCoverageKvpParser");
} else {
reader = (KvpRequestReader) context.getBean("wcs111GetCoverageRequestReader");
}
getCoverage = kvpParse(ref.getHref(), reader);
}
// perform GetCoverage
if (getCoverage instanceof GetCoverageType) {
WebCoverageService111 wcs = (WebCoverageService111) context
.getBean("wcs111ServiceTarget");
return wcs.getCoverage((net.opengis.wcs11.GetCoverageType) getCoverage)[0];
} else if (getCoverage instanceof net.opengis.wcs10.GetCoverageType) {
WebCoverageService100 wcs = (WebCoverageService100) context
.getBean("wcs100ServiceTarget");
return wcs.getCoverage((net.opengis.wcs10.GetCoverageType) getCoverage)[0];
} else if (getCoverage instanceof net.opengis.wcs20.GetCoverageType) {
WebCoverageService20 wcs = (WebCoverageService20) context
.getBean("wcs20ServiceTarget");
return wcs.getCoverage((net.opengis.wcs20.GetCoverageType) getCoverage);
}
else {
throw new WPSException("Unrecognized request type " + getCoverage);
}
}
@Override
public int longStepCount() {
return 0;
}
}