/*
* This file is part of the WfMOpen project.
* Copyright (C) 2001-2003 Danet GmbH (www.danet.de), GS-AN.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: Sax.java 2326 2007-03-27 21:59:44Z mlipp $
*
* $Log$
* Revision 1.3 2006/09/29 12:32:09 drmlipp
* Consistently using WfMOpen as projct name now.
*
* Revision 1.2 2006/03/08 14:46:41 drmlipp
* Synchronized with 1.3.3p5.
*
* Revision 1.1.1.2.6.1 2005/12/05 12:13:33 drmlipp
* Added tests for toString() of SAXContentBuffer.
*
* Revision 1.1.1.2 2004/08/18 15:18:47 drmlipp
* Update to 1.2
*
* Revision 1.12 2004/06/25 14:52:10 lipp
* Minimal implementation of XMLStreamReader.
*
* Revision 1.11 2004/05/09 18:41:43 lipp
* Added support for content > 32k.
*
* Revision 1.10 2003/06/27 09:44:13 lipp
* Fixed copyright/license information.
*
* Revision 1.9 2003/04/24 20:51:21 lipp
* Fixed some warnings.
*
* Revision 1.8 2003/04/21 20:25:41 lipp
* Major revision of implementation.
*
* Revision 1.7 2003/04/17 21:04:13 lipp
* Minor updates for namespace support.
*
* Revision 1.6 2002/10/08 13:25:12 schlue
* Classpath modified to ensure that xerces is used.
* Use of localname changed to qname.
*
* Revision 1.5 2002/02/03 21:41:42 lipp
* Cleaned up unittests.
*
* Revision 1.4 2002/01/23 10:42:20 lipp
* Added delegating handler.
*
* Revision 1.3 2002/01/23 09:42:34 lipp
* Added default handler and attributes.
*
* Revision 1.2 2002/01/22 22:28:26 lipp
* Getting started with sax support, the second.
*
* Revision 1.1 2002/01/22 15:51:48 lipp
* Getting started with sax support.
*
*/
package util;
import java.util.HashSet;
import java.util.Set;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import org.xml.sax.Attributes;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import de.danet.an.util.sax.DelegatingHandler;
import de.danet.an.util.sax.HandlerStack;
import de.danet.an.util.sax.SAXContentBuffer;
import de.danet.an.util.sax.StackedHandler;
import junit.framework.*;
/**
* Test class for sax utility classes
*/
public class Sax extends TestCase {
/**
* Konstruktor zum Erzeugen eines TestCase
*/
public Sax (String name) {
super (name);
}
/**
* Assembling the test suite
*/
public static Test suite() throws Exception {
TestSuite suite = new TestSuite();
suite.addTest(new Sax("saxContentBuf1"));
suite.addTest(new Sax("saxContentBuf2"));
suite.addTest(new Sax("saxContentBuf3"));
suite.addTest(new Sax("simpleParse"));
suite.addTest(new Sax("scopedParse"));
suite.addTest(new Sax("scopedParse2"));
suite.addTest(new Sax("scopedParse3"));
suite.addTest(new Sax("scopedParse4"));
return suite;
}
private XMLReader getReader() throws Exception {
SAXParserFactory pf = SAXParserFactory.newInstance();
pf.setValidating (false);
pf.setNamespaceAware (true);
SAXParser parser = pf.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setEntityResolver (new EntityResolver () {
public InputSource resolveEntity
(String publicId, String systemId) {
return new InputSource
(Sax.class.getResourceAsStream("/xpdl.dtd"));
}
});
return reader;
}
/**
* Test
*/
public void saxContentBuf1() throws Exception {
SAXContentBuffer buf = new SAXContentBuffer ();
final String ts1 = "Hello world!";
StringBuffer ts2 = new StringBuffer ();
for (int i = 0; i < 5000; i++) {
ts2.append ("0123456789");
}
assertTrue (ts2.length() == 50000);
buf.characters (ts1.toCharArray(), 0, ts1.toCharArray().length);
buf.characters (ts2.toString().toCharArray(), 0,
ts2.toString().toCharArray().length);
final String[] res = new String[2];
buf.emit (new DefaultHandler () {
public void characters (char[] ch, int start, int length)
throws SAXException {
if (res[0] == null) {
res[0] = new String (ch, start, length);
} else {
res[1] = new String (ch, start, length);
}
}
});
assertTrue (res[0].equals (ts1));
assertTrue (res[1].equals (ts2.toString ()));
}
/**
* Test
*/
public void saxContentBuf2() throws Exception {
SAXContentBuffer buf = new SAXContentBuffer ();
XMLReader reader = getReader();
reader.setContentHandler(buf);
reader.parse
(new InputSource
(Sax.class.getResourceAsStream("/util/testXPDL.xml")));
XMLStreamReader rdr = buf.createXMLStreamReader();
int event = 0;
int sees = 0;
int eees = 0;
while (rdr.hasNext()) {
event = rdr.next ();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
if (sees == 0) {
assertTrue (rdr.getNamespaceURI().equals
("http://www.wfmc.org/2002/XPDL1.0"));
assertTrue (rdr.getLocalName().equals ("Package"));
}
sees += 1;
break;
case XMLStreamConstants.END_ELEMENT:
eees += 1;
break;
}
}
assertTrue (event == XMLStreamConstants.END_DOCUMENT);
assertTrue (sees > 0);
assertTrue (sees == eees);
}
/**
* Test
*/
public void saxContentBuf3() throws Exception {
SAXContentBuffer buf = new SAXContentBuffer ();
XMLReader reader = getReader();
reader.setContentHandler(buf);
reader.parse
(new InputSource
(Sax.class.getResourceAsStream("/util/simpleSample.xml")));
assertTrue (buf.toString(),
buf.toString().equals ("<body><item/></body>"));
}
/**
* Simple parsing test
*/
public void simpleParse() throws Exception {
XMLReader reader = getReader();
HandlerStack stack = new HandlerStack (reader, new StackedHandler());
reader.parse
(new InputSource
(Sax.class.getResourceAsStream("/util/testXPDL.xml")));
}
/**
* Scoped parsing test
*/
public void scopedParse() throws Exception {
final Set outerTags = new HashSet();
final Set innerTags = new HashSet();
final String expPath
= "/{http://www.wfmc.org/2002/XPDL1.0}Package"
+ "/{http://www.wfmc.org/2002/XPDL1.0}WorkflowProcesses"
+ "/{http://www.wfmc.org/2002/XPDL1.0}WorkflowProcess"
+ "/{http://www.wfmc.org/2002/XPDL1.0}Activities"
+ "/{http://www.wfmc.org/2002/XPDL1.0}Activity"
+ "/{http://www.wfmc.org/2002/XPDL1.0}TransitionRestrictions";
XMLReader reader = getReader();
HandlerStack stack = new HandlerStack
(reader, new StackedHandler() {
public void startElement
(String uri, String localName, String qName,
Attributes atts) throws SAXException {
outerTags.add (qName);
if (qName.equals ("TransitionRestrictions")) {
assertTrue (currentPath().equals(expPath));
getStack().push (new SubHandler());
}
}
});
stack.setContextData ("innerTags", innerTags);
reader.parse
(new InputSource
(Sax.class.getResourceAsStream("/util/testXPDL.xml")));
assertTrue (outerTags.contains ("Activity"));
assertTrue (outerTags.contains ("TransitionRestrictions"));
assertTrue (!outerTags.contains ("TransitionRestriction"));
assertTrue (innerTags.contains ("TransitionRestrictions"));
assertTrue (innerTags.contains ("TransitionRestriction"));
assertTrue (!innerTags.contains ("Activity"));
}
public static class SubHandler extends StackedHandler {
private Set tags;
public void startElement
(String uri, String localName, String qName, Attributes atts)
throws SAXException {
Set tags = (Set)getContextData("innerTags");
tags.add (qName);
}
}
/**
* Scoped parsing test using delegating handler
*/
public void scopedParse2() throws Exception {
final Set outerTags = new HashSet();
final Set innerTags = new HashSet();
XMLReader reader = getReader();
DelegatingHandler dh = new DelegatingHandler () {
public void startElement
(String uri, String localName, String qName,
Attributes atts) throws SAXException {
outerTags.add (qName);
super.startElement (uri, localName, qName, atts);
}
};
dh.addHandler ("http://www.wfmc.org/2002/XPDL1.0",
"TransitionRestrictions", SubHandler.class);
HandlerStack stack = new HandlerStack (reader, dh);
stack.setContextData ("innerTags", innerTags);
reader.parse
(new InputSource
(Sax.class.getResourceAsStream("/util/testXPDL.xml")));
assertTrue (outerTags.contains ("Activity"));
assertTrue (outerTags.contains ("TransitionRestrictions"));
assertTrue (!outerTags.contains ("TransitionRestriction"));
assertTrue (innerTags.contains ("TransitionRestrictions"));
assertTrue (innerTags.contains ("TransitionRestriction"));
assertTrue (!innerTags.contains ("Activity"));
}
/**
* Scoped parsing test using delegating handler
*/
public void scopedParse3() throws Exception {
final Set outerTags = new HashSet();
final Set innerTags = new HashSet();
XMLReader reader = getReader();
DelegatingHandler dh = new DelegatingHandler () {
public void startElement
(String uri, String localName, String qName,
Attributes atts) throws SAXException {
outerTags.add (qName);
super.startElement (uri, localName, qName, atts);
}
};
dh.addHandler
("{http://www.wfmc.org/2002/XPDL1.0}Activity"
+ "/{http://www.wfmc.org/2002/XPDL1.0}TransitionRestrictions",
SubHandler.class);
HandlerStack stack = new HandlerStack (reader, dh);
stack.setContextData ("innerTags", innerTags);
reader.parse
(new InputSource
(Sax.class.getResourceAsStream("/util/testXPDL.xml")));
assertTrue (outerTags.contains ("Activity"));
assertTrue (outerTags.contains ("TransitionRestrictions"));
assertTrue (!outerTags.contains ("TransitionRestriction"));
assertTrue (innerTags.contains ("TransitionRestrictions"));
assertTrue (innerTags.contains ("TransitionRestriction"));
assertTrue (!innerTags.contains ("Activity"));
}
/**
* Scoped parsing test using delegating handler
*/
public void scopedParse4() throws Exception {
final Set outerTags = new HashSet();
final Set innerTags = new HashSet();
XMLReader reader = getReader();
DelegatingHandler dh = new DelegatingHandler () {
public void startElement
(String uri, String localName, String qName,
Attributes atts) throws SAXException {
outerTags.add (qName);
super.startElement (uri, localName, qName, atts);
}
};
dh.addHandler
("/{http://www.wfmc.org/2002/XPDL1.0}Package"
+ "/{http://www.wfmc.org/2002/XPDL1.0}WorkflowProcesses"
+ "/{http://www.wfmc.org/2002/XPDL1.0}WorkflowProcess"
+ "/{http://www.wfmc.org/2002/XPDL1.0}Activities"
+ "/{http://www.wfmc.org/2002/XPDL1.0}Activity"
+ "/{http://www.wfmc.org/2002/XPDL1.0}TransitionRestrictions",
SubHandler.class);
HandlerStack stack = new HandlerStack (reader, dh);
stack.setContextData ("innerTags", innerTags);
reader.parse
(new InputSource
(Sax.class.getResourceAsStream("/util/testXPDL.xml")));
assertTrue (outerTags.contains ("Activity"));
assertTrue (outerTags.contains ("TransitionRestrictions"));
assertTrue (!outerTags.contains ("TransitionRestriction"));
assertTrue (innerTags.contains ("TransitionRestrictions"));
assertTrue (innerTags.contains ("TransitionRestriction"));
assertTrue (!innerTags.contains ("Activity"));
}
}