/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.script.js;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import org.geoserver.data.test.MockData;
import org.geoserver.data.util.IOUtils;
import org.geoserver.script.ScriptIntTestSupport;
import org.geoserver.script.function.ScriptFunctionFactory;
import org.geotools.data.DataUtilities;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Function;
import org.opengis.filter.expression.PropertyName;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.geom.PrecisionModel;
public class JavaScriptFunctionTest extends ScriptIntTestSupport {
ScriptFunctionFactory functionFactory;
@Override
protected void populateDataDirectory(MockData dataDirectory) throws Exception {
File fromDir = DataUtilities.urlToFile(getClass().getResource("scripts"));
File toDir = new File(dataDirectory.getDataDirectoryRoot(), "scripts");
IOUtils.deepCopy(fromDir, toDir);
super.populateDataDirectory(dataDirectory);
}
@Override
protected void oneTimeSetUp() throws Exception {
super.oneTimeSetUp();
functionFactory = new ScriptFunctionFactory(getScriptManager());
}
@SuppressWarnings("unchecked")
public void testFactorial() {
Function factorial = functionFactory.function("factorial", Collections.EMPTY_LIST, null);
assertNotNull(factorial);
assertEquals(120, ((Number) factorial.evaluate(5)).intValue());
// confirm we can do repeat calls
assertEquals(720, ((Number) factorial.evaluate(6)).intValue());
}
public void testBuffer() {
SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setCRS(null);
builder.add("geometry", Polygon.class);
builder.add("distance", Float.class);
builder.setName("schema");
SimpleFeatureType schema = builder.buildFeatureType();
Coordinate[] coords = new Coordinate[5];
coords[0] = new Coordinate(0, 0);
coords[1] = new Coordinate(10, 0);
coords[2] = new Coordinate(10, 10);
coords[3] = new Coordinate(0, 10);
coords[4] = new Coordinate(0, 0);
Object[] attributes = new Object[2];
GeometryFactory gf = new GeometryFactory(new PrecisionModel());
LinearRing ring = gf.createLinearRing(coords);
attributes[0] = gf.createPolygon(ring, null);
attributes[1] = new Float(100.0);
SimpleFeature feature = SimpleFeatureBuilder.build(schema, attributes, null);
FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory(null);
PropertyName geometryProperty = filterFactory.property("geometry");
PropertyName distanceProperty = filterFactory.property("distance");
Expression[] expressions = new Expression[] {geometryProperty, distanceProperty};
Function buffer = functionFactory.function("buffer", Arrays.asList(expressions), null);
assertNotNull(buffer);
Object result = buffer.evaluate(feature);
assertTrue(result instanceof Polygon);
assertTrue(((Polygon) result).getArea() > 35314);
}
}