package com.revolsys.record.io; import java.io.File; import java.nio.file.Paths; import java.util.Map; import java.util.function.Supplier; import com.revolsys.collection.map.Maps; import com.revolsys.geometry.io.GeometryReader; import com.revolsys.geometry.io.GeometryReaderFactory; import com.revolsys.io.FileUtil; import com.revolsys.io.PathUtil; import com.revolsys.io.Reader; import com.revolsys.io.map.MapObjectFactoryRegistry; import com.revolsys.io.map.MapReader; import com.revolsys.io.map.MapReaderFactory; import com.revolsys.record.ArrayRecord; import com.revolsys.record.Record; import com.revolsys.record.RecordFactory; import com.revolsys.spring.resource.Resource; import com.revolsys.spring.resource.UrlResource; import com.revolsys.util.Property; import com.revolsys.util.function.SupplierWithProperties; public interface RecordReaderFactory extends GeometryReaderFactory, MapReaderFactory { @SuppressWarnings("unchecked") public static void mapObjectFactoryInit() { MapObjectFactoryRegistry.newFactory("recordReaderFactoryFile", "Factory to create a RecordReader from a file", (properties) -> { final String fileName = (String)properties.get("fileName"); final String fileUrl = (String)properties.get("fileUrl"); String defaultFileExtension; Object source; if (Property.hasValue(fileName)) { source = Paths.get(fileName); defaultFileExtension = FileUtil.getFileNameExtension(fileName); } else if (Property.hasValue(fileUrl)) { source = new UrlResource(fileUrl); defaultFileExtension = FileUtil.getFileNameExtension(fileUrl); } else { throw new IllegalArgumentException("Config must have fileName or fileUrl:" + properties); } final String fileExtension = Maps.getString(properties, "fileExtension", defaultFileExtension); final Supplier<RecordReader> factory = () -> { final RecordReader reader; if ("zip".equals(fileExtension)) { final String baseFileExtension = (String)properties.get("baseFileExtension"); final String baseName = (String)properties.get("baseName"); if (Property.hasValue(baseName)) { reader = RecordReader.newZipRecordReader(source, baseName, baseFileExtension); } else { reader = RecordReader.newZipRecordReader(source, baseFileExtension); } } else { reader = RecordReader.newRecordReader(source); } if (reader != null) { final Map<String, Object> readerProperties = (Map<String, Object>)properties .get("readerProperties"); reader.setProperties(readerProperties); } return reader; }; return new SupplierWithProperties<>(factory, properties); }); } /** * Construct a new directory reader using the ({@link ArrayRecordFactory}). * * @return The reader. */ default Reader<Record> newDirectoryRecordReader() { final RecordDirectoryReader directoryReader = new RecordDirectoryReader(); directoryReader.setFileExtensions(getFileExtensions()); return directoryReader; } /** * Construct a new reader for the directory using the ({@link ArrayRecordFactory} * ). * * @param directory The directory to read. * @return The reader for the file. */ default Reader<Record> newDirectoryRecordReader(final File directory) { return newDirectoryRecordReader(directory, ArrayRecord.FACTORY); } /** * Construct a new reader for the directory using the specified data object * recordFactory. * * @param directory directory file to read. * @param recordFactory The recordFactory used to create data objects. * @return The reader for the file. */ default <R extends Record> Reader<Record> newDirectoryRecordReader(final File directory, final RecordFactory<R> recordFactory) { final RecordDirectoryReader directoryReader = new RecordDirectoryReader(); directoryReader.setFileExtensions(getFileExtensions()); directoryReader.setDirectory(directory); return directoryReader; } @Override default GeometryReader newGeometryReader(final Resource resource) { final RecordReader recordReader = newRecordReader(resource); final RecordReaderGeometryReader geometryReader = new RecordReaderGeometryReader(recordReader); return geometryReader; } @Override default MapReader newMapReader(final Resource resource) { final RecordReader reader = newRecordReader(resource); return new RecordMapReader(reader); } /** * Construct a new reader for the resource using the ({@link ArrayRecordFactory} * ). * * @param file The file to read. * @return The reader for the file. */ default RecordReader newRecordReader(final Object object) { return newRecordReader(object, ArrayRecord.FACTORY); } /** * Construct a new {@link RecordReader} for the given source. The source can be one of the following * classes. * * <ul> * <li>{@link PathUtil}</li> * <li>{@link File}</li> * <li>{@link Resource}</li> * </ul> * @param source The source to read the records from. * @param recordFactory The factory used to create records. * @return The reader. * @throws IllegalArgumentException If the source is not a supported class. */ default RecordReader newRecordReader(final Object source, final RecordFactory<? extends Record> factory) { final Resource resource = Resource.getResource(source); return newRecordReader(resource, factory); } RecordReader newRecordReader(Resource resource, RecordFactory<? extends Record> factory); }