From: <svn...@os...> - 2012-03-29 15:28:14
|
Author: ang05a Date: 2012-03-29 08:28:04 -0700 (Thu, 29 Mar 2012) New Revision: 38653 Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java Log: Ensure isList in app-schema are sorted by natural order. Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java =================================================================== --- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java 2012-03-29 00:50:29 UTC (rev 38652) +++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java 2012-03-29 15:28:04 UTC (rev 38653) @@ -20,7 +20,9 @@ import java.io.IOException; import java.net.URI; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -30,6 +32,7 @@ import javax.xml.namespace.QName; +import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang.StringUtils; import org.geotools.data.DataAccess; import org.geotools.data.DataSourceException; @@ -89,6 +92,35 @@ * @since 2.4 */ public class DataAccessMappingFeatureIterator extends AbstractMappingFeatureIterator { + + class ValueComparator implements Comparator { + @Override + public int compare(Object o1, Object o2) { + if (o1 == null) { + if (o2 == null) { + return 0; + } else { + return -1; + } + } + if (o2 == null) { + return 1; + } + + String string1 = o1.toString(); + String string2 = o2.toString(); + + // in case numbers are stored as string, make sure the order is correct + if (NumberUtils.isNumber(string1) && NumberUtils.isNumber(string2)) { + return Double.valueOf(string1).compareTo(Double.valueOf(string2)); + } + + if (o1 instanceof Comparable) { + return ((Comparable) o1).compareTo(o2); + } + return string1.compareTo(string2); + } + } /** * Hold on to iterator to allow features to be streamed. */ @@ -119,6 +151,8 @@ private ArrayList<String> filteredFeatures; + private ValueComparator comparator; + public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered) throws IOException { this(store, mapping, query, null); @@ -827,7 +861,11 @@ for (Feature source : sources) { values[i] = getValue(sourceExpr, source); i++; + } + if (comparator == null) { + comparator = new ValueComparator(); } + Arrays.sort(values, comparator); String valueString = StringUtils.join(values, " "); StepList fullPath = attMapping.getTargetXPath(); StepList leafPath = fullPath.subList(fullPath.size() - 1, fullPath.size()); |