eu.esdihumboldt.hale.io.geoserver.rest.ResourceManagerIT.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.io.geoserver.rest.ResourceManagerIT.java

Source

/*
 * Copyright (c) 2015 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.hale.io.geoserver.rest;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.entity.ContentType;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import eu.esdihumboldt.hale.common.test.docker.AbstractDockerTest;
import eu.esdihumboldt.hale.common.test.docker.config.DockerConfigInstance;
import eu.esdihumboldt.hale.common.test.docker.config.HaleDockerClient;
import eu.esdihumboldt.hale.io.geoserver.AppSchemaDataStore;
import eu.esdihumboldt.hale.io.geoserver.DataStore;
import eu.esdihumboldt.hale.io.geoserver.DataStoreFile;
import eu.esdihumboldt.hale.io.geoserver.FeatureType;
import eu.esdihumboldt.hale.io.geoserver.Namespace;
import eu.esdihumboldt.hale.io.geoserver.ResourceBuilder;

@SuppressWarnings("javadoc")
public class ResourceManagerIT extends AbstractDockerTest {

    private static final String GEOSERVER_USER = "admin";
    private static final String GEOSERVER_PASSWORD = "geoserver";

    private static final String NAMESPACE_PREFIX = "hale";
    private static final String NAMESPACE_URI = "http://inspire.ec.europa.eu/schemas/lcv/3.0";
    private static final String NAMESPACE_URI_ALT = "http://www.esdi-community.eu/projects/hale";

    private static final String APP_SCHEMA_CONFIG_ARCHIVE = "/data/test_landcover.zip";
    private static final String APP_SCHEMA_DATASTORE = "LandCoverVector";

    private static String geoserverURL;
    private static HaleDockerClient client;

    private final Namespace ns;
    private final DataStore ds;

    public ResourceManagerIT() {
        ns = ResourceBuilder.namespace(NAMESPACE_PREFIX).setAttribute(Namespace.URI, NAMESPACE_URI).build();

        Map<String, String> connectionsParams = new HashMap<String, String>();
        connectionsParams.put("uri", NAMESPACE_URI);
        connectionsParams.put("workspaceName", ns.name());
        connectionsParams.put("mappingFileName", APP_SCHEMA_DATASTORE + ".xml");
        ds = ResourceBuilder.dataStore(APP_SCHEMA_DATASTORE, AppSchemaDataStore.class)
                .setAttribute(DataStore.ID, APP_SCHEMA_DATASTORE + "_datastore")
                .setAttribute(DataStore.WORKSPACE_ID, ns.name())
                .setAttribute(DataStore.CONNECTION_PARAMS, connectionsParams).build();
    }

    @BeforeClass
    public static void startGeoServer() throws Exception {
        DockerConfigInstance conf = new DockerConfigInstance("appschema", ResourceManagerIT.class.getClassLoader());
        client = new HaleDockerClient(conf);
        client.createContainer();
        client.startContainer();

        String host = client.getHostName();
        if (host == null) {
            // using docker container directly (probably unix socket connection)
            geoserverURL = "http://" + client.getContainerIp() + ":" + 8080 + "/geoserver";
        } else {
            geoserverURL = "http://" + host + ":" + client.getHostPort(8080) + "/geoserver";
        }

        waitForGeoServer();
    }

    private static void waitForGeoServer() throws Exception {
        NamespaceManager nsMgr = new NamespaceManager(geoserverURL);
        Namespace ns = ResourceBuilder.namespace("it.geosolutions").build();
        nsMgr.setResource(ns);
        nsMgr.setCredentials(GEOSERVER_USER, GEOSERVER_PASSWORD);

        int num = 0, maxAttempts = 10;
        Exception lastException = null;
        while (num < maxAttempts) {
            try {
                if (nsMgr.exists()) {
                    return;
                }
            } catch (Exception e) {
                lastException = e;
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // ignore
            }
        }

        if (lastException != null) {
            throw lastException;
        }
    }

    @AfterClass
    public static void tearDownGeoServer() throws Exception {
        client.killAndRemoveContainer();
    }

    @Before
    public void setUp() throws Exception {
        deleteDataStore();
        createNamespace();
    }

    @After
    public void tearDown() throws Exception {
        deleteDataStore();
        deleteNamespace();
    }

    @Test
    public void testNamespaceManager() throws Exception {
        NamespaceManager nsMgr = createNamespaceManager();

        // check namespace was created correctly
        Document nsDoc = nsMgr.read();
        assertEquals("namespace", nsDoc.getDocumentElement().getNodeName());

        NodeList prefixNodes = nsDoc.getElementsByTagName("prefix");
        assertEquals(1, prefixNodes.getLength());
        assertEquals(NAMESPACE_PREFIX, prefixNodes.item(0).getTextContent());

        NodeList uriNodes = nsDoc.getElementsByTagName("uri");
        assertEquals(1, uriNodes.getLength());
        assertEquals(NAMESPACE_URI, uriNodes.item(0).getTextContent());

        // update namespace URI
        try {
            ns.setAttribute(Namespace.URI, NAMESPACE_URI_ALT);
            nsMgr.update();

            nsDoc = nsMgr.read();
            uriNodes = nsDoc.getElementsByTagName("uri");
            assertEquals(1, uriNodes.getLength());
            assertEquals(NAMESPACE_URI_ALT, uriNodes.item(0).getTextContent());
        } finally {
            // reset namespace URI
            ns.setAttribute(Namespace.URI, NAMESPACE_URI);
        }
    }

    @Test
    public void testDataStoreManager() throws Exception {
        DataStoreManager dsMgr = createDataStoreManager();

        // create datastore
        URL url = dsMgr.create();
        assertNotNull(url);
        assertTrue(dsMgr.exists());

        Document listDoc = dsMgr.list();
        assertEquals("dataStores", listDoc.getDocumentElement().getNodeName());

        NodeList dataStoreNodes = listDoc.getElementsByTagName("dataStore");
        assertEquals(1, dataStoreNodes.getLength());

        NodeList dataStoreChildren = dataStoreNodes.item(0).getChildNodes();
        for (int i = 0; i < dataStoreChildren.getLength(); i++) {
            Node child = dataStoreChildren.item(i);
            if ("name".equals(child.getNodeName())) {
                assertEquals(APP_SCHEMA_DATASTORE, child.getTextContent());
                break;
            }
        }
    }

    @Test
    public void testConfigArchiveUpload() throws Exception {
        // build mapping file resource
        ContentType contentType = DataStoreFile.ZIP_CONTENT_TYPE;
        InputStream is = getClass().getResourceAsStream(APP_SCHEMA_CONFIG_ARCHIVE);
        DataStoreFile configArchive = ResourceBuilder.dataStoreFile(is, contentType)
                .setAttribute(DataStoreFile.EXTENSION, "appschema").setAttribute(DataStoreFile.DATASTORE, ds.name())
                .setAttribute(DataStoreFile.WORKSPACE, ns.name()).build();
        DataStoreFileManager dsFileMgr = new DataStoreFileManager(geoserverURL);
        dsFileMgr.setCredentials(GEOSERVER_USER, GEOSERVER_PASSWORD);
        dsFileMgr.setResource(configArchive);

        // upload mapping configuration (datastore is created implicitly)
        Map<String, String> updateParams = new HashMap<String, String>();
        updateParams.put("configure", "all");
        dsFileMgr.update(updateParams);

        // verify datastore was created
        DataStoreManager dsMgr = createDataStoreManager();
        Document listDoc = dsMgr.list();
        assertEquals("dataStores", listDoc.getDocumentElement().getNodeName());

        NodeList dataStoreNodes = listDoc.getElementsByTagName("dataStore");
        assertEquals(1, dataStoreNodes.getLength());

        NodeList dataStoreChildren = dataStoreNodes.item(0).getChildNodes();
        for (int i = 0; i < dataStoreChildren.getLength(); i++) {
            Node child = dataStoreChildren.item(i);
            if ("name".equals(child.getNodeName())) {
                assertEquals(APP_SCHEMA_DATASTORE, child.getTextContent());
                break;
            }
        }

        // check feature types were created
        FeatureType lcd = ResourceBuilder.featureType("LandCoverDataset").build();
        FeatureType lcu = ResourceBuilder.featureType("LandCoverUnit").build();
        FeatureTypeManager ftMgr = new FeatureTypeManager(geoserverURL);
        ftMgr.setCredentials(GEOSERVER_USER, GEOSERVER_PASSWORD);
        ftMgr.setWorkspace(ns.name());
        ftMgr.setDataStore(ds.name());

        ftMgr.setResource(lcd);
        assertTrue(ftMgr.exists());

        ftMgr.setResource(lcu);
        assertTrue(ftMgr.exists());
    }

    private void createNamespace() throws MalformedURLException {
        NamespaceManager nsMgr = createNamespaceManager();

        if (nsMgr.exists()) {
            nsMgr.delete();
        }

        assertFalse(nsMgr.exists());
        // create namespace
        URL nsURL = nsMgr.create();
        assertNotNull(nsURL);
        assertTrue(nsMgr.exists());
    }

    private NamespaceManager createNamespaceManager() throws MalformedURLException {
        NamespaceManager nsMgr = new NamespaceManager(geoserverURL);
        nsMgr.setCredentials(GEOSERVER_USER, GEOSERVER_PASSWORD);
        nsMgr.setResource(ns);

        return nsMgr;
    }

    private void deleteNamespace() throws MalformedURLException {
        NamespaceManager nsMgr = createNamespaceManager();

        if (nsMgr.exists()) {
            nsMgr.delete();
        }

        assertFalse(nsMgr.exists());
    }

    private DataStoreManager createDataStoreManager() throws MalformedURLException {
        DataStoreManager dsMgr = new DataStoreManager(geoserverURL);
        dsMgr.setCredentials(GEOSERVER_USER, GEOSERVER_PASSWORD);
        dsMgr.setWorkspace(ns.name());
        dsMgr.setResource(ds);

        return dsMgr;
    }

    private void deleteDataStore() throws MalformedURLException {
        DataStoreManager dsMgr = createDataStoreManager();

        if (dsMgr.exists()) {
            Map<String, String> deleteParams = new HashMap<String, String>();
            deleteParams.put("recurse", "true");
            dsMgr.delete(deleteParams);
        }

        assertFalse(dsMgr.exists());
    }
}