package mil.nga.giat.geowave.adapter.vector.util; import java.io.IOException; import java.util.Collection; import mil.nga.giat.geowave.core.store.CloseableIterator; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; public class FeatureTranslatingIterator implements CloseableIterator<SimpleFeature> { private final SimpleFeatureTranslator translator; private final CloseableIterator<SimpleFeature> iteratorDelegate; public FeatureTranslatingIterator( final SimpleFeatureType originalType, final Collection<String> desiredFields, final CloseableIterator<SimpleFeature> originalFeatures ) { translator = new SimpleFeatureTranslator( originalType, desiredFields); iteratorDelegate = originalFeatures; } @Override public boolean hasNext() { return iteratorDelegate.hasNext(); } @Override public SimpleFeature next() { return translator.translate(iteratorDelegate.next()); } @Override public void remove() { iteratorDelegate.remove(); } @Override public void close() throws IOException { iteratorDelegate.close(); } private static class SimpleFeatureTranslator { private final Collection<String> fields; private SimpleFeatureType newType; private SimpleFeatureBuilder sfBuilder; public SimpleFeatureTranslator( final SimpleFeatureType originalType, final Collection<String> fields ) { this.fields = fields; initialize(originalType); } private void initialize( final SimpleFeatureType originalType ) { final SimpleFeatureTypeBuilder sftBuilder = new SimpleFeatureTypeBuilder(); sftBuilder.setName(originalType.getName()); for (final AttributeDescriptor ad : originalType.getAttributeDescriptors()) { if (fields.contains(ad.getLocalName())) { sftBuilder.add( ad.getLocalName(), ad.getClass()); } } newType = sftBuilder.buildFeatureType(); sfBuilder = new SimpleFeatureBuilder( newType); } public SimpleFeature translate( final SimpleFeature original ) { for (final String field : fields) { final Object value = original.getAttribute(field); if (value != null) { sfBuilder.set( field, value); } } return sfBuilder.buildFeature(original.getID()); } } }