package com.revolsys.record.io; import java.io.File; import java.util.Map; import com.revolsys.geometry.model.ClockDirection; import com.revolsys.geometry.model.Geometry; import com.revolsys.io.FileUtil; import com.revolsys.io.IoFactory; import com.revolsys.io.Writer; import com.revolsys.record.ArrayRecord; import com.revolsys.record.Record; import com.revolsys.record.schema.RecordDefinition; import com.revolsys.spring.resource.Resource; import com.revolsys.util.Property; public interface RecordWriter extends Writer<Record> { static boolean isWritable(final File file) { for (final String fileNameExtension : FileUtil.getFileNameExtensions(file)) { if (isWritable(fileNameExtension)) { return true; } } return false; } static boolean isWritable(final String fileNameExtension) { return IoFactory.isAvailable(RecordWriterFactory.class, fileNameExtension); } static RecordWriter newRecordWriter(final Record record, final Object target) { if (record != null) { final RecordDefinition recordDefinition = record.getRecordDefinition(); return newRecordWriter(recordDefinition, target); } return null; } static RecordWriter newRecordWriter(final RecordDefinition recordDefinition, final Object target) { final Resource resource = Resource.getResource(target); final RecordWriterFactory writerFactory = IoFactory.factory(RecordWriterFactory.class, resource); if (writerFactory == null || recordDefinition == null) { return null; } else { final RecordWriter writer = writerFactory.newRecordWriter(recordDefinition, resource); return writer; } } default ClockDirection getPolygonRingDirection() { return ClockDirection.NONE; } default RecordDefinition getRecordDefinition() { return null; } boolean isIndent(); default boolean isValueWritable(final Object value) { return Property.hasValue(value) || isWriteNulls() || value instanceof Geometry; } boolean isWriteCodeValues(); boolean isWriteNulls(); default Record newRecord() { final RecordDefinition recordDefinition = getRecordDefinition(); return new ArrayRecord(recordDefinition); } default Record newRecord(final Iterable<? extends Object> values) { final RecordDefinition recordDefinition = getRecordDefinition(); return new ArrayRecord(recordDefinition, values); } default Record newRecord(final Map<String, ? extends Object> values) { final RecordDefinition recordDefinition = getRecordDefinition(); return new ArrayRecord(recordDefinition, values); } default Record newRecord(final Object... values) { final RecordDefinition recordDefinition = getRecordDefinition(); return new ArrayRecord(recordDefinition, values); } void setIndent(final boolean indent); void setWriteCodeValues(boolean writeCodeValues); void setWriteNulls(boolean writeNulls); default void write(final Iterable<? extends Object> values) { final Record record = newRecord(values); write(record); } default void write(final Map<String, ? extends Object> map) { final Record record = newRecord(map); write(record); } default void write(final Object... values) { final Record record = newRecord(values); write(record); } }