package org.mapfish.print.map.geotools.function; import com.google.common.collect.Lists; import org.geotools.filter.FunctionExpressionImpl; import org.opengis.feature.type.Name; import org.opengis.filter.capability.FunctionName; import org.opengis.filter.expression.Expression; import org.opengis.filter.expression.Function; import org.opengis.filter.expression.Literal; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * A factory for building all the mapfish print functions. */ public final class FunctionFactory implements org.geotools.filter.FunctionFactory { private List<? extends FunctionExpressionImpl> functions = Lists.newArrayList( new MultiplicationFunction() ); @Override public List<FunctionName> getFunctionNames() { return Lists.transform(this.functions, new com.google.common.base.Function<Function, FunctionName>() { @Nullable @Override public FunctionName apply(@Nonnull final Function input) { return input.getFunctionName(); } }); } @Override public Function function(final String name, final List<Expression> args, final Literal fallback) { for (FunctionExpressionImpl template : this.functions) { if (template.getName().equals(name)) { try { final FunctionExpressionImpl function = template.getClass().newInstance(); function.setParameters(args); return function; } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } return null; } @Override public Function function(final Name name, final List<Expression> args, final Literal fallback) { return function(name.getLocalPart(), args, fallback); } }