/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.tutorial.process;
import java.util.HashMap;
import java.util.Map;
import org.geotools.process.ProcessFactory;
import org.geotools.process.impl.AbstractProcess;
import org.geotools.text.Text;
import org.geotools.util.NullProgressListener;
import org.opengis.util.ProgressListener;
import com.vividsolutions.jts.geom.Geometry;
/**
* Process for adding a buffer around a geometry
*
* @author gdavis
*/
class BufferProcess extends AbstractProcess {
private boolean started = false;
public BufferProcess(BufferFactory bufferFactory) {
super(bufferFactory);
}
public ProcessFactory getFactory() {
return factory;
}
public Map<String, Object> execute(Map<String, Object> input, ProgressListener monitor) {
if (started)
throw new IllegalStateException("Process can only be run once");
started = true;
if (monitor == null)
monitor = new NullProgressListener();
try {
monitor.started();
monitor.setTask(Text.text("Grabbing arguments"));
monitor.progress(10.0f);
Object value = input.get(BufferFactory.GEOM1.key);
if (value == null) {
throw new NullPointerException("geom1 parameter required");
}
if (!(value instanceof Geometry)) {
throw new ClassCastException("geom1 requied Geometry, not " + value);
}
Geometry geom1 = (Geometry) value;
value = input.get(BufferFactory.BUFFER.key);
if (value == null) {
throw new ClassCastException("geom1 requied Geometry, not " + value);
}
if (!(value instanceof Number)) {
throw new ClassCastException("buffer requied number, not " + value);
}
Double buffer = ((Number) value).doubleValue();
monitor.setTask(Text.text("Processing Buffer"));
monitor.progress(25.0f);
if (monitor.isCanceled()) {
return null; // user has canceled this operation
}
Geometry resultGeom = geom1.buffer(buffer);
monitor.setTask(Text.text("Encoding result"));
monitor.progress(90.0f);
Map<String, Object> result = new HashMap<String, Object>();
result.put(BufferFactory.RESULT.key, resultGeom);
monitor.complete(); // same as 100.0f
return result;
} catch (Exception eek) {
monitor.exceptionOccurred(eek);
return null;
} finally {
monitor.dispose();
}
}
}