Author: jgarnett Date: 2008-05-29 07:35:02 -0700 (Thu, 29 May 2008) New Revision: 30453 Added: trunk/modules/library/main/src/main/java/org/geotools/filter/FallbackFunction.java Modified: trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionExpressionImpl.java trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionFinder.java trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java trunk/modules/library/main/src/main/java/org/geotools/filter/function/ClassificationFunction.java trunk/modules/library/main/src/main/java/org/geotools/filter/function/Collection_MaxFunction.java trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/data/ArcSDEJavaApiTest.java Log: Support fallbackvalue at a geotools implementation level; not pretty but it works. We can now represent *any* function - even one we don't have an implementation for. Fallback value will be making an appearance in SE 1.1 Added: trunk/modules/library/main/src/main/java/org/geotools/filter/FallbackFunction.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/filter/FallbackFunction.java 2008-05-29 14:15:03 UTC (rev 30452) +++ trunk/modules/library/main/src/main/java/org/geotools/filter/FallbackFunction.java 2008-05-29 14:35:02 UTC (rev 30453) @@ -0,0 +1,36 @@ +package org.geotools.filter; + +import java.util.List; + +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.filter.expression.Function; +import org.opengis.filter.expression.Literal; + +/** + * A placeholder class used to track a function the user requested + * that is not supported by our java implementation. + * <p> + * This can be used to construct expressions that are to be executed + * by another systems (say as SQL or as a WFS request). + * + * @author Jody Garnett + */ +public class FallbackFunction extends FunctionExpressionImpl { + + protected FallbackFunction(String name, List params, Literal fallback) { + super(name, fallback); + this.setParameters(params); + } + public int getArgCount() { + return 0; + } + @Override + public Object evaluate(Object object) { + return fallback.evaluate(object); + } + @SuppressWarnings("unchecked") + @Override + public Object evaluate(Object object, Class context) { + return fallback.evaluate( object, context ); + } +} Modified: trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionExpressionImpl.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionExpressionImpl.java 2008-05-29 14:15:03 UTC (rev 30452) +++ trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionExpressionImpl.java 2008-05-29 14:35:02 UTC (rev 30453) @@ -25,6 +25,7 @@ import org.geotools.filter.Expression; import org.opengis.filter.expression.ExpressionVisitor; import org.opengis.filter.expression.Function; +import org.opengis.filter.expression.Literal; /** * Abstract class for a function expression implementation @@ -36,15 +37,22 @@ extends org.geotools.filter.DefaultExpression implements FunctionExpression { /** function name **/ - String name; + protected String name; + /** function params **/ - List params; + protected List params; + protected Literal fallback; + + protected FunctionExpressionImpl(String name ){ + this( name, null ); + } /** * Creates a new instance of FunctionExpression */ - protected FunctionExpressionImpl(String name) { + protected FunctionExpressionImpl(String name, Literal fallback) { this.name = name; + this.fallback = fallback; params = new ArrayList(); } @@ -74,6 +82,12 @@ this.name = name; } + public Literal getFallbackValue() { + return fallback; + } + public void setFallbackValue(Literal fallback) { + this.fallback = fallback; + } /** * Returns the function parameters. */ Modified: trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionFinder.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionFinder.java 2008-05-29 14:15:03 UTC (rev 30452) +++ trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionFinder.java 2008-05-29 14:35:02 UTC (rev 30453) @@ -8,7 +8,9 @@ import org.geotools.factory.CommonFactoryFinder; import org.geotools.factory.Hints; +import org.geotools.filter.function.ClassificationFunction; import org.opengis.filter.expression.Function; +import org.opengis.filter.expression.Literal; /** * Isolate function lookup code from Factory implementation(s). @@ -35,6 +37,45 @@ return findFunction(name, null); } + /** + * Look up a function for the provided name, may return a FallbackFunction if + * an implementation could not be found. + * <p> + * You can create a function to represent an SQL function or a function hosted on + * an external service; the fallback value will be used if you evulate + * by a Java implementation on the classpath. + * @param name Function name; this will need to be an exact match + * @param parameters Set of Expressions to use as function parameters + * @param fallbackValue Literal to use if an implementation could not be found + * @return Function for the provided name, may be a FallbackFunction if an implementation could not be found + */ + public Function findFunction(String name, List parameters, Literal fallbackValue ){ + try { + Function function = findFunction( name, parameters ); + if( function instanceof FunctionImpl){ + FunctionImpl functionImpl = (FunctionImpl) function; + functionImpl.setFallbackValue( fallbackValue ); + } + if( function instanceof ClassificationFunction){ + ClassificationFunction classification = (ClassificationFunction) function; + classification.setFallbackValue( fallbackValue ); + } + return function; + } + catch( RuntimeException notFound ){ + // could not find an implementation + return new FallbackFunction( name, parameters, fallbackValue ); + } + } + + /** + * Look up a function for the provided name. + * + * @param name Function name; this will need to be an exact match + * @param parameters Set of parameters required + * @return Generated function + * @throws a RuntimeException if an implementation for name could not be found + */ public Function findFunction(String name, List/* <Expression> */parameters) { name = functionName(name); @@ -45,7 +86,6 @@ if (functionExpressionCache == null) { functionExpressionCache = new HashMap(); functionImplCache = new HashMap(); - Set functions = CommonFactoryFinder.getFunctionExpressions( null ); for (Iterator it = functions.iterator(); it.hasNext();) { Modified: trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java 2008-05-29 14:15:03 UTC (rev 30452) +++ trunk/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java 2008-05-29 14:35:02 UTC (rev 30453) @@ -4,6 +4,8 @@ import org.geotools.filter.expression.ExpressionAbstract; import org.opengis.filter.expression.Function; +import org.opengis.filter.expression.Literal; +import org.opengis.filter.expression.Expression; /** * @@ -16,8 +18,10 @@ String name; /** function params **/ - List params; + List<Expression> params; + Literal fallbackValue; + /** * Gets the name of this function. * @@ -38,15 +42,22 @@ /** * Returns the function parameters. */ - public List getParameters() { + public List<Expression> getParameters() { return params; } /** * Sets the function parameters. */ - public void setParameters(List params) { + public void setParameters(List<Expression> params) { this.params = params; } + public void setFallbackValue(Literal fallbackValue) { + this.fallbackValue = fallbackValue; + } + + public Literal getFallbackValue() { + return fallbackValue; + } } Modified: trunk/modules/library/main/src/main/java/org/geotools/filter/function/ClassificationFunction.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/filter/function/ClassificationFunction.java 2008-05-29 14:15:03 UTC (rev 30452) +++ trunk/modules/library/main/src/main/java/org/geotools/filter/function/ClassificationFunction.java 2008-05-29 14:35:02 UTC (rev 30453) @@ -32,6 +32,7 @@ import org.geotools.util.ProgressListener; import org.opengis.feature.simple.SimpleFeature; import org.opengis.filter.expression.ExpressionVisitor; +import org.opengis.filter.expression.Literal; /** * Parent for classifiers which break a feature collection into the specified number of classes. @@ -50,6 +51,8 @@ /** function params **/ List params = new ArrayList(2); + Literal fallback; + ProgressListener progress; /** Creates a new instance of ClassificationFunction. Subclasses should call setName */ @@ -76,6 +79,13 @@ public abstract Object evaluate(Object arg); + public void setFallbackValue(Literal fallback) { + this.fallback = fallback; + } + public Literal getFallbackValue() { + return fallback; + } + /** * @deprecated please use getParameters */ Modified: trunk/modules/library/main/src/main/java/org/geotools/filter/function/Collection_MaxFunction.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/filter/function/Collection_MaxFunction.java 2008-05-29 14:15:03 UTC (rev 30452) +++ trunk/modules/library/main/src/main/java/org/geotools/filter/function/Collection_MaxFunction.java 2008-05-29 14:35:02 UTC (rev 30453) @@ -46,6 +46,7 @@ */ public class Collection_MaxFunction extends FunctionExpressionImpl implements FunctionExpression { + /** The logger for the filter module. */ private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger( "org.geotools.filter.function"); Modified: trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/data/ArcSDEJavaApiTest.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/data/ArcSDEJavaApiTest.java 2008-05-29 14:15:03 UTC (rev 30452) +++ trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/data/ArcSDEJavaApiTest.java 2008-05-29 14:35:02 UTC (rev 30453) @@ -424,7 +424,7 @@ public void testCalculateBoundsMixedFilter() throws Exception { final String typeName = testData.getTempTableName(); - try { + //try { String where = "INT32_COL < 5"; String[] cols = { "SHAPE" }; final SeFilter[] spatFilters; @@ -469,11 +469,11 @@ assertEquals(170D, maxX, 1E-9); assertEquals(80D, maxY, 1E-9); - } catch (SeException e) { - LOGGER.warning(e.getSeError().getErrDesc()); - new ArcSdeException(e).printStackTrace(); - throw e; - } +// } catch (SeException e) { +// LOGGER.warning(e.getSeError().getErrDesc()); +// new ArcSdeException(e).printStackTrace(); +// throw e; +// } } /** |