Skip to content

Commit

Permalink
Refactory to ImportJSONReader and ImportJSONWriter utility classes
Browse files Browse the repository at this point in the history
Seperate out JSON input/output from converters
  • Loading branch information
jodygarnett committed Apr 7, 2017
1 parent aeae726 commit 6ee75dc
Show file tree
Hide file tree
Showing 12 changed files with 457 additions and 129 deletions.
Expand Up @@ -8,7 +8,7 @@
import com.google.common.collect.Iterators; import com.google.common.collect.Iterators;
import org.geoserver.rest.catalog.CatalogController; import org.geoserver.rest.catalog.CatalogController;
import org.geoserver.importer.*; import org.geoserver.importer.*;
import org.geoserver.importer.rest.converters.ImportContextJSONConverterWriter; import org.geoserver.importer.rest.converters.ImportJSONWriter;
import org.geoserver.rest.RestBaseController; import org.geoserver.rest.RestBaseController;
import org.geoserver.rest.RestException; import org.geoserver.rest.RestException;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
Expand All @@ -28,7 +28,7 @@ public ImportDataController(Importer importer) {
super(importer); super(importer);
} }


protected ImportContextJSONConverterWriter converterWriter; protected ImportJSONWriter converterWriter;


@GetMapping(value = { "/imports/{importId}/data", "/imports/{importId}/tasks/{taskId}/data", }, produces = { @GetMapping(value = { "/imports/{importId}/data", "/imports/{importId}/tasks/{taskId}/data", }, produces = {
MediaType.APPLICATION_JSON_VALUE, CatalogController.TEXT_JSON, MediaType.APPLICATION_JSON_VALUE, CatalogController.TEXT_JSON,
Expand Down
Expand Up @@ -5,7 +5,7 @@
package org.geoserver.importer.rest; package org.geoserver.importer.rest;


import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.geoserver.importer.rest.converters.ImportContextJSONConverterWriter; import org.geoserver.importer.rest.converters.ImportJSONWriter;


import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
Expand All @@ -18,7 +18,7 @@ public ImportJSONWrapper(JSONObject json) {
} }


@Override @Override
public void write(Writer writer, ImportContextJSONConverterWriter converter) throws IOException { public void write(Writer writer, ImportJSONWriter converter) throws IOException {
writer.write(json.toString()); writer.write(json.toString());
} }
} }
Expand Up @@ -16,8 +16,8 @@
import org.geoserver.catalog.impl.StoreInfoImpl; import org.geoserver.catalog.impl.StoreInfoImpl;
import org.geoserver.rest.catalog.CatalogController; import org.geoserver.rest.catalog.CatalogController;
import org.geoserver.importer.*; import org.geoserver.importer.*;
import org.geoserver.importer.rest.converters.ImportContextJSONConverterReader; import org.geoserver.importer.rest.converters.ImportJSONReader;
import org.geoserver.importer.rest.converters.ImportContextJSONConverterWriter; import org.geoserver.importer.rest.converters.ImportJSONWriter;
import org.geoserver.importer.transform.TransformChain; import org.geoserver.importer.transform.TransformChain;
import org.geoserver.rest.PutIgnoringExtensionContentNegotiationStrategy; import org.geoserver.rest.PutIgnoringExtensionContentNegotiationStrategy;
import org.geoserver.rest.RequestInfo; import org.geoserver.rest.RequestInfo;
Expand Down Expand Up @@ -207,7 +207,7 @@ public Object acceptData(ImportData data, ImportContext context, HttpServletResp
try { try {
newTasks = importer.update(context, data); newTasks = importer.update(context, data);
} catch (ValidationException ve) { } catch (ValidationException ve) {
throw ImportContextJSONConverterWriter.badRequest(ve.getMessage()); throw ImportJSONWriter.badRequest(ve.getMessage());
} catch (IOException e) { } catch (IOException e) {
throw new RestException("Error updating context", HttpStatus.INTERNAL_SERVER_ERROR, e); throw new RestException("Error updating context", HttpStatus.INTERNAL_SERVER_ERROR, e);
} }
Expand Down Expand Up @@ -300,11 +300,13 @@ public ImportData handleMultiPartFormUpload(HttpServletRequest request, ImportCo






void handleTaskPut(Long id, Integer taskId, HttpServletRequest request, HttpServletResponse response, ImportContextJSONConverterWriter converter) { void handleTaskPut(Long id, Integer taskId, HttpServletRequest request, HttpServletResponse response, ImportJSONWriter converter) {
ImportTask orig = task(id, taskId); ImportTask orig = task(id, taskId);
ImportTask task; ImportTask task;
try { try {
task = new ImportContextJSONConverterReader(importer, request.getInputStream()).task(); ImportJSONReader reader = new ImportJSONReader(importer);
task = reader.task(request.getInputStream());
// task = new ImportContextJSONConverterReader(importer,request.getInputStream()).task();
} catch (ValidationException | IOException ve) { } catch (ValidationException | IOException ve) {
LOGGER.log(Level.WARNING, null, ve); LOGGER.log(Level.WARNING, null, ve);
throw converter.badRequest(ve.getMessage()); throw converter.badRequest(ve.getMessage());
Expand Down Expand Up @@ -370,7 +372,7 @@ private ImportData handleFileUpload(ImportContext context, Object taskId, HttpSe
return directory; return directory;
} }


static void updateLayer(ImportTask orig, LayerInfo l, Importer importer, ImportContextJSONConverterWriter converter) { static void updateLayer(ImportTask orig, LayerInfo l, Importer importer, ImportJSONWriter converter) {
//update the original layer and resource from the new //update the original layer and resource from the new


ResourceInfo r = l.getResource(); ResourceInfo r = l.getResource();
Expand Down
Expand Up @@ -4,14 +4,12 @@
*/ */
package org.geoserver.importer.rest; package org.geoserver.importer.rest;


import org.geoserver.importer.rest.converters.ImportContextJSONConverterWriter; import org.geoserver.importer.rest.converters.ImportJSONWriter;

import org.geoserver.importer.rest.converters.ImportJSONWriter.FlushableJSONBuilder;
import java.io.IOException;
import java.io.Writer;


/** /**
* Wrapper used by {@link ImportContextJSONConverterWriter} to write custom json content * Wrapper used by {@link ImportJSONWriter} to write custom json content
*/ */
public interface ImportWrapper { public interface ImportWrapper {
void write(Writer writer, ImportContextJSONConverterWriter converter) throws IOException; void write(FlushableJSONBuilder json, ImportJSONWriter builder );
} }
@@ -0,0 +1,70 @@
package org.geoserver.importer.rest.converters;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import org.geoserver.importer.ImportContext;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.Importer;
import org.geoserver.importer.rest.converters.ImportJSONWriter.FlushableJSONBuilder;
import org.geoserver.rest.converters.BaseMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Component;

/**
* {@link BaseMessageConverter} implementation for writing {@link ImportTask} objects to JSON.
*/
@Component
public class ImportContextHTMLMessageConverter extends BaseMessageConverter<ImportContext> {

Importer importer;

@Autowired
public ImportContextHTMLMessageConverter(Importer importer) {
super(MediaType.TEXT_HTML);
this.importer = importer;
}

@Override
public int getPriority() {
return super.getPriority() - 5;
}

@Override
protected boolean supports(Class<?> clazz) {
return ImportContext.class.isAssignableFrom(clazz);
}

//
// Reading
//
@Override
protected boolean canRead(MediaType mediaType) {
return false;
}

//
// writing
//
@Override
protected void writeInternal(ImportContext context, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {

try (OutputStreamWriter output = new OutputStreamWriter(outputMessage.getBody())) {
output.write("<html><body><pre>");

FlushableJSONBuilder json = new FlushableJSONBuilder(output);
ImportJSONWriter writer = new ImportJSONWriter(
importer);

writer.context(json, context, true, writer.expand(1));

output.write("</pre></body></html>");
output.flush();
}
}
}
@@ -0,0 +1,85 @@
package org.geoserver.importer.rest.converters;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import org.geoserver.importer.ImportContext;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.Importer;
import org.geoserver.importer.rest.converters.ImportJSONWriter.FlushableJSONBuilder;
import org.geoserver.importer.transform.ImportTransform;
import org.geoserver.importer.transform.TransformChain;
import org.geoserver.rest.catalog.CatalogController;
import org.geoserver.rest.converters.BaseMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Component;

import net.sf.json.JSONObject;

/**
* {@link BaseMessageConverter} implementation for reading {@link ImportContext} and {@link ImportTask} objects from JSON
*/
@Component
public class ImportContextJSONMessageConverter extends BaseMessageConverter<ImportContext> {

Importer importer;

@Autowired
public ImportContextJSONMessageConverter(Importer importer) {
super(MediaType.APPLICATION_JSON, CatalogController.MEDIATYPE_TEXT_JSON);
this.importer = importer;
}

@Override
public int getPriority() {
return super.getPriority() - 5;
}

@Override
protected boolean supports(Class<?> clazz) {
return ImportContext.class.isAssignableFrom(clazz);
}

//
// Reading
//
@Override
protected ImportContext readInternal(Class<? extends ImportContext> clazz,
HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
try (InputStream in = inputMessage.getBody()) {
ImportJSONReader reader = new ImportJSONReader(
importer);
JSONObject json = reader.parse(in);
ImportContext context = reader.context(json);

return context;
}
}

//
// writing
//
@Override
protected void writeInternal(ImportContext context, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {

try (OutputStreamWriter output = new OutputStreamWriter(outputMessage.getBody())) {
FlushableJSONBuilder json = new FlushableJSONBuilder(output);

ImportJSONWriter writer = new ImportJSONWriter(
importer);

writer.context(json, context, true, writer.expand(1));

output.flush();
}
}

}
@@ -0,0 +1,106 @@
package org.geoserver.importer.rest.converters;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import org.geoserver.importer.Database;
import org.geoserver.importer.Directory;
import org.geoserver.importer.FileData;
import org.geoserver.importer.ImportContext;
import org.geoserver.importer.ImportData;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.Importer;
import org.geoserver.importer.RemoteData;
import org.geoserver.importer.Table;
import org.geoserver.importer.mosaic.Mosaic;
import org.geoserver.importer.rest.converters.ImportJSONWriter.FlushableJSONBuilder;
import org.geoserver.importer.transform.ImportTransform;
import org.geoserver.importer.transform.TransformChain;
import org.geoserver.rest.RestException;
import org.geoserver.rest.catalog.CatalogController;
import org.geoserver.rest.converters.BaseMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Component;

/**
* {@link BaseMessageConverter} implementation for writing {@link ImportTask} objects to JSON.
*/
@Component
public class ImportDataHTMLMessageConverter extends BaseMessageConverter<ImportData> {

Importer importer;

@Autowired
public ImportDataHTMLMessageConverter(Importer importer) {
super(MediaType.TEXT_HTML);
this.importer = importer;
}

@Override
public int getPriority() {
return super.getPriority() - 5;
}

@Override
protected boolean supports(Class<?> clazz) {
return ImportData.class.isAssignableFrom(clazz);
}

//
// Reading
//
@Override
protected boolean canRead(MediaType mediaType) {
return false;
}

//
// writing
//
@Override
protected void writeInternal(ImportData data, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {

try (OutputStream out = outputMessage.getBody()) {
OutputStreamWriter outputStream = new OutputStreamWriter(out);
outputStream.write("<html><body><pre>");

FlushableJSONBuilder json = new FlushableJSONBuilder(outputStream);
ImportJSONWriter writer = new ImportJSONWriter(
importer);

Object parent = data.getParent();
int expand = writer.expand(1);
if (data instanceof FileData) {
if (data instanceof Directory) {
if (data instanceof Mosaic) {
writer.mosaic((Mosaic) data, parent, expand);
} else {
writer.directory(json, (Directory) data, parent, expand);
}
} else {
writer.file(json, (FileData) data, parent, expand, false);
}
} else if (data instanceof Database) {
writer.database(json, (Database) data, parent, expand);
} else if (data instanceof Table) {
writer.table((Table) data, parent, expand);
} else if (data instanceof RemoteData) {
writer.remote(json, (RemoteData) data, parent, expand);
} else {
throw new RestException("Trying to write an unknown object " + data,
HttpStatus.I_AM_A_TEAPOT);
}
outputStream.write("</pre></body></html>");
outputStream.flush();
}
}
}

0 comments on commit 6ee75dc

Please sign in to comment.