package org.geoserver.community.css.web; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.vividsolutions.jts.geom.Geometry; import org.geotools.feature.FeatureCollection; import org.geotools.feature.FeatureIterator; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; /** * The Summary class represents an entry in the SummaryTable; including a * propertyname, minimum, and maximum value. */ class Summary implements Serializable { final private String name; final private Object min; final private Object max; public Summary(String name, Object min, Object max) { this.name = name; this.min = min; this.max = max; } public String getName() { return name; } public Object getMin() { return min; } public Object getMax() { return max; } public static List<Summary> summarize( FeatureCollection<SimpleFeatureType, SimpleFeature> data ) { final List<AttributeDescriptor> comparable = new ArrayList<AttributeDescriptor>(); final List<AttributeDescriptor> noncomparable = new ArrayList<AttributeDescriptor>(); for (AttributeDescriptor att : data.getSchema().getAttributeDescriptors()) { if (Comparable.class.isAssignableFrom(att.getType().getBinding()) && !Geometry.class.isAssignableFrom(att.getType().getBinding())) { comparable.add(att); } else { noncomparable.add(att); } } Map<AttributeDescriptor, Comparable<Object>> minima = new HashMap(); Map<AttributeDescriptor, Comparable<Object>> maxima = new HashMap(); FeatureIterator<SimpleFeature> it = data.features(); try { while(it.hasNext()) { SimpleFeature f = it.next(); for (AttributeDescriptor att : comparable) { Comparable<Object> value = (Comparable<Object>)f.getAttribute(att.getName()); if (value != null) { final Comparable<Object> min = minima.containsKey(att) ? minima.get(att) : value; final Comparable<Object> max = maxima.containsKey(att) ? maxima.get(att) : value; minima.put(att, value.compareTo(min) < 0 ? value : min); maxima.put(att, value.compareTo(max) < 0 ? value : max); } } } } finally { it.close(); } final List<Summary> summaries = new ArrayList<Summary>(); for (AttributeDescriptor att : comparable) { summaries.add(new Summary(att.getLocalName(), minima.get(att), maxima.get(att))); } for (AttributeDescriptor att : noncomparable) { summaries.add(new Summary(att.getLocalName(), "[n/a]", "[n/a]")); } return summaries; } }