diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportDataController.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportDataController.java index 1cb0f9ce3aa..af89d1ed7c0 100644 --- a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportDataController.java +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportDataController.java @@ -8,7 +8,7 @@ import com.google.common.collect.Iterators; import org.geoserver.rest.catalog.CatalogController; 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.RestException; import org.springframework.http.HttpHeaders; @@ -28,7 +28,7 @@ public ImportDataController(Importer importer) { super(importer); } - protected ImportContextJSONConverterWriter converterWriter; + protected ImportJSONWriter converterWriter; @GetMapping(value = { "/imports/{importId}/data", "/imports/{importId}/tasks/{taskId}/data", }, produces = { MediaType.APPLICATION_JSON_VALUE, CatalogController.TEXT_JSON, diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportJSONWrapper.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportJSONWrapper.java index 3d327f79f00..17896970290 100644 --- a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportJSONWrapper.java +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportJSONWrapper.java @@ -5,7 +5,7 @@ package org.geoserver.importer.rest; 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.Writer; @@ -18,7 +18,7 @@ public ImportJSONWrapper(JSONObject json) { } @Override - public void write(Writer writer, ImportContextJSONConverterWriter converter) throws IOException { + public void write(Writer writer, ImportJSONWriter converter) throws IOException { writer.write(json.toString()); } } diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportTaskController.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportTaskController.java index 8174b4547f0..f2e2c4ae9b3 100644 --- a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportTaskController.java +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportTaskController.java @@ -16,8 +16,8 @@ import org.geoserver.catalog.impl.StoreInfoImpl; import org.geoserver.rest.catalog.CatalogController; import org.geoserver.importer.*; -import org.geoserver.importer.rest.converters.ImportContextJSONConverterReader; -import org.geoserver.importer.rest.converters.ImportContextJSONConverterWriter; +import org.geoserver.importer.rest.converters.ImportJSONReader; +import org.geoserver.importer.rest.converters.ImportJSONWriter; import org.geoserver.importer.transform.TransformChain; import org.geoserver.rest.PutIgnoringExtensionContentNegotiationStrategy; import org.geoserver.rest.RequestInfo; @@ -207,7 +207,7 @@ public Object acceptData(ImportData data, ImportContext context, HttpServletResp try { newTasks = importer.update(context, data); } catch (ValidationException ve) { - throw ImportContextJSONConverterWriter.badRequest(ve.getMessage()); + throw ImportJSONWriter.badRequest(ve.getMessage()); } catch (IOException e) { throw new RestException("Error updating context", HttpStatus.INTERNAL_SERVER_ERROR, e); } @@ -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 task; 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) { LOGGER.log(Level.WARNING, null, ve); throw converter.badRequest(ve.getMessage()); @@ -370,7 +372,7 @@ private ImportData handleFileUpload(ImportContext context, Object taskId, HttpSe 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 ResourceInfo r = l.getResource(); diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportWrapper.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportWrapper.java index d25cf2265e9..baff8a7f12e 100644 --- a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportWrapper.java +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/ImportWrapper.java @@ -4,14 +4,12 @@ */ package org.geoserver.importer.rest; -import org.geoserver.importer.rest.converters.ImportContextJSONConverterWriter; - -import java.io.IOException; -import java.io.Writer; +import org.geoserver.importer.rest.converters.ImportJSONWriter; +import org.geoserver.importer.rest.converters.ImportJSONWriter.FlushableJSONBuilder; /** - * Wrapper used by {@link ImportContextJSONConverterWriter} to write custom json content + * Wrapper used by {@link ImportJSONWriter} to write custom json content */ public interface ImportWrapper { - void write(Writer writer, ImportContextJSONConverterWriter converter) throws IOException; + void write(FlushableJSONBuilder json, ImportJSONWriter builder ); } diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextHTMLMessageConverter.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextHTMLMessageConverter.java new file mode 100644 index 00000000000..761d6861e58 --- /dev/null +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextHTMLMessageConverter.java @@ -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 { + + 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("
");
+
+            FlushableJSONBuilder json = new FlushableJSONBuilder(output);
+            ImportJSONWriter writer = new ImportJSONWriter(
+                    importer);
+
+            writer.context(json, context, true, writer.expand(1));
+
+            output.write("
"); + output.flush(); + } + } +} diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONMessageConverter.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONMessageConverter.java new file mode 100644 index 00000000000..4c501e1240b --- /dev/null +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONMessageConverter.java @@ -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 { + + 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 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(); + } + } + +} diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportDataHTMLMessageConverter.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportDataHTMLMessageConverter.java new file mode 100644 index 00000000000..05dd6a1f8aa --- /dev/null +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportDataHTMLMessageConverter.java @@ -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 { + + 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("
");
+
+            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("
"); + outputStream.flush(); + } + } +} diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONConverterReader.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportJSONReader.java similarity index 84% rename from src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONConverterReader.java rename to src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportJSONReader.java index e5b37078dae..ff99026286b 100644 --- a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONConverterReader.java +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportJSONReader.java @@ -10,11 +10,9 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.NotImplementedException; import org.geoserver.catalog.CatalogFactory; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.LayerInfo; @@ -22,7 +20,6 @@ import org.geoserver.catalog.StoreInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.catalog.WorkspaceInfo; -import org.geoserver.rest.catalog.CatalogController; import org.geoserver.config.util.XStreamPersister; import org.geoserver.importer.Archive; import org.geoserver.importer.Database; @@ -56,11 +53,6 @@ import org.geotools.referencing.CRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; 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.JSONArray; @@ -70,55 +62,47 @@ * {@link BaseMessageConverter} implementation for reading {@link ImportContext} and {@link ImportTask} objects from JSON */ @Component -public class ImportContextJSONConverterReader extends BaseMessageConverter { +public class ImportJSONReader { Importer importer; - JSONObject json; - + @Autowired - public ImportContextJSONConverterReader(Importer importer) { - super(MediaType.APPLICATION_JSON,CatalogController.MEDIATYPE_TEXT_JSON); + public ImportJSONReader(Importer importer) { this.importer = importer; } - public ImportContextJSONConverterReader(Importer importer, InputStream in) throws IOException { - super(MediaType.APPLICATION_JSON,CatalogController.MEDIATYPE_TEXT_JSON); - this.importer = importer; - this.json = parse(in); - } - - public JSONObject object() { - return json; - } - @Override - protected boolean supports(Class clazz) { - return (ImportContext.class.isAssignableFrom(clazz) || ImportTask.class.isAssignableFrom(clazz) || - ImportTransform.class.isAssignableFrom(clazz) || TransformChain.class.isAssignableFrom(clazz)); - } +// public ImportContextJSONConverterReader(Importer importer, InputStream in) throws IOException { +// super(MediaType.APPLICATION_JSON,CatalogController.MEDIATYPE_TEXT_JSON); +// this.importer = importer; +// JSONObject json = parse(in); +// } + +// @Override +// protected boolean supports(Class clazz) { +// return (ImportContext.class.isAssignableFrom(clazz) || ImportTask.class.isAssignableFrom(clazz) || +// ImportTransform.class.isAssignableFrom(clazz) || TransformChain.class.isAssignableFrom(clazz)); +// } - @Override - protected boolean canWrite(MediaType mediaType) { - return false; // write not supported - } - - @Override - protected Object readInternal(Class clazz, HttpInputMessage inputMessage) - throws IOException, HttpMessageNotReadableException { - InputStream in = inputMessage.getBody(); - json = parse(in); - if (ImportContext.class.isAssignableFrom(clazz)) { - return context(); - } else if (ImportTask.class.isAssignableFrom(clazz)) { - return task(); - } else if (ImportTransform.class.isAssignableFrom(clazz) || TransformChain.class.isAssignableFrom(clazz)) { - return transform(); - } - return null; - } +// @Override +// protected boolean canWrite(MediaType mediaType) { +// return false; // write not supported +// } + +// @Override +// protected Object readInternal(Class clazz, HttpInputMessage inputMessage) +// throws IOException, HttpMessageNotReadableException { +// InputStream in = inputMessage.getBody(); +// JSONObject json = parse(in); +// if (ImportContext.class.isAssignableFrom(clazz)) { +// return context(json); +// } else if (ImportTask.class.isAssignableFrom(clazz)) { +// return task(json); +// } else if (ImportTransform.class.isAssignableFrom(clazz) || TransformChain.class.isAssignableFrom(clazz)) { +// return transform(json); +// } +// return null; +// } - public ImportContext context() throws IOException { - return context(json); - } public ImportContext context(JSONObject json) throws IOException { ImportContext context = null; if (json.has("import")) { @@ -154,9 +138,6 @@ public ImportContext context(JSONObject json) throws IOException { } return context; } - public LayerInfo layer() throws IOException { - return layer(json); - } LayerInfo layer(JSONObject json) throws IOException { CatalogFactory f = importer.getCatalog().getFactory(); @@ -222,7 +203,11 @@ LayerInfo layer(JSONObject json) throws IOException { return l; } - public ImportTask task() throws IOException { + public ImportTask task(InputStream inputStream) throws IOException { + JSONObject json = parse(inputStream); + return task(json); + } + public ImportTask task(JSONObject json) throws IOException { if (json.has("task")) { json = json.getJSONObject("task"); @@ -302,11 +287,14 @@ List transforms(JSONArray transforms) throws IOException { return result; } - public ImportTransform transform() throws IOException { + public ImportTransform transform(String json) throws IOException { + return transform(IOUtils.toInputStream(json)); + } + public ImportTransform transform(InputStream inputStream) throws IOException { + JSONObject json = parse(inputStream); return transform(json); } - - ImportTransform transform(JSONObject json) throws IOException { + public ImportTransform transform(JSONObject json) throws IOException { ImportTransform transform; String type = json.getString("type"); if ("DateFormatTransform".equalsIgnoreCase(type)) { @@ -368,10 +356,6 @@ List getOptions(JSONObject json) { return options; } - public ImportData data() throws IOException { - return data(json); - } - ImportData data(JSONObject json) throws IOException { String type = json.getString("type"); if (type == null) { @@ -393,7 +377,7 @@ else if("archive".equalsIgnoreCase(type)) { else if ("database".equalsIgnoreCase(type)) { return database(json); } - else if ("remote".equalsIgnoreCase(type)) { + else if ("remote".equalsIgnoreCase(type)) { return remote(json); } else { @@ -457,11 +441,7 @@ Archive archive(JSONObject json) throws IOException { throw new UnsupportedOperationException("TODO: implement"); } - public Directory directory() throws IOException { - return directory(json); - } - - Directory directory(JSONObject json) throws IOException { + public Directory directory(JSONObject json) throws IOException { if (json.has("location")) { return new Directory(new File(json.getString("location"))); } @@ -493,7 +473,7 @@ CoordinateReferenceSystem crs(String srs) { } } - JSONObject parse(InputStream in) throws IOException { + public JSONObject parse(InputStream in) throws IOException { ByteArrayOutputStream bout = new ByteArrayOutputStream(); IOUtils.copy(in, bout); return JSONObject.fromObject(new String(bout.toByteArray())); @@ -514,19 +494,4 @@ T fromJSON(JSONObject json, Class clazz) throws IOException { return xp.load(new ByteArrayInputStream(json.toString().getBytes()), clazz); } - T fromJSON(Class clazz) throws IOException { - return fromJSON(json, clazz); - } - - @Override - protected void writeInternal(Object t, HttpOutputMessage outputMessage) - throws IOException, HttpMessageNotWritableException { - throw new HttpMessageNotWritableException( - getClass().getName() + " does not support serialization"); - } - - @Override - public int getPriority() { - return super.getPriority()-5; - } } diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONConverterWriter.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportJSONWriter.java similarity index 94% rename from src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONConverterWriter.java rename to src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportJSONWriter.java index 3b5a63deb3a..905c67ebe70 100644 --- a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportContextJSONConverterWriter.java +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportJSONWriter.java @@ -27,7 +27,6 @@ import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.StoreInfo; import org.geoserver.catalog.StyleInfo; -import org.geoserver.rest.catalog.CatalogController; import org.geoserver.config.util.XStreamPersister; import org.geoserver.config.util.XStreamPersister.Callback; import org.geoserver.config.util.XStreamPersisterFactory; @@ -84,7 +83,7 @@ * {@link ImportTask} or {@link ImportWrapper} objects. */ @Component -public class ImportContextJSONConverterWriter extends BaseMessageConverter { +public class ImportJSONWriter { static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); static { @@ -98,36 +97,35 @@ public class ImportContextJSONConverterWriter extends BaseMessageConverter clazz) { return ImportContext.class.isAssignableFrom(clazz) || ImportTask.class.isAssignableFrom(clazz) || ImportWrapper.class.isAssignableFrom(clazz) || ImportData.class.isAssignableFrom(clazz); } - @Override +// @Override protected boolean canRead(MediaType mediaType) { return false; } - @Override +// @Override protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { throw new HttpMessageNotReadableException(getClass().getName() + " does not support deserialization"); } - @Override +// @Override protected void writeInternal(Object t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { MediaType contentType = outputMessage.getHeaders().getContentType(); @@ -174,7 +172,7 @@ protected void writeInternal(Object t, HttpOutputMessage outputMessage) remote((RemoteData) data, parent, expand); } } else if (ImportWrapper.class.isAssignableFrom(t.getClass())) { - ((ImportWrapper) t).write(writer, this); + ((ImportWrapper) t).write(json, this); } else { throw new RestException("Trying to write an unknown object " + t, HttpStatus.I_AM_A_TEAPOT); @@ -218,8 +216,10 @@ public void contexts(Iterator contexts, int expand) throws IOExce json.endArray().endObject(); json.flush(); } - public void context(ImportContext context, boolean top, int expand) throws IOException { + context( json, context, top, expand ); + } + public void context(FlushableJSONBuilder json, ImportContext context, boolean top, int expand) throws IOException { if (top) { json.object().key("import"); } @@ -575,8 +575,10 @@ public void data(ImportData data, Object parent, int expand) throws IOException } json.flush(); } - public void remote(RemoteData data, Object parent, int expand) throws IOException { + remote(json, data, parent, expand); + } + public void remote(FlushableJSONBuilder json,RemoteData data, Object parent, int expand) throws IOException { json.object(); @@ -597,6 +599,9 @@ public void remote(RemoteData data, Object parent, int expand) throws IOExceptio } public void file(FileData data, Object parent, int expand, boolean href) throws IOException { + file(json, data, parent, expand, href); + } + public void file(FlushableJSONBuilder json,FileData data, Object parent, int expand, boolean href) throws IOException { json.object(); @@ -649,12 +654,21 @@ void fileContents(FileData data, Object parent, int expand) throws IOException { public void mosaic(Mosaic data, Object parent, int expand) throws IOException { directory(data, "mosaic", parent, expand); } + + public void mosaic(FlushableJSONBuilder json, Mosaic data, Object parent, int expand) throws IOException { + directory(json, data, "mosaic", parent, expand); + } public void directory(Directory data, Object parent, int expand) throws IOException { directory(data, "directory", parent, expand); } - - public void directory(Directory data, String typeName, Object parent, int expand) + public void directory(FlushableJSONBuilder json,Directory data, Object parent, int expand) throws IOException { + directory(json,data, "directory", parent, expand); + } + public void directory(Directory data, String typeName, Object parent, int expand) throws IOException{ + directory(json, data, "directory", parent, expand); + } + public void directory(FlushableJSONBuilder json,Directory data, String typeName, Object parent, int expand) throws IOException { json.object(); @@ -696,8 +710,10 @@ public void files(Directory data, Object parent, boolean top, int expand) throws } json.flush(); } - public void database(Database data, Object parent, int expand) throws IOException { + database(json, data, parent, expand); + } + public void database(FlushableJSONBuilder json,Database data, Object parent, int expand) throws IOException { json.object(); json.key("type").value("database"); json.key("format").value(data.getFormat() != null ? data.getFormat().getName() : null); diff --git a/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportWrapperMessageConverter.java b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportWrapperMessageConverter.java new file mode 100644 index 00000000000..a8fa43779b0 --- /dev/null +++ b/src/extension/importer/rest-ng/src/main/java/org/geoserver/importer/rest/converters/ImportWrapperMessageConverter.java @@ -0,0 +1,83 @@ +package org.geoserver.importer.rest.converters; + +import java.io.IOException; +import java.io.OutputStreamWriter; + +import org.geoserver.importer.Importer; +import org.geoserver.importer.rest.ImportWrapper; +import org.geoserver.importer.rest.converters.ImportJSONWriter.FlushableJSONBuilder; +import org.geoserver.rest.catalog.CatalogController; +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 ImportWrapper} objects. + *

+ * This converter is willing to write JSON directly, or output JSON as HTML for visual inspection. + */ +@Component +public class ImportWrapperMessageConverter extends BaseMessageConverter { + + Importer importer; + + @Autowired + public ImportWrapperMessageConverter(Importer importer) { + super(MediaType.APPLICATION_JSON, CatalogController.MEDIATYPE_TEXT_JSON, + MediaType.TEXT_HTML); + this.importer = importer; + } + + @Override + public int getPriority() { + return super.getPriority() - 5; + } + + @Override + protected boolean supports(Class clazz) { + return ImportWrapper.class.isAssignableFrom(clazz); + } + + // + // Reading + // + @Override + protected boolean canRead(MediaType mediaType) { + return false; + } + + // + // writing + // + @Override + protected void writeInternal(ImportWrapper wrapper, HttpOutputMessage outputMessage) + throws IOException, HttpMessageNotWritableException { + MediaType contentType = outputMessage.getHeaders().getContentType(); + try (OutputStreamWriter outputWriter = new OutputStreamWriter(outputMessage.getBody())) { + if (MediaType.TEXT_HTML.isCompatibleWith(contentType)) { + writeHTML(wrapper, outputWriter); + } else { + writeJSON(wrapper, outputWriter); + } + outputWriter.flush(); + } + } + + private void writeHTML(ImportWrapper wrapper, OutputStreamWriter outputWriter) + throws IOException { + outputWriter.write("

");
+        writeJSON(wrapper, outputWriter);
+        outputWriter.write("
"); + } + + private void writeJSON(ImportWrapper wrapper, OutputStreamWriter outputWriter) { + FlushableJSONBuilder json = new FlushableJSONBuilder(outputWriter); + ImportJSONWriter writer = new ImportJSONWriter(importer); + + wrapper.write(json, writer); + } + +} diff --git a/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/TransformTestSupport.java b/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/TransformTestSupport.java index 9561271a259..c4a1e73b8b9 100644 --- a/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/TransformTestSupport.java +++ b/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/TransformTestSupport.java @@ -6,13 +6,15 @@ package org.geoserver.importer.rest; import junit.framework.TestCase; +import net.sf.json.JSONObject; + import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.WriterOutputStream; import org.geoserver.importer.ImportContext; import org.geoserver.importer.ImportTask; import org.geoserver.importer.Importer; -import org.geoserver.importer.rest.converters.ImportContextJSONConverterReader; -import org.geoserver.importer.rest.converters.ImportContextJSONConverterWriter; +import org.geoserver.importer.rest.converters.ImportJSONReader; +import org.geoserver.importer.rest.converters.ImportJSONWriter; import org.geoserver.importer.transform.ImportTransform; import org.geoserver.rest.RequestInfo; import org.springframework.beans.BeanUtils; @@ -47,14 +49,15 @@ public void doJSONTest(ImportTransform transform) throws Exception { RequestInfo.set(ri); - ImportContextJSONConverterWriter jsonio = new ImportContextJSONConverterWriter(im, new WriterOutputStream(buffer)); + ImportJSONWriter jsonio = new ImportJSONWriter(im, new WriterOutputStream(buffer)); ImportContext c = new ImportContext(0); c.addTask(new ImportTask()); jsonio.transform(transform, 0, c.task(0), true, 1); - ImportTransform transform2 = new ImportContextJSONConverterReader(im, IOUtils.toInputStream(buffer.toString())).transform(); + ImportJSONReader reader = new ImportJSONReader(im); + ImportTransform transform2 = reader.transform(buffer.toString()); PropertyDescriptor[] pd = BeanUtils.getPropertyDescriptors(transform.getClass()); for (int i = 0; i < pd.length; i++) { diff --git a/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/converters/ImportJSONIOTest.java b/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/converters/ImportJSONIOTest.java index 3e4c817a7bf..97ae694b330 100644 --- a/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/converters/ImportJSONIOTest.java +++ b/src/extension/importer/rest-ng/src/test/java/org/geoserver/importer/rest/converters/ImportJSONIOTest.java @@ -30,7 +30,7 @@ * @author Ian Schneider */ public class ImportJSONIOTest extends ImporterTestSupport { - private ImportContextJSONConverterWriter writer; + private ImportJSONWriter writer; private ByteArrayOutputStream buf; @@ -47,7 +47,7 @@ public void prepareData() throws Exception { info.setPagePath("pagePath"); newBuffer(); - writer = new ImportContextJSONConverterWriter(importer, buf); + writer = new ImportJSONWriter(importer, buf); oldAttributes = RequestContextHolder.getRequestAttributes(); RequestContextHolder.setRequestAttributes(new TransformTestSupport.MapRequestAttributes()); @@ -60,12 +60,12 @@ public void cleanUp() { RequestContextHolder.setRequestAttributes(oldAttributes); } - private ImportContextJSONConverterReader reader() throws IOException { - return new ImportContextJSONConverterReader(importer, stream(buffer())); + private ImportJSONReader reader() throws IOException { + return new ImportJSONReader(importer, stream(buffer())); } - private ImportContextJSONConverterReader reader(JSONObject json) throws IOException { - ImportContextJSONConverterReader reader = new ImportContextJSONConverterReader(importer, stream(buffer())); + private ImportJSONReader reader(JSONObject json) throws IOException { + ImportJSONReader reader = new ImportJSONReader(importer, stream(buffer())); reader.json = json; return reader; } @@ -142,7 +142,7 @@ public void testRemoteDataFreeAccess() throws IOException { writer.context(context, true, 3); ByteArrayInputStream inbuf = new ByteArrayInputStream(buf.toByteArray()); - ImportContext readBack = new ImportContextJSONConverterReader(importer, inbuf).context(); + ImportContext readBack = new ImportJSONReader(importer, inbuf).context(); Assert.assertEquals(context.getData(), readBack.getData()); } @@ -158,7 +158,7 @@ public void testRemoteDataFullDataAccess() throws IOException { writer.context(context, true, 3); ByteArrayInputStream inbuf = new ByteArrayInputStream(buf.toByteArray()); - ImportContext readBack = new ImportContextJSONConverterReader(importer, inbuf).context(); + ImportContext readBack = new ImportJSONReader(importer, inbuf).context(); Assert.assertEquals(context.getData(), readBack.getData()); }