home *** CD-ROM | disk | FTP | other *** search
- package net.n3.nanoxml;
-
- import java.io.Reader;
- import java.util.Enumeration;
- import java.util.Properties;
-
- public class StdXMLParser implements IXMLParser {
- private static final char[] END_OF_PI = new char[]{'>', '?'};
- private static final char[] END_OF_CDATA = new char[]{'>', ']', ']'};
- private static final char[] END_OF_PCDATA = new char[]{'<'};
- private IXMLBuilder builder = null;
- private IXMLReader reader = null;
- private IXMLEntityResolver entityResolver = new XMLEntityResolver();
- private IXMLValidator validator = null;
-
- protected void finalize() throws Throwable {
- this.builder = null;
- this.reader = null;
- this.entityResolver = null;
- this.validator = null;
- super.finalize();
- }
-
- public void setBuilder(IXMLBuilder var1) {
- this.builder = var1;
- }
-
- public IXMLBuilder getBuilder() {
- return this.builder;
- }
-
- public void setValidator(IXMLValidator var1) {
- this.validator = var1;
- }
-
- public IXMLValidator getValidator() {
- return this.validator;
- }
-
- public void setResolver(IXMLEntityResolver var1) {
- this.entityResolver = var1;
- }
-
- public IXMLEntityResolver getResolver() {
- return this.entityResolver;
- }
-
- public void setReader(IXMLReader var1) {
- this.reader = var1;
- }
-
- public IXMLReader getReader() {
- return this.reader;
- }
-
- public Object parse() throws XMLException {
- try {
- this.builder.startBuilding(this.reader.getSystemID(), this.reader.getLineNr());
- this.scanData();
- return this.builder.getResult();
- } catch (XMLException var2) {
- throw var2;
- } catch (Exception var3) {
- throw new XMLException(var3);
- }
- }
-
- protected void scanData() throws Exception {
- while(!this.reader.atEOF() && this.builder.getResult() == null) {
- char var1 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- switch (var1) {
- case '\t':
- case '\n':
- case '\r':
- case ' ':
- break;
- case '<':
- this.scanSomeTag(false);
- break;
- default:
- XMLUtil.errorInvalidInput(this.reader.getSystemID(), this.reader.getLineNr(), "`" + var1 + "' (0x" + Integer.toHexString(var1) + ')');
- }
- }
-
- }
-
- protected void scanSomeTag(boolean var1) throws Exception {
- char var2 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- switch (var2) {
- case '!':
- this.processSpecialTag(var1);
- break;
- case '?':
- this.processPI();
- break;
- default:
- this.reader.unread(var2);
- this.processElement();
- }
-
- }
-
- protected void processPI() throws Exception {
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- String var1 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- ContentReader var2 = new ContentReader(this.reader, this.entityResolver, '&', END_OF_PI, true, "");
- if (!var1.equalsIgnoreCase("xml")) {
- this.builder.newProcessingInstruction(var1, var2);
- }
-
- ((Reader)var2).close();
- }
-
- protected void processSpecialTag(boolean var1) throws Exception {
- char var2 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- switch (var2) {
- case '-':
- XMLUtil.skipComment(this.reader, this.entityResolver);
- return;
- case 'D':
- this.processDocType();
- return;
- case '[':
- if (var1) {
- this.processCDATA();
- } else {
- XMLUtil.skipTag(this.reader, '&', this.entityResolver);
- }
-
- return;
- default:
- }
- }
-
- protected void processCDATA() throws Exception {
- if (!XMLUtil.checkLiteral(this.reader, '&', this.entityResolver, "CDATA[")) {
- XMLUtil.skipTag(this.reader, '&', this.entityResolver);
- } else {
- this.validator.PCDataAdded(this.reader.getSystemID(), this.reader.getLineNr());
- ContentReader var1 = new ContentReader(this.reader, this.entityResolver, '&', END_OF_CDATA, true, "");
- this.builder.addPCData(var1, this.reader.getSystemID(), this.reader.getLineNr());
- ((Reader)var1).close();
- }
- }
-
- protected void processDocType() throws Exception {
- if (!XMLUtil.checkLiteral(this.reader, '&', this.entityResolver, "OCTYPE")) {
- XMLUtil.skipTag(this.reader, '&', this.entityResolver);
- } else {
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- String var1 = null;
- StringBuffer var2 = new StringBuffer();
- String var3 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- char var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- if (var4 == 'P') {
- var1 = XMLUtil.scanPublicID(var2, this.reader, '&', this.entityResolver);
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- } else if (var4 == 'S') {
- var1 = XMLUtil.scanSystemID(this.reader, '&', this.entityResolver);
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- }
-
- if (var4 == '[') {
- this.validator.parseDTD(var2.toString(), this.reader, this.entityResolver, false);
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- }
-
- if (var4 != '>') {
- XMLUtil.errorExpectedInput(this.reader.getSystemID(), this.reader.getLineNr(), "`>'");
- }
-
- if (var1 != null) {
- Reader var5 = this.reader.openStream(var2.toString(), var1);
- this.reader.startNewStream(var5);
- this.reader.setSystemID(var1);
- this.reader.setPublicID(var2.toString());
- this.validator.parseDTD(var2.toString(), this.reader, this.entityResolver, true);
- }
-
- }
- }
-
- protected void processElement() throws Exception {
- String var1 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- String var2 = null;
- int var3 = var1.indexOf(58);
- if (var3 > 0) {
- var2 = var1.substring(0, var3);
- var1 = var1.substring(var3 + 1);
- }
-
- this.validator.elementStarted(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
- this.builder.startElement(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
-
- while(true) {
- char var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- if (var4 == '/' || var4 == '>') {
- Properties var5 = new Properties();
- this.validator.elementAttributesProcessed(var1, var2, (String)null, var5, this.reader.getSystemID(), this.reader.getLineNr());
-
- String var7;
- String var8;
- String var9;
- for(Enumeration var6 = var5.keys(); var6.hasMoreElements(); this.builder.addAttribute(var7, var9, (String)null, var8, "CDATA")) {
- var7 = (String)var6.nextElement();
- var8 = var5.getProperty(var7);
- var9 = null;
- var3 = var7.indexOf(58);
- if (var3 > 0) {
- var9 = var7.substring(0, var3);
- var7 = var7.substring(var3 + 1);
- }
- }
-
- this.builder.elementAttributesProcessed(var1, var2, (String)null);
- if (var4 == '/') {
- if (XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver) != '>') {
- XMLUtil.errorExpectedInput(this.reader.getSystemID(), this.reader.getLineNr(), "`>'");
- }
-
- this.validator.elementEnded(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
- this.builder.endElement(var1, var2, (String)null);
- return;
- } else {
- StringBuffer var13 = new StringBuffer(16);
-
- while(true) {
- var13.setLength(0);
- boolean[] var14 = new boolean[1];
- XMLUtil.skipWhitespace(this.reader, '&', var13, var14);
- var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
- if (var4 == '<' && !var14[0]) {
- var4 = this.reader.read();
- if (var4 == '/') {
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- var9 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
- if (!var9.equals(var1)) {
- XMLUtil.errorWrongClosingTag(this.reader.getSystemID(), this.reader.getLineNr(), var1, var9);
- }
-
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- if (XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver) != '>') {
- XMLUtil.errorClosingTagNotEmpty(this.reader.getSystemID(), this.reader.getLineNr());
- }
-
- this.validator.elementEnded(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
- this.builder.endElement(var1, var2, (String)null);
- return;
- }
-
- this.reader.unread(var4);
- this.scanSomeTag(true);
- } else {
- this.validator.PCDataAdded(this.reader.getSystemID(), this.reader.getLineNr());
- this.reader.unread(var4);
- ContentReader var15 = new ContentReader(this.reader, this.entityResolver, '&', END_OF_PCDATA, false, var13.toString());
- this.builder.addPCData(var15, this.reader.getSystemID(), this.reader.getLineNr());
- ((Reader)var15).close();
- this.reader.unread('<');
- }
- }
- }
- }
-
- this.reader.unread(var4);
- this.processAttribute();
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- }
- }
-
- protected void processAttribute() throws Exception {
- String var1 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
- XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
- if (XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver) != '=') {
- XMLUtil.errorExpectedInput(this.reader.getSystemID(), this.reader.getLineNr(), "`='");
- }
-
- String var2 = XMLUtil.scanString(this.reader, '&', true, this.entityResolver);
- this.validator.attributeAdded(var1, (String)null, (String)null, var2, this.reader.getSystemID(), this.reader.getLineNr());
- this.builder.addAttribute(var1, (String)null, (String)null, var2, "CDATA");
- }
- }
-