package com.revolsys.record.io;
import java.io.File;
import java.util.Map;
import java.util.TreeMap;
import com.revolsys.geometry.model.ClockDirection;
import com.revolsys.identifier.Identifier;
import com.revolsys.io.BaseCloseable;
import com.revolsys.io.IoFactory;
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.format.zip.ZipRecordReader;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.record.schema.RecordDefinitionProxy;
import com.revolsys.spring.resource.Resource;
public interface RecordReader extends Reader<Record>, RecordDefinitionProxy {
static RecordReader empty() {
return new ListRecordReader(null);
}
static RecordReader empty(final RecordDefinition recordDefinition) {
return new ListRecordReader(recordDefinition);
}
static boolean isReadable(final Object source) {
return IoFactory.isAvailable(RecordReaderFactory.class, source);
}
/**
* Construct a new {@link RecordReader} for the given source. The source can be one of the following
* classes.
*
* <ul>
* <li>{@link Path}</li>
* <li>{@link File}</li>
* <li>{@link Resource}</li>
* </ul>
* @param source The source to read the records from.
* @return The reader.
* @throws IllegalArgumentException If the source is not a supported class.
*/
static RecordReader newRecordReader(final Object source) {
return newRecordReader(source, ArrayRecord.FACTORY);
}
/**
* Construct a new {@link RecordReader} for the given source. The source can be one of the following
* classes.
*
* <ul>
* <li>{@link Path}</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.
*/
static RecordReader newRecordReader(final Object source,
final RecordFactory<? extends Record> recordFactory) {
final RecordReaderFactory readerFactory = IoFactory.factory(RecordReaderFactory.class, source);
if (readerFactory == null) {
return null;
} else {
final Resource resource = readerFactory.getZipResource(source);
final RecordReader reader = readerFactory.newRecordReader(resource, recordFactory);
return reader;
}
}
static RecordReader newZipRecordReader(final Object source, final String fileExtension) {
final Resource resource = Resource.getResource(source);
return new ZipRecordReader(resource, fileExtension, ArrayRecord.FACTORY);
}
static RecordReader newZipRecordReader(final Object source, final String baseName,
final String fileExtension) {
final Resource resource = Resource.getResource(source);
return new ZipRecordReader(resource, baseName, fileExtension, ArrayRecord.FACTORY);
}
default ClockDirection getPolygonRingDirection() {
return ClockDirection.NONE;
}
default Map<Identifier, Record> readRecordsById() {
try (
BaseCloseable closeable = this) {
final Map<Identifier, Record> recordsById = new TreeMap<>(Identifier.comparator());
for (final Record record : this) {
final Identifier identifier = record.getIdentifier();
recordsById.put(identifier, record);
}
return recordsById;
}
}
}