/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.importer.rest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.ArrayList; import java.util.List; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.importer.ImportContext; import org.geoserver.importer.ImportTask; import org.geoserver.importer.ImporterTestSupport; import org.geoserver.importer.SpatialFile; import org.geoserver.importer.transform.IntegerFieldToDateTransform; import org.geoserver.importer.transform.ReprojectTransform; import org.geoserver.rest.RestBaseController; import org.geotools.referencing.CRS; import org.junit.Before; import org.junit.Test; import org.springframework.http.HttpStatus; import org.springframework.mock.web.MockHttpServletResponse; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class ImportTransformTest extends ImporterTestSupport { DataStoreInfo store; ImportTask importTask; private static String BASEPATH = RestBaseController.ROOT_PATH; /** * Create a test transform context: one import task with two transforms: * * One ReprojectTransform and one IntegerFieldToDateTransform. * * @throws Exception */ @Before public void setupTransformContext() throws Exception { Catalog cat = getCatalog(); File dir = unpack("shape/archsites_epsg_prj.zip"); SpatialFile file = new SpatialFile(new File(dir, "archsites.shp")); file.prepare(); ImportContext context = importer.createContext(file, store); importTask = context.getTasks().get(0); importTask.getTransform().add(new ReprojectTransform(CRS.decode("EPSG:4326"))); importTask.getTransform().add(new IntegerFieldToDateTransform("pretendDateIntField")); } @Test public void testGetTransforms() throws Exception { JSON j = getAsJSON(BASEPATH + "/imports/0/tasks/0/transforms"); List<JSONObject> txs = parseTransformObjectsFromResponse(j); assertEquals(2, txs.size()); assertEquals("ReprojectTransform", txs.get(0).get("type")); assertEquals("IntegerFieldToDateTransform", txs.get(1).get("type")); } @Test public void testGetTransform() throws Exception { JSON j = getAsJSON(BASEPATH + "/imports/0/tasks/0/transforms/0"); assertTrue(j instanceof JSONObject); assertEquals("ReprojectTransform", ((JSONObject) j).get("type")); } @Test public void testGetTransformsExpandNone() throws Exception { JSON j = getAsJSON(BASEPATH + "/imports/0/tasks/0/transforms?expand=none"); List<JSONObject> txs = parseTransformObjectsFromResponse(j); assertEquals(2, txs.size()); assertTrue(txs.get(0).containsKey("href")); assertTrue(txs.get(1).containsKey("href")); } @Test public void testPostTransform() throws Exception { String json = "{\"type\": \"ReprojectTransform\", \"target\": \"EPSG:3005\"}"; MockHttpServletResponse resp = postAsServletResponse(BASEPATH + "/imports/0/tasks/0/transforms", json, "application/json"); String location = resp.getHeader("Location"); assertEquals(HttpStatus.CREATED.value(), resp.getStatus()); // Make sure it was created assertEquals(3, importTask.getTransform().getTransforms().size()); } @Test public void testDeleteTransform() throws Exception { MockHttpServletResponse resp = deleteAsServletResponse( BASEPATH + "/imports/0/tasks/0/transforms/0"); assertEquals(HttpStatus.OK.value(), resp.getStatus()); // Make sure it was deleted assertEquals(1, importTask.getTransform().getTransforms().size()); } @Test public void testPutTransform() throws Exception { String json = "{\"type\": \"ReprojectTransform\", \"target\": \"EPSG:3005\"}"; MockHttpServletResponse resp = putAsServletResponse( BASEPATH + "/imports/0/tasks/0/transforms/0", json, "application/json"); assertEquals(HttpStatus.OK.value(), resp.getStatus()); // Get it again and make sure it changed. JSON j = getAsJSON(BASEPATH + "/imports/0/tasks/0/transforms/0"); assertTrue(j instanceof JSONObject); assertEquals("EPSG:3005", ((JSONObject) j).get("target")); } /** * Parses the transforms list out of a /transforms response (example below), asserting that the structure and types are as expected. * * <pre> * * { * "transformChain": { * "transforms": [ * { * "href": "http://localhost:8080/geoserver/restng/imports/0/tasks/0/transforms/imports/0/tasks/0/transforms/0", * "source": null, * "target": "EPSG:4326", * "type": "ReprojectTransform" * }, * { * "field": "pretendDateIntField", * "href": "http://localhost:8080/geoserver/restng/imports/0/tasks/0/transforms/imports/0/tasks/0/transforms/1", * "type": "IntegerFieldToDateTransform" * } * ], * "type": "vector" * } * } * </pre> * * For the above example, this will check the structure and types and then return: * * <pre> * [ * { * "href": "http://localhost:8080/geoserver/restng/imports/0/tasks/0/transforms/imports/0/tasks/0/transforms/0", * "source": null, * "target": "EPSG:4326", * "type": "ReprojectTransform" * }, * { * "field": "pretendDateIntField", * "href": "http://localhost:8080/geoserver/restng/imports/0/tasks/0/transforms/imports/0/tasks/0/transforms/1", * "type": "IntegerFieldToDateTransform" * } * ] * </pre> * * @param transformsResponse * @return */ List<JSONObject> parseTransformObjectsFromResponse(JSON transformsResponse) { assertTrue(transformsResponse instanceof JSONObject); JSONObject jo = (JSONObject) transformsResponse; assertTrue( jo.containsKey("transformChain") && jo.get("transformChain") instanceof JSONObject); JSONObject tco = (JSONObject) jo.get("transformChain"); assertTrue(tco.containsKey("transforms") && tco.get("transforms") instanceof JSONArray); JSONArray array = (JSONArray) tco.get("transforms"); List<JSONObject> transformsList = new ArrayList<>(); for (Object i : array) { assertTrue(i instanceof JSONObject); transformsList.add((JSONObject) i); } return transformsList; } }