cswprofile.java

来自「esri的ArcGIS Server超级学习模板程序(for java)」· Java 代码 · 共 520 行 · 第 1/2 页

JAVA
520
字号
package com.esri.solutions.jitk.datasources.ogc.csw;

import org.apache.log4j.Logger;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;


/**
 * @version 1.0
 * @created 25-Jul-2007 1:43:58 PM
 */
public class CswProfile {
    private static final Logger LOG = Logger.getLogger(CswProfile.class);
    private String description;
    private boolean filter_extentsearch;
    private boolean filter_livedatamap;
    private boolean usesMetadataResourceUrl = Boolean.TRUE;
    private String id;
    private String getRecordByIdKVP;
    private String getRepositoryItemKVP;
    private String metadataxslt;
    private Transformer metadataXsltObj; // Need Java solution
    private String name;
    private String requestxslt;
    private Transformer requestXsltObj; // Need java solution
    private String responsexslt;
    private Transformer responseXsltObj; // Need java solution

    public CswProfile() {
    }

    /**
         *
         * @param sid
         * @param sname
         * @param sdescription
         */
    public CswProfile(String sid, String sname, String sdescription) {
    }

    /**
     *
     * @param sid
     * @param sname
     * @param sdescription
     * @param skvp
     * @param srequestxslt
     * @param sresponsexslt
     * @param smetadataxslt
     * @param livedatamap
     * @param extentsearch
     */
    public CswProfile(String id, String name, String description, String kvp,
        String getRepositoryItemKVP, String requestxslt, String responsexslt,
        String metadataxslt, boolean livedatamap, boolean extentsearch,
        boolean usesMetadataResourceUrl) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.getRecordByIdKVP = kvp;
        this.getRepositoryItemKVP = getRepositoryItemKVP;
        this.requestxslt = requestxslt;
        this.responsexslt = responsexslt;
        this.metadataxslt = metadataxslt;
        this.filter_livedatamap = livedatamap;
        this.filter_extentsearch = extentsearch;
        this.usesMetadataResourceUrl = usesMetadataResourceUrl;
    }

    /**
     * Generate a CSW request String to get metadata by ID.
     *
     * @remark The CSW request String is built. The request is String is build based
     * on the baseurl and record id
     * @param ="param1" The base url
     * @param ="param2" The record ID String
     * @returns The request String
     *
     * @param baseURL
     * @param recordId
     */
    public String generateCSWGetMetadataByIDRequestURL(String baseURL,
        String recordId) {
        StringBuffer requeststring = new StringBuffer();
        requeststring.append(baseURL);

        if (baseURL.endsWith("?")) {
            requeststring.append(getRecordByIdKVP);
        } else {
            requeststring.append("?" + getRecordByIdKVP);
        }

        requeststring.append("&ID=" + recordId);

        LOG.debug("CSW GetMetadataByIdRequest Url: " +
            requeststring.toString());

        return requeststring.toString();
    }

    /**
     * Generate a CSW request String to get a repository item.
     *
     * @param baseURL {@link String} base Url to the catalog service.
     * @param recordId {@link String} ID of the repository item.
     * @return The request string.
     */
    public String generateCSWGetRepositoryItemRequestURL(String baseURL,
        String recordId) throws InvalidOperationException {
        if ((getRepositoryItemKVP == null) ||
                (getRepositoryItemKVP.length() <= 0)) {
            throw new InvalidOperationException(
                "GetRepositoryItem KVP is not configured for this profile: [" +
                this.getName() + "]");
        }

        StringBuilder requeststring = new StringBuilder();
        requeststring.append(baseURL);

        if (baseURL.endsWith("?")) {
            requeststring.append(getRepositoryItemKVP);
        } else {
            requeststring.append("?" + getRepositoryItemKVP);
        }

        requeststring.append("&ID=" + recordId);

        LOG.debug("CSW GetRepositoryItemRequest Url: " +
            requeststring.toString());

        return requeststring.toString();
    }

    /**
     * Generate a CSW request String.
     * First, create a simple common form of request xml
     * Then, transform the request xml into a real request xml using profile specific xslt
     *
     * @remark The CSW request String is built. The request is String is build based
     * on the request xslt.
     * @param ="param1" The search criteria
     * @returns The request String
     *
     * @param search
     * @throws TransformerException
     * @throws IOException
     */
    public String generateCSWGetRecordsRequest(CswSearchCriteria search)
        throws TransformerException, IOException {
        // Build xml
        String request = "<?xml version='1.0' encoding='UTF-8' ?>";
        request += ("<GetRecords>" + "<StartPosition>" +
        search.getStartPosition() + "</StartPosition>");
        request += ("<MaxRecords>" + search.getMaxRecords() + "</MaxRecords>");
        request += ("<KeyWord>" + this.XmlEscape(search.getSearchText()) +
        "</KeyWord>");
        request += ("<LiveDataMap>" + search.isLiveDataAndMapsOnly() +
        "</LiveDataMap>");

        if (search.getEnvelope() != null) {
            request += ("<Envelope type=\"" + search.getGeometrySearchType() +
            "\">");
            request += ("<MinX>" + search.getEnvelope().getMinX() + "</MinX>");
            request += ("<MinY>" + search.getEnvelope().getMinY() + "</MinY>");
            request += ("<MaxX>" + search.getEnvelope().getMaxX() + "</MaxX>");
            request += ("<MaxY>" + search.getEnvelope().getMaxY() + "</MaxY>");
            request += "</Envelope>";
        }

        if ((search.getTopicCategories() != null) &&
                (search.getTopicCategories().size() > 0)) {
            request += "<TopicCategories>";

            for (String code : search.getTopicCategories()) {
                request += ("<TopicCategory>" + code + "</TopicCategory>");
            }

            request += "</TopicCategories>";
        }

        request += "</GetRecords>";

        // Load xslt using transformer
        // Get a TransformerFactory object
        //File xsltFile = new File(requestxslt);
        //Source xsltSource = new StreamSource(xsltFile);
        Source xsltSource = new StreamSource(this.getClass().getClassLoader()
                                                 .getResourceAsStream(requestxslt));

        StringReader reader = new StringReader(request);
        Source requestSource = new StreamSource(reader);

        // Prepare output writer
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);

        TransformerFactory xformFactory = TransformerFactory.newInstance();

        //Get an XSL Transformer object
        Transformer transformer = xformFactory.newTransformer(xsltSource);
        transformer.transform(requestSource, result);

        String requestStr = result.getWriter().toString();
        // close
        reader.close();
        writer.close();

        LOG.debug("CSW GetRecords Request: " + requestStr);

        return requestStr;
    }

    /**
     * Read a CSW metadata response.
     *
     * @remark The CSW metadata response is read. The CSw record is updated with the
     * metadata
     * @param ="param1" The metadata response String
     * @param ="param2" The CSW record for the record
     *
     * @param response
     * @param record
     */
    public void readCSWGetMetadataByIDResponse(String response, CswRecord record)
        throws TransformerException {
        if (metadataxslt == null) {
            record.setFullMetadata(response);
        } else {
            //String RECORD_TAG = "Record";

            // Massage responseString as a proper object
            StringReader reader = new StringReader(response);
            Source responseSource = new StreamSource(reader);

            // Load xslt to parse responseString
            //File xsltFile = new File(metadataxslt);
            //Source xsltSource = new StreamSource(xsltFile);

⌨️ 快捷键说明

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