package com.revolsys.record.io.format.shp; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import com.revolsys.io.AbstractDirectoryReader; import com.revolsys.io.PathName; import com.revolsys.io.Reader; import com.revolsys.record.ArrayRecord; import com.revolsys.record.Record; import com.revolsys.record.RecordFactory; import com.revolsys.record.io.RecordDirectoryReader; import com.revolsys.record.schema.RecordDefinition; import com.revolsys.spring.resource.Resource; /** * <p> * The ShapefileDirectoryReader is a that can read .shp * data files contained in a single directory. The reader will iterate through * the .shp files in alpabetical order returning all features. * </p> * <p> * See the {@link AbstractDirectoryReader} class for examples on how to use * dataset readers. * </p> * * @author Paul Austin * @see AbstractDirectoryReader */ public class ShapefileDirectoryReader extends RecordDirectoryReader { private final Map<String, String> fileNameTypeMap = new HashMap<>(); private Map<String, RecordDefinition> typeNameRecordDefinitionMap = new HashMap<>(); public ShapefileDirectoryReader() { setFileExtensions(ShapefileConstants.FILE_EXTENSION); } /** * Construct a new ShapefileDirectoryReader. * * @param directory The containing the .shp files. */ public ShapefileDirectoryReader(final File directory) { this(); setDirectory(directory); } public Map<String, String> getFileNameTypeMap() { return this.fileNameTypeMap; } public Map<String, RecordDefinition> getTypeNameRecordDefinitionMap() { return this.typeNameRecordDefinitionMap; } @Override protected Reader<Record> newReader(final Resource resource) { try { final RecordFactory<ArrayRecord> recordFactory = ArrayRecord.FACTORY; final ShapefileRecordReader iterator = new ShapefileRecordReader(resource, recordFactory); final String baseName = resource.getBaseName().toUpperCase(); iterator.setTypeName(PathName.newPathName(this.fileNameTypeMap.get(baseName))); iterator.setRecordDefinition(this.typeNameRecordDefinitionMap.get(iterator.getTypeName())); return iterator; } catch (final IOException e) { throw new RuntimeException("Unable to create reader for " + resource, e); } } public void setFileNameTypeMap(final Map<String, String> fileNameTypeMap) { this.fileNameTypeMap.clear(); for (final Entry<String, String> entry : fileNameTypeMap.entrySet()) { final String fileName = entry.getKey(); final String typeName = entry.getValue(); this.fileNameTypeMap.put(fileName.toUpperCase(), typeName); } setBaseFileNames(fileNameTypeMap.keySet()); } public void setTypeNameRecordDefinitionMap( final Map<String, RecordDefinition> typeNameRecordDefinitionMap) { this.typeNameRecordDefinitionMap = typeNameRecordDefinitionMap; } }