/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geogig.geoserver.rest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.locationtech.geogig.geotools.data.GeoGigDataStoreFactory.REPOSITORY; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; import org.geogig.geoserver.GeoGigTestData; import org.geogig.geoserver.GeoGigTestData.CatalogBuilder; import org.geogig.geoserver.config.GeoServerGeoGigRepositoryResolver; import org.geogig.geoserver.config.RepositoryInfo; import org.geogig.geoserver.config.RepositoryManager; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.rest.CatalogRESTTestSupport; import org.geoserver.data.test.SystemTestData; import org.geotools.data.DataStore; import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.locationtech.geogig.plumbing.ResolveGeogigDir; import org.locationtech.geogig.porcelain.InitOp; import org.locationtech.geogig.repository.RepositoryResolver; import org.locationtech.geogig.repository.impl.GeoGIG; import org.springframework.mock.web.MockHttpServletResponse; /** * Integration test suite with GeoServer's REST API * */ public class GeoGigGeoServerRESTntegrationTest extends CatalogRESTTestSupport { @Rule public GeoGigTestData geogigData = new GeoGigTestData(); @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); geogigData.init()// .config("user.name", "gabriel")// .config("user.email", "gabriel@test.com")// .createTypeTree("lines", "geom:LineString:srid=4326")// .createTypeTree("points", "geom:Point:srid=4326")// .add()// .commit("created type trees")// .get(); geogigData.insert("points", // "p1=geom:POINT(0 0)", // "p2=geom:POINT(1 1)", // "p3=geom:POINT(2 2)"); geogigData.insert("lines", // "l1=geom:LINESTRING(-10 0, 10 0)", // "l2=geom:LINESTRING(0 0, 180 0)"); geogigData.add().commit("Added test features"); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); catalogBuilder.setUpWorkspace("gigws"); } @After public void after() { RepositoryManager.close(); getCatalog().dispose(); } /** * Override so that default layers are not added */ @Override protected void setUpTestData(SystemTestData testData) throws Exception { // } private void checkNewConfig(DataStoreInfo ds) throws IOException, URISyntaxException { Map<String, Serializable> params = ds.getConnectionParameters(); String repository = (String) params.get(REPOSITORY.key); assertNotNull(repository); // get a resolver to get the ID URI repoURI = new URI(repository); RepositoryResolver resolver = RepositoryResolver.lookup(repoURI); assertTrue(String.format( "Expected GeoGig DataStoreInfo to containg a '%s' URI value with scheme '%s'", REPOSITORY.key, GeoServerGeoGigRepositoryResolver.GEOSERVER_URI_SCHEME), resolver.canHandle(repoURI)); } @Test public void createDataStoreNewConfig() throws Exception { String message = "<dataStore>\n"// + " <name>repo_new_config</name>\n"// + " <type>GeoGIG</type>\n"// + " <connectionParameters>\n"// + " <entry key=\"geogig_repository\">${repository}</entry>\n"// + " </connectionParameters>\n"// + "</dataStore>\n"; GeoGIG geogig = geogigData.createRepository("new_repo"); try { geogig.command(InitOp.class).call(); File repo = geogig.command(ResolveGeogigDir.class).getFile().get(); final URI location = repo.getParentFile().getAbsoluteFile().toURI(); RepositoryManager manager = RepositoryManager.get(); RepositoryInfo info = new RepositoryInfo(); info.setLocation(location); info = manager.save(info); final String repoName = info.getRepoName(); message = message.replace("${repository}", GeoServerGeoGigRepositoryResolver.getURI(repoName)); // System.err.println(message); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); catalogBuilder.setUpWorkspace("new_ws"); final String uri = "/rest/workspaces/new_ws/datastores"; MockHttpServletResponse response = postAsServletResponse(uri, message, "text/xml"); assertEquals(201, response.getStatus()); String locationHeader = response.getHeader("Location"); assertNotNull(locationHeader); assertTrue(locationHeader.endsWith("/workspaces/new_ws/datastores/repo_new_config")); DataStoreInfo newDataStore = catalog.getDataStoreByName("repo_new_config"); assertNotNull(newDataStore); DataStore ds = (DataStore) newDataStore.getDataStore(null); assertNotNull(ds); checkNewConfig(newDataStore); } finally { geogig.close(); } } @Test public void createDataStoreCustomURIWithName() throws Exception { String message = "<dataStore>\n"// + " <name>repo_new_config2</name>\n"// + " <type>GeoGIG</type>\n"// + " <connectionParameters>\n"// + " <entry key=\"geogig_repository\">${repository}</entry>\n"// + " </connectionParameters>\n"// + "</dataStore>\n"; GeoGIG geogig = geogigData.createRepository("new_repo1"); try { geogig.command(InitOp.class).call(); File repo = geogig.command(ResolveGeogigDir.class).getFile().get(); final URI location = repo.getParentFile().getAbsoluteFile().toURI(); RepositoryManager manager = RepositoryManager.get(); RepositoryInfo info = new RepositoryInfo(); info.setLocation(location); info = manager.save(info); final String customURI = GeoServerGeoGigRepositoryResolver.getURI("new_repo1"); message = message.replace("${repository}", customURI); final String uri = "/rest/workspaces/gigws/datastores"; MockHttpServletResponse response = postAsServletResponse(uri, message, "text/xml"); assertEquals(201, response.getStatus()); String locationHeader = response.getHeader("Location"); assertNotNull(locationHeader); assertTrue(locationHeader.endsWith("/workspaces/gigws/datastores/repo_new_config2")); DataStoreInfo newDataStore = catalog.getDataStoreByName("repo_new_config2"); assertNotNull(newDataStore); DataStore ds = (DataStore) newDataStore.getDataStore(null); assertNotNull(ds); checkNewConfig(newDataStore); } finally { geogig.close(); } } }