/* ====================================================================
* Limited Evaluation License:
*
* This software is open source, but licensed. The license with this package
* is an evaluation license, which may not be used for productive systems. If
* you want a full license, please contact us.
*
* The exclusive owner of this work is the OpenRate project.
* This work, including all associated documents and components
* is Copyright of the OpenRate project 2006-2015.
*
* The following restrictions apply unless they are expressly relaxed in a
* contractual agreement between the license holder or one of its officially
* assigned agents and you or your organisation:
*
* 1) This work may not be disclosed, either in full or in part, in any form
* electronic or physical, to any third party. This includes both in the
* form of source code and compiled modules.
* 2) This work contains trade secrets in the form of architecture, algorithms
* methods and technologies. These trade secrets may not be disclosed to
* third parties in any form, either directly or in summary or paraphrased
* form, nor may these trade secrets be used to construct products of a
* similar or competing nature either by you or third parties.
* 3) This work may not be included in full or in part in any application.
* 4) You may not remove or alter any proprietary legends or notices contained
* in or on this work.
* 5) This software may not be reverse-engineered or otherwise decompiled, if
* you received this work in a compiled form.
* 6) This work is licensed, not sold. Possession of this software does not
* imply or grant any right to you.
* 7) You agree to disclose any changes to this work to the copyright holder
* and that the copyright holder may include any such changes at its own
* discretion into the work
* 8) You agree not to derive other works from the trade secrets in this work,
* and that any such derivation may make you liable to pay damages to the
* copyright holder
* 9) You agree to use this software exclusively for evaluation purposes, and
* that you shall not use this software to derive commercial profit or
* support your business or personal activities.
*
* This software is provided "as is" and any expressed or impled warranties,
* including, but not limited to, the impled warranties of merchantability
* and fitness for a particular purpose are disclaimed. In no event shall
* The OpenRate Project or its officially assigned agents be liable to any
* direct, indirect, incidental, special, exemplary, or consequential damages
* (including but not limited to, procurement of substitute goods or services;
* Loss of use, data, or profits; or any business interruption) however caused
* and on theory of liability, whether in contract, strict liability, or tort
* (including negligence or otherwise) arising in any way out of the use of
* this software, even if advised of the possibility of such damage.
* This software contains portions by The Apache Software Foundation, Robert
* Half International.
* ====================================================================
*/
/**
* afzaal 06-11-2008 initial version
*/
package OpenRate.parser;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* An XML parser
*
* @author afzaal
*/
public class XMLParser extends DefaultHandler
{
/**
* CVS version info - Automatically captured and written to the Framework
* Version Audit log at Framework startup. For more information
* please <a target='new' href='http://www.open-rate.com/wiki/index.php?title=Framework_Version_Map'>click here</a> to go to wiki page.
*/
public static String CVS_MODULE_INFO = "OpenRate, $RCSfile: XMLParser.java,v $, $Revision: 1.11 $, $Date: 2013-05-13 18:12:12 $";
private static SAXParserFactory factory = SAXParserFactory.newInstance();
// Used to store xml tag names
private ArrayList<String> tmpQNames = new ArrayList<>(5);
private StringBuffer tmpValue;
// Header Identifier to Skip calling SetAttribute of IXMLparser interface
private String headerIdentifier;
// This is the client that needs attributes from xml
private IXmlParser client;
/**
* Constructor
*
* @param client The client
*/
public XMLParser(IXmlParser client)
{
this.client = client;
}
/**
* Parse XML
*
* @param xmlToParse The XML to parse
* @param headerIdentifier The header identifier
* @throws Exception
*/
public void parseXML(String xmlToParse, String headerIdentifier) throws Exception
{
if(headerIdentifier == null || headerIdentifier.trim().equals(""))
{
headerIdentifier = null;
}
this.headerIdentifier = headerIdentifier;
SAXParser parser;
parser = factory.newSAXParser();
parser.parse(new ByteArrayInputStream(xmlToParse.getBytes()), this);
}
/**
* Add a start element
*
* @param uri
* @param local
* @param qname
* @param atts
* @throws SAXException
*/
@Override
public void startElement(String uri, String local, String qname,
Attributes atts) throws SAXException
{
tmpValue = new StringBuffer("");
if(headerIdentifier != null && qname.equalsIgnoreCase(headerIdentifier))
{
tmpQNames.add(headerIdentifier);
}
else if(tmpQNames.isEmpty() && (headerIdentifier== null || !(qname.equalsIgnoreCase(headerIdentifier))))
{
tmpQNames.add(qname);
}
else if(tmpQNames.size() > 0)
{
tmpQNames.add(tmpQNames.get(tmpQNames.size()-1)+"."+qname);
}
}
/**
* Add an end element
*
* @param uri
* @param local
* @param qname
* @throws SAXException
*/
@Override
public void endElement(String uri, String local, String qname) throws SAXException
{
if(headerIdentifier == null || !(qname.equalsIgnoreCase(headerIdentifier)))
{
client.setAttribute(tmpQNames.get(tmpQNames.size()-1), tmpValue.toString());
tmpQNames.remove(tmpQNames.size()-1);
tmpValue = new StringBuffer();
}
}
/**
* Add characters
*
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
if(ch != null && tmpQNames != null && tmpQNames.size() > 0)
{
tmpValue.append(ch, start, length);
}
}
/**
* Start of document
*
* @throws SAXException
*/
@Override
public void startDocument ()
throws SAXException
{
}
/**
* End of document
*
* @throws SAXException
*/
@Override
public void endDocument()
throws SAXException
{
}
/**
* Start of prefix mapping
*
* @param prefix
* @param uri
* @throws SAXException
*/
@Override
public void startPrefixMapping (String prefix, String uri)
throws SAXException
{
}
/**
* End of prefix mapping
*
* @param prefix
* @throws SAXException
*/
@Override
public void endPrefixMapping (String prefix)
throws SAXException
{
}
/**
* Ignorable whiltespace
*
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public void ignorableWhitespace (char ch[], int start, int length)
throws SAXException
{
}
/**
* Processing instruction
*
* @param target
* @param data
* @throws SAXException
*/
@Override
public void processingInstruction (String target, String data)
throws SAXException
{
}
/**
* Skipped entity
*
* @param name
* @throws SAXException
*/
@Override
public void skippedEntity (String name)
throws SAXException
{
}
/**
* Set document locator
*
* @param locator
*/
@Override
public void setDocumentLocator (Locator locator)
{
}
}