/* (c) 2015 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wps.sextante; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.WritableByteChannel; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.geotools.data.DataStore; import org.geotools.data.FeatureSource; import org.geotools.data.FeatureStore; import org.geotools.data.memory.MemoryDataStore; import org.geotools.data.shapefile.dbf.DbaseFileException; import org.geotools.data.shapefile.dbf.DbaseFileHeader; import org.geotools.data.shapefile.dbf.DbaseFileWriter; import org.geotools.feature.AttributeTypeBuilder; import org.geotools.feature.FeatureCollection; import org.geotools.feature.DefaultFeatureCollection; 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; import org.opengis.feature.type.AttributeType; import com.vividsolutions.jts.geom.Geometry; import es.unex.sextante.dataObjects.AbstractTable; import es.unex.sextante.dataObjects.IRecord; import es.unex.sextante.dataObjects.IRecordsetIterator; import es.unex.sextante.outputs.FileOutputChannel; import es.unex.sextante.outputs.IOutputChannel; public class GTTable extends AbstractTable { private String m_sName; private String m_sFilename; private int m_iCount; private FeatureSource<SimpleFeatureType, SimpleFeature> m_BaseDataObject; public void create(final FeatureSource<SimpleFeatureType, SimpleFeature> featureSource) { try { m_BaseDataObject = featureSource; m_iCount = featureSource.getFeatures().size(); } catch (final Exception e) { e.printStackTrace(); } } public void addRecord(final Object[] values) { if (getFeatureSource() instanceof FeatureStore) { try { final FeatureStore<SimpleFeatureType, SimpleFeature> store = ((FeatureStore<SimpleFeatureType, SimpleFeature>) getFeatureSource()); final List<Object> attributes = new ArrayList<Object>(); attributes.addAll(Arrays.asList(values)); final SimpleFeatureType ft = store.getSchema(); final DefaultFeatureCollection collection = new DefaultFeatureCollection(); final SimpleFeature feature = SimpleFeatureBuilder.build(ft, attributes, SimpleFeatureBuilder.createDefaultFeatureId()); collection.add(feature); store.addFeatures(collection); m_iCount++; } catch (final Exception e) { e.printStackTrace(); } } } public void create(final String sName, final String sFilename, final Class<?>[] fields, final String[] sFields) { try { m_sFilename = sFilename; m_sName = sName; final SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder(); builder.setName(sName); final AttributeTypeBuilder attBuilder = new AttributeTypeBuilder(); for (int i = 0; i < sFields.length; i++) { final AttributeType type = attBuilder.binding(fields[0]).buildType(); final AttributeDescriptor descriptor = attBuilder.buildDescriptor(sFields[i], type); builder.add(descriptor); } final DataStore mds = new MemoryDataStore(); mds.createSchema(builder.buildFeatureType()); create(mds.getFeatureSource(mds.getTypeNames()[0])); } catch (final Exception e) { e.printStackTrace(); } } public IRecordsetIterator iterator() { if (m_BaseDataObject != null) { try { final FeatureCollection<SimpleFeatureType, SimpleFeature> features = getFeatureSource().getFeatures(); return new GTRecordsetIterator(features); } catch (final Exception e) { e.printStackTrace(); return null; } } else { return null; } } @SuppressWarnings("unchecked") private FeatureSource<SimpleFeatureType, SimpleFeature> getFeatureSource() { return m_BaseDataObject; } public String getFieldName(final int i) { if (m_BaseDataObject != null) { try { final SimpleFeatureType ft = getFeatureSource().getSchema(); final AttributeType at = ft.getType(i); return at.getName().getLocalPart(); } catch (final Exception e) { e.printStackTrace(); return null; } } return null; } public Class<?> getFieldType(final int i) { if (m_BaseDataObject != null) { try { final SimpleFeatureType ft = getFeatureSource().getSchema(); final AttributeType at = ft.getType(i); return at.getBinding(); } catch (final Exception e) { e.printStackTrace(); return null; } } return null; } public int getFieldCount() { if (m_BaseDataObject != null) { try { final SimpleFeatureType ft = getFeatureSource().getSchema(); return ft.getAttributeCount(); } catch (final Exception e) { e.printStackTrace(); return 0; } } return 0; } public long getRecordCount() { return m_iCount; } public void close() {} public String getName() { return m_sName; } public void open() {} public void postProcess() {} protected DbaseFileHeader createDbaseHeader() throws IOException, DbaseFileException { final SimpleFeatureType featureType = getFeatureSource().getSchema(); final DbaseFileHeader header = new DbaseFileHeader(); for (int i = 0, ii = featureType.getAttributeCount(); i < ii; i++) { final AttributeType type = featureType.getType(i); final Class colType = type.getBinding(); final String colName = type.getName().getLocalPart(); final int fieldLen = 255; if ((colType == Integer.class) || (colType == Short.class) || (colType == Byte.class)) { header.addColumn(colName, 'N', Math.min(fieldLen, 16), 0); } else if ((colType == Double.class) || (colType == Float.class) || (colType == Number.class)) { final int l = Math.min(fieldLen, 33); header.addColumn(colName, 'N', l, l / 2); } else if (java.util.Date.class.isAssignableFrom(colType)) { header.addColumn(colName, 'D', fieldLen, 0); } else if (colType == Boolean.class) { header.addColumn(colName, 'L', 1, 0); } else if (CharSequence.class.isAssignableFrom(colType)) { header.addColumn(colName, 'C', Math.min(254, fieldLen), 0); } else if (Geometry.class.isAssignableFrom(colType)) { continue; } else { throw new IOException("Unable to write : " + colType.getName()); } } return header; } public IOutputChannel getOutputChannel() { return new FileOutputChannel(m_sFilename); } public void setName(final String name) { m_sName = name; } @Override public void free() { // TODO Auto-generated method stub } @Override public Object getBaseDataObject() { return m_BaseDataObject; } }