/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You 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.gpt.server.csw.client; import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.esri.gpt.framework.util.Val; /** * 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. */ CswCatalogCapabilities 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(CswCatalogCapabilities capabilities) { cap = capabilities; // TODO Auto-generated constructor stub } // methods ===================================================================== /** * Sax start element * @param uri * @param localName * @param qName * @param attrib * @throws SAXException */ @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 " + 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"))); } } /** * Sax end element * @param uri * @param localName * @param qName * @throws SAXException */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (localName.equals("")) { localName = qName; } LOG.finer("TEXT IN ELEMENT " + text); LOG.finer("ELEMENT END " + 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(); } }