⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mockutils.java

📁 电子地图服务器,搭建自己的地图服务
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
 * This code is licensed under the GPL 2.0 license, availible at the root
 * application directory.
 */
package org.vfny.geoserver.testdata;

import com.mockrunner.mock.web.MockHttpServletRequest;
import com.mockrunner.mock.web.MockHttpSession;
import com.mockrunner.mock.web.MockServletContext;
import org.geoserver.wfs.WFS;
import org.geotools.data.DataSourceException;
import org.geotools.data.DataStore;
import org.geotools.data.DataUtilities;
import org.geotools.data.property.PropertyDataStore;
import org.geotools.feature.FeatureType;
import org.geotools.feature.SchemaException;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.vfny.geoserver.global.ConfigurationException;
import org.vfny.geoserver.global.Data;
import org.vfny.geoserver.global.GeoServer;
import org.vfny.geoserver.global.WMS;
import org.vfny.geoserver.global.dto.DataDTO;
import org.vfny.geoserver.global.dto.DataStoreInfoDTO;
import org.vfny.geoserver.global.dto.FeatureTypeInfoDTO;
import org.vfny.geoserver.global.dto.NameSpaceInfoDTO;
import org.vfny.geoserver.global.dto.ServiceDTO;
import org.vfny.geoserver.global.dto.StyleDTO;
import org.vfny.geoserver.global.dto.WFSDTO;
import org.vfny.geoserver.global.dto.WMSDTO;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


/**
 * Provides utility methods for the creation of mock objects to help in unit
 * testing specific geoserver classes.
 * <p>
 * Of interest is the {@linkplain #newHttpRequest(Map, boolean)} method which
 * provides a fully functional mocked up GeoServer instance configured with a
 * PropertyDataStore holding CITE FeatureTypes and convenient styles, etc.
 * </p>
 * <p>
 * The PropertyDataStore is created against a temporary directory so it is safe
 * to make transactions on each test. A further improvement would be to create
 * just a MemoryDataStore, but it was easier to reuse the code in
 * AbstractCiteDataTest in the while.
 * </p>
 *
 * @author Gabriel Roldan
 *
 */
public class MockUtils {
    private MockUtils() {
    }

    /**
     *
     * @param includeMockGeoserver
     *            if <code>true</code>, the generated HttpServletRequest
     *            includes a mock geoserver configuration for the cite test
     *            data, so you can use it, for example, for unit testing request
     *            readers.
     * @return
     */
    public static MockHttpServletRequest newHttpRequest(boolean includeMockGeoserver)
        throws ConfigurationException, IOException {
        return newHttpRequest(Collections.EMPTY_MAP, includeMockGeoserver);
    }

    /**
     * Creates a mock HttpServletRequest with the provided set of request
     * parameters, and possibly a fully configured GeoServer with cite test data
     * on the request's HttpServletContext.
     *
     * @param initialParams
     *            a map of request parameters to construct the mock http request
     *            with, where keys are parameter names, and values may be a
     *            single String or a String[] if there are multiple values for
     *            the same request parameter.
     * @param includeMockGeoserver
     *            if <code>true</code>, the generated HttpServletRequest
     *            includes a mock geoserver configuration for the cite test
     *            data, so you can use it, for example, for unit testing request
     *            readers.
     * @return
     */
    public static MockHttpServletRequest newHttpRequest(Map /* <String, String> */ initialParams,
        boolean includeMockGeoServer) throws ConfigurationException, IOException {
        MockHttpServletRequest request = new MockHttpServletRequest();

        for (Iterator it = initialParams.entrySet().iterator(); it.hasNext();) {
            Map.Entry e = (Map.Entry) it.next();

            String name = (String) e.getKey();
            Object value = e.getValue();

            if ((value != null) && value.getClass().isArray()) {
                if (value.getClass().getComponentType() != String.class) {
                    throw new IllegalArgumentException("provided an illegal parameter for " + name
                        + ": " + value);
                }

                request.setupAddParameter(name, (String[]) value);
            } else {
                request.setupAddParameter(name, (String) value);
            }
        }

        if (includeMockGeoServer) {
            setUpMockGeoServer(request);
        }

        return request;
    }

