package com.revolsys.gis.web.rest.converter;
import java.io.IOException;
import java.util.List;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.io.IoConstants;
import com.revolsys.io.IoFactory;
import com.revolsys.record.Record;
import com.revolsys.record.io.ListRecordReader;
import com.revolsys.record.io.RecordReader;
import com.revolsys.record.io.RecordReaderFactory;
import com.revolsys.record.io.RecordWriterFactory;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.ui.web.rest.converter.AbstractHttpMessageConverter;
import com.revolsys.ui.web.utils.HttpServletUtils;
public class RecordHttpMessageConverter extends AbstractHttpMessageConverter<Record> {
private final RecordReaderHttpMessageConverter readerConverter = new RecordReaderHttpMessageConverter();
public RecordHttpMessageConverter() {
super(Record.class, IoFactory.mediaTypes(RecordReaderFactory.class),
IoFactory.mediaTypes(RecordWriterFactory.class));
}
public GeometryFactory getGeometryFactory() {
return this.readerConverter.getGeometryFactory();
}
public List<String> getRequestAttributeNames() {
return this.readerConverter.getRequestAttributeNames();
}
@Override
public Record read(final Class<? extends Record> clazz, final HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
final RecordReader reader = this.readerConverter.read(RecordReader.class, inputMessage);
try {
for (final Record record : reader) {
return record;
}
return null;
} finally {
reader.close();
}
}
public void setGeometryFactory(final GeometryFactory geometryFactory) {
this.readerConverter.setGeometryFactory(geometryFactory);
}
public void setRequestAttributeNames(final List<String> requestAttributeNames) {
this.readerConverter.setRequestAttributeNames(requestAttributeNames);
}
@Override
public void write(final Record record, final MediaType mediaType,
final HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
if (!HttpServletUtils.getResponse().isCommitted()) {
if (record != null) {
final RecordDefinition recordDefinition = record.getRecordDefinition();
final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
requestAttributes.setAttribute(IoConstants.SINGLE_OBJECT_PROPERTY, true,
RequestAttributes.SCOPE_REQUEST);
final ListRecordReader reader = new ListRecordReader(recordDefinition, record);
this.readerConverter.write(reader, mediaType, outputMessage);
}
}
}
}