package com.revolsys.record.io.format.shp; import java.io.File; import java.io.OutputStream; import java.nio.charset.Charset; import com.revolsys.io.FileUtil; import com.revolsys.record.Record; import com.revolsys.record.RecordFactory; import com.revolsys.record.io.AbstractRecordIoFactory; import com.revolsys.record.io.RecordReader; import com.revolsys.record.io.RecordWriter; import com.revolsys.record.io.RecordWriterFactory; import com.revolsys.record.io.format.zip.ZipRecordReader; import com.revolsys.record.io.format.zip.ZipRecordWriter; import com.revolsys.record.schema.RecordDefinition; import com.revolsys.spring.resource.FileSystemResource; import com.revolsys.spring.resource.Resource; public class ShapefileZip extends AbstractRecordIoFactory implements RecordWriterFactory { public ShapefileZip() { super("ESRI Shapefile inside a ZIP archive"); addMediaTypeAndFileExtension("application/x-shp+zip", "shpz"); } @Override public boolean isBinary() { return true; } @Override public RecordReader newRecordReader(final Resource resource, final RecordFactory<? extends Record> factory) { return new ZipRecordReader(resource, ShapefileConstants.FILE_EXTENSION, factory); } @Override public RecordWriter newRecordWriter(final String baseName, final RecordDefinition recordDefinition, final OutputStream outputStream, final Charset charset) { File directory; try { directory = FileUtil.newTempDirectory(baseName, "zipDir"); } catch (final Throwable e) { throw new RuntimeException("Unable to create temporary directory", e); } final Resource tempResource = new FileSystemResource(new File(directory, baseName + ".shp")); final RecordWriter shapeWriter = new ShapefileRecordWriter(recordDefinition, tempResource); return new ZipRecordWriter(directory, shapeWriter, outputStream); } }