/* Copyright (c) 2001 - 2007 TOPP - 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.sextante;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.geotools.process.Process;
import org.opengis.util.ProgressListener;
import es.unex.sextante.core.GeoAlgorithm;
import es.unex.sextante.core.ITaskMonitor;
import es.unex.sextante.core.OutputObjectsSet;
import es.unex.sextante.core.ParametersSet;
import es.unex.sextante.dataObjects.IDataObject;
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
import es.unex.sextante.exceptions.WrongParameterIDException;
import es.unex.sextante.geotools.GTOutputFactory;
import es.unex.sextante.outputs.Output;
import es.unex.sextante.parameters.Parameter;
import es.unex.sextante.rasterWrappers.GridExtent;
public class SextanteProcess implements Process{
/**
* A constant to use as a key to identify the output grid extent
* as another input parameter of the process. In a SEXTANTE
* algorithm this is not a parameter included in the parameters set.
*/
public static final Object GRID_EXTENT = "GRID_EXTENT";
private GeoAlgorithm m_Algorithm;
/**
* Constructs a new process based on a SEXTANTE geoalgorithm
* @param algorithm the SEXTANTE geoalgorithm
*/
public SextanteProcess(GeoAlgorithm algorithm) {
m_Algorithm = algorithm;
}
public Map<String, Object> execute(Map<String, Object> input,
ProgressListener monitor) {
ITaskMonitor taskMonitor = new ProgressListenerTaskMonitor(monitor);
try {
setAlgorithmInputs(input);
/*
* Execute the algorithm
* The output factory tells the algorithm how to create
* new data objects (layers and tables)
* Since we are working with GeoTools , we use the
* GTOutputFactory, which creates objects based on geotools
* data objects (DataStore and GridCoverage)
*/
if (m_Algorithm.execute(taskMonitor, new GTOutputFactory())){
return createReturnMapFromOutputObjects();
}
else{
//if the execution was canceled, we return null
return null;
}
} catch (GeoAlgorithmExecutionException e) {
e.printStackTrace();
return null;
}
}
/**
* Creates a suitable return map for this process
* from the outputs generated by the SEXTANTE algorithm
* @return a map with algorithm results
*/
private Map<String, Object> createReturnMapFromOutputObjects() {
Map<String, Object> results = new HashMap<String, Object>();
OutputObjectsSet outputs = m_Algorithm.getOutputObjects();
for (int i = 0; i < outputs.getOutputObjectsCount(); i++) {
Output output = outputs.getOutput(i);
Object outputObject = output.getOutputObject();
// if the output object is a layer or a table, we return
// the inner GeoTools object
if (outputObject instanceof IDataObject){
IDataObject dataObject = (IDataObject) outputObject;
results.put(output.getName(), dataObject.getBaseDataObject());
}
else{
results.put(output.getName(), outputObject);
}
}
return results;
}
/**
* Sets the input of the SEXTANTE algorithm from the input map
* of this process
* @param input the input map of this process
* @throws WrongParameterIDException
*/
private void setAlgorithmInputs(Map<String, Object> input)
throws WrongParameterIDException {
ParametersSet paramSet = (ParametersSet) m_Algorithm.getParameters();
Set<String> keys = input.keySet();
Iterator<String> iter = keys.iterator();
while(iter.hasNext()){
String sKey = iter.next();
if (!sKey.equals(GRID_EXTENT)){
Object paramValue = input.get(sKey);
Parameter param = paramSet.getParameter(sKey);
param.setParameterValue(paramValue);
}
GridExtent ge = (GridExtent) input.get(GRID_EXTENT);
m_Algorithm.setGridExtent(ge);
}
}
}