/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2014 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wms.dimension.impl;
import java.io.IOException;
import java.util.List;
import org.geoserver.catalog.AttributeTypeInfo;
import org.geoserver.catalog.DimensionInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.wms.dimension.AbstractFeatureAttributeVisitorSelectionStrategy;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.visitor.CalcResult;
import org.geotools.feature.visitor.FeatureCalc;
import org.geotools.feature.visitor.NearestVisitor;
import org.geotools.util.Converters;
import org.opengis.filter.FilterFactory2;
/**
* Default implementation for selecting the default values for dimensions of
* feature (vector) resources using the nearest-domain-value-to-the-reference-value
* strategy.
*
* @author Ilkka Rinne / Spatineo Inc for the Finnish Meteorological Institute
*
*/
public class FeatureNearestValueSelectionStrategyImpl extends
AbstractFeatureAttributeVisitorSelectionStrategy {
private Object toMatch;
private String fixedCapabilitiesValue;
private FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
/**
* Default constructor.
*/
public FeatureNearestValueSelectionStrategyImpl(Object toMatch){
this(toMatch,null);
}
public FeatureNearestValueSelectionStrategyImpl(Object toMatch, String capabilitiesValue) {
this.toMatch = toMatch;
this.fixedCapabilitiesValue = capabilitiesValue;
}
@Override
public Object getDefaultValue(ResourceInfo resource, String dimensionName,
DimensionInfo dimension, Class clz) {
String attrName = dimension.getAttribute();
Class<?> attrType = String.class;
if (resource instanceof FeatureTypeInfo){
List<AttributeTypeInfo> attrTypes;
try {
attrTypes = ((FeatureTypeInfo)resource).attributes();
for (AttributeTypeInfo attr:attrTypes){
if (attr.getName().equals(attrName)){
attrType = attr.getBinding();
break;
}
}
} catch (IOException e) {
}
}
final FeatureCalc nearest = new NearestVisitor(ff.property(dimension.getAttribute()),
this.toMatch);
CalcResult res = getCalculatedResult((FeatureTypeInfo) resource, dimension, nearest);
if (res.equals(CalcResult.NULL_RESULT)) {
return null;
} else {
return Converters.convert(res.getValue(),clz);
}
}
@Override
public String getCapabilitiesRepresentation(ResourceInfo resource, String dimensionName, DimensionInfo dimensionInfo) {
if (fixedCapabilitiesValue != null){
return this.fixedCapabilitiesValue;
} else {
return super.getCapabilitiesRepresentation(resource, dimensionName, dimensionInfo);
}
}
}