com.esri.geoportal.commons.csw.client.impl.CapabilitiesParse.java Source code

Java tutorial

Introduction

Here is the source code for com.esri.geoportal.commons.csw.client.impl.CapabilitiesParse.java

Source

/*
 * Copyright 2016 Esri, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.esri.geoportal.commons.csw.client.impl;

import java.util.Stack;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.lang3.StringEscapeUtils;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * The Class CapabilitiesParse.
 */
public class CapabilitiesParse extends DefaultHandler {

    // class variable ==============================================================
    /** The LOG. */
    Logger LOG = Logger.getLogger(CapabilitiesParse.class.getCanonicalName());

    // instance variables ==========================================================
    /** The text. */
    StringBuffer text = new StringBuffer();

    /** The cap. */
    Capabilities cap;

    /** The ows parameter. */
    boolean owsParameter = false;

    /** The capabilities. */
    boolean capabilities = false;

    /** The get record by id. */
    boolean getRecordById = false;

    /** The get records. */
    boolean getRecords = false;

    /** The constraint. */
    boolean constraint = false;

    /** The value. */
    boolean value = false;

    /** The operation. */
    boolean operation = false;

    /** The get. */
    boolean get = false;

    /** The post. */
    boolean post = false;

    /** The get records url list. */
    @SuppressWarnings("unchecked")
    private final Stack getRecordsList = new Stack();

    // constructor ================================================================
    /**
     * Instantiates a new capabilities parse.
     * 
     * @param capabilities the capabilities
     */
    public CapabilitiesParse(Capabilities capabilities) {
        cap = capabilities;
        // TODO Auto-generated constructor stub
    }

    // methods =====================================================================
    @SuppressWarnings("unchecked")
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attrib) throws SAXException {
        tracking(localName, true);
        text = new StringBuffer();

        if (localName.equals("")) {
            localName = qName;
        }
        LOG.finer("ELEMENT BEGIN " + StringEscapeUtils.escapeJava(localName));

        // Define handling rules 
        text = new StringBuffer();

        if (capabilities && localName.equalsIgnoreCase("operation")) {
            if (chkStr(attrib.getValue("name")).equalsIgnoreCase("GetRecordById")) {
                getRecordById = true;
            } else {
                getRecordById = false;
            }

            if (chkStr(attrib.getValue("name")).equalsIgnoreCase("GetRecords")) {
                getRecords = true;
            } else {
                getRecords = false;
            }
        }

        if (capabilities && getRecordById && localName.equalsIgnoreCase("get")) {
            cap.set_getRecordByIDGetURL(attrib.getValue("xlink:href"));
        }

        if (capabilities && getRecords && localName.equalsIgnoreCase("post")) {
            getRecordsList.push(chkStr(attrib.getValue("xlink:href")));
        }

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (localName.equals("")) {
            localName = qName;
        }

        LOG.finer("TEXT IN ELEMENT " + StringEscapeUtils.escapeJava(text.toString()));
        LOG.finer("ELEMENT END " + StringEscapeUtils.escapeJava(localName));
        try {
            text = new StringBuffer(chkStr(text.toString()));
            if (capabilities && getRecords && post && constraint && localName.equalsIgnoreCase("Value")
                    && text.toString().equalsIgnoreCase("XML") && getRecordsList.peek() != null) {
                cap.set_getRecordsPostURL(getRecordsList.pop().toString());
            } else if (capabilities && getRecords && post && constraint && localName.equalsIgnoreCase("Value")
                    && !text.toString().equalsIgnoreCase("XML") && getRecordsList.peek() != null) {
                getRecordsList.pop();
            }

            if (capabilities && getRecords && localName.equalsIgnoreCase("HTTP") && getRecordsList.peek() != null) {
                String tmp = chkStr(cap.get_getRecordsPostURL());
                if ("".equals(tmp)) {
                    cap.set_getRecordsPostURL(getRecordsList.pop().toString());
                }
            }
            if (capabilities && localName.equalsIgnoreCase("Abstract")) {
                cap.setAbstractText(text.toString());
            }
            if (capabilities && localName.equalsIgnoreCase("Title")) {
                cap.setTitle(text.toString());
            }
        } catch (Throwable e) {
            LOG.log(Level.FINER, "Error while getting getrecords url", e);
        }
        tracking(localName, false);

    }

    /**
     * Tracks the xml elements
     * 
     * @param element the element
     * @param alive the alive
     */
    private void tracking(String element, boolean alive) {

        if (element.equals("owsParameter")) {
            owsParameter = alive;
        } else if (element.equalsIgnoreCase("Capabilities")) {
            capabilities = alive;
        } else if (element.equalsIgnoreCase("Operation")) {
            operation = alive;
        } else if (element.equalsIgnoreCase("Constraint")) {
            constraint = alive;
        } else if (element.equalsIgnoreCase("Value")) {
            value = alive;
        } else if (element.equalsIgnoreCase("Post")) {
            post = alive;
        } else if (element.equalsIgnoreCase("Get")) {
            get = alive;
        }

    }

    /**
     * Appends element chracters.
     * 
     * @param chars Characters
     * @param start start position
     * @param length length to read
     */
    @Override
    public void characters(char chars[], int start, int length) {

        text.append(chars, start, length);
    }

    /**
     * If string is null, returns empty string, else returns trimmed
     * string.
     * 
     * @param string the string to be checked
     * 
     * @return the string (trimmed, never null)
     */
    private static String chkStr(String string) {
        if (string == null) {
            return "";
        }
        return string.trim();
    }

}