    /**
     * * public static WMS getWMS(HttpServletRequest request) { ServletRequest
     * req = request; HttpSession session = request.getSession(); ServletContext
     * context = session.getServletContext();
     *
     * return (WMS) context.getAttribute(WMS.WEB_CONTAINER_KEY); }
     *
     * @param request
     */
    private static void setUpMockGeoServer(MockHttpServletRequest request)
        throws ConfigurationException, IOException {
        final GeoServer mockGeoServer = new GeoServer();
        final Data citeData = createTestCiteData(mockGeoServer);
        WMSDTO wmsDto = newWmsDto();
        WMS wms = new WMS(wmsDto) {
                public Data getData() {
                    return citeData;
                }
            };

        WFSDTO wfsDto = newWfsDto();
        WFS wfs = new WFS(wfsDto) {
                public Data getData() {
                    return citeData;
                }
            };

        MockHttpSession session = new MockHttpSession();
        MockServletContext ctx = new MockServletContext();

        ctx.setAttribute(WMS.WEB_CONTAINER_KEY, wms);
        ctx.setAttribute(WFS.WEB_CONTAINER_KEY, wfs);
        ctx.setAttribute(GeoServer.WEB_CONTAINER_KEY, mockGeoServer);

        session.setupServletContext(ctx);
        request.setSession(session);
    }

    /**
     * Creates a new mock WMS config object.
     * <p>
     * The creates WMS config object has no data (i.e. getData() returns null)
     * </p>
     *
     * @return
     */
    public static WMSDTO newWmsDto() {
        WMSDTO dto = new WMSDTO();
        dto.setGmlPrefixing(true);

        ServiceDTO service = new ServiceDTO();
        service.setAbstract("test abstract");
        service.setAccessConstraints("NONE");
        service.setEnabled(true);
        service.setFees("NONE");
        service.setKeywords(Arrays.asList(new String[] { "test", "mock", "service", "config" }));
        service.setMaintainer("Gabriel Roldan");
        service.setName("WMS");

        try {
            service.setOnlineResource(new URL("http://www.axios.es"));
        } catch (Exception e) {
            // no-op
        }

        service.setTitle("My mock WMS");
        dto.setService(service);

        return dto;
    }

    /**
     * Creates a new mock WMS config object.
     * <p>
     * The creates WMS config object has no data (i.e. getData() returns null)
     * </p>
     *
     * @return
     */
    public static WFSDTO newWfsDto() {
        WFSDTO dto = new WFSDTO();
        dto.setCiteConformanceHacks(true);

        ServiceDTO service = new ServiceDTO();
        service.setAbstract("test abstract");
        service.setAccessConstraints("NONE");
        service.setEnabled(true);
        service.setFees("NONE");
        service.setKeywords(Arrays.asList(new String[] { "test", "mock", "service", "config" }));
        service.setMaintainer("Gabriel Roldan");
        service.setName("WMS");

        try {
            service.setOnlineResource(new URL("http://www.axios.es"));
        } catch (Exception e) {
            // no-op
        }

        service.setTitle("My mock WMS");
        dto.setService(service);
        dto.setServiceLevel(WFSDTO.COMPLETE);

        return dto;
    }

    /**
     *
     * @param geoserver
     * @return
     * @throws ConfigurationException
     * @throws IOException
     */
    public static Data createTestCiteData(GeoServer geoserver)
        throws ConfigurationException, IOException {
        DataDTO dataDto = new DataDTO();
        File dir = null;

        URL testDataUrl = MockUtils.class.getResource("test-data");
        System.out.println(testDataUrl);

        if (!"file".equals(testDataUrl.getProtocol())) {
            throw new IOException("unsupported protocol: " + testDataUrl.getProtocol());
        }

        String url = testDataUrl.toExternalForm();
        String testPath = url.substring("file:".length());
        dir = new File(testPath);

        if (!dir.exists() || !dir.isDirectory()) {
            throw new ConfigurationException("Expected cite test dataset directory at " + dir);
        }

        Map formats = new HashMap();
        dataDto.setFormats(formats);

        Map coverages = new HashMap();
        dataDto.setCoverages(coverages);

        Map dataStores = createDataStoresMap();
        dataDto.setDataStores(dataStores);

        Map featureTypes = createFeatureTypes();
        dataDto.setFeaturesTypes(featureTypes);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -