From: <svn...@os...> - 2008-12-30 16:53:49
|
Author: aaime Date: 2008-12-30 11:53:44 -0500 (Tue, 30 Dec 2008) New Revision: 32123 Modified: trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReader.java trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemIterator.java trunk/modules/library/main/src/main/java/org/geotools/feature/simple/SimpleFeatureBuilder.java trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureIteratorTest.java trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReaderTest.java Log: GEOT-2243 ForceCoordinateSystemIterator/Reader use inefficient SimpleFeatureBuilder retype method Modified: trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReader.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReader.java 2008-12-30 11:18:10 UTC (rev 32122) +++ trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReader.java 2008-12-30 16:53:44 UTC (rev 32123) @@ -64,7 +64,7 @@ */ public class ForceCoordinateSystemFeatureReader implements FeatureReader<SimpleFeatureType, SimpleFeature> { protected FeatureReader<SimpleFeatureType, SimpleFeature> reader; - protected SimpleFeatureType schema; + protected SimpleFeatureBuilder builder; /** * Shortcut constructor that can be used if the new schema has already been computed @@ -73,7 +73,7 @@ */ ForceCoordinateSystemFeatureReader(FeatureReader<SimpleFeatureType, SimpleFeature> reader, SimpleFeatureType schema) { this.reader = reader; - this.schema = schema; + this.builder = new SimpleFeatureBuilder(schema); } /** @@ -111,8 +111,9 @@ CoordinateReferenceSystem originalCs = type.getCoordinateReferenceSystem(); if (!cs.equals(originalCs)) { - schema = FeatureTypes.transform(type, cs, forceOnlyMissing); + type = FeatureTypes.transform(type, cs, forceOnlyMissing); } + this.builder = new SimpleFeatureBuilder(type); this.reader = reader; } @@ -125,10 +126,10 @@ throw new IllegalStateException("Reader has already been closed"); } - if( schema==null ) + if( builder == null ) return reader.getFeatureType(); - return schema; + return builder.getFeatureType(); } /** @@ -141,11 +142,11 @@ } SimpleFeature next = reader.next(); - if( schema==null ) + if( builder == null ) return next; - return SimpleFeatureBuilder.retype(next, schema); + return SimpleFeatureBuilder.retype(next, builder); } /** @@ -169,6 +170,6 @@ reader.close(); reader = null; - schema = null; + builder = null; } } Modified: trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemIterator.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemIterator.java 2008-12-30 11:18:10 UTC (rev 32122) +++ trunk/modules/library/main/src/main/java/org/geotools/data/crs/ForceCoordinateSystemIterator.java 2008-12-30 16:53:44 UTC (rev 32123) @@ -63,7 +63,7 @@ */ public class ForceCoordinateSystemIterator implements Iterator<SimpleFeature> { protected FeatureIterator<SimpleFeature> reader; - protected SimpleFeatureType schema; + protected SimpleFeatureBuilder builder; /** * Shortcut constructor that can be used if the new schema has already been computed @@ -72,7 +72,7 @@ */ ForceCoordinateSystemIterator(FeatureIterator<SimpleFeature> reader, SimpleFeatureType schema) { this.reader = reader; - this.schema = schema; + this.builder = new SimpleFeatureBuilder(schema); } /** @@ -94,10 +94,9 @@ .getCoordinateReferenceSystem(); if (!cs.equals(originalCs)) { - schema = FeatureTypes.transform(type, cs); - } else { - schema = type; - } + type = FeatureTypes.transform(type, cs); + } + builder = new SimpleFeatureBuilder(type); this.reader = reader; } @@ -106,10 +105,10 @@ * @see org.geotools.data.FeatureReader#getFeatureType() */ public SimpleFeatureType getFeatureType() { - if (reader == null || schema == null ) { + if (reader == null || builder == null ) { throw new IllegalStateException("Reader has already been closed"); } - return schema; + return builder.getFeatureType(); } /** @@ -122,13 +121,12 @@ } SimpleFeature next = reader.next(); - if( schema==null ) + if( builder == null ) return next; try { - return SimpleFeatureBuilder.retype(next, schema); - } - catch( IllegalAttributeException eep){ + return SimpleFeatureBuilder.retype(next, builder); + } catch( IllegalAttributeException eep){ throw (IllegalStateException) new IllegalStateException(eep.getMessage()).initCause(eep ); } } @@ -156,6 +154,6 @@ } reader.close(); reader = null; - schema = null; + builder = null; } } Modified: trunk/modules/library/main/src/main/java/org/geotools/feature/simple/SimpleFeatureBuilder.java =================================================================== --- trunk/modules/library/main/src/main/java/org/geotools/feature/simple/SimpleFeatureBuilder.java 2008-12-30 11:18:10 UTC (rev 32122) +++ trunk/modules/library/main/src/main/java/org/geotools/feature/simple/SimpleFeatureBuilder.java 2008-12-30 16:53:44 UTC (rev 32123) @@ -25,6 +25,7 @@ import java.util.logging.Logger; import org.geotools.data.DataUtilities; +import org.geotools.data.ReTypeFeatureReader; import org.geotools.factory.CommonFactoryFinder; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.type.Types; @@ -486,9 +487,14 @@ } /** - * Copies an existing feature, retyping it in the process. + * Copies an existing feature, retyping it in the process. + * <p> Be warned, this method will + * create its own SimpleFeatureBuilder, which will trigger a scan of the SPI looking for + * the current default feature factory, which is expensive and has scalability issues.<p> + * If you need good performance consider using + * {@link SimpleFeatureBuilder#retype(SimpleFeature, SimpleFeatureBuilder)} instead. * <p> - * If the feature type contians attributes in which the oringial feature + * If the feature type contains attributes in which the original feature * does not have a value for, the value in the resulting feature is set to * <code>null</code>. * </p> @@ -499,8 +505,7 @@ */ public static SimpleFeature retype(SimpleFeature feature, SimpleFeatureType featureType) { SimpleFeatureBuilder builder = new SimpleFeatureBuilder(featureType); - for ( Iterator a = featureType.getAttributeDescriptors().iterator(); a.hasNext(); ) { - AttributeDescriptor att = (AttributeDescriptor) a.next(); + for (AttributeDescriptor att : featureType.getAttributeDescriptors()) { Object value = feature.getAttribute( att.getName() ); builder.set(att.getName(), value); } @@ -508,6 +513,28 @@ } /** + * Copies an existing feature, retyping it in the process. + * <p> + * If the feature type contains attributes in which the original feature + * does not have a value for, the value in the resulting feature is set to + * <code>null</code>. + * </p> + * @param feature The original feature. + * @param SimpleFeatureBuilder A builder for the target feature type + * + * @return The copied feature, with a new type. + * @since 2.5.3 + */ + public static SimpleFeature retype(SimpleFeature feature, SimpleFeatureBuilder builder) { + builder.reset(); + for (AttributeDescriptor att : builder.getFeatureType().getAttributeDescriptors()) { + Object value = feature.getAttribute( att.getName() ); + builder.set(att.getName(), value); + } + return builder.buildFeature(feature.getID()); + } + + /** * Adds some user data to the next attributed added to the feature. * <p> * This value is reset when the next attribute is added. Modified: trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureIteratorTest.java =================================================================== --- trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureIteratorTest.java 2008-12-30 11:18:10 UTC (rev 32122) +++ trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureIteratorTest.java 2008-12-30 16:53:44 UTC (rev 32123) @@ -115,7 +115,7 @@ assertFalse( original.hasNext() ); assertFalse( modified.hasNext() ); - assertNotNull(modified.schema); + assertNotNull(modified.builder); } public void testNullDestination() throws Exception { @@ -160,6 +160,6 @@ assertFalse( original.hasNext() ); assertFalse( modified.hasNext() ); - assertNotNull(modified.schema); + assertNotNull(modified.builder); } } Modified: trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReaderTest.java =================================================================== --- trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReaderTest.java 2008-12-30 11:18:10 UTC (rev 32122) +++ trunk/modules/library/main/src/test/java/org/geotools/data/crs/ForceCoordinateSystemFeatureReaderTest.java 2008-12-30 16:53:44 UTC (rev 32123) @@ -86,7 +86,7 @@ assertFalse( original.hasNext() ); assertFalse( modified.hasNext() ); - assertNull(modified.schema); + assertSame(modified.builder.getFeatureType(), original.getFeatureType()); } public void testDifferentCRS() throws Exception { @@ -117,7 +117,7 @@ assertFalse( original.hasNext() ); assertFalse( modified.hasNext() ); - assertNotNull(modified.schema); + assertNotNull(modified.builder); } public void testNullDestination() throws Exception { @@ -165,6 +165,6 @@ assertFalse( original.hasNext() ); assertFalse( modified.hasNext() ); - assertNotNull(modified.schema); + assertNotNull(modified.builder); } } |