/* 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.catalog.arcims; import java.io.IOException; import java.io.StringReader; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * Handles the SAX parsing of an axl response from an ArcIMS metadata publish service. * <p> * Parsing starts by passing a publish service request and axl response to * the parseAxlResponse method. * <br/>When an element is started the PublishServiceRequest.onStartSaxElement * is triggered. * <br/>When an element is ended the PublishServiceRequest.onEndSaxElement * is triggered. */ class ImsSaxHandler extends DefaultHandler { // class variables ============================================================= // instance variables ========================================================== private StringBuffer _characters = new StringBuffer(); private ImsRequest _imsRequest = null; // constructors ================================================================ /** Default constructor. */ protected ImsSaxHandler() { super(); } // properties ================================================================== // methods ===================================================================== /** * Sets text node characters for a SAX element. * @param ch the array of characters * @param start the starting position within the array * @param length the number of characters to read from the array * @throws SAXException if the exception occurs */ @Override public void characters(char ch[], int start, int length) throws SAXException { if ((ch != null) && (length > 0)) _characters.append(ch,start,length); } /** * Ends a SAX element. * <br/>The parser is not namespace aware. * @param uri the uri namespace for the element * @param localName the local name for the element * @param qName the qualified name for the element * @throws SAXException if a SAXException occurs */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { String sTag = returnLowerCaseTag(uri,localName,qName); String sCharacters = _characters.toString().trim(); // check for errors if (sTag.equals("error")) { throw new ImsSaxException(sCharacters); } else if (sCharacters.startsWith("[ERR")) { if (_imsRequest != null) { _imsRequest.setActionStatus(ImsRequest.ACTION_STATUS_ERROR); } throw new ImsSaxException(sCharacters); } // check for metadata action status if (sTag.equals("metadata_action")) { if (_imsRequest != null) { if (sCharacters.equals("OK")) { _imsRequest.setActionStatus(ImsRequest.ACTION_STATUS_OK); } else if (sCharacters.equals("REPLACED")) { _imsRequest.setActionStatus(ImsRequest.ACTION_STATUS_REPLACED); } } } // trigger end element, reset characters if (_imsRequest != null) { _imsRequest.onEndSaxElement(sTag,sCharacters); } _characters = new StringBuffer(); } /** * Starts a SAX parser on an ArcIMS axl response. * @param imsRequest the associated request * @param axlResponse the ArcIMS axl response * @throws ParserConfigurationException if the exception occurs * @throws SAXException if the exception occurs * @throws IOException if the exception occurs */ protected void parseAxlResponse(ImsRequest imsRequest, String axlResponse) throws ParserConfigurationException, SAXException, IOException { _imsRequest = imsRequest; SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); InputSource src = new InputSource(new StringReader(axlResponse)); parser.parse(src,this); } /** * Returns the lower case tag name for an element. * <br/>The parser is not namespace aware. * @param uri the uri namespace for the element * @param localName the local name for the element * @param qName the qualified name for the element * @return the lower case tag name */ private String returnLowerCaseTag(String uri, String localName, String qName) { if (qName == null) { return ""; } else { return qName.trim().toLowerCase(); } } /** * Starts a SAX element. * <br/>The parser is not namespace aware. * @param uri the uri namespace for the element * @param localName the local name for the element * @param qName the qualified name for the element * @param attributes the attributes for the element * @throws SAXException if a SAXException occurs */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // reset characters, trigger start element _characters = new StringBuffer(); String sTag = returnLowerCaseTag(uri,localName,qName); if (_imsRequest != null) { _imsRequest.onStartSaxElement(sTag,attributes); } } }