/* (c) 2014 - 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.wms.web.publish;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.validation.validator.RangeValidator;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.MetadataMap;
import org.geoserver.web.publish.PublishedConfigurationPanel;
import org.geoserver.web.util.MapModel;
import org.opengis.feature.type.PropertyDescriptor;
/**
* Configures a layer KML related attributes (coming from metadata)
*/
public class KMLLayerConfigPanel extends PublishedConfigurationPanel<LayerInfo> {
private static final long serialVersionUID = 6469105227923320272L;
/**
* TODO: replace this with a list coming from the KML regionation classes
*/
static final List<String> KML_STRATEGIES = Arrays.asList("external-sorting", "geometry", "native-sorting", "random");
public KMLLayerConfigPanel(String id, IModel<LayerInfo> model){
super(id, model);
PropertyModel<MetadataMap> metadata = new PropertyModel<MetadataMap>(model, "resource.metadata");
add(new DropDownChoice<String>("kml.regionateAttribute",
new MapModel(metadata, "kml.regionateAttribute"),
new AttributeNamesModel(new PropertyModel(model, "resource"))));
add(new DropDownChoice<String>("kml.regionateStrategy",
new MapModel(metadata, "kml.regionateStrategy"), KML_STRATEGIES)
);
TextField<Integer> maxFeatures = new TextField<Integer>("kml.regionateFeatureLimit",
new MapModel(metadata, "kml.regionateFeatureLimit"), Integer.class);
maxFeatures.add(RangeValidator.minimum(1));
add(maxFeatures);
}
private static class AttributeNamesModel extends LoadableDetachableModel<List<String>> {
private static final long serialVersionUID = 2480902398710400909L;
IModel<FeatureTypeInfo> featureTypeInfo;
public AttributeNamesModel(IModel<FeatureTypeInfo> featureTypeInfo) {
this.featureTypeInfo = featureTypeInfo;
}
@Override
protected List<String> load() {
try {
FeatureTypeInfo fti = featureTypeInfo.getObject();
List<String> result = new ArrayList<String>();
for (PropertyDescriptor property : fti.getFeatureType().getDescriptors()) {
result.add(property.getName().getLocalPart());
}
Collections.sort(result);
return result;
} catch(IOException e) {
throw new RuntimeException("Could not load feature type attribute list", e);
}
}
}
}