diff options
author | Andrew Haley <aph@redhat.com> | 2016-09-30 16:24:48 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2016-09-30 16:24:48 +0000 |
commit | 07b78716af6a9d7c9fd1e94d9baf94a52c873947 (patch) | |
tree | 3f22b3241c513ad168c8353805614ae1249410f4 /libjava/classpath/gnu/xml/stream | |
parent | eae993948bae8b788c53772bcb9217c063716f93 (diff) | |
download | gcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.tar.gz |
Makefile.def: Remove libjava.
2016-09-30 Andrew Haley <aph@redhat.com>
* Makefile.def: Remove libjava.
* Makefile.tpl: Likewise.
* Makefile.in: Regenerate.
* configure.ac: Likewise.
* configure: Likewise.
* gcc/java: Remove.
* libjava: Likewise.
From-SVN: r240662
Diffstat (limited to 'libjava/classpath/gnu/xml/stream')
30 files changed, 0 insertions, 12464 deletions
diff --git a/libjava/classpath/gnu/xml/stream/AttributeImpl.java b/libjava/classpath/gnu/xml/stream/AttributeImpl.java deleted file mode 100644 index 58a0dbe2126..00000000000 --- a/libjava/classpath/gnu/xml/stream/AttributeImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -/* AttributeImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.namespace.QName; -import javax.xml.stream.events.Attribute; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; - -/** - * An attribute event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class AttributeImpl - extends XMLEventImpl - implements Attribute -{ - - protected final QName name; - protected final String value; - protected final String type; - protected final boolean specified; - - protected AttributeImpl(Location location, - QName name, String value, String type, - boolean specified) - { - super(location); - this.name = name; - this.value = value; - this.type = type; - this.specified = specified; - } - - public int getEventType() - { - return ATTRIBUTE; - } - - public QName getName() - { - return name; - } - - public String getValue() - { - return value; - } - - public String getDTDType() - { - return type; - } - - public boolean isSpecified() - { - return specified; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - String prefix = name.getPrefix(); - if (prefix != null && !"".equals(prefix)) - { - writer.write(prefix); - writer.write(':'); - } - writer.write(name.getLocalPart()); - writer.write('='); - writer.write('"'); - writer.write(encode(value, true)); - writer.write('"'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/BufferedReader.java b/libjava/classpath/gnu/xml/stream/BufferedReader.java deleted file mode 100644 index dc69fb34ba3..00000000000 --- a/libjava/classpath/gnu/xml/stream/BufferedReader.java +++ /dev/null @@ -1,198 +0,0 @@ -/* BufferedReader.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Reader; - -/** - * A mark-capable buffered reader. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -class BufferedReader - extends Reader -{ - - static final int DEFAULT_BUFFER_SIZE = 4096; - - final Reader in; - char[] buf; - int pos, count, markpos, marklimit, bufferSize; - - BufferedReader(Reader in) - { - this(in, DEFAULT_BUFFER_SIZE); - } - - BufferedReader(Reader in, int bufferSize) - { - if (bufferSize < 1) - throw new IllegalArgumentException(); - this.in = in; - this.bufferSize = bufferSize; - buf = new char[bufferSize]; - pos = count = bufferSize; - } - - public void close() - throws IOException - { - buf = null; - pos = count = 0; - markpos = -1; - in.close(); - } - - public void mark(int readlimit) - throws IOException - { - marklimit = readlimit; - markpos = pos; - } - - public boolean markSupported() - { - return true; - } - - public int read() - throws IOException - { - if (pos >= count && !refill()) - return -1; - return (int) buf[pos++]; - } - - public int read(char[] b) - throws IOException - { - return read(b, 0, b.length); - } - - public int read(char[] b, int off, int len) - throws IOException - { - if (off < 0 || len < 0 || b.length - off < len) - throw new IndexOutOfBoundsException(); - - if (len == 0) - return 0; - - if (pos >= count && !refill()) - return -1; - - int ret = Math.min(count - pos, len); - System.arraycopy(buf, pos, b, off, ret); - pos += ret; - off += ret; - len -= ret; - - while (len > 0 && refill()) - { - int remain = Math.min(count - pos, len); - System.arraycopy(buf, pos, b, off, remain); - pos += remain; - off += remain; - len -= remain; - ret += remain; - } - - return ret; - } - - public void reset() - throws IOException - { - if (markpos == -1) - throw new IOException(buf == null ? "Stream closed." : "Invalid mark."); - pos = markpos; - } - - public long skip(long n) - throws IOException - { - if (buf == null) - throw new IOException("Stream closed."); - final long origN = n; - while (n > 0L) - { - if (pos >= count && !refill()) - break; - int numread = (int) Math.min((long) (count - pos), n); - pos += numread; - n -= numread; - } - return origN - n; - } - - private boolean refill() - throws IOException - { - if (buf == null) - throw new IOException("Stream closed."); - - int markcount = count - markpos; - if (markpos == -1 || markcount >= marklimit) - { - markpos = -1; - pos = count = 0; - } - else - { - char[] newbuf = buf; - if (markpos < bufferSize) - { - newbuf = new char[count - markpos + bufferSize]; - } - System.arraycopy(buf, markpos, newbuf, 0, markcount); - buf = newbuf; - count = markcount; - pos -= markpos; - markpos = 0; - } - - int numread = in.read(buf, count, bufferSize); - if (numread <= 0) - return false; - - count += numread; - return true; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/CRLFReader.java b/libjava/classpath/gnu/xml/stream/CRLFReader.java deleted file mode 100644 index 7f3cf4d7446..00000000000 --- a/libjava/classpath/gnu/xml/stream/CRLFReader.java +++ /dev/null @@ -1,180 +0,0 @@ -/* CRLFReader.java -- - Copyright (C) 2005,2006 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Reader; - -/** - * Filtered reader that normalizes CRLF pairs into LFs. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -class CRLFReader - extends Reader -{ - - /** - * The CR octet. - */ - public static final int CR = 13; - - /** - * The LF octet. - */ - public static final int LF = 10; - - private boolean doReset; - - protected Reader in; - - /** - * Constructor. - */ - protected CRLFReader(Reader in) - { - if (!in.markSupported()) - in = new BufferedReader(in); - this.in = in; - } - - public int read() - throws IOException - { - int c = in.read(); - if (c == 13) // CR - { - in.mark(1); - int d = in.read(); - if (d == 10) // LF - c = d; - else - in.reset(); - } - return c; - } - - public int read(char[] b) - throws IOException - { - return read(b, 0, b.length); - } - - public int read(char[] b, int off, int len) - throws IOException - { - in.mark(len + 1); - int l = in.read(b, off, len); - if (l > 0) - { - int i = indexOfCRLF(b, off, l); - if (doReset) - { - in.reset(); - if (i != -1) - { - l = in.read(b, off, (i + 1) - off); // read to CR - in.read(); // skip LF - b[i] = '\n'; // fix CR as LF - } - else - l = in.read(b, off, len); // CR(s) but no LF - } - } - return l; - } - - public boolean markSupported() - { - return in.markSupported(); - } - - public void mark(int limit) - throws IOException - { - in.mark(limit); - } - - public void reset() - throws IOException - { - in.reset(); - } - - public long skip(long n) - throws IOException - { - return in.skip(n); - } - - public void close() - throws IOException - { - in.close(); - } - - private int indexOfCRLF(char[] b, int off, int len) - throws IOException - { - doReset = false; - int end = off + len; - int em1 = end - 1; - for (int i = off; i < end; i++) - { - if (b[i] == '\r') // CR - { - int d; - if (i == em1) - { - d = in.read(); - doReset = true; - } - else - d = b[i + 1]; - if (d == '\n') // LF - { - doReset = true; - return i; - } - } - } - return -1; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/CharactersImpl.java b/libjava/classpath/gnu/xml/stream/CharactersImpl.java deleted file mode 100644 index 2107a5a6d59..00000000000 --- a/libjava/classpath/gnu/xml/stream/CharactersImpl.java +++ /dev/null @@ -1,119 +0,0 @@ -/* CharactersImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.Characters; - -/** - * A character data (text) event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class CharactersImpl - extends XMLEventImpl - implements Characters -{ - - protected final String data; - protected final boolean whitespace; - protected final boolean cdata; - protected final boolean ignorableWhitespace; - - protected CharactersImpl(Location location, - String data, boolean whitespace, boolean cdata, - boolean ignorableWhitespace) - { - super(location); - this.data = data; - this.whitespace = whitespace; - this.cdata = cdata; - this.ignorableWhitespace = ignorableWhitespace; - } - - public int getEventType() - { - return cdata ? CDATA : whitespace ? SPACE : CHARACTERS; - } - - public String getData() - { - return data; - } - - public boolean isWhiteSpace() - { - return whitespace; - } - - public boolean isCData() - { - return cdata; - } - - public boolean isIgnorableWhiteSpace() - { - return ignorableWhitespace; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - if (cdata) - { - writer.write("<![CDATA["); - writer.write(data); - writer.write("]]>"); - } - else - writer.write(encode(data, false)); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/CommentImpl.java b/libjava/classpath/gnu/xml/stream/CommentImpl.java deleted file mode 100644 index 118ac7a5767..00000000000 --- a/libjava/classpath/gnu/xml/stream/CommentImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -/* CommentImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.Comment; - -/** - * A comment event. - * - * @author <a href'mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class CommentImpl - extends XMLEventImpl - implements Comment -{ - - protected final String text; - - protected CommentImpl(Location location, String text) - { - super(location); - this.text = text; - } - - public int getEventType() - { - return COMMENT; - } - - public String getText() - { - return text; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("<!--"); - writer.write(encode(text, false)); - writer.write("-->"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/DTDImpl.java b/libjava/classpath/gnu/xml/stream/DTDImpl.java deleted file mode 100644 index cf049d3620e..00000000000 --- a/libjava/classpath/gnu/xml/stream/DTDImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -/* DTDImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.DTD; - -/** - * A DOCTYPE declaration event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class DTDImpl - extends XMLEventImpl - implements DTD -{ - - protected final String body; - protected final Object impl; - protected final List notations; - protected final List entities; - - protected DTDImpl(Location location, - String body, Object impl, List notations, List entities) - { - super(location); - this.body = body; - this.impl = impl; - this.notations = notations; - this.entities = entities; - } - - public int getEventType() - { - return DTD; - } - - public String getDocumentTypeDeclaration() - { - return body; - } - - public Object getProcessedDTD() - { - return impl; - } - - public List getNotations() - { - return notations; - } - - public List getEntities() - { - return entities; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("<!DOCTYPE "); - writer.write(body); - writer.write(">"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/EndDocumentImpl.java b/libjava/classpath/gnu/xml/stream/EndDocumentImpl.java deleted file mode 100644 index 13877c5c965..00000000000 --- a/libjava/classpath/gnu/xml/stream/EndDocumentImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* EndDocumentImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.EndDocument; - -/** - * An end-document event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class EndDocumentImpl - extends XMLEventImpl - implements EndDocument -{ - - protected EndDocumentImpl(Location location) - { - super(location); - } - - public int getEventType() - { - return END_DOCUMENT; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - } - -} diff --git a/libjava/classpath/gnu/xml/stream/EndElementImpl.java b/libjava/classpath/gnu/xml/stream/EndElementImpl.java deleted file mode 100644 index 71f6aa0bcac..00000000000 --- a/libjava/classpath/gnu/xml/stream/EndElementImpl.java +++ /dev/null @@ -1,107 +0,0 @@ -/* EndElementImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.List; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.EndElement; - -/** - * An end-element event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class EndElementImpl - extends XMLEventImpl - implements EndElement -{ - - protected final QName name; - protected final List namespaces; - - protected EndElementImpl(Location location, QName name, List namespaces) - { - super(location); - this.name = name; - this.namespaces = namespaces; - } - - public int getEventType() - { - return END_ELEMENT; - } - - public QName getName() - { - return name; - } - - public Iterator getNamespaces() - { - return namespaces.iterator(); - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("</"); - String prefix = name.getPrefix(); - if (prefix != null && !"".equals(prefix)) - { - writer.write(prefix); - writer.write(':'); - } - writer.write(name.getLocalPart()); - writer.write(">"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/EntityDeclarationImpl.java b/libjava/classpath/gnu/xml/stream/EntityDeclarationImpl.java deleted file mode 100644 index b6e33e8d2b0..00000000000 --- a/libjava/classpath/gnu/xml/stream/EntityDeclarationImpl.java +++ /dev/null @@ -1,163 +0,0 @@ -/* EntityDeclarationImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.EntityDeclaration; - -/** - * An entity declaration event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class EntityDeclarationImpl - extends XMLEventImpl - implements EntityDeclaration -{ - - protected final String publicId; - protected final String systemId; - protected final String name; - protected final String notationName; - protected final String replacementText; - protected final String baseUri; - - protected EntityDeclarationImpl(Location location, - String publicId, String systemId, - String name, String notationName, - String replacementText, String baseUri) - { - super(location); - this.publicId = publicId; - this.systemId = systemId; - this.name = name; - this.notationName = notationName; - this.replacementText = replacementText; - this.baseUri = baseUri; - } - - public int getEventType() - { - return ENTITY_DECLARATION; - } - - public String getPublicId() - { - return publicId; - } - - public String getSystemId() - { - return systemId; - } - - public String getName() - { - return name; - } - - public String getNotationName() - { - return notationName; - } - - public String getReplacementText() - { - return replacementText; - } - - public String getBaseURI() - { - return baseUri; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("<!ENTITY "); - writer.write(name); - writer.write(' '); - if (systemId != null) - { - if (publicId != null) - { - writer.write(" PUBLIC "); - writer.write('"'); - writer.write(publicId); - writer.write('"'); - writer.write(' '); - writer.write('"'); - writer.write(systemId); - writer.write('"'); - } - else - { - writer.write(" SYSTEM "); - writer.write('"'); - writer.write(systemId); - writer.write('"'); - } - if (notationName != null) - { - writer.write(" NDATA "); - writer.write(notationName); - } - } - else - { - writer.write('"'); - if (replacementText != null) - writer.write(replacementText); - writer.write('"'); - } - writer.write(">"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/EntityReferenceImpl.java b/libjava/classpath/gnu/xml/stream/EntityReferenceImpl.java deleted file mode 100644 index 6f8a11c80fd..00000000000 --- a/libjava/classpath/gnu/xml/stream/EntityReferenceImpl.java +++ /dev/null @@ -1,101 +0,0 @@ -/* EntityReferenceImpl.java -- - Copyright (C) 2005,2006 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.EntityDeclaration; -import javax.xml.stream.events.EntityReference; - -/** - * An entity reference event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class EntityReferenceImpl - extends XMLEventImpl - implements EntityReference -{ - - protected final EntityDeclaration decl; - protected final String name; - - protected EntityReferenceImpl(Location location, - EntityDeclaration decl, - String name) - { - super(location); - this.decl = decl; - this.name = name; - } - - public int getEventType() - { - return ENTITY_REFERENCE; - } - - public EntityDeclaration getDeclaration() - { - return decl; - } - - public String getName() - { - return name; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write('&'); - writer.write(name); - writer.write(';'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/FilteredEventReader.java b/libjava/classpath/gnu/xml/stream/FilteredEventReader.java deleted file mode 100644 index 1ddb469df0a..00000000000 --- a/libjava/classpath/gnu/xml/stream/FilteredEventReader.java +++ /dev/null @@ -1,114 +0,0 @@ -/* FilteredEventReader.java -- - Copyright (C) 2005,2006 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import javax.xml.stream.EventFilter; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.XMLEvent; -import javax.xml.stream.util.EventReaderDelegate; - -class FilteredEventReader - extends EventReaderDelegate -{ - - final EventFilter filter; - - FilteredEventReader(XMLEventReader reader, EventFilter filter) - { - super(reader); - this.filter = filter; - } - - public boolean hasNext() - { - // XXX ??? - return super.hasNext(); - } - - public XMLEvent nextEvent() - throws XMLStreamException - { - XMLEvent ret; - do - { - ret = super.nextEvent(); - } - while (!filter.accept(ret)); - return ret; - } - - public Object next() - { - try - { - return nextEvent(); - } - catch (XMLStreamException e) - { - RuntimeException e2 = new RuntimeException(); - e2.initCause(e); - throw e2; - } - } - - public XMLEvent peek() - throws XMLStreamException - { - XMLEvent ret; - do - { - ret = super.peek(); - } - while (!filter.accept(ret)); - return ret; - } - - public XMLEvent nextTag() - throws XMLStreamException - { - XMLEvent ret; - do - { - ret = super.nextTag(); - } - while (!filter.accept(ret)); - return ret; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/FilteredStreamReader.java b/libjava/classpath/gnu/xml/stream/FilteredStreamReader.java deleted file mode 100644 index 62d96488eb0..00000000000 --- a/libjava/classpath/gnu/xml/stream/FilteredStreamReader.java +++ /dev/null @@ -1,90 +0,0 @@ -/* FilteredStreamReader.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import javax.xml.stream.StreamFilter; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.util.StreamReaderDelegate; - -class FilteredStreamReader - extends StreamReaderDelegate -{ - - final XMLStreamReader reader; - final StreamFilter filter; - - FilteredStreamReader(XMLStreamReader reader, StreamFilter filter) - { - super(reader); - this.reader = reader; - this.filter = filter; - } - - public boolean hasNext() - throws XMLStreamException - { - // XXX ??? - return super.hasNext(); - } - - public int next() - throws XMLStreamException - { - int ret; - do - { - ret = super.next(); - } - while (!filter.accept(reader)); - return ret; - } - - public int nextTag() - throws XMLStreamException - { - int ret; - do - { - ret = super.nextTag(); - } - while (!filter.accept(reader)); - return ret; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/NamespaceImpl.java b/libjava/classpath/gnu/xml/stream/NamespaceImpl.java deleted file mode 100644 index 241f980b600..00000000000 --- a/libjava/classpath/gnu/xml/stream/NamespaceImpl.java +++ /dev/null @@ -1,137 +0,0 @@ -/* NamespaceImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.Namespace; - -/** - * A namespace declaration event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class NamespaceImpl - extends XMLEventImpl - implements Namespace -{ - - protected final String prefix; - protected final String uri; - protected final boolean specified; - - protected NamespaceImpl(Location location, String prefix, String uri, - boolean specified) - { - super(location); - this.prefix = prefix; - this.uri = uri; - this.specified = specified; - } - - public int getEventType() - { - return NAMESPACE; - } - - public String getPrefix() - { - return prefix; - } - - public String getNamespaceURI() - { - return uri; - } - - public boolean isSpecified() - { - return specified; - } - - public QName getName() - { - if (isDefaultNamespaceDeclaration()) - return new QName("", "xmlns", null); - else - return new QName("", prefix, "xmlns"); - } - - public String getDTDType() - { - return "CDATA"; - } - - public String getValue() - { - return uri; - } - - public boolean isDefaultNamespaceDeclaration() - { - return (prefix == null || "".equals(prefix)); - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("xmlns"); - if (prefix != null && !"".equals(prefix)) - { - writer.write(':'); - writer.write(prefix); - } - writer.write('='); - writer.write('"'); - writer.write(encode(uri, true)); - writer.write('"'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/NotationDeclarationImpl.java b/libjava/classpath/gnu/xml/stream/NotationDeclarationImpl.java deleted file mode 100644 index a338237eec9..00000000000 --- a/libjava/classpath/gnu/xml/stream/NotationDeclarationImpl.java +++ /dev/null @@ -1,125 +0,0 @@ -/* NotationDeclarationImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.NotationDeclaration; - -/** - * A notation declaration event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class NotationDeclarationImpl - extends XMLEventImpl - implements NotationDeclaration -{ - - protected final String name; - protected final String publicId; - protected final String systemId; - - protected NotationDeclarationImpl(Location location, - String name, String publicId, - String systemId) - { - super(location); - this.name = name; - this.publicId = publicId; - this.systemId = systemId; - } - - public int getEventType() - { - return NOTATION_DECLARATION; - } - - public String getName() - { - return name; - } - - public String getPublicId() - { - return publicId; - } - - public String getSystemId() - { - return systemId; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("<!NOTATION "); - writer.write(name); - if (publicId != null) - { - writer.write(" PUBLIC "); - writer.write('"'); - writer.write(publicId); - writer.write('"'); - writer.write(' '); - writer.write('"'); - writer.write(systemId); - writer.write('"'); - } - else - { - writer.write(" SYSTEM "); - writer.write('"'); - writer.write(systemId); - writer.write('"'); - } - writer.write('>'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/ProcessingInstructionImpl.java b/libjava/classpath/gnu/xml/stream/ProcessingInstructionImpl.java deleted file mode 100644 index 4ce0badc828..00000000000 --- a/libjava/classpath/gnu/xml/stream/ProcessingInstructionImpl.java +++ /dev/null @@ -1,104 +0,0 @@ -/* ProcessingInstructionImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.ProcessingInstruction; - -/** - * A processing instruction event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class ProcessingInstructionImpl - extends XMLEventImpl - implements ProcessingInstruction -{ - - protected final String target; - protected final String data; - - protected ProcessingInstructionImpl(Location location, - String target, String data) - { - super(location); - this.target = target; - this.data = data; - } - - public int getEventType() - { - return PROCESSING_INSTRUCTION; - } - - public String getTarget() - { - return target; - } - - public String getData() - { - return data; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("<?"); - writer.write(target); - if (data != null) - { - writer.write(' '); - writer.write(data); - } - writer.write("?>"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/SAXParser.java b/libjava/classpath/gnu/xml/stream/SAXParser.java deleted file mode 100644 index b71d98ed30f..00000000000 --- a/libjava/classpath/gnu/xml/stream/SAXParser.java +++ /dev/null @@ -1,1041 +0,0 @@ -/* SAXParser.java -- - Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.InputStream; -import java.io.IOException; -import java.io.Reader; -import java.net.URL; -import java.util.Iterator; -import java.util.Map; -import javax.xml.XMLConstants; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLReporter; -import javax.xml.stream.XMLResolver; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; - -import org.xml.sax.ContentHandler; -import org.xml.sax.DTDHandler; -import org.xml.sax.EntityResolver; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.Parser; -import org.xml.sax.SAXException; -import org.xml.sax.SAXNotRecognizedException; -import org.xml.sax.SAXNotSupportedException; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; -import org.xml.sax.ext.Attributes2; -import org.xml.sax.ext.DeclHandler; -import org.xml.sax.ext.LexicalHandler; -import org.xml.sax.ext.Locator2; - -/** - * JAXP SAX parser using an underlying StAX parser. - * This parser supports the following additional SAX features and - * properties: - * <table> - * <tr><th colspan='4'>Features</th></tr> - * <tr><td>http://gnu.org/sax/features/xml-base</td> - * <td colspan='2'>read/write</td> - * <td>Indicates or sets whether XML Base processing is enabled</td></tr> - * <tr><th colspan='4'>Properties</th></tr> - * <tr><td>http://gnu.org/sax/properties/base-uri</td> - * <td>read-only</td><td>String</td> - * <td>Returns the base URI of the current event</td></tr> - * <tr><td>http://gnu.org/sax/properties/document-xml-encoding</td> - * <td>read-only</td><td>String</td> - * <td>Returns the encoding specified in the XML declaration</td></tr> - * </table> - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class SAXParser - extends javax.xml.parsers.SAXParser - implements XMLReader, Attributes2, Locator2, XMLReporter, XMLResolver -{ - - ContentHandler contentHandler; - DeclHandler declHandler; - DTDHandler dtdHandler; - EntityResolver entityResolver; - ErrorHandler errorHandler; - LexicalHandler lexicalHandler; - - boolean validating = false; - boolean namespaceAware = true; - boolean xIncludeAware = false; - boolean stringInterning = true; - boolean coalescing = true; - boolean replaceERefs = true; - boolean externalEntities = true; - boolean supportDTD = true; - boolean baseAware = true; - - XMLParser parser; - XMLStreamReader reader; - String encoding; - String xmlVersion; - boolean xmlStandalone; - String xmlEncoding; - String baseURI; - - public SAXParser() - { - } - - SAXParser(boolean validating, boolean namespaceAware, boolean xIncludeAware) - { - this.validating = validating; - this.namespaceAware = namespaceAware; - this.xIncludeAware = xIncludeAware; - } - - // -- SAXParser -- - - public Parser getParser() - throws SAXException - { - return null; - } - - public XMLReader getXMLReader() - throws SAXException - { - return this; - } - - public boolean isNamespaceAware() - { - return namespaceAware; - } - - public boolean isValidating() - { - return validating; - } - - public void setProperty(String name, Object value) - throws SAXNotRecognizedException, SAXNotSupportedException - { - if (parser != null) - throw new IllegalStateException("parsing in progress"); - final String FEATURES = "http://xml.org/sax/features/"; - final String PROPERTIES = "http://xml.org/sax/properties/"; - final String GNU_FEATURES = "http://gnu.org/sax/features/"; - if ((FEATURES + "namespaces").equals(name)) - namespaceAware = Boolean.TRUE.equals(value); - else if ((FEATURES + "namespace-prefixes").equals(name)) - { - // NOOP - } - else if ((FEATURES + "string-interning").equals(name)) - stringInterning = Boolean.TRUE.equals(value); - else if ((FEATURES + "use-attributes2").equals(name)) - { - // NOOP - } - else if ((FEATURES + "validation").equals(name)) - validating = Boolean.TRUE.equals(value); - else if ((FEATURES + "external-general-entities").equals(name)) - externalEntities = Boolean.TRUE.equals(value); - else if ((FEATURES + "external-parameter-entities").equals(name)) - externalEntities = Boolean.TRUE.equals(value); - else if ((PROPERTIES + "declaration-handler").equals(name)) - declHandler = (DeclHandler) value; - else if ((PROPERTIES + "lexical-handler").equals(name)) - lexicalHandler = (LexicalHandler) value; - else if ((GNU_FEATURES + "xml-base").equals(name)) - baseAware = Boolean.TRUE.equals(value); - else if ((GNU_FEATURES + "coalescing").equals(name)) - coalescing = Boolean.TRUE.equals(value); - else - throw new SAXNotSupportedException(name); - } - - public Object getProperty(String name) - throws SAXNotRecognizedException, SAXNotSupportedException - { - final String FEATURES = "http://xml.org/sax/features/"; - final String PROPERTIES = "http://xml.org/sax/properties/"; - final String GNU_FEATURES = "http://gnu.org/sax/features/"; - final String GNU_PROPERTIES = "http://gnu.org/sax/properties/"; - if ((GNU_FEATURES + "base-uri").equals(name)) - return baseURI; - if ((FEATURES + "is-standalone").equals(name)) - return xmlStandalone ? Boolean.TRUE : Boolean.FALSE; - if ((FEATURES + "namespaces").equals(name)) - return namespaceAware ? Boolean.TRUE : Boolean.FALSE; - if ((FEATURES + "namespace-prefixes").equals(name)) - return Boolean.TRUE; - if ((FEATURES + "string-interning").equals(name)) - return stringInterning ? Boolean.TRUE : Boolean.FALSE; - if ((FEATURES + "use-attributes2").equals(name)) - return Boolean.TRUE; - if ((FEATURES + "use-locator2").equals(name)) - return Boolean.TRUE; - if ((FEATURES + "use-entity-resolver2").equals(name)) - return Boolean.FALSE; - if ((FEATURES + "validation").equals(name)) - return validating ? Boolean.TRUE : Boolean.FALSE; - if ((FEATURES + "external-general-entities").equals(name)) - return externalEntities ? Boolean.TRUE : Boolean.FALSE; - if ((FEATURES + "external-parameter-entities").equals(name)) - return externalEntities ? Boolean.TRUE : Boolean.FALSE; - if ((FEATURES + "xml-1.1").equals(name)) - return Boolean.TRUE; - if ((PROPERTIES + "declaration-handler").equals(name)) - return declHandler; - if ((PROPERTIES + "document-xml-version").equals(name)) - return xmlVersion; - if ((PROPERTIES + "lexical-handler").equals(name)) - return lexicalHandler; - if ((GNU_FEATURES + "xml-base").equals(name)) - return baseAware ? Boolean.TRUE : Boolean.FALSE; - if ((GNU_PROPERTIES + "document-xml-encoding").equals(name)) - return xmlEncoding; - throw new SAXNotRecognizedException(name); - } - - public boolean isXIncludeAware() - { - return xIncludeAware; - } - - public void reset() - { - parser = null; - encoding = null; - xmlVersion = null; - xmlStandalone = false; - } - - // -- XMLReader -- - - public boolean getFeature(String name) - throws SAXNotRecognizedException, SAXNotSupportedException - { - Object ret = getProperty(name); - if (ret instanceof Boolean) - return ((Boolean) ret).booleanValue(); - throw new SAXNotSupportedException(name); - } - - public void setFeature(String name, boolean value) - throws SAXNotRecognizedException, SAXNotSupportedException - { - setProperty(name, value ? Boolean.TRUE : Boolean.FALSE); - } - - public void setEntityResolver(EntityResolver resolver) - { - entityResolver = resolver; - } - - public EntityResolver getEntityResolver() - { - return entityResolver; - } - - public void setDTDHandler(DTDHandler handler) - { - dtdHandler = handler; - } - - public DTDHandler getDTDHandler() - { - return dtdHandler; - } - - public void setContentHandler(ContentHandler handler) - { - contentHandler = handler; - } - - public ContentHandler getContentHandler() - { - return contentHandler; - } - - public void setErrorHandler(ErrorHandler handler) - { - errorHandler = handler; - } - - public ErrorHandler getErrorHandler() - { - return errorHandler; - } - - public synchronized void parse(InputSource input) - throws IOException, SAXException - { - reset(); - String systemId = input.getSystemId(); - InputStream in = input.getByteStream(); - boolean opened = false; - if (in != null) - parser = new XMLParser(in, systemId, - validating, - namespaceAware, - coalescing, - replaceERefs, - externalEntities, - supportDTD, - baseAware, - stringInterning, - true, - this, - this); - else - { - Reader r = input.getCharacterStream(); - if (r != null) - parser = new XMLParser(r, systemId, - validating, - namespaceAware, - coalescing, - replaceERefs, - externalEntities, - supportDTD, - baseAware, - stringInterning, - true, - this, - this); - } - if (parser == null) - { - if (systemId == null) - throw new SAXException("No stream or system ID specified"); - systemId = XMLParser.absolutize(null, systemId); - in = new URL(systemId).openStream(); - opened = true; - parser = new XMLParser(in, systemId, - validating, - namespaceAware, - coalescing, - replaceERefs, - externalEntities, - supportDTD, - baseAware, - stringInterning, - true, - this, - this); - } - reader = parser; - baseURI = systemId; - - if (xIncludeAware) - reader = new XIncludeFilter(parser, systemId, namespaceAware, - validating, true); - - if (contentHandler != null) - contentHandler.setDocumentLocator(this); - boolean startDocumentDone = false; - try - { - while (parser.hasNext()) - { - int event = parser.next(); - if (baseAware) - baseURI = parser.getXMLBase(); - switch (event) - { - case XMLStreamConstants.CHARACTERS: - if (contentHandler != null) - { - char[] b = reader.getTextCharacters(); - contentHandler.characters(b, 0, b.length); - } - break; - case XMLStreamConstants.SPACE: - if (contentHandler != null) - { - char[] b = reader.getTextCharacters(); - if (isIgnorableWhitespace(parser, b, false)) - contentHandler.ignorableWhitespace(b, 0, b.length); - else - contentHandler.characters(b, 0, b.length); - } - break; - case XMLStreamConstants.CDATA: - if (lexicalHandler != null) - lexicalHandler.startCDATA(); - if (contentHandler != null) - { - char[] b = reader.getTextCharacters(); - if (isIgnorableWhitespace(parser, b, true)) - contentHandler.ignorableWhitespace(b, 0, b.length); - else - contentHandler.characters(b, 0, b.length); - } - if (lexicalHandler != null) - lexicalHandler.endCDATA(); - break; - case XMLStreamConstants.START_ELEMENT: - if (contentHandler != null) - { - QName name = reader.getName(); - String uri = name.getNamespaceURI(); - String localName = name.getLocalPart(); - String prefix = name.getPrefix(); - String qName = localName; - if (!"".equals(prefix)) - qName = prefix + ":" + localName; - if (!namespaceAware) - { - uri = ""; - localName = ""; - } - else - { - int nc = reader.getNamespaceCount(); - for (int i = 0; i < nc; i++) - { - String nsuri = reader.getNamespaceURI(i); - String nsprefix = reader.getNamespacePrefix(i); - if ("xml".equals(nsprefix)) - continue; - contentHandler.startPrefixMapping(nsprefix, nsuri); - } - } - contentHandler.startElement(uri, localName, qName, this); - } - break; - case XMLStreamConstants.END_ELEMENT: - if (contentHandler != null) - { - QName name = reader.getName(); - String uri = name.getNamespaceURI(); - String localName = name.getLocalPart(); - String prefix = name.getPrefix(); - String qName = localName; - if (!"".equals(prefix)) - qName = prefix + ":" + localName; - if (!namespaceAware) - { - uri = ""; - localName = ""; - } - contentHandler.endElement(uri, localName, qName); - if (namespaceAware) - { - int nc = reader.getNamespaceCount(); - for (int i = 0; i < nc; i++) - { - String nsprefix = reader.getNamespacePrefix(i); - if ("xml".equals(nsprefix)) - continue; - contentHandler.endPrefixMapping(nsprefix); - } - } - } - break; - case XMLStreamConstants.COMMENT: - if (lexicalHandler != null) - { - char[] b = reader.getTextCharacters(); - lexicalHandler.comment(b, 0, b.length); - } - break; - case XMLStreamConstants.PROCESSING_INSTRUCTION: - if (contentHandler != null) - { - String target = reader.getPITarget(); - String data = reader.getPIData(); - if (data == null) - data = ""; - contentHandler.processingInstruction(target, data); - } - break; - case XMLParser.START_ENTITY: - if (lexicalHandler != null) - { - String name = reader.getText(); - lexicalHandler.startEntity(name); - } - break; - case XMLParser.END_ENTITY: - if (lexicalHandler != null) - { - String name = reader.getText(); - lexicalHandler.endEntity(name); - } - break; - case XMLStreamConstants.START_DOCUMENT: - encoding = reader.getEncoding(); - xmlVersion = reader.getVersion(); - xmlStandalone = reader.isStandalone(); - xmlEncoding = reader.getCharacterEncodingScheme(); - if (contentHandler != null) - contentHandler.startDocument(); - startDocumentDone = true; - break; - case XMLStreamConstants.END_DOCUMENT: - if (contentHandler != null) - contentHandler.endDocument(); - break; - case XMLStreamConstants.DTD: - XMLParser.Doctype doctype = parser.doctype; - if (lexicalHandler != null) - { - String rootName = doctype.rootName; - String publicId = doctype.publicId; - String systemId2 = doctype.systemId; - lexicalHandler.startDTD(rootName, publicId, systemId2); - } - for (Iterator i = doctype.entryIterator(); i.hasNext(); ) - { - String entry = (String) i.next(); - char c = entry.charAt(0); - String name = entry.substring(1); - if ('E' == c) - { - // Element decl - if (declHandler != null) - { - XMLParser.ContentModel model = - doctype.getElementModel(name); - declHandler.elementDecl(name, model.text); - } - } - else if ('A' == c) - { - // Attlist decl - if (declHandler != null) - { - for (Iterator j = doctype.attlistIterator(name); - j.hasNext(); ) - { - Map.Entry att = (Map.Entry) j.next(); - String aname = (String) att.getKey(); - XMLParser.AttributeDecl decl = - (XMLParser.AttributeDecl) att.getValue(); - String type = decl.type; - String value = decl.value; - String mode = null; - switch (decl.valueType) - { - case XMLParser.ATTRIBUTE_DEFAULT_FIXED: - mode = "#FIXED"; - break; - case XMLParser.ATTRIBUTE_DEFAULT_REQUIRED: - mode = "#REQUIRED"; - break; - case XMLParser.ATTRIBUTE_DEFAULT_IMPLIED: - mode = "#IMPLIED"; - break; - } - declHandler.attributeDecl(name, aname, - type, mode, value); - } - } - } - else if ('e' == c) - { - // Entity decl - Object entity = doctype.getEntity(name); - if (entity instanceof String) - { - if (declHandler != null) - declHandler.internalEntityDecl(name, - (String) entity); - } - else - { - XMLParser.ExternalIds ids = - (XMLParser.ExternalIds) entity; - if (ids.notationName != null) - { - if (dtdHandler != null) - { - String pub = ids.publicId; - String url = ids.systemId; - String not = ids.notationName; - dtdHandler.unparsedEntityDecl(name, - pub, - url, - not); - } - } - else - { - if (declHandler != null) - { - String pub = ids.publicId; - String url = ids.systemId; - declHandler.externalEntityDecl(name, - pub, - url); - } - } - } - } - else if ('n' == c) - { - // Notation decl - if (dtdHandler != null) - { - XMLParser.ExternalIds ids = - doctype.getNotation(name); - String pub = ids.publicId; - String url = ids.systemId; - dtdHandler.notationDecl(name, pub, url); - } - } - else if ('c' == c) - { - // Comment - if (lexicalHandler != null) - { - String comment = doctype.getComment(name); - char[] b = comment.toCharArray(); - lexicalHandler.comment(b, 0, b.length); - } - } - else if ('p' == c) - { - // Processing instruction - if (contentHandler != null) - { - String[] pi = doctype.getPI(name); - String target = pi[0]; - String data = pi[1]; - if (data == null) - data = ""; - contentHandler.processingInstruction(target, data); - } - } - } - if (lexicalHandler != null) - lexicalHandler.endDTD(); - } - } - reset(); - if (opened) - in.close(); - } - catch (Exception e) - { - SAXParseException e2 = new SAXParseException(e.getMessage(), this); - e2.initCause(e); - try - { - if (!startDocumentDone && contentHandler != null) - contentHandler.startDocument(); - if (errorHandler != null) - errorHandler.fatalError(e2); - if (contentHandler != null) - contentHandler.endDocument(); - } - catch (SAXException sex) - { - // Ignored, we will rethrow the original exception. - } - reset(); - if (opened) - in.close(); - if (e instanceof SAXException) - throw (SAXException) e; - if (e instanceof IOException) - throw (IOException) e; - else - throw e2; - } - } - - /** - * Indicates whether the specified characters are ignorable whitespace. - */ - private boolean isIgnorableWhitespace(XMLParser reader, char[] b, - boolean testCharacters) - throws XMLStreamException - { - XMLParser.Doctype doctype = reader.doctype; - if (doctype == null) - return false; - String currentElement = reader.getCurrentElement(); - // check for xml:space - int ac = reader.getAttributeCount(); - for (int i = 0; i < ac; i++) - { - QName aname = reader.getAttributeName(i); - if ("space".equals(aname.getLocalPart()) && - XMLConstants.XML_NS_URI.equals(aname.getNamespaceURI())) - { - if ("preserve".equals(reader.getAttributeValue(i))) - return false; - } - } - XMLParser.ContentModel model = doctype.getElementModel(currentElement); - if (model == null || model.type != XMLParser.ContentModel.ELEMENT) - return false; - if (model.external && xmlStandalone) - return false; - boolean white = true; - if (testCharacters) - { - for (int i = 0; i < b.length; i++) - { - if (b[i] != ' ' && b[i] != '\t' && b[i] != '\n' && b[i] != '\r') - { - white = false; - break; - } - } - } - return white; - } - - public void parse(String systemId) - throws IOException, SAXException - { - parse(new InputSource(systemId)); - } - - // -- Attributes2 -- - - public int getIndex(String qName) - { - int len = reader.getAttributeCount(); - for (int i = 0; i < len; i++) - { - QName q = reader.getAttributeName(i); - String localName = q.getLocalPart(); - String prefix = q.getPrefix(); - String qn = ("".equals(prefix)) ? localName : prefix + ":" + localName; - if (qName.equals(qn)) - return i; - } - return -1; - } - - public int getIndex(String uri, String localName) - { - int len = reader.getAttributeCount(); - for (int i = 0; i < len; i++) - { - QName q = reader.getAttributeName(i); - String ln = q.getLocalPart(); - String u = q.getNamespaceURI(); - if (u == null && uri != null) - continue; - if (u != null && !u.equals(uri)) - continue; - if (ln.equals(localName)) - return i; - } - return -1; - } - - public int getLength() - { - return reader.getAttributeCount(); - } - - public String getLocalName(int index) - { - return reader.getAttributeLocalName(index); - } - - public String getQName(int index) - { - QName q = reader.getAttributeName(index); - String localName = q.getLocalPart(); - String prefix = q.getPrefix(); - return ("".equals(prefix)) ? localName : prefix + ":" + localName; - } - - public String getType(int index) - { - String ret = reader.getAttributeType(index); - // SAX doesn't permit ENUMERATION? - return ("ENUMERATION".equals(ret)) ? "NMTOKEN" : ret; - } - - public String getType(String qName) - { - int index = getIndex(qName); - return (index == -1) ? null : getType(index); - } - - public String getType(String uri, String localName) - { - int index = getIndex(uri, localName); - return (index == -1) ? null : getType(index); - } - - public String getURI(int index) - { - String ret = reader.getAttributeNamespace(index); - return (ret == null) ? "" : ret; - } - - public String getValue(int index) - { - return reader.getAttributeValue(index); - } - - public String getValue(String qName) - { - int index = getIndex(qName); - return (index == -1) ? null : getValue(index); - } - - public String getValue(String uri, String localName) - { - int index = getIndex(uri, localName); - return (index == -1) ? null : getValue(index); - } - - public boolean isDeclared(int index) - { - return parser.isAttributeDeclared(index); - } - - public boolean isDeclared(String qName) - { - int index = getIndex(qName); - return (index == -1) ? false : isDeclared(index); - } - - public boolean isDeclared(String uri, String localName) - { - int index = getIndex(uri, localName); - return (index == -1) ? false : isDeclared(index); - } - - public boolean isSpecified(int index) - { - return reader.isAttributeSpecified(index); - } - - public boolean isSpecified(String qName) - { - int index = getIndex(qName); - return (index == -1) ? false : isSpecified(index); - } - - public boolean isSpecified(String uri, String localName) - { - int index = getIndex(uri, localName); - return (index == -1) ? false : isSpecified(index); - } - - // -- Locator2 -- - - public int getColumnNumber() - { - Location l = reader.getLocation(); - return l.getColumnNumber(); - } - - public int getLineNumber() - { - Location l = reader.getLocation(); - return l.getLineNumber(); - } - - public String getPublicId() - { - Location l = reader.getLocation(); - return l.getPublicId(); - } - - public String getSystemId() - { - Location l = reader.getLocation(); - return l.getSystemId(); - } - - public String getEncoding() - { - return encoding; - } - - public String getXMLVersion() - { - return xmlVersion; - } - - // -- XMLResolver -- - - public Object resolveEntity(String publicId, String systemId, - String baseURI, String namespace) - throws XMLStreamException - { - if (entityResolver != null) - { - try - { - InputSource input = - entityResolver.resolveEntity(publicId, systemId); - if (input != null) - { - InputStream in = input.getByteStream(); - if (in == null) - { - String newSystemId = input.getSystemId(); - if (newSystemId != null && !newSystemId.equals(systemId)) - in = XMLParser.resolve(newSystemId); - } - return in; - } - } - catch (SAXException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - return null; - } - - public XMLEventReader resolveAsXMLEventReader(String uri) - throws XMLStreamException - { - // unused - return null; - } - - public XMLStreamReader resolveAsXMLStreamReader(String uri) - throws XMLStreamException - { - // unused - return null; - } - - // -- XMLReporter -- - - public void report(String message, String errorType, - Object relatedInformation, Location location) - throws XMLStreamException - { - if (errorHandler != null) - { - try - { - errorHandler.warning(new SAXParseException(message, this)); - } - catch (SAXException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - } - - public static void main(String[] args) - throws Exception - { - boolean validating = false; - boolean namespaceAware = false; - boolean xIncludeAware = false; - boolean expectCallbackClass = false; - String callbackClass = null; - int pos = 0; - while (pos < args.length && (args[pos].startsWith("-") || expectCallbackClass)) - { - if ("-x".equals(args[pos])) - xIncludeAware = true; - else if ("-v".equals(args[pos])) - validating = true; - else if ("-n".equals(args[pos])) - namespaceAware = true; - else if ("-c".equals(args[pos])) - expectCallbackClass = true; - else if (expectCallbackClass) - { - callbackClass = args[pos]; - expectCallbackClass = false; - } - pos++; - } - if (pos >= args.length || expectCallbackClass) - { - System.out.println("Syntax: SAXParser [-n] [-v] [-x] [-c <class>] <file> [<file2> [...]]"); - System.out.println("\t-n: use namespace aware mode"); - System.out.println("\t-v: use validating parser"); - System.out.println("\t-x: use XInclude aware mode"); - System.out.println("\t-c <class>: use specified class as callback handler (must have a no-arg public constructor)"); - System.exit(2); - } - while (pos < args.length) - { - ContentHandler handler = null; - if (callbackClass != null) - { - Class t = Class.forName(callbackClass); - handler = (ContentHandler) t.newInstance(); - } - else - handler = new org.xml.sax.helpers.DefaultHandler(); - SAXParser parser = new SAXParser(validating, namespaceAware, - xIncludeAware); - InputSource input = new InputSource(args[pos]); - java.io.FileReader fr = new java.io.FileReader(args[pos]); - input.setCharacterStream(fr); - try - { - XMLReader reader = parser.getXMLReader(); - reader.setContentHandler(handler); - reader.parse(input); - } - finally - { - fr.close(); - } - pos++; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/SAXParserFactory.java b/libjava/classpath/gnu/xml/stream/SAXParserFactory.java deleted file mode 100644 index ebaeb3cb2cc..00000000000 --- a/libjava/classpath/gnu/xml/stream/SAXParserFactory.java +++ /dev/null @@ -1,104 +0,0 @@ -/* SAXParserFactory.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import javax.xml.parsers.ParserConfigurationException; - -import org.xml.sax.SAXException; -import org.xml.sax.SAXNotRecognizedException; -import org.xml.sax.SAXNotSupportedException; - -/** - * SAX parser factory providing a SAX compatibility layer on top of StAX. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class SAXParserFactory - extends javax.xml.parsers.SAXParserFactory -{ - - static final Set FEATURE_NAMES = new HashSet(); - static - { - FEATURE_NAMES.add("http://xml.org/sax/features/namespaces"); - FEATURE_NAMES.add("http://xml.org/sax/features/string-interning"); - FEATURE_NAMES.add("http://xml.org/sax/features/validation"); - } - - Map features = new HashMap(); - - public javax.xml.parsers.SAXParser newSAXParser() - throws ParserConfigurationException, SAXException - { - boolean validating = isValidating(); - boolean namespaceAware = isNamespaceAware(); - boolean xIncludeAware = isXIncludeAware(); - SAXParser ret = new SAXParser(validating, namespaceAware, xIncludeAware); - for (Iterator i = features.entrySet().iterator(); i.hasNext(); ) - { - Map.Entry entry = (Map.Entry) i.next(); - String name = (String) entry.getKey(); - Boolean value = (Boolean) entry.getValue(); - ret.setFeature(name, value.booleanValue()); - } - return ret; - } - - public void setFeature(String name, boolean value) - throws ParserConfigurationException, SAXNotRecognizedException, SAXNotSupportedException - { - if (!FEATURE_NAMES.contains(name)) - throw new SAXNotSupportedException(name); - features.put(name, value ? Boolean.TRUE : Boolean.FALSE); - } - - public boolean getFeature(String name) - throws ParserConfigurationException, SAXNotRecognizedException, SAXNotSupportedException - { - if (!FEATURE_NAMES.contains(name)) - throw new SAXNotSupportedException(name); - Boolean value = (Boolean) features.get(name); - return (value == null) ? false : value.booleanValue(); - } - -} diff --git a/libjava/classpath/gnu/xml/stream/StartDocumentImpl.java b/libjava/classpath/gnu/xml/stream/StartDocumentImpl.java deleted file mode 100644 index d2e590cfc90..00000000000 --- a/libjava/classpath/gnu/xml/stream/StartDocumentImpl.java +++ /dev/null @@ -1,143 +0,0 @@ -/* StartDocumentImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.StartDocument; - -/** - * A start-document event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class StartDocumentImpl - extends XMLEventImpl - implements StartDocument -{ - - protected final String systemId; - protected final String encoding; - protected final String xmlVersion; - protected final boolean xmlStandalone; - protected final boolean standaloneDeclared; - protected final boolean encodingDeclared; - - protected StartDocumentImpl(Location location, - String systemId, String encoding, - String xmlVersion, boolean xmlStandalone, - boolean standaloneDeclared, - boolean encodingDeclared) - { - super(location); - this.systemId = systemId; - this.encoding = encoding; - this.xmlVersion = xmlVersion; - this.xmlStandalone = xmlStandalone; - this.standaloneDeclared = standaloneDeclared; - this.encodingDeclared = encodingDeclared; - } - - public int getEventType() - { - return START_DOCUMENT; - } - - public String getSystemId() - { - return systemId; - } - - public String getCharacterEncodingScheme() - { - return encoding; - } - - public boolean encodingSet() - { - return encodingDeclared; - } - - public boolean isStandalone() - { - return xmlStandalone; - } - - public boolean standaloneSet() - { - return standaloneDeclared; - } - - public String getVersion() - { - return xmlVersion; - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write("<?xml version='"); - writer.write(xmlVersion); - writer.write('\''); - if (standaloneDeclared) - { - writer.write(" standalone='"); - writer.write(xmlStandalone ? "yes" : "no"); - writer.write('\''); - } - if (encodingDeclared) - { - writer.write(" encoding='"); - writer.write(encoding); - writer.write('\''); - } - writer.write("?>"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/StartElementImpl.java b/libjava/classpath/gnu/xml/stream/StartElementImpl.java deleted file mode 100644 index 66e68d56071..00000000000 --- a/libjava/classpath/gnu/xml/stream/StartElementImpl.java +++ /dev/null @@ -1,152 +0,0 @@ -/* StartElementImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.List; -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.Attribute; -import javax.xml.stream.events.Namespace; -import javax.xml.stream.events.StartElement; - -/** - * A start-element event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class StartElementImpl - extends XMLEventImpl - implements StartElement -{ - - protected final QName name; - protected final List attributes; - protected final List namespaces; - protected final NamespaceContext namespaceContext; - - protected StartElementImpl(Location location, - QName name, List attributes, List namespaces, - NamespaceContext namespaceContext) - { - super(location); - this.name = name; - this.attributes = attributes; - this.namespaces = namespaces; - this.namespaceContext = namespaceContext; - } - - public int getEventType() - { - return START_ELEMENT; - } - - public QName getName() - { - return name; - } - - public Iterator getAttributes() - { - return attributes.iterator(); - } - - public Iterator getNamespaces() - { - return namespaces.iterator(); - } - - public Attribute getAttributeByName(QName name) - { - for (Iterator i = attributes.iterator(); i.hasNext(); ) - { - Attribute attr = (Attribute) i.next(); - if (name.equals(attr.getName())) - return attr; - } - return null; - } - - public NamespaceContext getNamespaceContext() - { - return namespaceContext; - } - - public String getNamespaceURI(String prefix) - { - return namespaceContext.getNamespaceURI(prefix); - } - - public void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException - { - try - { - writer.write('<'); - String prefix = name.getPrefix(); - if (prefix != null && !"".equals(prefix)) - { - writer.write(prefix); - writer.write(':'); - } - writer.write(name.getLocalPart()); - for (Iterator i = namespaces.iterator(); i.hasNext(); ) - { - writer.write(' '); - ((Namespace) i.next()).writeAsEncodedUnicode(writer); - } - for (Iterator i = attributes.iterator(); i.hasNext(); ) - { - writer.write(' '); - ((Attribute) i.next()).writeAsEncodedUnicode(writer); - } - writer.write('>'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - -} diff --git a/libjava/classpath/gnu/xml/stream/UnicodeReader.java b/libjava/classpath/gnu/xml/stream/UnicodeReader.java deleted file mode 100644 index aa2a95422b0..00000000000 --- a/libjava/classpath/gnu/xml/stream/UnicodeReader.java +++ /dev/null @@ -1,205 +0,0 @@ -/* UnicodeReader.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Reader; - -/** - * A reader that converts UTF-16 characters to Unicode code points. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class UnicodeReader -{ - - final Reader in; - - UnicodeReader(Reader in) - { - this.in = in; - } - - public void mark(int limit) - throws IOException - { - in.mark(limit * 2); - } - - public void reset() - throws IOException - { - in.reset(); - } - - public int read() - throws IOException - { - int ret = in.read(); - if (ret == -1) - return ret; - if (ret >= 0xd800 && ret < 0xdc00) - { - // Unicode surrogate? - int low = in.read(); - if (low >= 0xdc00 && low < 0xe000) - ret = Character.toCodePoint((char) ret, (char) low); - else - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(ret)); - } - else if (ret >= 0xdc00 && ret < 0xe000) - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(ret)); - return ret; - } - - public int read(int[] buf, int off, int len) - throws IOException - { - if (len == 0) - return 0; - char[] b2 = new char[len]; - int ret = in.read(b2, 0, len); - if (ret <= 0) - return ret; - int l = ret - 1; - int i = 0, j = off; - for (; i < l; i++) - { - char c = b2[i]; - if (c >= 0xd800 && c < 0xdc00) - { - // Unicode surrogate? - char d = b2[i + 1]; - if (d >= 0xdc00 && d < 0xe000) - { - buf[j++] = Character.toCodePoint(c, d); - i++; - continue; - } - else - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(c)); - } - else if (c >= 0xdc00 && c < 0xe000) - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(c)); - buf[j++] = (int) c; - } - if (i == l) - { - // last char - char c = b2[l]; - if (c >= 0xd800 && c < 0xdc00) - { - int low = in.read(); - if (low >= 0xdc00 && low < 0xe000) - { - buf[j++] = Character.toCodePoint(c, (char) low); - return j; - } - else - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(c)); - } - else if (c >= 0xdc00 && c < 0xe000) - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(c)); - buf[j++] = (int) c; - } - return j; - } - - public void close() - throws IOException - { - in.close(); - } - - /** - * Returns the specified UTF-16 char array as an array of Unicode code - * points. - */ - public static int[] toCodePointArray(String text) - throws IOException - { - char[] b2 = text.toCharArray(); - int[] buf = new int[b2.length]; - if (b2.length > 0) - { - int l = b2.length - 1; - int i = 0, j = 0; - for (; i < l; i++) - { - char c = b2[i]; - if (c >= 0xd800 && c < 0xdc00) - { - // Unicode surrogate? - char d = b2[i + 1]; - if (d >= 0xdc00 && d < 0xe000) - { - buf[j++] = Character.toCodePoint(c, d); - i++; - continue; - } - else - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(c)); - } - else if (c >= 0xdc00 && c < 0xe000) - throw new IOException("unpaired surrogate: U+" + - Integer.toHexString(c)); - buf[j++] = (int) c; - } - if (i == l) - { - // last char - buf[j++] = (int) b2[l]; - if (j < buf.length) - { - int[] buf2 = new int[j]; - System.arraycopy(buf, 0, buf2, 0, j); - buf = buf2; - } - } - } - return buf; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XIncludeFilter.java b/libjava/classpath/gnu/xml/stream/XIncludeFilter.java deleted file mode 100644 index 6d955c492e7..00000000000 --- a/libjava/classpath/gnu/xml/stream/XIncludeFilter.java +++ /dev/null @@ -1,931 +0,0 @@ -/* XIncludeFilter.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.IOException; -import java.io.Reader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLConnection; -import java.util.HashSet; -import java.util.NoSuchElementException; -import java.util.StringTokenizer; -import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.util.StreamReaderDelegate; - -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.DOMImplementation; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.ProcessingInstruction; -import org.w3c.dom.TypeInfo; -import org.w3c.dom.traversal.DocumentTraversal; -import org.w3c.dom.traversal.NodeFilter; -import org.w3c.dom.traversal.TreeWalker; -import org.w3c.dom.xpath.XPathEvaluator; -import org.w3c.dom.xpath.XPathNSResolver; -import org.w3c.dom.xpath.XPathResult; -import org.xml.sax.SAXException; - -/** - * StAX filter for performing XInclude processing. - * - * @see http://www.w3.org/TR/xinclude/ - * @see http://www.w3.org/TR/xptr-framework/ - * @see http://www.w3.org/TR/xptr-element/ - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -class XIncludeFilter - extends StreamReaderDelegate -{ - - static final String XINCLUDE_NS_URI = "http://www.w3.org/2001/XInclude"; - static final int SHOW_FLAGS = - NodeFilter.SHOW_CDATA_SECTION | - NodeFilter.SHOW_COMMENT | - NodeFilter.SHOW_ELEMENT | - NodeFilter.SHOW_ENTITY_REFERENCE | - NodeFilter.SHOW_PROCESSING_INSTRUCTION | - NodeFilter.SHOW_TEXT; - - final String systemId; - final boolean namespaceAware; - final boolean validating; - final boolean expandERefs; - String href; - int event; - boolean included; - XPathResult result; - int snapshotIndex; - Node current; - TreeWalker walker; - HashSet seen = new HashSet(); - boolean backtracking; - boolean lookahead; - - Reader includedText; - char[] buf; - int len = -1; - boolean inInclude, inFallback, seenFallback; - - DocumentBuilder builder; - - XIncludeFilter(XMLStreamReader reader, String systemId, - boolean namespaceAware, boolean validating, - boolean expandERefs) - { - super(reader); - this.systemId = XMLParser.absolutize(null, systemId); - this.namespaceAware = namespaceAware; - this.validating = validating; - this.expandERefs = expandERefs; - } - - public int getAttributeCount() - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - return (attrs == null) ? 0 : attrs.getLength(); - } - return super.getAttributeCount(); - } - - public String getAttributeLocalName(int index) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return null; - Node attr = attrs.item(index); - return attr.getLocalName(); - } - return super.getAttributeLocalName(index); - } - - public String getAttributeNamespace(int index) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return null; - Node attr = attrs.item(index); - return attr.getNamespaceURI(); - } - return super.getAttributeNamespace(index); - } - - public String getAttributePrefix(int index) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return null; - Node attr = attrs.item(index); - return attr.getPrefix(); - } - return super.getAttributePrefix(index); - } - - public QName getAttributeName(int index) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return null; - Node attr = attrs.item(index); - String localName = attr.getLocalName(); - String uri = attr.getNamespaceURI(); - String prefix = attr.getPrefix(); - return new QName(uri, localName, prefix); - } - return super.getAttributeName(index); - } - - public String getAttributeType(int index) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return null; - Attr attr = (Attr) attrs.item(index); - TypeInfo ti = attr.getSchemaTypeInfo(); - return (ti == null) ? "CDATA" : ti.getTypeName(); - } - return super.getAttributeType(index); - } - - public boolean isAttributeSpecified(int index) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return false; - Attr attr = (Attr) attrs.item(index); - return attr.getSpecified(); - } - return super.isAttributeSpecified(index); - } - - public String getAttributeValue(int index) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return null; - Node attr = attrs.item(index); - return attr.getNodeValue(); - } - return super.getAttributeValue(index); - } - - public String getAttributeValue(String uri, String localName) - { - if (current != null) - { - NamedNodeMap attrs = current.getAttributes(); - if (attrs == null) - return null; - Node attr = attrs.getNamedItemNS(uri, localName); - return (attr == null) ? null : attr.getNodeValue(); - } - return super.getAttributeValue(uri, localName); - } - - public String getElementText() - throws XMLStreamException - { - if (current != null) - return current.getTextContent(); - return super.getElementText(); - } - - public int getEventType() - { - return event; - } - - public String getLocalName() - { - if (current != null) - return current.getLocalName(); - return super.getLocalName(); - } - - public QName getName() - { - if (current != null) - { - String localName = current.getLocalName(); - String uri = current.getNamespaceURI(); - String prefix = current.getPrefix(); - return new QName(uri, localName, prefix); - } - return super.getName(); - } - - public String getNamespaceURI() - { - if (current != null) - return current.getNamespaceURI(); - return super.getNamespaceURI(); - } - - // TODO namespaces - - public String getPIData() - { - if (current != null) - return ((ProcessingInstruction) current).getData(); - return super.getPIData(); - } - - public String getPITarget() - { - if (current != null) - return ((ProcessingInstruction) current).getTarget(); - return super.getPITarget(); - } - - public String getPrefix() - { - if (current != null) - return current.getPrefix(); - return super.getPrefix(); - } - - public String getText() - { - if (current != null) - return current.getNodeValue(); - if (walker != null) - { - Node n = walker.getCurrentNode(); - if (n != null) - return n.getTextContent(); - } - if (buf != null) - return new String(buf, 0, len); - return super.getText(); - } - - public char[] getTextCharacters() - { - if (current != null) - { - buf = current.getNodeValue().toCharArray(); - len = buf.length; - } - if (buf != null) - return buf; - return super.getTextCharacters(); - } - - public int getTextCharacters(int sourceStart, char[] target, - int targetStart, int length) - throws XMLStreamException - { - if (current != null) - { - buf = current.getNodeValue().toCharArray(); - len = buf.length; - } - if (buf != null) - { - int max = Math.min(len - sourceStart, length); - if (max > 0) - System.arraycopy(buf, sourceStart, target, targetStart, max); - return max; - } - return super.getTextCharacters(sourceStart, target, targetStart, length); - } - - public int getTextLength() - { - if (current != null) - { - buf = current.getNodeValue().toCharArray(); - len = buf.length; - } - if (buf != null) - return len; - return super.getTextLength(); - } - - public int getTextStart() - { - if (current != null) - { - buf = current.getNodeValue().toCharArray(); - len = buf.length; - } - if (buf != null) - return 0; - return super.getTextStart(); - } - - public boolean hasNext() - throws XMLStreamException - { - if (!lookahead) - { - try - { - next(); - } - catch (NoSuchElementException e) - { - event = -1; - } - lookahead = true; - } - return (event != -1); - } - - public int next() - throws XMLStreamException - { - if (lookahead) - { - lookahead = false; - return event; - } - buf = null; - len = 0; - if (walker != null) - { - Node c = walker.getCurrentNode(); - Node n = null; - if (c.getNodeType() == Node.ELEMENT_NODE) - { - boolean isStartElement = !seen.contains(c); - if (isStartElement) - { - seen.add(c); - current = c; - event = XMLStreamConstants.START_ELEMENT; - return event; - } - else if (backtracking) - { - n = walker.nextSibling(); - if (n != null) - backtracking = false; - } - else - { - n = walker.firstChild(); - if (n == null) - n = walker.nextSibling(); - } - } - else - { - n = walker.firstChild(); - if (n == null) - n = walker.nextSibling(); - } - if (n == null) - { - current = walker.parentNode(); - if (current != null && current.getNodeType() == Node.ELEMENT_NODE) - { - // end-element - backtracking = true; - event = XMLStreamConstants.END_ELEMENT; - return event; - } - else - { - walker = null; - current = null; - } - } - else - { - current = n; - switch (n.getNodeType()) - { - case Node.ELEMENT_NODE: - return next(); - case Node.TEXT_NODE: - String text = n.getNodeValue(); - buf = text.toCharArray(); - len = buf.length; - event = isSpace(buf, len) ? - XMLStreamConstants.SPACE : - XMLStreamConstants.CHARACTERS; - return event; - case Node.CDATA_SECTION_NODE: - event = XMLStreamConstants.CDATA; - return event; - case Node.COMMENT_NODE: - event = XMLStreamConstants.COMMENT; - return event; - case Node.PROCESSING_INSTRUCTION_NODE: - event = XMLStreamConstants.PROCESSING_INSTRUCTION; - return event; - case Node.ENTITY_REFERENCE_NODE: - event = XMLStreamConstants.ENTITY_REFERENCE; - return event; - default: - throw new IllegalStateException(); - } - } - } - if (result != null) - { - switch (result.getResultType()) - { - case XPathResult.BOOLEAN_TYPE: - boolean bval = result.getBooleanValue(); - String btext = bval ? "true" : "false"; - buf = btext.toCharArray(); - len = buf.length; - result = null; - event = XMLStreamConstants.CHARACTERS; - return event; - case XPathResult.NUMBER_TYPE: - double nval = result.getNumberValue(); - String ntext = Double.toString(nval); - buf = ntext.toCharArray(); - len = buf.length; - result = null; - event = XMLStreamConstants.CHARACTERS; - return event; - case XPathResult.STRING_TYPE: - String stext = result.getStringValue(); - buf = stext.toCharArray(); - len = buf.length; - result = null; - event = isSpace(buf, len) ? - XMLStreamConstants.SPACE : - XMLStreamConstants.CHARACTERS; - return event; - case XPathResult.ANY_UNORDERED_NODE_TYPE: - case XPathResult.FIRST_ORDERED_NODE_TYPE: - Node n1 = result.getSingleNodeValue(); - Document d1 = getDocument(n1); - walker = getDocumentTraversal(d1) - .createTreeWalker(n1, SHOW_FLAGS, null, expandERefs); - result = null; - return next(); - case XPathResult.ORDERED_NODE_ITERATOR_TYPE: - case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: - Node n2 = result.iterateNext(); - if (n2 == null) - { - result = null; - return next(); - } - Document d2 = getDocument(n2); - walker = getDocumentTraversal(d2) - .createTreeWalker(n2, SHOW_FLAGS, null, expandERefs); - return next(); - case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE: - case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE: - Node n3 = result.snapshotItem(snapshotIndex++); - if (n3 == null) - { - result = null; - return next(); - } - Document d3 = getDocument(n3); - walker = getDocumentTraversal(d3) - .createTreeWalker(n3, SHOW_FLAGS, null, expandERefs); - return next(); - default: - throw new IllegalStateException(); - } - } - if (includedText != null) - { - // fill buffer - if (buf == null) - buf = new char[2048]; - try - { - len = includedText.read(buf, 0, buf.length); - if (len == -1) - { - includedText = null; - buf = null; - return next(); - } - // chars or space? - return (event = isSpace(buf, len) ? - XMLStreamConstants.SPACE : - XMLStreamConstants.CHARACTERS); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - event = super.next(); - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - String uri = getNamespaceURI(); - if (XINCLUDE_NS_URI.equals(uri)) - { - String localName = getLocalName(); - if ("include".equals(localName)) - { - href = getAttributeValue(null, "href"); - String parse = getAttributeValue(null, "parse"); - String xpointer = getAttributeValue(null, "xpointer"); - String encoding = getAttributeValue(null, "encoding"); - String accept = getAttributeValue(null, "accept"); - String acceptLanguage = getAttributeValue(null, - "accept-language"); - if (includeResource(href, parse, xpointer, encoding, - accept, acceptLanguage)) - { - // Skip to xi:include end-element event - int depth = 0; - while (depth >= 0) - { - event = super.next(); - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - depth++; - break; - case XMLStreamConstants.END_ELEMENT: - depth--; - } - } - } - else - inInclude = true; - } - else if (inInclude && "fallback".equals(localName)) - { - if (!seenFallback) - inFallback = seenFallback = true; - else - throw new XMLStreamException("duplicate xi:fallback element"); - } - else if (inInclude) - { - throw new XMLStreamException("illegal xi element '" + - localName + "'"); - } - return next(); - } - break; - case XMLStreamConstants.END_ELEMENT: - String uri2 = getNamespaceURI(); - if (XINCLUDE_NS_URI.equals(uri2)) - { - String localName = getLocalName(); - if ("include".equals(localName)) - { - if (!seenFallback && included) - { - String msg = "Unable to read " + href + - " and no xi:fallback element present"; - throw new XMLStreamException(msg); - } - included = false; - href = null; - inInclude = inFallback = seenFallback = false; - } - else if ("fallback".equals(localName)) - inFallback = false; - return next(); - } - break; - } - if (inInclude && !inFallback) - return next(); - return event; - } - - boolean isSpace(char[] text, int len) - { - boolean space = true; - for (int i = 0; i < len; i++) - { - char c = text[i]; - if (c != ' ' && c != '\t' && c != '\n' && c != '\r') - { - space = false; - break; - } - } - return space; - } - - String getBaseURI() - { - String base = (String) getParent().getProperty("gnu.xml.stream.baseURI"); - return (base == null) ? systemId : base; - } - - boolean includeResource(String href, String parse, String xpointer, - String encoding, String accept, - String acceptLanguage) - { - included = false; - try - { - if (xpointer != null) - throw new XMLStreamException("xpointer attribute not yet supported"); - String base = getBaseURI(); - if (href == null || "".equals(href)) - href = base; - else - href = XMLParser.absolutize(base, href); - if (parse == null || "xml".equals(parse)) - { - seen.clear(); - result = null; - snapshotIndex = 0; - walker = null; - current = null; - backtracking = false; - - URLConnection connection = getURLConnection(href, accept, - acceptLanguage); - InputStream in = connection.getInputStream(); - Document doc = getDocumentBuilder().parse(in, href); - DocumentTraversal dt = getDocumentTraversal(doc); - if (xpointer == null) - { - result = null; - Node item = doc.getDocumentElement(); - walker = dt.createTreeWalker(item, SHOW_FLAGS, null, - expandERefs); - } - else - { - result = null; - snapshotIndex = 0; - walker = null; - // shorthand or scheme-based? - int lpi = xpointer.indexOf('('); - int rpi = xpointer.indexOf(')', lpi); - if (lpi != -1 && rpi != -1) - { - String scheme = xpointer.substring(0, lpi); - if ("element".equals(scheme)) - { - // element() scheme - String elementSchemeData = - xpointer.substring(lpi + 1, rpi); - Node item = doc; - int si = elementSchemeData.indexOf('/'); - if (si == -1) - { - if (elementSchemeData.length() > 0) - item = doc.getElementById(elementSchemeData); - } - else - { - if (si > 0) - { - String context = - elementSchemeData.substring(0, si); - item = doc.getElementById(context); - elementSchemeData = - elementSchemeData.substring(si + 1); - } - StringTokenizer st = - new StringTokenizer(elementSchemeData, "/"); - while (st.hasMoreTokens() && item != null) - { - int n = Integer.parseInt(st.nextToken()); - Node ctx = item.getFirstChild(); - int count = 1; - while (ctx != null && count++ < n) - ctx = ctx.getNextSibling(); - item = ctx; - } - } - walker = dt.createTreeWalker(item, SHOW_FLAGS, null, - expandERefs); - included = true; - } - else if ("xpointer".equals(scheme)) - { - xpointer = xpointer.substring(lpi + 1, rpi); - XPathEvaluator eval = getXPathEvaluator(doc); - XPathNSResolver resolver = eval.createNSResolver(doc); - result = - (XPathResult) eval.evaluate(xpointer, doc, - resolver, - XPathResult.ANY_TYPE, - null); - // TODO xpointer() scheme functions - included = true; - } - else - { - String msg = "Unknown XPointer scheme: " + scheme; - throw new XMLStreamException(msg); - } - } - else - { - Node item = doc.getElementById(xpointer); - walker = dt.createTreeWalker(item, SHOW_FLAGS, null, - expandERefs); - included = true; - } - } - } - else if ("text".equals(parse)) - { - URLConnection connection = getURLConnection(href, accept, - acceptLanguage); - InputStream in = connection.getInputStream(); - if (encoding == null) - { - encoding = connection.getContentEncoding(); - if (encoding == null) - { - String contentType = connection.getContentType(); - if (contentType != null) - encoding = getParameter(contentType, "charset"); - } - } - if (encoding == null) - includedText = new InputStreamReader(in, "UTF-8"); - else - includedText = new InputStreamReader(in, encoding); - included = true; - } - else - throw new XMLStreamException("value of 'parse' attribute must be "+ - "'xml' or 'text'"); - return true; - } - catch (IOException e) - { - return false; - } - catch (XMLStreamException e) - { - return false; - } - catch (SAXException e) - { - return false; - } - } - - URLConnection getURLConnection(String href, String accept, - String acceptLanguage) - throws IOException - { - URL url = new URL(href); - URLConnection connection = url.openConnection(); - if (connection instanceof HttpURLConnection) - { - HttpURLConnection http = (HttpURLConnection) connection; - http.setInstanceFollowRedirects(true); - if (accept != null) - http.setRequestProperty("Accept", accept); - if (acceptLanguage != null) - http.setRequestProperty("Accept-Language", acceptLanguage); - } - return connection; - } - - Document getDocument(Node node) - { - if (node.getNodeType() == Node.DOCUMENT_NODE) - return (Document) node; - return node.getOwnerDocument(); - } - - DocumentBuilder getDocumentBuilder() - throws XMLStreamException - { - if (builder == null) - { - try - { - DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); - f.setXIncludeAware(true); - f.setNamespaceAware(namespaceAware); - f.setValidating(validating); - builder = f.newDocumentBuilder(); - } - catch (ParserConfigurationException e) - { - XMLStreamException e2 = new XMLStreamException(e.getMessage()); - e2.initCause(e); - throw e2; - } - } - builder.reset(); - return builder; - } - - DocumentTraversal getDocumentTraversal(Document doc) - throws XMLStreamException - { - DOMImplementation dom = doc.getImplementation(); - if (!dom.hasFeature("Traversal", "2.0")) - throw new XMLStreamException("Traversal not supported"); - return (DocumentTraversal) doc; - } - - XPathEvaluator getXPathEvaluator(Document doc) - throws XMLStreamException - { - DOMImplementation dom = doc.getImplementation(); - if (!dom.hasFeature("XPath", "3.0")) - throw new XMLStreamException("XPath not supported"); - return (XPathEvaluator) doc; - } - - static String getParameter(String contentType, String name) - { - StringTokenizer st = new StringTokenizer(contentType, " ;"); - if (st.hasMoreTokens()) - st.nextToken(); - while (st.hasMoreTokens()) - { - String token = st.nextToken(); - int ei = token.indexOf('='); - if (ei != -1) - { - String key = token.substring(0, ei); - if (key.equals(name)) - { - String value = token.substring(ei + 1); - int len = value.length(); - if (len > 1 && - value.charAt(0) == '"' && - value.charAt(len - 1) == '"') - value = value.substring(1, len - 1); - else if (len > 1 && - value.charAt(0) == '\'' && - value.charAt(len - 1) == '\'') - value = value.substring(1, len - 1); - return value; - } - } - } - return null; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLEventAllocatorImpl.java b/libjava/classpath/gnu/xml/stream/XMLEventAllocatorImpl.java deleted file mode 100644 index a1824bfc54d..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLEventAllocatorImpl.java +++ /dev/null @@ -1,204 +0,0 @@ -/* XMLEventAllocatorImpl.java -- - Copyright (C) 2005,2006 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.events.EntityDeclaration; -import javax.xml.stream.events.XMLEvent; -import javax.xml.stream.util.XMLEventAllocator; -import javax.xml.stream.util.XMLEventConsumer; - -/** - * Allocator for creating XML events based on a reader state. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLEventAllocatorImpl - implements XMLEventAllocator -{ - - protected Map entityDeclarations; - - protected XMLEventAllocatorImpl() - { - entityDeclarations = new HashMap(); - } - - public XMLEvent allocate(XMLStreamReader reader) - throws XMLStreamException - { - String text; - boolean whitespace; - boolean ignorableWhitespace; - int len; - List namespaces; - int eventType = reader.getEventType(); - Location location = reader.getLocation(); - switch (eventType) - { - case XMLStreamConstants.CDATA: - text = reader.getText(); - whitespace = isWhitespace(text); - // TODO ignorableWhitespace - ignorableWhitespace = whitespace && false; - return new CharactersImpl(location, text, - whitespace, true, ignorableWhitespace); - case XMLStreamConstants.CHARACTERS: - text = reader.getText(); - whitespace = false; - // TODO ignorableWhitespace - ignorableWhitespace = whitespace && false; - return new CharactersImpl(location, text, - whitespace, false, ignorableWhitespace); - case XMLStreamConstants.COMMENT: - text = reader.getText(); - return new CommentImpl(location, text); - case XMLStreamConstants.DTD: - text = reader.getText(); - List notations = new LinkedList(); - List entities = new LinkedList(); - // TODO readDTDBody(notations, entities); - return new DTDImpl(location, text, null, notations, entities); - case XMLStreamConstants.END_DOCUMENT: - return new EndDocumentImpl(location); - case XMLStreamConstants.END_ELEMENT: - len = reader.getNamespaceCount(); - namespaces = new LinkedList(); - for (int i = 0; i < len; i++) - namespaces.add(new NamespaceImpl(location, - reader.getNamespacePrefix(i), - reader.getNamespaceURI(i), - false)); - return new EndElementImpl(location, - reader.getName(), - namespaces); - case XMLStreamConstants.ENTITY_REFERENCE: - String name = reader.getLocalName(); - EntityDeclaration decl = - (EntityDeclaration) entityDeclarations.get(name); - return new EntityReferenceImpl(location, decl, name); - case XMLStreamConstants.PROCESSING_INSTRUCTION: - return new ProcessingInstructionImpl(location, - reader.getPITarget(), - reader.getPIData()); - case XMLStreamConstants.SPACE: - text = reader.getText(); - whitespace = true; - // TODO ignorableWhitespace - ignorableWhitespace = whitespace && false; - return new CharactersImpl(location, text, - whitespace, false, ignorableWhitespace); - case XMLStreamConstants.START_DOCUMENT: - String systemId = location.getSystemId(); - String encoding = reader.getCharacterEncodingScheme(); - boolean encodingDeclared = encoding != null; - if (encoding == null) - { - encoding = reader.getEncoding(); - if (encoding == null) - encoding = "UTF-8"; - } - String xmlVersion = reader.getVersion(); - if (xmlVersion == null) - xmlVersion = "1.0"; - boolean xmlStandalone = reader.isStandalone(); - boolean standaloneDeclared = reader.standaloneSet(); - return new StartDocumentImpl(location, - systemId, - encoding, - xmlVersion, - xmlStandalone, - standaloneDeclared, - encodingDeclared); - case XMLStreamConstants.START_ELEMENT: - len = reader.getNamespaceCount(); - namespaces = new LinkedList(); - for (int i = 0; i < len; i++) - namespaces.add(new NamespaceImpl(location, - reader.getNamespacePrefix(i), - reader.getNamespaceURI(i), - false)); - len = reader.getAttributeCount(); - List attributes = new LinkedList(); - for (int i = 0; i < len; i++) - attributes.add(new AttributeImpl(location, - reader.getAttributeName(i), - reader.getAttributeValue(i), - reader.getAttributeType(i), - reader.isAttributeSpecified(i))); - return new StartElementImpl(location, - reader.getName(), - attributes, namespaces, - reader.getNamespaceContext()); - default: - throw new XMLStreamException("Unknown event type: " + eventType); - } - } - - public void allocate(XMLStreamReader reader, XMLEventConsumer consumer) - throws XMLStreamException - { - consumer.add(allocate(reader)); - } - - public XMLEventAllocator newInstance() - { - return new XMLEventAllocatorImpl(); - } - - protected boolean isWhitespace(String text) - { - int len = text.length(); - for (int i = 0; i < len; i++) - { - char c = text.charAt(i); - if (c != 0x20 && c != 0x09 && c != 0x0a && c != 0x0d) - return false; - } - return true; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLEventFactoryImpl.java b/libjava/classpath/gnu/xml/stream/XMLEventFactoryImpl.java deleted file mode 100644 index 12f7f2c790b..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLEventFactoryImpl.java +++ /dev/null @@ -1,269 +0,0 @@ -/* XMLEventFactoryImpl.java -- - Copyright (C) 2005,2006 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedList; -import javax.xml.XMLConstants; -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLEventFactory; -import javax.xml.stream.events.Attribute; -import javax.xml.stream.events.Characters; -import javax.xml.stream.events.Comment; -import javax.xml.stream.events.DTD; -import javax.xml.stream.events.EndDocument; -import javax.xml.stream.events.EndElement; -import javax.xml.stream.events.EntityDeclaration; -import javax.xml.stream.events.EntityReference; -import javax.xml.stream.events.Namespace; -import javax.xml.stream.events.ProcessingInstruction; -import javax.xml.stream.events.StartDocument; -import javax.xml.stream.events.StartElement; - -/** - * Factory for XML events. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLEventFactoryImpl - extends XMLEventFactory -{ - - protected Location location; - - public void setLocation(Location location) - { - this.location = location; - } - - public Attribute createAttribute(String prefix, String namespaceURI, - String localName, String value) - { - return new AttributeImpl(location, - new QName(namespaceURI, localName, prefix), - value, "CDATA", true); - } - - public Attribute createAttribute(String localName, String value) - { - return new AttributeImpl(location, - new QName(localName), - value, "CDATA", true); - } - - public Attribute createAttribute(QName name, String value) - { - return new AttributeImpl(location, name, value, - "CDATA", true); - } - - public Namespace createNamespace(String namespaceURI) - { - return new NamespaceImpl(location, - XMLConstants.DEFAULT_NS_PREFIX, - namespaceURI, - true); - } - - public Namespace createNamespace(String prefix, String namespaceUri) - { - return new NamespaceImpl(location, prefix, namespaceUri, true); - } - - public StartElement createStartElement(QName name, - Iterator attributes, - Iterator namespaces) - { - return new StartElementImpl(location, name, - createLinkedList(attributes), - createLinkedList(namespaces), - null); - } - - public StartElement createStartElement(String prefix, - String namespaceUri, - String localName) - { - return new StartElementImpl(location, - new QName(namespaceUri, localName, prefix), - Collections.EMPTY_LIST, - Collections.EMPTY_LIST, - null); - } - - public StartElement createStartElement(String prefix, - String namespaceUri, - String localName, - Iterator attributes, - Iterator namespaces) - { - return new StartElementImpl(location, - new QName(namespaceUri, localName, prefix), - createLinkedList(attributes), - createLinkedList(namespaces), - null); - } - - public StartElement createStartElement(String prefix, - String namespaceUri, - String localName, - Iterator attributes, - Iterator namespaces, - NamespaceContext context) - { - return new StartElementImpl(location, - new QName(namespaceUri, localName, prefix), - createLinkedList(attributes), - createLinkedList(namespaces), - context); - } - - public EndElement createEndElement(QName name, - Iterator namespaces) - { - return new EndElementImpl(location, name, - createLinkedList(namespaces)); - } - - public EndElement createEndElement(String prefix, - String namespaceUri, - String localName) - { - return new EndElementImpl(location, - new QName(namespaceUri, localName, prefix), - Collections.EMPTY_LIST); - } - - public EndElement createEndElement(String prefix, - String namespaceUri, - String localName, - Iterator namespaces) - { - return new EndElementImpl(location, - new QName(namespaceUri, localName, prefix), - createLinkedList(namespaces)); - } - - public Characters createCharacters(String content) - { - return new CharactersImpl(location, content, false, false, false); - } - - public Characters createCData(String content) - { - return new CharactersImpl(location, content, false, true, false); - } - - public Characters createSpace(String content) - { - return new CharactersImpl(location, content, true, false, false); - } - - public Characters createIgnorableSpace(String content) - { - return new CharactersImpl(location, content, true, false, true); - } - - public StartDocument createStartDocument() - { - return new StartDocumentImpl(location, null, "UTF-8", "1.0", - false, false, false); - } - - public StartDocument createStartDocument(String encoding, - String version, - boolean standalone) - { - return new StartDocumentImpl(location, null, encoding, version, - standalone, true, true); - } - - public StartDocument createStartDocument(String encoding, - String version) - { - return new StartDocumentImpl(location, null, encoding, version, - false, false, true); - } - - public StartDocument createStartDocument(String encoding) - { - return new StartDocumentImpl(location, null, encoding, "1.0", - false, false, true); - } - - public EndDocument createEndDocument() - { - return new EndDocumentImpl(location); - } - - public EntityReference createEntityReference(String name, - EntityDeclaration declaration) - { - return new EntityReferenceImpl(location, declaration, name); - } - - public Comment createComment(String text) - { - return new CommentImpl(location, text); - } - - public ProcessingInstruction createProcessingInstruction(String target, - String data) - { - return new ProcessingInstructionImpl(location, target, data); - } - - public DTD createDTD(String dtd) - { - return new DTDImpl(location, dtd, null, - Collections.EMPTY_LIST, - Collections.EMPTY_LIST); - } - - LinkedList createLinkedList(Iterator i) - { - LinkedList ret = new LinkedList(); - while (i.hasNext()) - ret.add(i.next()); - return ret; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLEventImpl.java b/libjava/classpath/gnu/xml/stream/XMLEventImpl.java deleted file mode 100644 index 2e650bf74f6..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLEventImpl.java +++ /dev/null @@ -1,198 +0,0 @@ -/* XMLEventImpl.java -- - Copyright (C) 2005,2006 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import gnu.java.lang.CPStringBuilder; - -import java.io.Writer; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.Characters; -import javax.xml.stream.events.EndElement; -import javax.xml.stream.events.StartElement; -import javax.xml.stream.events.XMLEvent; - -/** - * An XML stream event. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public abstract class XMLEventImpl - implements XMLEvent -{ - - protected final Location location; - - protected XMLEventImpl(Location location) - { - this.location = location; - } - - public abstract int getEventType(); - - public Location getLocation() - { - return location; - } - - public boolean isStartElement() - { - return getEventType() == START_ELEMENT; - } - - public boolean isAttribute() - { - return getEventType() == ATTRIBUTE; - } - - public boolean isNamespace() - { - return getEventType() == NAMESPACE; - } - - public boolean isEndElement() - { - return getEventType() == END_ELEMENT; - } - - public boolean isEntityReference() - { - return getEventType() == ENTITY_REFERENCE; - } - - public boolean isProcessingInstruction() - { - return getEventType() == PROCESSING_INSTRUCTION; - } - - public boolean isCharacters() - { - int et = getEventType(); - return et == CHARACTERS || et == CDATA; - } - - public boolean isStartDocument() - { - return getEventType() == START_DOCUMENT; - } - - public boolean isEndDocument() - { - return getEventType() == END_DOCUMENT; - } - - public StartElement asStartElement() - { - return (StartElement) this; - } - - public EndElement asEndElement() - { - return (EndElement) this; - } - - public Characters asCharacters() - { - return (Characters) this; - } - - public QName getSchemaType() - { - return null; - } - - public abstract void writeAsEncodedUnicode(Writer writer) - throws XMLStreamException; - - protected String encode(String text, boolean inAttr) - { - int len = text.length(); - CPStringBuilder buf = null; - for (int i = 0; i < len; i++) - { - char c = text.charAt(i); - if (c == '<') - { - if (buf == null) - { - buf = new CPStringBuilder(text.substring(0, i)); - } - buf.append("<"); - } - else if (c == '>') - { - if (buf == null) - { - buf = new CPStringBuilder(text.substring(0, i)); - } - buf.append(">"); - } - else if (c == '&') - { - if (buf == null) - { - buf = new CPStringBuilder(text.substring(0, i)); - } - buf.append("&"); - } - else if (c == '\'' && inAttr) - { - if (buf == null) - { - buf = new CPStringBuilder(text.substring(0, i)); - } - buf.append("'"); - } - else if (c == '"' && inAttr) - { - if (buf == null) - { - buf = new CPStringBuilder(text.substring(0, i)); - } - buf.append("""); - } - else if (buf != null) - { - buf.append(c); - } - } - return (buf == null) ? text : buf.toString(); - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLEventReaderImpl.java b/libjava/classpath/gnu/xml/stream/XMLEventReaderImpl.java deleted file mode 100644 index bab6d9378b4..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLEventReaderImpl.java +++ /dev/null @@ -1,157 +0,0 @@ -/* XMLEventReaderImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.events.XMLEvent; -import javax.xml.stream.util.XMLEventAllocator; - -/** - * Parser using XML events. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLEventReaderImpl - implements XMLEventReader -{ - - protected final XMLStreamReader reader; - protected final XMLEventAllocator allocator; - protected final String systemId; - protected XMLEvent peekEvent; - - protected XMLEventReaderImpl(XMLStreamReader reader, - XMLEventAllocator allocator, - String systemId) - { - this.reader = reader; - this.allocator = allocator; - this.systemId = systemId; - } - - public XMLEvent nextEvent() - throws XMLStreamException - { - XMLEvent ret = peek(); - peekEvent = null; - return ret; - } - - public Object next() - { - try - { - return nextEvent(); - } - catch (XMLStreamException e) - { - RuntimeException e2 = new RuntimeException(); - e2.initCause(e); - throw e2; - } - } - - public boolean hasNext() - { - if (peekEvent != null) - return true; - try - { - return reader.hasNext(); - } - catch (XMLStreamException e) - { - return false; - } - } - - public XMLEvent peek() - throws XMLStreamException - { - if (peekEvent != null) - return peekEvent; - if (!reader.hasNext()) - return null; - reader.next(); - peekEvent = allocator.allocate(reader); - return peekEvent; - } - - public String getElementText() - throws XMLStreamException - { - return reader.getElementText(); - } - - public XMLEvent nextTag() - throws XMLStreamException - { - if (peekEvent != null) - { - int eventType = peekEvent.getEventType(); - if (eventType == XMLStreamConstants.START_ELEMENT || - eventType == XMLStreamConstants.END_ELEMENT) - return peekEvent; - else - peekEvent = null; - } - reader.nextTag(); - return allocator.allocate(reader); - } - - public Object getProperty(String name) - throws IllegalArgumentException - { - return reader.getProperty(name); - } - - public void close() - throws XMLStreamException - { - reader.close(); - } - - public void remove() - { - throw new UnsupportedOperationException(); - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLEventWriterImpl.java b/libjava/classpath/gnu/xml/stream/XMLEventWriterImpl.java deleted file mode 100644 index 33b1dce31b0..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLEventWriterImpl.java +++ /dev/null @@ -1,190 +0,0 @@ -/* XMLEventWriterImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLEventWriter; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; -import javax.xml.stream.events.Attribute; -import javax.xml.stream.events.Characters; -import javax.xml.stream.events.Comment; -import javax.xml.stream.events.DTD; -import javax.xml.stream.events.Namespace; -import javax.xml.stream.events.ProcessingInstruction; -import javax.xml.stream.events.StartDocument; -import javax.xml.stream.events.StartElement; -import javax.xml.stream.events.XMLEvent; - -/** - * Writer to write events to an underlying XML stream writer. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLEventWriterImpl - implements XMLEventWriter -{ - - protected final XMLStreamWriter writer; - - protected XMLEventWriterImpl(XMLStreamWriter writer) - { - this.writer = writer; - } - - public void flush() - throws XMLStreamException - { - writer.flush(); - } - - public void close() - throws XMLStreamException - { - writer.close(); - } - - public void add(XMLEvent event) - throws XMLStreamException - { - QName name; - String uri; - switch (event.getEventType()) - { - case XMLStreamConstants.START_ELEMENT: - StartElement startElement = event.asStartElement(); - name = startElement.getName(); - uri = name.getNamespaceURI(); - if (uri != null && !"".equals(uri)) - writer.writeStartElement(name.getPrefix(), name.getLocalPart(), uri); - else - writer.writeStartElement(name.getLocalPart()); - break; - case XMLStreamConstants.END_ELEMENT: - writer.writeEndElement(); - break; - case XMLStreamConstants.ATTRIBUTE: - Attribute attribute = (Attribute) event; - name = attribute.getName(); - uri = name.getNamespaceURI(); - if (uri != null && !"".equals(uri)) - writer.writeAttribute(name.getPrefix(), uri, name.getLocalPart(), - attribute.getValue()); - else - writer.writeAttribute(name.getLocalPart(), attribute.getValue()); - break; - case XMLStreamConstants.NAMESPACE: - Namespace namespace = (Namespace) event; - uri = namespace.getNamespaceURI(); - writer.writeNamespace(namespace.getPrefix(), uri); - break; - case XMLStreamConstants.PROCESSING_INSTRUCTION: - ProcessingInstruction pi = (ProcessingInstruction) event; - String data = pi.getData(); - if (data == null) - writer.writeProcessingInstruction(pi.getTarget()); - else - writer.writeProcessingInstruction(pi.getTarget(), data); - break; - case XMLStreamConstants.COMMENT: - Comment comment = (Comment) event; - writer.writeComment(comment.getText()); - break; - case XMLStreamConstants.START_DOCUMENT: - StartDocument startDocument = (StartDocument) event; - writer.writeStartDocument(startDocument.getVersion()); - break; - case XMLStreamConstants.END_DOCUMENT: - writer.writeEndDocument(); - break; - case XMLStreamConstants.DTD: - DTD dtd = (DTD) event; - writer.writeDTD(dtd.getDocumentTypeDeclaration()); - break; - case XMLStreamConstants.CHARACTERS: - case XMLStreamConstants.SPACE: - Characters characters = event.asCharacters(); - writer.writeCharacters(characters.getData()); - break; - case XMLStreamConstants.CDATA: - Characters cdata = event.asCharacters(); - writer.writeCData(cdata.getData()); - break; - } - } - - public void add(XMLEventReader reader) - throws XMLStreamException - { - while (reader.hasNext()) - add(reader.nextEvent()); - } - - public String getPrefix(String uri) - throws XMLStreamException - { - return writer.getPrefix(uri); - } - - public void setPrefix(String prefix, String uri) - throws XMLStreamException - { - writer.setPrefix(prefix, uri); - } - - public void setDefaultNamespace(String uri) - throws XMLStreamException - { - writer.setDefaultNamespace(uri); - } - - public void setNamespaceContext(NamespaceContext context) - throws XMLStreamException - { - writer.setNamespaceContext(context); - } - - public NamespaceContext getNamespaceContext() - { - return writer.getNamespaceContext(); - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLInputFactoryImpl.java b/libjava/classpath/gnu/xml/stream/XMLInputFactoryImpl.java deleted file mode 100644 index 87aa32107d3..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLInputFactoryImpl.java +++ /dev/null @@ -1,397 +0,0 @@ -/* XMLInputFactoryImpl.java -- - Copyright (C) 2005,2006 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.IOException; -import java.io.Reader; -import java.net.MalformedURLException; -import java.net.URL; - -import javax.xml.transform.Source; -import javax.xml.transform.stream.StreamSource; -import javax.xml.stream.EventFilter; -import javax.xml.stream.StreamFilter; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLReporter; -import javax.xml.stream.XMLResolver; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.util.XMLEventAllocator; - -/** - * Factory for creating parsers from various kinds of XML source. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLInputFactoryImpl - extends XMLInputFactory -{ - - protected XMLResolver resolver; - protected XMLReporter reporter; - protected XMLEventAllocator allocator; - - protected boolean validating; - protected boolean namespaceAware = true; - protected boolean coalescing; - protected boolean replacingEntityReferences = true; - protected boolean externalEntities = true; - protected boolean supportDTD = true; - protected boolean xIncludeAware = false; - protected boolean baseAware = true; - protected boolean stringInterning = true; - - public XMLInputFactoryImpl() - { - allocator = new XMLEventAllocatorImpl(); - } - - public XMLStreamReader createXMLStreamReader(Reader reader) - throws XMLStreamException - { - return createXMLStreamReader(null, reader); - } - - public XMLStreamReader createXMLStreamReader(Source source) - throws XMLStreamException - { - String systemId = source.getSystemId(); - InputStream in = getInputStream(source); - XMLParser ret = new XMLParser(in, systemId, - validating, - namespaceAware, - coalescing, - replacingEntityReferences, - externalEntities, - supportDTD, - baseAware, - stringInterning, - false, - reporter, - resolver); - if (xIncludeAware) - return new XIncludeFilter(ret, systemId, namespaceAware, validating, - replacingEntityReferences); - return ret; - } - - public XMLStreamReader createXMLStreamReader(InputStream in) - throws XMLStreamException - { - return createXMLStreamReader(null, in); - } - - public XMLStreamReader createXMLStreamReader(InputStream in, String encoding) - throws XMLStreamException - { - return createXMLStreamReader(in); - } - - public XMLStreamReader createXMLStreamReader(String systemId, InputStream in) - throws XMLStreamException - { - XMLParser ret = new XMLParser(in, systemId, - validating, - namespaceAware, - coalescing, - replacingEntityReferences, - externalEntities, - supportDTD, - baseAware, - stringInterning, - false, - reporter, - resolver); - if (xIncludeAware) - return new XIncludeFilter(ret, null, namespaceAware, validating, - replacingEntityReferences); - return ret; - } - - public XMLStreamReader createXMLStreamReader(String systemId, Reader reader) - throws XMLStreamException - { - XMLParser ret = new XMLParser(reader, systemId, - validating, - namespaceAware, - coalescing, - replacingEntityReferences, - externalEntities, - supportDTD, - baseAware, - stringInterning, - false, - reporter, - resolver); - if (xIncludeAware) - return new XIncludeFilter(ret, null, namespaceAware, validating, - replacingEntityReferences); - return ret; - } - - public XMLEventReader createXMLEventReader(Reader reader) - throws XMLStreamException - { - XMLStreamReader sr = createXMLStreamReader(reader); - return new XMLEventReaderImpl(sr, allocator, null); - } - - public XMLEventReader createXMLEventReader(String systemId, Reader reader) - throws XMLStreamException - { - XMLStreamReader sr = createXMLStreamReader(systemId, reader); - return new XMLEventReaderImpl(sr, allocator, null); - } - - public XMLEventReader createXMLEventReader(XMLStreamReader reader) - throws XMLStreamException - { - return new XMLEventReaderImpl(reader, allocator, null); - } - - public XMLEventReader createXMLEventReader(Source source) - throws XMLStreamException - { - XMLStreamReader sr = createXMLStreamReader(source); - return new XMLEventReaderImpl(sr, allocator, null); - } - - public XMLEventReader createXMLEventReader(InputStream in) - throws XMLStreamException - { - XMLStreamReader sr = createXMLStreamReader(in); - return new XMLEventReaderImpl(sr, allocator, null); - } - - public XMLEventReader createXMLEventReader(InputStream in, String encoding) - throws XMLStreamException - { - XMLStreamReader sr = createXMLStreamReader(in, encoding); - return new XMLEventReaderImpl(sr, allocator, null); - } - - public XMLEventReader createXMLEventReader(String systemId, InputStream in) - throws XMLStreamException - { - XMLStreamReader sr = createXMLStreamReader(systemId, in); - return new XMLEventReaderImpl(sr, allocator, null); - } - - public XMLStreamReader createFilteredReader(XMLStreamReader reader, - StreamFilter filter) - throws XMLStreamException - { - return new FilteredStreamReader(reader, filter); - } - - public XMLEventReader createFilteredReader(XMLEventReader reader, - EventFilter filter) - throws XMLStreamException - { - return new FilteredEventReader(reader, filter); - } - - public XMLResolver getXMLResolver() - { - return resolver; - } - - public void setXMLResolver(XMLResolver resolver) - { - this.resolver = resolver; - } - - public XMLReporter getXMLReporter() - { - return reporter; - } - - public void setXMLReporter(XMLReporter reporter) - { - this.reporter = reporter; - } - - public void setProperty(String name, Object value) - throws IllegalArgumentException - { - if (name.equals(IS_NAMESPACE_AWARE)) - namespaceAware = ((Boolean) value).booleanValue(); - else if (name.equals(IS_VALIDATING)) - validating = ((Boolean) value).booleanValue(); - else if (name.equals(IS_COALESCING)) - coalescing = ((Boolean) value).booleanValue(); - else if (name.equals(IS_REPLACING_ENTITY_REFERENCES)) - replacingEntityReferences = ((Boolean) value).booleanValue(); - else if (name.equals(IS_SUPPORTING_EXTERNAL_ENTITIES)) - externalEntities = ((Boolean) value).booleanValue(); - else if (name.equals(SUPPORT_DTD)) - supportDTD = ((Boolean) value).booleanValue(); - else if (name.equals(REPORTER)) - reporter = (XMLReporter) value; - else if (name.equals(RESOLVER)) - resolver = (XMLResolver) value; - else if (name.equals(ALLOCATOR)) - allocator = (XMLEventAllocator) value; - else if (name.equals("gnu.xml.stream.stringInterning")) - stringInterning = ((Boolean) value).booleanValue(); - else if (name.equals("gnu.xml.stream.baseAware")) - baseAware = ((Boolean) value).booleanValue(); - else if (name.equals("gnu.xml.stream.xIncludeAware")) - xIncludeAware = ((Boolean) value).booleanValue(); - else - throw new IllegalArgumentException(name); - } - - public Object getProperty(String name) - throws IllegalArgumentException - { - if (name.equals(IS_NAMESPACE_AWARE)) - return namespaceAware ? Boolean.TRUE : Boolean.FALSE; - if (name.equals(IS_VALIDATING)) - return validating ? Boolean.TRUE : Boolean.FALSE; - if (name.equals(IS_COALESCING)) - return coalescing ? Boolean.TRUE : Boolean.FALSE; - if (name.equals(IS_REPLACING_ENTITY_REFERENCES)) - return replacingEntityReferences ? Boolean.TRUE : Boolean.FALSE; - if (name.equals(IS_SUPPORTING_EXTERNAL_ENTITIES)) - return externalEntities ? Boolean.TRUE : Boolean.FALSE; - if (name.equals(SUPPORT_DTD)) - return supportDTD ? Boolean.TRUE : Boolean.FALSE; - if (name.equals(REPORTER)) - return reporter; - if (name.equals(RESOLVER)) - return resolver; - if (name.equals(ALLOCATOR)) - return allocator; - if (name.equals("gnu.xml.stream.stringInterning")) - return stringInterning ? Boolean.TRUE : Boolean.FALSE; - if (name.equals("gnu.xml.stream.baseAware")) - return baseAware ? Boolean.TRUE : Boolean.FALSE; - if (name.equals("gnu.xml.stream.xIncludeAware")) - return xIncludeAware ? Boolean.TRUE : Boolean.FALSE; - throw new IllegalArgumentException(name); - } - - public boolean isPropertySupported(String name) - { - return name.equals(IS_NAMESPACE_AWARE) || - name.equals(IS_VALIDATING) || - name.equals(IS_COALESCING) || - name.equals(IS_REPLACING_ENTITY_REFERENCES) || - name.equals(IS_SUPPORTING_EXTERNAL_ENTITIES) || - name.equals(SUPPORT_DTD) || - name.equals(REPORTER) || - name.equals(RESOLVER) || - name.equals(ALLOCATOR) || - name.equals("gnu.xml.stream.stringInterning") || - name.equals("gnu.xml.stream.baseAware") || - name.equals("gnu.xml.stream.xIncludeAware"); - } - - public void setEventAllocator(XMLEventAllocator allocator) - { - this.allocator = allocator; - } - - public XMLEventAllocator getEventAllocator() - { - return allocator; - } - - public void setCoalescing(boolean coalescing) - { - this.coalescing = coalescing; - } - - public boolean isCoalescing() - { - return coalescing; - } - - protected InputStream getInputStream(Source source) - throws XMLStreamException - { - InputStream in = null; - if (source instanceof StreamSource) - { - StreamSource streamSource = (StreamSource) source; - in = streamSource.getInputStream(); - } - if (in == null) - { - String systemId = source.getSystemId(); - try - { - URL url = new URL(systemId); - try - { - in = url.openStream(); - } - catch (IOException e2) - { - XMLStreamException e3 = new XMLStreamException(e2); - e3.initCause(e2); - throw e3; - } - } - catch (MalformedURLException e) - { - // Fall back to relative file - if (File.separatorChar != '/') - systemId = systemId.replace('/', File.separatorChar); - try - { - in = new FileInputStream(systemId); - } - catch (FileNotFoundException e2) - { - XMLStreamException e3 = new XMLStreamException(e2); - e3.initCause(e2); - throw e3; - } - } - } - return in; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLOutputFactoryImpl.java b/libjava/classpath/gnu/xml/stream/XMLOutputFactoryImpl.java deleted file mode 100644 index d849e8ba5ed..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLOutputFactoryImpl.java +++ /dev/null @@ -1,187 +0,0 @@ -/* XMLOutputFactoryImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.io.UnsupportedEncodingException; - -import javax.xml.transform.Result; -import javax.xml.transform.stream.StreamResult; -import javax.xml.stream.XMLEventWriter; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; - -/** - * Standard output factory. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLOutputFactoryImpl - extends XMLOutputFactory -{ - - protected boolean prefixDefaulting = false; - - public XMLOutputFactoryImpl() - { - } - - public XMLStreamWriter createXMLStreamWriter(Writer stream) - throws XMLStreamException - { - // XXX try to determine character encoding of writer? - return new XMLStreamWriterImpl(stream, null, prefixDefaulting); - } - - public XMLStreamWriter createXMLStreamWriter(OutputStream stream) - throws XMLStreamException - { - return createXMLStreamWriter(stream, "UTF-8"); - } - - public XMLStreamWriter createXMLStreamWriter(OutputStream stream, - String encoding) - throws XMLStreamException - { - if (encoding == null) - encoding = "UTF-8"; - try - { - Writer writer = new OutputStreamWriter(stream, encoding); - return new XMLStreamWriterImpl(writer, encoding, prefixDefaulting); - } - catch (UnsupportedEncodingException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public XMLStreamWriter createXMLStreamWriter(Result result) - throws XMLStreamException - { - if (result instanceof StreamResult) - { - StreamResult sr = (StreamResult) result; - OutputStream out = sr.getOutputStream(); - if (out != null) - return createXMLStreamWriter(out); - Writer writer = sr.getWriter(); - if (writer != null) - return createXMLStreamWriter(writer); - } - throw new UnsupportedOperationException(); - } - - public XMLEventWriter createXMLEventWriter(OutputStream stream) - throws XMLStreamException - { - XMLStreamWriter writer = createXMLStreamWriter(stream); - return new XMLEventWriterImpl(writer); - } - - public XMLEventWriter createXMLEventWriter(OutputStream stream, - String encoding) - throws XMLStreamException - { - XMLStreamWriter writer = createXMLStreamWriter(stream, encoding); - return new XMLEventWriterImpl(writer); - } - - public XMLEventWriter createXMLEventWriter(Writer stream) - throws XMLStreamException - { - XMLStreamWriter writer = createXMLStreamWriter(stream); - return new XMLEventWriterImpl(writer); - } - - public XMLEventWriter createXMLEventWriter(Result result) - throws XMLStreamException - { - if (result instanceof StreamResult) - { - StreamResult sr = (StreamResult) result; - OutputStream out = sr.getOutputStream(); - if (out != null) - return createXMLEventWriter(out); - Writer writer = sr.getWriter(); - if (writer != null) - return createXMLEventWriter(writer); - } - throw new UnsupportedOperationException(); - } - - public void setProperty(String name, Object value) - throws IllegalArgumentException - { - if (IS_REPAIRING_NAMESPACES.equals(name)) - prefixDefaulting = ((Boolean) value).booleanValue(); - else - throw new IllegalArgumentException(name); - } - - public Object getProperty(String name) - throws IllegalArgumentException - { - if (IS_REPAIRING_NAMESPACES.equals(name)) - return new Boolean(prefixDefaulting); - throw new IllegalArgumentException(name); - } - - public boolean isPropertySupported(String name) - { - if (IS_REPAIRING_NAMESPACES.equals(name)) - return true; - return false; - } - - public boolean isPrefixDefaulting() - { - return prefixDefaulting; - } - - public void setPrefixDefaulting(boolean value) - { - prefixDefaulting = value; - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLParser.java b/libjava/classpath/gnu/xml/stream/XMLParser.java deleted file mode 100644 index 71e8765695a..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLParser.java +++ /dev/null @@ -1,5434 +0,0 @@ -/* XMLParser.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. - -Partly derived from code which carried the following notice: - - Copyright (c) 1997, 1998 by Microstar Software Ltd. - - AElfred is free for both commercial and non-commercial use and - redistribution, provided that Microstar's copyright and disclaimer are - retained intact. You are free to modify AElfred for your own use and - to redistribute AElfred with your modifications, provided that the - modifications are clearly documented. - - 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. Please use it AT - YOUR OWN RISK. -*/ - -package gnu.xml.stream; - -import gnu.java.lang.CPStringBuilder; - -import java.io.BufferedInputStream; -import java.io.EOFException; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.StringTokenizer; - -import javax.xml.XMLConstants; -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLReporter; -import javax.xml.stream.XMLResolver; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; - -import gnu.java.net.CRLFInputStream; -import gnu.classpath.debug.TeeInputStream; -import gnu.classpath.debug.TeeReader; - -/** - * An XML parser. - * This parser supports the following additional StAX properties: - * <table> - * <tr><td>gnu.xml.stream.stringInterning</td> - * <td>Boolean</td> - * <td>Indicates whether markup strings will be interned</td></tr> - * <tr><td>gnu.xml.stream.xmlBase</td> - * <td>Boolean</td> - * <td>Indicates whether XML Base processing will be performed</td></tr> - * <tr><td>gnu.xml.stream.baseURI</td> - * <td>String</td> - * <td>Returns the base URI of the current event</td></tr> - * </table> - * - * @see http://www.w3.org/TR/REC-xml/ - * @see http://www.w3.org/TR/xml11/ - * @see http://www.w3.org/TR/REC-xml-names - * @see http://www.w3.org/TR/xml-names11 - * @see http://www.w3.org/TR/xmlbase/ - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLParser - implements XMLStreamReader, NamespaceContext -{ - - // -- parser state machine states -- - private static final int INIT = 0; // start state - private static final int PROLOG = 1; // in prolog - private static final int CONTENT = 2; // in content - private static final int EMPTY_ELEMENT = 3; // empty element state - private static final int MISC = 4; // in Misc (after root element) - - // -- parameters for parsing literals -- - private final static int LIT_ENTITY_REF = 2; - private final static int LIT_NORMALIZE = 4; - private final static int LIT_ATTRIBUTE = 8; - private final static int LIT_DISABLE_PE = 16; - private final static int LIT_DISABLE_CREF = 32; - private final static int LIT_DISABLE_EREF = 64; - private final static int LIT_PUBID = 256; - - // -- types of attribute values -- - final static int ATTRIBUTE_DEFAULT_UNDECLARED = 30; - final static int ATTRIBUTE_DEFAULT_SPECIFIED = 31; - final static int ATTRIBUTE_DEFAULT_IMPLIED = 32; - final static int ATTRIBUTE_DEFAULT_REQUIRED = 33; - final static int ATTRIBUTE_DEFAULT_FIXED = 34; - - // -- additional event types -- - final static int START_ENTITY = 50; - final static int END_ENTITY = 51; - - /** - * The current input. - */ - private Input input; - - /** - * Stack of inputs representing XML general entities. - * The input representing the XML input stream or reader is always the - * first element in this stack. - */ - private LinkedList inputStack = new LinkedList(); - - /** - * Stack of start-entity events to be reported. - */ - private LinkedList startEntityStack = new LinkedList(); - - /** - * Stack of end-entity events to be reported. - */ - private LinkedList endEntityStack = new LinkedList(); - - /** - * Current parser state within the main state machine. - */ - private int state = INIT; - - /** - * The (type of the) current event. - */ - private int event; - - /** - * The element name stack. The first element in this stack will be the - * root element. - */ - private LinkedList stack = new LinkedList(); - - /** - * Stack of namespace contexts. These are maps specifying prefix-to-URI - * mappings. The first element in this stack is the most recent namespace - * context (i.e. the other way around from the element name stack). - */ - private LinkedList namespaces = new LinkedList(); - - /** - * The base-URI stack. This holds the base URI context for each element. - * The first element in this stack is the most recent context (i.e. the - * other way around from the element name stack). - */ - private LinkedList bases = new LinkedList(); - - /** - * The list of attributes for the current element, in the order defined in - * the XML stream. - */ - private ArrayList attrs = new ArrayList(); - - /** - * Buffer for text and character data. - */ - private StringBuffer buf = new StringBuffer(); - - /** - * Buffer for NMTOKEN strings (markup). - */ - private StringBuffer nmtokenBuf = new StringBuffer(); - - /** - * Buffer for string literals. (e.g. attribute values) - */ - private StringBuffer literalBuf = new StringBuffer(); - - /** - * Temporary Unicode character buffer used during character data reads. - */ - private int[] tmpBuf = new int[1024]; - - /** - * The element content model for the current element. - */ - private ContentModel currentContentModel; - - /** - * The validation stack. This holds lists of the elements seen for each - * element, in order to determine whether the names and order of these - * elements match the content model for the element. The last entry in - * this stack represents the current element. - */ - private LinkedList validationStack; - - /** - * These sets contain the IDs and the IDREFs seen in the document, to - * ensure that IDs are unique and that each IDREF refers to an ID in the - * document. - */ - private HashSet ids, idrefs; - - /** - * The target and data associated with the current processing instruction - * event. - */ - private String piTarget, piData; - - /** - * The XML version declared in the XML declaration. - */ - private String xmlVersion; - - /** - * The encoding declared in the XML declaration. - */ - private String xmlEncoding; - - /** - * The standalone value declared in the XML declaration. - */ - private Boolean xmlStandalone; - - /** - * The document type definition. - */ - Doctype doctype; - - /** - * State variables for determining parameter-entity expansion. - */ - private boolean expandPE, peIsError; - - /** - * Whether this is a validating parser. - */ - private final boolean validating; - - /** - * Whether strings representing markup will be interned. - */ - private final boolean stringInterning; - - /** - * If true, CDATA sections will be merged with adjacent text nodes into a - * single event. - */ - private final boolean coalescing; - - /** - * Whether to replace general entity references with their replacement - * text automatically during parsing. - * Otherwise entity-reference events will be issued. - */ - private final boolean replaceERefs; - - /** - * Whether to support external entities. - */ - private final boolean externalEntities; - - /** - * Whether to support DTDs. - */ - private final boolean supportDTD; - - /** - * Whether to support XML namespaces. If true, namespace information will - * be available. Otherwise namespaces will simply be reported as ordinary - * attributes. - */ - private final boolean namespaceAware; - - /** - * Whether to support XML Base. If true, URIs specified in xml:base - * attributes will be honoured when resolving external entities. - */ - private final boolean baseAware; - - /** - * Whether to report extended event types (START_ENTITY and END_ENTITY) - * in addition to the standard event types. Used by the SAX parser. - */ - private final boolean extendedEventTypes; - - /** - * The reporter to receive parsing warnings. - */ - final XMLReporter reporter; - - /** - * Callback interface for resolving external entities. - */ - final XMLResolver resolver; - - // -- Constants for testing the next kind of markup event -- - private static final String TEST_START_ELEMENT = "<"; - private static final String TEST_END_ELEMENT = "</"; - private static final String TEST_COMMENT = "<!--"; - private static final String TEST_PI = "<?"; - private static final String TEST_CDATA = "<![CDATA["; - private static final String TEST_XML_DECL = "<?xml"; - private static final String TEST_DOCTYPE_DECL = "<!DOCTYPE"; - private static final String TEST_ELEMENT_DECL = "<!ELEMENT"; - private static final String TEST_ATTLIST_DECL = "<!ATTLIST"; - private static final String TEST_ENTITY_DECL = "<!ENTITY"; - private static final String TEST_NOTATION_DECL = "<!NOTATION"; - private static final String TEST_KET = ">"; - private static final String TEST_END_COMMENT = "--"; - private static final String TEST_END_PI = "?>"; - private static final String TEST_END_CDATA = "]]>"; - - /** - * The general entities predefined by the XML specification. - */ - private static final LinkedHashMap PREDEFINED_ENTITIES = new LinkedHashMap(); - static - { - PREDEFINED_ENTITIES.put("amp", "&"); - PREDEFINED_ENTITIES.put("lt", "<"); - PREDEFINED_ENTITIES.put("gt", ">"); - PREDEFINED_ENTITIES.put("apos", "'"); - PREDEFINED_ENTITIES.put("quot", "\""); - } - - /** - * Creates a new XML parser for the given input stream. - * This constructor should be used where possible, as it allows the - * encoding of the XML data to be correctly determined from the stream. - * @param in the input stream - * @param systemId the URL from which the input stream was retrieved - * (necessary if there are external entities to be resolved) - * @param validating if the parser is to be a validating parser - * @param namespaceAware if the parser should support XML Namespaces - * @param coalescing if CDATA sections should be merged into adjacent text - * nodes - * @param replaceERefs if entity references should be automatically - * replaced by their replacement text (otherwise they will be reported as - * entity-reference events) - * @param externalEntities if external entities should be loaded - * @param supportDTD if support for the XML DTD should be enabled - * @param baseAware if the parser should support XML Base to resolve - * external entities - * @param stringInterning whether strings will be interned during parsing - * @param reporter the reporter to receive warnings during processing - * @param resolver the callback interface used to resolve external - * entities - */ - public XMLParser(InputStream in, String systemId, - boolean validating, - boolean namespaceAware, - boolean coalescing, - boolean replaceERefs, - boolean externalEntities, - boolean supportDTD, - boolean baseAware, - boolean stringInterning, - boolean extendedEventTypes, - XMLReporter reporter, - XMLResolver resolver) - { - this.validating = validating; - this.namespaceAware = namespaceAware; - this.coalescing = coalescing; - this.replaceERefs = replaceERefs; - this.externalEntities = externalEntities; - this.supportDTD = supportDTD; - this.baseAware = baseAware; - this.stringInterning = stringInterning; - this.extendedEventTypes = extendedEventTypes; - this.reporter = reporter; - this.resolver = resolver; - if (validating) - { - validationStack = new LinkedList(); - ids = new HashSet(); - idrefs = new HashSet(); - } - String debug = System.getProperty("gnu.xml.debug.input"); - if (debug != null) - { - try - { - File file = File.createTempFile(debug, ".xml"); - in = new TeeInputStream(in, new FileOutputStream(file)); - } - catch (IOException e) - { - RuntimeException e2 = new RuntimeException(); - e2.initCause(e); - throw e2; - } - } - systemId = canonicalize(systemId); - pushInput(new Input(in, null, null, systemId, null, null, false, true)); - } - - /** - * Creates a new XML parser for the given character stream. - * This constructor is only available for compatibility with the JAXP - * APIs, which permit XML to be parsed from a character stream. Because - * the encoding specified by the character stream may conflict with that - * specified in the XML declaration, this method should be avoided where - * possible. - * @param in the input stream - * @param systemId the URL from which the input stream was retrieved - * (necessary if there are external entities to be resolved) - * @param validating if the parser is to be a validating parser - * @param namespaceAware if the parser should support XML Namespaces - * @param coalescing if CDATA sections should be merged into adjacent text - * nodes - * @param replaceERefs if entity references should be automatically - * replaced by their replacement text (otherwise they will be reported as - * entity-reference events) - * @param externalEntities if external entities should be loaded - * @param supportDTD if support for the XML DTD should be enabled - * @param baseAware if the parser should support XML Base to resolve - * external entities - * @param stringInterning whether strings will be interned during parsing - * @param reporter the reporter to receive warnings during processing - * @param resolver the callback interface used to resolve external - * entities - */ - public XMLParser(Reader reader, String systemId, - boolean validating, - boolean namespaceAware, - boolean coalescing, - boolean replaceERefs, - boolean externalEntities, - boolean supportDTD, - boolean baseAware, - boolean stringInterning, - boolean extendedEventTypes, - XMLReporter reporter, - XMLResolver resolver) - { - this.validating = validating; - this.namespaceAware = namespaceAware; - this.coalescing = coalescing; - this.replaceERefs = replaceERefs; - this.externalEntities = externalEntities; - this.supportDTD = supportDTD; - this.baseAware = baseAware; - this.stringInterning = stringInterning; - this.extendedEventTypes = extendedEventTypes; - this.reporter = reporter; - this.resolver = resolver; - if (validating) - { - validationStack = new LinkedList(); - ids = new HashSet(); - idrefs = new HashSet(); - } - String debug = System.getProperty("gnu.xml.debug.input"); - if (debug != null) - { - try - { - File file = File.createTempFile(debug, ".xml"); - reader = new TeeReader(reader, new FileWriter(file)); - } - catch (IOException e) - { - RuntimeException e2 = new RuntimeException(); - e2.initCause(e); - throw e2; - } - } - systemId = canonicalize(systemId); - pushInput(new Input(null, reader, null, systemId, null, null, false, true)); - } - - // -- NamespaceContext -- - - public String getNamespaceURI(String prefix) - { - if (XMLConstants.XML_NS_PREFIX.equals(prefix)) - return XMLConstants.XML_NS_URI; - if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) - return XMLConstants.XMLNS_ATTRIBUTE_NS_URI; - for (Iterator i = namespaces.iterator(); i.hasNext(); ) - { - LinkedHashMap ctx = (LinkedHashMap) i.next(); - String namespaceURI = (String) ctx.get(prefix); - if (namespaceURI != null) - return namespaceURI; - } - return null; - } - - public String getPrefix(String namespaceURI) - { - if (XMLConstants.XML_NS_URI.equals(namespaceURI)) - return XMLConstants.XML_NS_PREFIX; - if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) - return XMLConstants.XMLNS_ATTRIBUTE; - for (Iterator i = namespaces.iterator(); i.hasNext(); ) - { - LinkedHashMap ctx = (LinkedHashMap) i.next(); - if (ctx.containsValue(namespaceURI)) - { - for (Iterator j = ctx.entrySet().iterator(); j.hasNext(); ) - { - Map.Entry entry = (Map.Entry) i.next(); - String uri = (String) entry.getValue(); - if (uri.equals(namespaceURI)) - return (String) entry.getKey(); - } - } - } - return null; - } - - public Iterator getPrefixes(String namespaceURI) - { - if (XMLConstants.XML_NS_URI.equals(namespaceURI)) - return Collections.singleton(XMLConstants.XML_NS_PREFIX).iterator(); - if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) - return Collections.singleton(XMLConstants.XMLNS_ATTRIBUTE).iterator(); - LinkedList acc = new LinkedList(); - for (Iterator i = namespaces.iterator(); i.hasNext(); ) - { - LinkedHashMap ctx = (LinkedHashMap) i.next(); - if (ctx.containsValue(namespaceURI)) - { - for (Iterator j = ctx.entrySet().iterator(); j.hasNext(); ) - { - Map.Entry entry = (Map.Entry) i.next(); - String uri = (String) entry.getValue(); - if (uri.equals(namespaceURI)) - acc.add(entry.getKey()); - } - } - } - return acc.iterator(); - } - - // -- XMLStreamReader -- - - public void close() - throws XMLStreamException - { - stack = null; - namespaces = null; - bases = null; - buf = null; - attrs = null; - doctype = null; - - inputStack = null; - validationStack = null; - ids = null; - idrefs = null; - } - - public NamespaceContext getNamespaceContext() - { - return this; - } - - public int getAttributeCount() - { - return attrs.size(); - } - - public String getAttributeLocalName(int index) - { - Attribute a = (Attribute) attrs.get(index); - return a.localName; - } - - public String getAttributeNamespace(int index) - { - String prefix = getAttributePrefix(index); - return getNamespaceURI(prefix); - } - - public String getAttributePrefix(int index) - { - Attribute a = (Attribute) attrs.get(index); - return a.prefix; - } - - public QName getAttributeName(int index) - { - Attribute a = (Attribute) attrs.get(index); - String namespaceURI = getNamespaceURI(a.prefix); - return new QName(namespaceURI, a.localName, a.prefix); - } - - public String getAttributeType(int index) - { - Attribute a = (Attribute) attrs.get(index); - return a.type; - } - - private String getAttributeType(String elementName, String attName) - { - if (doctype != null) - { - AttributeDecl att = doctype.getAttributeDecl(elementName, attName); - if (att != null) - return att.type; - } - return "CDATA"; - } - - public String getAttributeValue(int index) - { - Attribute a = (Attribute) attrs.get(index); - return a.value; - } - - public String getAttributeValue(String namespaceURI, String localName) - { - for (Iterator i = attrs.iterator(); i.hasNext(); ) - { - Attribute a = (Attribute) i.next(); - if (a.localName.equals(localName)) - { - String uri = getNamespaceURI(a.prefix); - if ((uri == null && namespaceURI == null) || - (uri != null && uri.equals(namespaceURI))) - return a.value; - } - } - return null; - } - - boolean isAttributeDeclared(int index) - { - if (doctype == null) - return false; - Attribute a = (Attribute) attrs.get(index); - String qn = ("".equals(a.prefix)) ? a.localName : - a.prefix + ":" + a.localName; - String elementName = buf.toString(); - return doctype.isAttributeDeclared(elementName, qn); - } - - public String getCharacterEncodingScheme() - { - return xmlEncoding; - } - - public String getElementText() - throws XMLStreamException - { - if (event != XMLStreamConstants.START_ELEMENT) - throw new XMLStreamException("current event must be START_ELEMENT"); - CPStringBuilder elementText = new CPStringBuilder(); - int depth = stack.size(); - while (event != XMLStreamConstants.END_ELEMENT || stack.size() > depth) - { - switch (next()) - { - case XMLStreamConstants.CHARACTERS: - case XMLStreamConstants.SPACE: - elementText.append(buf.toString()); - } - } - return elementText.toString(); - } - - public String getEncoding() - { - return (input.inputEncoding == null) ? "UTF-8" : input.inputEncoding; - } - - public int getEventType() - { - return event; - } - - public String getLocalName() - { - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - case XMLStreamConstants.END_ELEMENT: - String qName = buf.toString(); - int ci = qName.indexOf(':'); - String localName = (ci == -1) ? qName : qName.substring(ci + 1); - if (stringInterning) - localName = localName.intern(); - return localName; - default: - return null; - } - } - - public Location getLocation() - { - return input; - } - - public QName getName() - { - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - case XMLStreamConstants.END_ELEMENT: - String qName = buf.toString(); - int ci = qName.indexOf(':'); - String localName = (ci == -1) ? qName : qName.substring(ci + 1); - if (stringInterning) - localName = localName.intern(); - String prefix = (ci == -1) ? - (namespaceAware ? XMLConstants.DEFAULT_NS_PREFIX : null) : - qName.substring(0, ci); - if (stringInterning && prefix != null) - prefix = prefix.intern(); - String namespaceURI = getNamespaceURI(prefix); - return new QName(namespaceURI, localName, prefix); - default: - return null; - } - } - - public int getNamespaceCount() - { - if (!namespaceAware || namespaces.isEmpty()) - return 0; - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - case XMLStreamConstants.END_ELEMENT: - LinkedHashMap ctx = (LinkedHashMap) namespaces.getFirst(); - return ctx.size(); - default: - return 0; - } - } - - public String getNamespacePrefix(int index) - { - LinkedHashMap ctx = (LinkedHashMap) namespaces.getFirst(); - int count = 0; - for (Iterator i = ctx.keySet().iterator(); i.hasNext(); ) - { - String prefix = (String) i.next(); - if (count++ == index) - return prefix; - } - return null; - } - - public String getNamespaceURI() - { - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - case XMLStreamConstants.END_ELEMENT: - String qName = buf.toString(); - int ci = qName.indexOf(':'); - if (ci == -1) - return null; - String prefix = qName.substring(0, ci); - return getNamespaceURI(prefix); - default: - return null; - } - } - - public String getNamespaceURI(int index) - { - LinkedHashMap ctx = (LinkedHashMap) namespaces.getFirst(); - int count = 0; - for (Iterator i = ctx.values().iterator(); i.hasNext(); ) - { - String uri = (String) i.next(); - if (count++ == index) - return uri; - } - return null; - } - - public String getPIData() - { - return piData; - } - - public String getPITarget() - { - return piTarget; - } - - public String getPrefix() - { - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - case XMLStreamConstants.END_ELEMENT: - String qName = buf.toString(); - int ci = qName.indexOf(':'); - String prefix = (ci == -1) ? - (namespaceAware ? XMLConstants.DEFAULT_NS_PREFIX : null) : - qName.substring(0, ci); - if (stringInterning && prefix != null) - prefix = prefix.intern(); - return prefix; - default: - return null; - } - } - - public Object getProperty(String name) - throws IllegalArgumentException - { - if (name == null) - throw new IllegalArgumentException("name is null"); - if (XMLInputFactory.ALLOCATOR.equals(name)) - return null; - if (XMLInputFactory.IS_COALESCING.equals(name)) - return coalescing ? Boolean.TRUE : Boolean.FALSE; - if (XMLInputFactory.IS_NAMESPACE_AWARE.equals(name)) - return namespaceAware ? Boolean.TRUE : Boolean.FALSE; - if (XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES.equals(name)) - return replaceERefs ? Boolean.TRUE : Boolean.FALSE; - if (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES.equals(name)) - return externalEntities ? Boolean.TRUE : Boolean.FALSE; - if (XMLInputFactory.IS_VALIDATING.equals(name)) - return Boolean.FALSE; - if (XMLInputFactory.REPORTER.equals(name)) - return reporter; - if (XMLInputFactory.RESOLVER.equals(name)) - return resolver; - if (XMLInputFactory.SUPPORT_DTD.equals(name)) - return supportDTD ? Boolean.TRUE : Boolean.FALSE; - if ("gnu.xml.stream.stringInterning".equals(name)) - return stringInterning ? Boolean.TRUE : Boolean.FALSE; - if ("gnu.xml.stream.xmlBase".equals(name)) - return baseAware ? Boolean.TRUE : Boolean.FALSE; - if ("gnu.xml.stream.baseURI".equals(name)) - return getXMLBase(); - return null; - } - - public String getText() - { - return buf.toString(); - } - - public char[] getTextCharacters() - { - return buf.toString().toCharArray(); - } - - public int getTextCharacters(int sourceStart, char[] target, - int targetStart, int length) - throws XMLStreamException - { - length = Math.min(sourceStart + buf.length(), length); - int sourceEnd = sourceStart + length; - buf.getChars(sourceStart, sourceEnd, target, targetStart); - return length; - } - - public int getTextLength() - { - return buf.length(); - } - - public int getTextStart() - { - return 0; - } - - public String getVersion() - { - return (xmlVersion == null) ? "1.0" : xmlVersion; - } - - public boolean hasName() - { - switch (event) - { - case XMLStreamConstants.START_ELEMENT: - case XMLStreamConstants.END_ELEMENT: - return true; - default: - return false; - } - } - - public boolean hasText() - { - switch (event) - { - case XMLStreamConstants.CHARACTERS: - case XMLStreamConstants.SPACE: - return true; - default: - return false; - } - } - - public boolean isAttributeSpecified(int index) - { - Attribute a = (Attribute) attrs.get(index); - return a.specified; - } - - public boolean isCharacters() - { - return (event == XMLStreamConstants.CHARACTERS); - } - - public boolean isEndElement() - { - return (event == XMLStreamConstants.END_ELEMENT); - } - - public boolean isStandalone() - { - return Boolean.TRUE.equals(xmlStandalone); - } - - public boolean isStartElement() - { - return (event == XMLStreamConstants.START_ELEMENT); - } - - public boolean isWhiteSpace() - { - return (event == XMLStreamConstants.SPACE); - } - - public int nextTag() - throws XMLStreamException - { - do - { - switch (next()) - { - case XMLStreamConstants.START_ELEMENT: - case XMLStreamConstants.END_ELEMENT: - case XMLStreamConstants.CHARACTERS: - case XMLStreamConstants.SPACE: - case XMLStreamConstants.COMMENT: - case XMLStreamConstants.PROCESSING_INSTRUCTION: - break; - default: - throw new XMLStreamException("Unexpected event type: " + event); - } - } - while (event != XMLStreamConstants.START_ELEMENT && - event != XMLStreamConstants.END_ELEMENT); - return event; - } - - public void require(int type, String namespaceURI, String localName) - throws XMLStreamException - { - if (event != type) - throw new XMLStreamException("Current event type is " + event); - if (event == XMLStreamConstants.START_ELEMENT || - event == XMLStreamConstants.END_ELEMENT) - { - String ln = getLocalName(); - if (!ln.equals(localName)) - throw new XMLStreamException("Current local-name is " + ln); - String uri = getNamespaceURI(); - if ((uri == null && namespaceURI != null) || - (uri != null && !uri.equals(namespaceURI))) - throw new XMLStreamException("Current namespace URI is " + uri); - } - } - - public boolean standaloneSet() - { - return (xmlStandalone != null); - } - - public boolean hasNext() - throws XMLStreamException - { - return (event != XMLStreamConstants.END_DOCUMENT && event != -1); - } - - public int next() - throws XMLStreamException - { - if (event == XMLStreamConstants.END_ELEMENT) - { - // Pop namespace context - if (namespaceAware && !namespaces.isEmpty()) - namespaces.removeFirst(); - // Pop base context - if (baseAware && !bases.isEmpty()) - bases.removeFirst(); - } - if (!startEntityStack.isEmpty()) - { - String entityName = (String) startEntityStack.removeFirst(); - buf.setLength(0); - buf.append(entityName); - event = START_ENTITY; - return extendedEventTypes ? event : next(); - } - else if (!endEntityStack.isEmpty()) - { - String entityName = (String) endEntityStack.removeFirst(); - buf.setLength(0); - buf.append(entityName); - event = END_ENTITY; - return extendedEventTypes ? event : next(); - } - try - { - if (!input.initialized) - input.init(); - switch (state) - { - case CONTENT: - if (tryRead(TEST_END_ELEMENT)) - { - readEndElement(); - if (stack.isEmpty()) - state = MISC; - event = XMLStreamConstants.END_ELEMENT; - } - else if (tryRead(TEST_COMMENT)) - { - readComment(false); - event = XMLStreamConstants.COMMENT; - } - else if (tryRead(TEST_PI)) - { - readPI(false); - event = XMLStreamConstants.PROCESSING_INSTRUCTION; - } - else if (tryRead(TEST_CDATA)) - { - readCDSect(); - event = XMLStreamConstants.CDATA; - } - else if (tryRead(TEST_START_ELEMENT)) - { - state = readStartElement(); - event = XMLStreamConstants.START_ELEMENT; - } - else - { - // Check for character reference or predefined entity - mark(8); - int c = readCh(); - if (c == 0x26) // '&' - { - c = readCh(); - if (c == 0x23) // '#' - { - reset(); - event = readCharData(null); - } - else - { - // entity reference - reset(); - readCh(); // & - readReference(); - String ref = buf.toString(); - String text = (String) PREDEFINED_ENTITIES.get(ref); - if (text != null) - { - event = readCharData(text); - } - else if (replaceERefs && !isUnparsedEntity(ref)) - { - // this will report a start-entity event - boolean external = false; - if (doctype != null) - { - Object entity = doctype.getEntity(ref); - if (entity instanceof ExternalIds) - external = true; - } - expandEntity(ref, false, external); - event = next(); - } - else - { - event = XMLStreamConstants.ENTITY_REFERENCE; - } - } - } - else - { - reset(); - event = readCharData(null); - if (validating && doctype != null) - validatePCData(buf.toString()); - } - } - break; - case EMPTY_ELEMENT: - String elementName = (String) stack.removeLast(); - buf.setLength(0); - buf.append(elementName); - state = stack.isEmpty() ? MISC : CONTENT; - event = XMLStreamConstants.END_ELEMENT; - if (validating && doctype != null) - endElementValidationHook(); - break; - case INIT: // XMLDecl? - if (tryRead(TEST_XML_DECL)) - readXMLDecl(); - input.finalizeEncoding(); - event = XMLStreamConstants.START_DOCUMENT; - state = PROLOG; - break; - case PROLOG: // Misc* (doctypedecl Misc*)? - skipWhitespace(); - if (doctype == null && tryRead(TEST_DOCTYPE_DECL)) - { - readDoctypeDecl(); - event = XMLStreamConstants.DTD; - } - else if (tryRead(TEST_COMMENT)) - { - readComment(false); - event = XMLStreamConstants.COMMENT; - } - else if (tryRead(TEST_PI)) - { - readPI(false); - event = XMLStreamConstants.PROCESSING_INSTRUCTION; - } - else if (tryRead(TEST_START_ELEMENT)) - { - state = readStartElement(); - event = XMLStreamConstants.START_ELEMENT; - } - else - { - int c = readCh(); - error("no root element: U+" + Integer.toHexString(c)); - } - break; - case MISC: // Comment | PI | S - skipWhitespace(); - if (tryRead(TEST_COMMENT)) - { - readComment(false); - event = XMLStreamConstants.COMMENT; - } - else if (tryRead(TEST_PI)) - { - readPI(false); - event = XMLStreamConstants.PROCESSING_INSTRUCTION; - } - else - { - if (event == XMLStreamConstants.END_DOCUMENT) - throw new NoSuchElementException(); - int c = readCh(); - if (c != -1) - error("Only comments and PIs may appear after " + - "the root element"); - event = XMLStreamConstants.END_DOCUMENT; - } - break; - default: - event = -1; - } - return event; - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(); - e2.initCause(e); - throw e2; - } - } - - // package private - - /** - * Returns the current element name. - */ - String getCurrentElement() - { - return (String) stack.getLast(); - } - - // private - - private void mark(int limit) - throws IOException - { - input.mark(limit); - } - - private void reset() - throws IOException - { - input.reset(); - } - - private int read() - throws IOException - { - return input.read(); - } - - private int read(int[] b, int off, int len) - throws IOException - { - return input.read(b, off, len); - } - - /** - * Parsed character read. - */ - private int readCh() - throws IOException, XMLStreamException - { - int c = read(); - if (expandPE && c == 0x25) // '%' - { - if (peIsError) - error("PE reference within decl in internal subset."); - expandPEReference(); - return readCh(); - } - return c; - } - - /** - * Reads the next character, ensuring it is the character specified. - * @param delim the character to match - * @exception XMLStreamException if the next character is not the - * specified one - */ - private void require(char delim) - throws IOException, XMLStreamException - { - mark(1); - int c = readCh(); - if (delim != c) - { - reset(); - error("required character (got U+" + Integer.toHexString(c) + ")", - new Character(delim)); - } - } - - /** - * Reads the next few characters, ensuring they match the string specified. - * @param delim the string to match - * @exception XMLStreamException if the next characters do not match the - * specified string - */ - private void require(String delim) - throws IOException, XMLStreamException - { - char[] chars = delim.toCharArray(); - int len = chars.length; - mark(len); - int off = 0; - do - { - int l2 = read(tmpBuf, off, len - off); - if (l2 == -1) - { - reset(); - error("EOF before required string", delim); - } - off += l2; - } - while (off < len); - for (int i = 0; i < chars.length; i++) - { - if (chars[i] != tmpBuf[i]) - { - reset(); - error("required string", delim); - } - } - } - - /** - * Try to read a single character. On failure, reset the stream. - * @param delim the character to test - * @return true if the character matched delim, false otherwise. - */ - private boolean tryRead(char delim) - throws IOException, XMLStreamException - { - mark(1); - int c = readCh(); - if (delim != c) - { - reset(); - return false; - } - return true; - } - - /** - * Tries to read the specified characters. - * If successful, the stream is positioned after the last character, - * otherwise it is reset. - * @param test the string to test - * @return true if the characters matched the test string, false otherwise. - */ - private boolean tryRead(String test) - throws IOException - { - char[] chars = test.toCharArray(); - int len = chars.length; - mark(len); - int count = 0; - int l2 = read(tmpBuf, 0, len); - if (l2 == -1) - { - reset(); - return false; - } - count += l2; - // check the characters we received first before doing additional reads - for (int i = 0; i < count; i++) - { - if (chars[i] != tmpBuf[i]) - { - reset(); - return false; - } - } - while (count < len) - { - // force read - int c = read(); - if (c == -1) - { - reset(); - return false; - } - tmpBuf[count] = (char) c; - // check each character as it is read - if (chars[count] != tmpBuf[count]) - { - reset(); - return false; - } - count++; - } - return true; - } - - /** - * Reads characters until the specified test string is encountered. - * @param delim the string delimiting the end of the characters - */ - private void readUntil(String delim) - throws IOException, XMLStreamException - { - int startLine = input.line; - try - { - while (!tryRead(delim)) - { - int c = readCh(); - if (c == -1) - throw new EOFException(); - else if (input.xml11) - { - if (!isXML11Char(c) || isXML11RestrictedChar(c)) - error("illegal XML 1.1 character", - "U+" + Integer.toHexString(c)); - } - else if (!isChar(c)) - error("illegal XML character", - "U+" + Integer.toHexString(c)); - buf.append(Character.toChars(c)); - } - } - catch (EOFException e) - { - error("end of input while looking for delimiter "+ - "(started on line " + startLine + ')', delim); - } - } - - /** - * Reads any whitespace characters. - * @return true if whitespace characters were read, false otherwise - */ - private boolean tryWhitespace() - throws IOException, XMLStreamException - { - boolean white; - boolean ret = false; - do - { - mark(1); - int c = readCh(); - while (c == -1 && inputStack.size() > 1) - { - popInput(); - c = readCh(); - } - white = (c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d); - if (white) - ret = true; - } - while (white); - reset(); - return ret; - } - - /** - * Skip over any whitespace characters. - */ - private void skipWhitespace() - throws IOException, XMLStreamException - { - boolean white; - do - { - mark(1); - int c = readCh(); - while (c == -1 && inputStack.size() > 1) - { - popInput(); - c = readCh(); - } - white = (c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d); - } - while (white); - reset(); - } - - /** - * Try to read as many whitespace characters as are available. - * @exception XMLStreamException if no whitespace characters were seen - */ - private void requireWhitespace() - throws IOException, XMLStreamException - { - if (!tryWhitespace()) - error("whitespace required"); - } - - /** - * Returns the current base URI for resolving external entities. - */ - String getXMLBase() - { - if (baseAware) - { - for (Iterator i = bases.iterator(); i.hasNext(); ) - { - String base = (String) i.next(); - if (base != null) - return base; - } - } - return input.systemId; - } - - /** - * Push the specified text input source. - */ - private void pushInput(String name, String text, boolean report, - boolean normalize) - throws IOException, XMLStreamException - { - // Check for recursion - if (name != null && !"".equals(name)) - { - for (Iterator i = inputStack.iterator(); i.hasNext(); ) - { - Input ctx = (Input) i.next(); - if (name.equals(ctx.name)) - error("entities may not be self-recursive", name); - } - } - else - report = false; - pushInput(new Input(null, new StringReader(text), input.publicId, - input.systemId, name, input.inputEncoding, report, - normalize)); - } - - /** - * Push the specified external input source. - */ - private void pushInput(String name, ExternalIds ids, boolean report, - boolean normalize) - throws IOException, XMLStreamException - { - if (!externalEntities) - return; - String url = canonicalize(absolutize(input.systemId, ids.systemId)); - // Check for recursion - for (Iterator i = inputStack.iterator(); i.hasNext(); ) - { - Input ctx = (Input) i.next(); - if (url.equals(ctx.systemId)) - error("entities may not be self-recursive", url); - if (name != null && !"".equals(name) && name.equals(ctx.name)) - error("entities may not be self-recursive", name); - } - if (name == null || "".equals(name)) - report = false; - InputStream in = null; - if (resolver != null) - { - Object obj = resolver.resolveEntity(ids.publicId, url, getXMLBase(), - null); - if (obj instanceof InputStream) - in = (InputStream) obj; - } - if (in == null) - in = resolve(url); - if (in == null) - error("unable to resolve external entity", - (ids.systemId != null) ? ids.systemId : ids.publicId); - pushInput(new Input(in, null, ids.publicId, url, name, null, report, - normalize)); - input.init(); - if (tryRead(TEST_XML_DECL)) - readTextDecl(); - input.finalizeEncoding(); - } - - /** - * Push the specified input source (general entity) onto the input stack. - */ - private void pushInput(Input input) - { - if (input.report) - startEntityStack.addFirst(input.name); - inputStack.addLast(input); - if (this.input != null) - input.xml11 = this.input.xml11; - this.input = input; - } - - /** - * Returns a canonicalized version of the specified URL. - * This is largely to work around a problem with the specification of - * file URLs. - */ - static String canonicalize(String url) - { - if (url == null) - return null; - if (url.startsWith("file:") && !url.startsWith("file://")) - url = "file://" + url.substring(5); - return url; - } - - /** - * "Absolutize" a URL. This resolves a relative URL into an absolute one. - * @param base the current base URL - * @param href the (absolute or relative) URL to resolve - */ - public static String absolutize(String base, String href) - { - if (href == null) - return null; - int ci = href.indexOf(':'); - if (ci > 1 && isURLScheme(href.substring(0, ci))) - { - // href is absolute already - return href; - } - if (base == null) - base = ""; - else - { - int i = base.lastIndexOf('/'); - if (i != -1) - base = base.substring(0, i + 1); - else - base = ""; - } - if ("".equals(base)) - { - // assume file URL relative to current directory - base = System.getProperty("user.dir"); - if (base.charAt(0) == '/') - base = base.substring(1); - base = "file:///" + base.replace(File.separatorChar, '/'); - if (!base.endsWith("/")) - base += "/"; - } - // We can't use java.net.URL here to do the parsing, as it searches for - // a protocol handler. A protocol handler may not be registered for the - // URL scheme here. Do it manually. - // - // Set aside scheme and host portion of base URL - String basePrefix = null; - ci = base.indexOf(':'); - if (ci > 1 && isURLScheme(base.substring(0, ci))) - { - if (base.length() > (ci + 3) && - base.charAt(ci + 1) == '/' && - base.charAt(ci + 2) == '/') - { - int si = base.indexOf('/', ci + 3); - if (si == -1) - base = null; - else - { - basePrefix = base.substring(0, si); - base = base.substring(si); - } - } - else - base = null; - } - if (base == null) // unknown or malformed base URL, use href - return href; - if (href.startsWith("/")) // absolute href pathname - return (basePrefix == null) ? href : basePrefix + href; - // relative href pathname - if (!base.endsWith("/")) - { - int lsi = base.lastIndexOf('/'); - if (lsi == -1) - base = "/"; - else - base = base.substring(0, lsi + 1); - } - while (href.startsWith("../") || href.startsWith("./")) - { - if (href.startsWith("../")) - { - // strip last path component from base - int lsi = base.lastIndexOf('/', base.length() - 2); - if (lsi > -1) - base = base.substring(0, lsi + 1); - href = href.substring(3); // strip ../ prefix - } - else - { - href = href.substring(2); // strip ./ prefix - } - } - return (basePrefix == null) ? base + href : basePrefix + base + href; - } - - /** - * Indicates whether the specified characters match the scheme portion of - * a URL. - * @see RFC 1738 section 2.1 - */ - private static boolean isURLScheme(String text) - { - int len = text.length(); - for (int i = 0; i < len; i++) - { - char c = text.charAt(i); - if (c == '+' || c == '.' || c == '-') - continue; - if (c < 65 || (c > 90 && c < 97) || c > 122) - return false; - } - return true; - } - - /** - * Returns an input stream for the given URL. - */ - static InputStream resolve(String url) - throws IOException - { - try - { - return new URL(url).openStream(); - } - catch (MalformedURLException e) - { - return null; - } - catch (IOException e) - { - IOException e2 = new IOException("error resolving " + url); - e2.initCause(e); - throw e2; - } - } - - /** - * Pops the current input source (general entity) off the stack. - */ - private void popInput() - { - Input old = (Input) inputStack.removeLast(); - if (old.report) - endEntityStack.addFirst(old.name); - input = (Input) inputStack.getLast(); - } - - /** - * Parse an entity text declaration. - */ - private void readTextDecl() - throws IOException, XMLStreamException - { - final int flags = LIT_DISABLE_CREF | LIT_DISABLE_PE | LIT_DISABLE_EREF; - requireWhitespace(); - if (tryRead("version")) - { - readEq(); - String v = readLiteral(flags, false); - if ("1.0".equals(v)) - input.xml11 = false; - else if ("1.1".equals(v)) - { - Input i1 = (Input) inputStack.getFirst(); - if (!i1.xml11) - error("external entity specifies later version number"); - input.xml11 = true; - } - else - throw new XMLStreamException("illegal XML version: " + v); - requireWhitespace(); - } - require("encoding"); - readEq(); - String enc = readLiteral(flags, false); - skipWhitespace(); - require("?>"); - input.setInputEncoding(enc); - } - - /** - * Parse the XML declaration. - */ - private void readXMLDecl() - throws IOException, XMLStreamException - { - final int flags = LIT_DISABLE_CREF | LIT_DISABLE_PE | LIT_DISABLE_EREF; - - requireWhitespace(); - require("version"); - readEq(); - xmlVersion = readLiteral(flags, false); - if ("1.0".equals(xmlVersion)) - input.xml11 = false; - else if ("1.1".equals(xmlVersion)) - input.xml11 = true; - else - throw new XMLStreamException("illegal XML version: " + xmlVersion); - - boolean white = tryWhitespace(); - - if (tryRead("encoding")) - { - if (!white) - error("whitespace required before 'encoding='"); - readEq(); - xmlEncoding = readLiteral(flags, false); - white = tryWhitespace(); - } - - if (tryRead("standalone")) - { - if (!white) - error("whitespace required before 'standalone='"); - readEq(); - String standalone = readLiteral(flags, false); - if ("yes".equals(standalone)) - xmlStandalone = Boolean.TRUE; - else if ("no".equals(standalone)) - xmlStandalone = Boolean.FALSE; - else - error("standalone flag must be 'yes' or 'no'", standalone); - } - - skipWhitespace(); - require("?>"); - if (xmlEncoding != null) - input.setInputEncoding(xmlEncoding); - } - - /** - * Parse the DOCTYPE declaration. - */ - private void readDoctypeDecl() - throws IOException, XMLStreamException - { - if (!supportDTD) - error("parser was configured not to support DTDs"); - requireWhitespace(); - String rootName = readNmtoken(true); - skipWhitespace(); - ExternalIds ids = readExternalIds(false, true); - doctype = - this.new Doctype(rootName, ids.publicId, ids.systemId); - - // Parse internal subset first - skipWhitespace(); - if (tryRead('[')) - { - while (true) - { - expandPE = true; - skipWhitespace(); - expandPE = false; - if (tryRead(']')) - break; - else - readMarkupdecl(false); - } - } - skipWhitespace(); - require('>'); - - // Parse external subset - if (ids.systemId != null && externalEntities) - { - pushInput("", ">", false, false); - pushInput("[dtd]", ids, true, true); - // loop until we get back to ">" - while (true) - { - expandPE = true; - skipWhitespace(); - expandPE = false; - mark(1); - int c = readCh(); - if (c == 0x3e) // '>' - break; - else if (c == -1) - popInput(); - else - { - reset(); - expandPE = true; - readMarkupdecl(true); - expandPE = true; - } - } - if (inputStack.size() != 2) - error("external subset has unmatched '>'"); - popInput(); - } - checkDoctype(); - if (validating) - validateDoctype(); - - // Make rootName available for reading - buf.setLength(0); - buf.append(rootName); - } - - /** - * Checks the well-formedness of the DTD. - */ - private void checkDoctype() - throws XMLStreamException - { - // TODO check entity recursion - } - - /** - * Parse the markupdecl production. - */ - private void readMarkupdecl(boolean inExternalSubset) - throws IOException, XMLStreamException - { - boolean saved = expandPE; - mark(1); - require('<'); - reset(); - expandPE = false; - if (tryRead(TEST_ELEMENT_DECL)) - { - expandPE = saved; - readElementDecl(); - } - else if (tryRead(TEST_ATTLIST_DECL)) - { - expandPE = saved; - readAttlistDecl(); - } - else if (tryRead(TEST_ENTITY_DECL)) - { - expandPE = saved; - readEntityDecl(inExternalSubset); - } - else if (tryRead(TEST_NOTATION_DECL)) - { - expandPE = saved; - readNotationDecl(inExternalSubset); - } - else if (tryRead(TEST_PI)) - { - readPI(true); - expandPE = saved; - } - else if (tryRead(TEST_COMMENT)) - { - readComment(true); - expandPE = saved; - } - else if (tryRead("<![")) - { - // conditional section - expandPE = saved; - if (inputStack.size() < 2) - error("conditional sections illegal in internal subset"); - skipWhitespace(); - if (tryRead("INCLUDE")) - { - skipWhitespace(); - require('['); - skipWhitespace(); - while (!tryRead("]]>")) - { - readMarkupdecl(inExternalSubset); - skipWhitespace(); - } - } - else if (tryRead("IGNORE")) - { - skipWhitespace(); - require('['); - expandPE = false; - for (int nesting = 1; nesting > 0; ) - { - int c = readCh(); - switch (c) - { - case 0x3c: // '<' - if (tryRead("![")) - nesting++; - break; - case 0x5d: // ']' - if (tryRead("]>")) - nesting--; - break; - case -1: - throw new EOFException(); - } - } - expandPE = saved; - } - else - error("conditional section must begin with INCLUDE or IGNORE"); - } - else - error("expected markup declaration"); - } - - /** - * Parse the elementdecl production. - */ - private void readElementDecl() - throws IOException, XMLStreamException - { - requireWhitespace(); - boolean saved = expandPE; - expandPE = (inputStack.size() > 1); - String name = readNmtoken(true); - expandPE = saved; - requireWhitespace(); - readContentspec(name); - skipWhitespace(); - require('>'); - } - - /** - * Parse the contentspec production. - */ - private void readContentspec(String elementName) - throws IOException, XMLStreamException - { - if (tryRead("EMPTY")) - doctype.addElementDecl(elementName, "EMPTY", new EmptyContentModel()); - else if (tryRead("ANY")) - doctype.addElementDecl(elementName, "ANY", new AnyContentModel()); - else - { - ContentModel model; - CPStringBuilder acc = new CPStringBuilder(); - require('('); - acc.append('('); - skipWhitespace(); - if (tryRead("#PCDATA")) - { - // mixed content - acc.append("#PCDATA"); - MixedContentModel mm = new MixedContentModel(); - model = mm; - skipWhitespace(); - if (tryRead(')')) - { - acc.append(")"); - if (tryRead('*')) - { - mm.min = 0; - mm.max = -1; - } - } - else - { - while (!tryRead(")")) - { - require('|'); - acc.append('|'); - skipWhitespace(); - String name = readNmtoken(true); - acc.append(name); - mm.addName(name); - skipWhitespace(); - } - require('*'); - acc.append(")*"); - mm.min = 0; - mm.max = -1; - } - } - else - model = readElements(acc); - doctype.addElementDecl(elementName, acc.toString(), model); - } - } - - /** - * Parses an element content model. - */ - private ElementContentModel readElements(CPStringBuilder acc) - throws IOException, XMLStreamException - { - int separator; - ElementContentModel model = new ElementContentModel(); - - // Parse first content particle - skipWhitespace(); - model.addContentParticle(readContentParticle(acc)); - // End or separator - skipWhitespace(); - int c = readCh(); - switch (c) - { - case 0x29: // ')' - acc.append(')'); - mark(1); - c = readCh(); - switch (c) - { - case 0x3f: // '?' - acc.append('?'); - model.min = 0; - model.max = 1; - break; - case 0x2a: // '*' - acc.append('*'); - model.min = 0; - model.max = -1; - break; - case 0x2b: // '+' - acc.append('+'); - model.min = 1; - model.max = -1; - break; - default: - reset(); - } - return model; // done - case 0x7c: // '|' - model.or = true; - // fall through - case 0x2c: // ',' - separator = c; - acc.append(Character.toChars(c)); - break; - default: - error("bad separator in content model", - "U+" + Integer.toHexString(c)); - return model; - } - // Parse subsequent content particles - while (true) - { - skipWhitespace(); - model.addContentParticle(readContentParticle(acc)); - skipWhitespace(); - c = readCh(); - if (c == 0x29) // ')' - { - acc.append(')'); - break; - } - else if (c != separator) - { - error("bad separator in content model", - "U+" + Integer.toHexString(c)); - return model; - } - else - acc.append(c); - } - // Check for occurrence indicator - mark(1); - c = readCh(); - switch (c) - { - case 0x3f: // '?' - acc.append('?'); - model.min = 0; - model.max = 1; - break; - case 0x2a: // '*' - acc.append('*'); - model.min = 0; - model.max = -1; - break; - case 0x2b: // '+' - acc.append('+'); - model.min = 1; - model.max = -1; - break; - default: - reset(); - } - return model; - } - - /** - * Parse a cp production. - */ - private ContentParticle readContentParticle(CPStringBuilder acc) - throws IOException, XMLStreamException - { - ContentParticle cp = new ContentParticle(); - if (tryRead('(')) - { - acc.append('('); - cp.content = readElements(acc); - } - else - { - String name = readNmtoken(true); - acc.append(name); - cp.content = name; - mark(1); - int c = readCh(); - switch (c) - { - case 0x3f: // '?' - acc.append('?'); - cp.min = 0; - cp.max = 1; - break; - case 0x2a: // '*' - acc.append('*'); - cp.min = 0; - cp.max = -1; - break; - case 0x2b: // '+' - acc.append('+'); - cp.min = 1; - cp.max = -1; - break; - default: - reset(); - } - } - return cp; - } - - /** - * Parse an attribute-list definition. - */ - private void readAttlistDecl() - throws IOException, XMLStreamException - { - requireWhitespace(); - boolean saved = expandPE; - expandPE = (inputStack.size() > 1); - String elementName = readNmtoken(true); - expandPE = saved; - boolean white = tryWhitespace(); - while (!tryRead('>')) - { - if (!white) - error("whitespace required before attribute definition"); - readAttDef(elementName); - white = tryWhitespace(); - } - } - - /** - * Parse a single attribute definition. - */ - private void readAttDef(String elementName) - throws IOException, XMLStreamException - { - String name = readNmtoken(true); - requireWhitespace(); - CPStringBuilder acc = new CPStringBuilder(); - HashSet values = new HashSet(); - String type = readAttType(acc, values); - if (validating) - { - if ("ID".equals(type)) - { - // VC: One ID per Element Type - for (Iterator i = doctype.attlistIterator(elementName); - i.hasNext(); ) - { - Map.Entry entry = (Map.Entry) i.next(); - AttributeDecl decl = (AttributeDecl) entry.getValue(); - if ("ID".equals(decl.type)) - error("element types must not have more than one ID " + - "attribute"); - } - } - else if ("NOTATION".equals(type)) - { - // VC: One Notation Per Element Type - for (Iterator i = doctype.attlistIterator(elementName); - i.hasNext(); ) - { - Map.Entry entry = (Map.Entry) i.next(); - AttributeDecl decl = (AttributeDecl) entry.getValue(); - if ("NOTATION".equals(decl.type)) - error("element types must not have more than one NOTATION " + - "attribute"); - } - // VC: No Notation on Empty Element - ContentModel model = doctype.getElementModel(elementName); - if (model != null && model.type == ContentModel.EMPTY) - error("attributes of type NOTATION must not be declared on an " + - "element declared EMPTY"); - } - } - String enumer = null; - if ("ENUMERATION".equals(type) || "NOTATION".equals(type)) - enumer = acc.toString(); - else - values = null; - requireWhitespace(); - readDefault(elementName, name, type, enumer, values); - } - - /** - * Parse an attribute type. - */ - private String readAttType(CPStringBuilder acc, HashSet values) - throws IOException, XMLStreamException - { - if (tryRead('(')) - { - readEnumeration(false, acc, values); - return "ENUMERATION"; - } - else - { - String typeString = readNmtoken(true); - if ("NOTATION".equals(typeString)) - { - readNotationType(acc, values); - return typeString; - } - else if ("CDATA".equals(typeString) || - "ID".equals(typeString) || - "IDREF".equals(typeString) || - "IDREFS".equals(typeString) || - "ENTITY".equals(typeString) || - "ENTITIES".equals(typeString) || - "NMTOKEN".equals(typeString) || - "NMTOKENS".equals(typeString)) - return typeString; - else - { - error("illegal attribute type", typeString); - return null; - } - } - } - - /** - * Parse an enumeration. - */ - private void readEnumeration(boolean isNames, CPStringBuilder acc, - HashSet values) - throws IOException, XMLStreamException - { - acc.append('('); - // first token - skipWhitespace(); - String token = readNmtoken(isNames); - acc.append(token); - values.add(token); - // subsequent tokens - skipWhitespace(); - while (!tryRead(')')) - { - require('|'); - acc.append('|'); - skipWhitespace(); - token = readNmtoken(isNames); - // VC: No Duplicate Tokens - if (validating && values.contains(token)) - error("duplicate token", token); - acc.append(token); - values.add(token); - skipWhitespace(); - } - acc.append(')'); - } - - /** - * Parse a notation type for an attribute. - */ - private void readNotationType(CPStringBuilder acc, HashSet values) - throws IOException, XMLStreamException - { - requireWhitespace(); - require('('); - readEnumeration(true, acc, values); - } - - /** - * Parse the default value for an attribute. - */ - private void readDefault(String elementName, String name, - String type, String enumeration, HashSet values) - throws IOException, XMLStreamException - { - int valueType = ATTRIBUTE_DEFAULT_SPECIFIED; - int flags = LIT_ATTRIBUTE; - String value = null, defaultType = null; - boolean saved = expandPE; - - if (!"CDATA".equals(type)) - flags |= LIT_NORMALIZE; - - expandPE = false; - if (tryRead('#')) - { - if (tryRead("FIXED")) - { - defaultType = "#FIXED"; - valueType = ATTRIBUTE_DEFAULT_FIXED; - requireWhitespace(); - value = readLiteral(flags, false); - } - else if (tryRead("REQUIRED")) - { - defaultType = "#REQUIRED"; - valueType = ATTRIBUTE_DEFAULT_REQUIRED; - } - else if (tryRead("IMPLIED")) - { - defaultType = "#IMPLIED"; - valueType = ATTRIBUTE_DEFAULT_IMPLIED; - } - else - error("illegal keyword for attribute default value"); - } - else - value = readLiteral(flags, false); - expandPE = saved; - if (validating) - { - if ("ID".equals(type)) - { - // VC: Attribute Default Value Syntactically Correct - if (value != null && !isNmtoken(value, true)) - error("default value must match Name production", value); - // VC: ID Attribute Default - if (valueType != ATTRIBUTE_DEFAULT_REQUIRED && - valueType != ATTRIBUTE_DEFAULT_IMPLIED) - error("ID attributes must have a declared default of " + - "#IMPLIED or #REQUIRED"); - } - else if (value != null) - { - // VC: Attribute Default Value Syntactically Correct - if ("IDREF".equals(type) || "ENTITY".equals(type)) - { - if (!isNmtoken(value, true)) - error("default value must match Name production", value); - } - else if ("IDREFS".equals(type) || "ENTITIES".equals(type)) - { - StringTokenizer st = new StringTokenizer(value); - while (st.hasMoreTokens()) - { - String token = st.nextToken(); - if (!isNmtoken(token, true)) - error("default value must match Name production", token); - } - } - else if ("NMTOKEN".equals(type) || "ENUMERATION".equals(type)) - { - if (!isNmtoken(value, false)) - error("default value must match Nmtoken production", value); - } - else if ("NMTOKENS".equals(type)) - { - StringTokenizer st = new StringTokenizer(value); - while (st.hasMoreTokens()) - { - String token = st.nextToken(); - if (!isNmtoken(token, false)) - error("default value must match Nmtoken production", - token); - } - } - } - } - // Register attribute def - AttributeDecl attribute = - new AttributeDecl(type, value, valueType, enumeration, values, - inputStack.size() != 1); - doctype.addAttributeDecl(elementName, name, attribute); - } - - /** - * Parse the EntityDecl production. - */ - private void readEntityDecl(boolean inExternalSubset) - throws IOException, XMLStreamException - { - int flags = 0; - // Check if parameter entity - boolean peFlag = false; - expandPE = false; - requireWhitespace(); - if (tryRead('%')) - { - peFlag = true; - requireWhitespace(); - } - expandPE = true; - // Read entity name - String name = readNmtoken(true); - if (name.indexOf(':') != -1) - error("illegal character ':' in entity name", name); - if (peFlag) - name = "%" + name; - requireWhitespace(); - mark(1); - int c = readCh(); - reset(); - if (c == 0x22 || c == 0x27) // " | ' - { - // Internal entity replacement text - String value = readLiteral(flags | LIT_DISABLE_EREF, true); - int ai = value.indexOf('&'); - while (ai != -1) - { - int sci = value.indexOf(';', ai); - if (sci == -1) - error("malformed reference in entity value", value); - String ref = value.substring(ai + 1, sci); - int[] cp = UnicodeReader.toCodePointArray(ref); - if (cp.length == 0) - error("malformed reference in entity value", value); - if (cp[0] == 0x23) // # - { - if (cp.length == 1) - error("malformed reference in entity value", value); - if (cp[1] == 0x78) // 'x' - { - if (cp.length == 2) - error("malformed reference in entity value", value); - for (int i = 2; i < cp.length; i++) - { - int x = cp[i]; - if (x < 0x30 || - (x > 0x39 && x < 0x41) || - (x > 0x46 && x < 0x61) || - x > 0x66) - error("malformed character reference in entity value", - value); - } - } - else - { - for (int i = 1; i < cp.length; i++) - { - int x = cp[i]; - if (x < 0x30 || x > 0x39) - error("malformed character reference in entity value", - value); - } - } - } - else - { - if (!isNameStartCharacter(cp[0], input.xml11)) - error("malformed reference in entity value", value); - for (int i = 1; i < cp.length; i++) - { - if (!isNameCharacter(cp[i], input.xml11)) - error("malformed reference in entity value", value); - } - } - ai = value.indexOf('&', sci); - } - doctype.addEntityDecl(name, value, inExternalSubset); - } - else - { - ExternalIds ids = readExternalIds(false, false); - // Check for NDATA - boolean white = tryWhitespace(); - if (!peFlag && tryRead("NDATA")) - { - if (!white) - error("whitespace required before NDATA"); - requireWhitespace(); - ids.notationName = readNmtoken(true); - } - doctype.addEntityDecl(name, ids, inExternalSubset); - } - // finish - skipWhitespace(); - require('>'); - } - - /** - * Parse the NotationDecl production. - */ - private void readNotationDecl(boolean inExternalSubset) - throws IOException, XMLStreamException - { - requireWhitespace(); - String notationName = readNmtoken(true); - if (notationName.indexOf(':') != -1) - error("illegal character ':' in notation name", notationName); - if (validating) - { - // VC: Unique Notation Name - ExternalIds notation = doctype.getNotation(notationName); - if (notation != null) - error("duplicate notation name", notationName); - } - requireWhitespace(); - ExternalIds ids = readExternalIds(true, false); - ids.notationName = notationName; - doctype.addNotationDecl(notationName, ids, inExternalSubset); - skipWhitespace(); - require('>'); - } - - /** - * Returns a tuple {publicId, systemId}. - */ - private ExternalIds readExternalIds(boolean inNotation, boolean isSubset) - throws IOException, XMLStreamException - { - int c; - int flags = LIT_DISABLE_CREF | LIT_DISABLE_PE | LIT_DISABLE_EREF; - ExternalIds ids = new ExternalIds(); - - if (tryRead("PUBLIC")) - { - requireWhitespace(); - ids.publicId = readLiteral(LIT_NORMALIZE | LIT_PUBID | flags, false); - if (inNotation) - { - skipWhitespace(); - mark(1); - c = readCh(); - reset(); - if (c == 0x22 || c == 0x27) // " | ' - { - String href = readLiteral(flags, false); - ids.systemId = absolutize(input.systemId, href); - } - } - else - { - requireWhitespace(); - String href = readLiteral(flags, false); - ids.systemId = absolutize(input.systemId, href); - } - // Check valid URI characters - for (int i = 0; i < ids.publicId.length(); i++) - { - char d = ids.publicId.charAt(i); - if (d >= 'a' && d <= 'z') - continue; - if (d >= 'A' && d <= 'Z') - continue; - if (" \r\n0123456789-' ()+,./:=?;!*#@$_%".indexOf(d) != -1) - continue; - error("illegal PUBLIC id character", - "U+" + Integer.toHexString(d)); - } - } - else if (tryRead("SYSTEM")) - { - requireWhitespace(); - String href = readLiteral(flags, false); - ids.systemId = absolutize(input.systemId, href); - } - else if (!isSubset) - { - error("missing SYSTEM or PUBLIC keyword"); - } - if (ids.systemId != null && !inNotation) - { - if (ids.systemId.indexOf('#') != -1) - error("SYSTEM id has a URI fragment", ids.systemId); - } - return ids; - } - - /** - * Parse the start of an element. - * @return the state of the parser afterwards (EMPTY_ELEMENT or CONTENT) - */ - private int readStartElement() - throws IOException, XMLStreamException - { - // Read element name - String elementName = readNmtoken(true); - attrs.clear(); - // Push namespace context - if (namespaceAware) - { - if (elementName.charAt(0) == ':' || - elementName.charAt(elementName.length() - 1) == ':') - error("not a QName", elementName); - namespaces.addFirst(new LinkedHashMap()); - } - // Read element content - boolean white = tryWhitespace(); - mark(1); - int c = readCh(); - while (c != 0x2f && c != 0x3e) // '/' | '>' - { - // Read attribute - reset(); - if (!white) - error("need whitespace between attributes"); - readAttribute(elementName); - white = tryWhitespace(); - mark(1); - c = readCh(); - } - // supply defaulted attributes - if (doctype != null) - { - for (Iterator i = doctype.attlistIterator(elementName); i.hasNext(); ) - { - Map.Entry entry = (Map.Entry) i.next(); - String attName = (String) entry.getKey(); - AttributeDecl decl = (AttributeDecl) entry.getValue(); - if (validating) - { - switch (decl.valueType) - { - case ATTRIBUTE_DEFAULT_REQUIRED: - // VC: Required Attribute - if (decl.value == null && !attributeSpecified(attName)) - error("value for " + attName + " attribute is required"); - break; - case ATTRIBUTE_DEFAULT_FIXED: - // VC: Fixed Attribute Default - for (Iterator j = attrs.iterator(); j.hasNext(); ) - { - Attribute a = (Attribute) j.next(); - if (attName.equals(a.name) && - !decl.value.equals(a.value)) - error("value for " + attName + " attribute must be " + - decl.value); - } - break; - } - } - if (namespaceAware && attName.equals("xmlns")) - { - LinkedHashMap ctx = - (LinkedHashMap) namespaces.getFirst(); - if (ctx.containsKey(XMLConstants.DEFAULT_NS_PREFIX)) - continue; // namespace was specified - } - else if (namespaceAware && attName.startsWith("xmlns:")) - { - LinkedHashMap ctx = - (LinkedHashMap) namespaces.getFirst(); - if (ctx.containsKey(attName.substring(6))) - continue; // namespace was specified - } - else if (attributeSpecified(attName)) - continue; - if (decl.value == null) - continue; - // VC: Standalone Document Declaration - if (validating && decl.external && xmlStandalone == Boolean.TRUE) - error("standalone must be 'no' if attributes inherit values " + - "from externally declared markup declarations"); - Attribute attr = - new Attribute(attName, decl.type, false, decl.value); - if (namespaceAware) - { - if (!addNamespace(attr)) - attrs.add(attr); - } - else - attrs.add(attr); - } - } - if (baseAware) - { - String uri = getAttributeValue(XMLConstants.XML_NS_URI, "base"); - String base = getXMLBase(); - bases.addFirst(absolutize(base, uri)); - } - if (namespaceAware) - { - // check prefix bindings - int ci = elementName.indexOf(':'); - if (ci != -1) - { - String prefix = elementName.substring(0, ci); - String uri = getNamespaceURI(prefix); - if (uri == null) - error("unbound element prefix", prefix); - else if (input.xml11 && "".equals(uri)) - error("XML 1.1 unbound element prefix", prefix); - } - for (Iterator i = attrs.iterator(); i.hasNext(); ) - { - Attribute attr = (Attribute) i.next(); - if (attr.prefix != null && - !XMLConstants.XMLNS_ATTRIBUTE.equals(attr.prefix)) - { - String uri = getNamespaceURI(attr.prefix); - if (uri == null) - error("unbound attribute prefix", attr.prefix); - else if (input.xml11 && "".equals(uri)) - error("XML 1.1 unbound attribute prefix", attr.prefix); - } - } - } - if (validating && doctype != null) - { - validateStartElement(elementName); - currentContentModel = doctype.getElementModel(elementName); - if (currentContentModel == null) - error("no element declaration", elementName); - validationStack.add(new LinkedList()); - } - // make element name available for read - buf.setLength(0); - buf.append(elementName); - // push element onto stack - stack.addLast(elementName); - switch (c) - { - case 0x3e: // '>' - return CONTENT; - case 0x2f: // '/' - require('>'); - return EMPTY_ELEMENT; - } - return -1; // to satisfy compiler - } - - /** - * Indicates whether the specified attribute name was specified for the - * current element. - */ - private boolean attributeSpecified(String attName) - { - for (Iterator j = attrs.iterator(); j.hasNext(); ) - { - Attribute a = (Attribute) j.next(); - if (attName.equals(a.name)) - return true; - } - return false; - } - - /** - * Parse an attribute. - */ - private void readAttribute(String elementName) - throws IOException, XMLStreamException - { - // Read attribute name - String attributeName = readNmtoken(true); - String type = getAttributeType(elementName, attributeName); - readEq(); - // Read literal - final int flags = LIT_ATTRIBUTE | LIT_ENTITY_REF; - String value = (type == null || "CDATA".equals(type)) ? - readLiteral(flags, false) : readLiteral(flags | LIT_NORMALIZE, false); - // add attribute event - Attribute attr = this.new Attribute(attributeName, type, true, value); - if (namespaceAware) - { - if (attributeName.charAt(0) == ':' || - attributeName.charAt(attributeName.length() - 1) == ':') - error("not a QName", attributeName); - else if (attributeName.equals("xmlns")) - { - LinkedHashMap ctx = (LinkedHashMap) namespaces.getFirst(); - if (ctx.containsKey(XMLConstants.DEFAULT_NS_PREFIX)) - error("duplicate default namespace"); - } - else if (attributeName.startsWith("xmlns:")) - { - LinkedHashMap ctx = (LinkedHashMap) namespaces.getFirst(); - if (ctx.containsKey(attributeName.substring(6))) - error("duplicate namespace", attributeName.substring(6)); - } - else if (attrs.contains(attr)) - error("duplicate attribute", attributeName); - } - else if (attrs.contains(attr)) - error("duplicate attribute", attributeName); - if (validating && doctype != null) - { - // VC: Attribute Value Type - AttributeDecl decl = - doctype.getAttributeDecl(elementName, attributeName); - if (decl == null) - error("attribute must be declared", attributeName); - if ("ENUMERATION".equals(decl.type)) - { - // VC: Enumeration - if (!decl.values.contains(value)) - error("value does not match enumeration " + decl.enumeration, - value); - } - else if ("ID".equals(decl.type)) - { - // VC: ID - if (!isNmtoken(value, true)) - error("ID values must match the Name production"); - if (ids.contains(value)) - error("Duplicate ID", value); - ids.add(value); - } - else if ("IDREF".equals(decl.type) || "IDREFS".equals(decl.type)) - { - StringTokenizer st = new StringTokenizer(value); - while (st.hasMoreTokens()) - { - String token = st.nextToken(); - // VC: IDREF - if (!isNmtoken(token, true)) - error("IDREF values must match the Name production"); - idrefs.add(token); - } - } - else if ("NMTOKEN".equals(decl.type) || "NMTOKENS".equals(decl.type)) - { - StringTokenizer st = new StringTokenizer(value); - while (st.hasMoreTokens()) - { - String token = st.nextToken(); - // VC: Name Token - if (!isNmtoken(token, false)) - error("NMTOKEN values must match the Nmtoken production"); - } - } - else if ("ENTITY".equals(decl.type)) - { - // VC: Entity Name - if (!isNmtoken(value, true)) - error("ENTITY values must match the Name production"); - Object entity = doctype.getEntity(value); - if (entity == null || !(entity instanceof ExternalIds) || - ((ExternalIds) entity).notationName == null) - error("ENTITY values must match the name of an unparsed " + - "entity declared in the DTD"); - } - else if ("NOTATION".equals(decl.type)) - { - if (!decl.values.contains(value)) - error("NOTATION values must match a declared notation name", - value); - // VC: Notation Attributes - ExternalIds notation = doctype.getNotation(value); - if (notation == null) - error("NOTATION values must match the name of a notation " + - "declared in the DTD", value); - } - } - if (namespaceAware) - { - if (!addNamespace(attr)) - attrs.add(attr); - } - else - attrs.add(attr); - } - - /** - * Determines whether the specified attribute is a namespace declaration, - * and adds it to the current namespace context if so. Returns false if - * the attribute is an ordinary attribute. - */ - private boolean addNamespace(Attribute attr) - throws XMLStreamException - { - if ("xmlns".equals(attr.name)) - { - LinkedHashMap ctx = (LinkedHashMap) namespaces.getFirst(); - if (ctx.get(XMLConstants.DEFAULT_NS_PREFIX) != null) - error("Duplicate default namespace declaration"); - if (XMLConstants.XML_NS_URI.equals(attr.value)) - error("can't bind XML namespace"); - ctx.put(XMLConstants.DEFAULT_NS_PREFIX, attr.value); - return true; - } - else if ("xmlns".equals(attr.prefix)) - { - LinkedHashMap ctx = (LinkedHashMap) namespaces.getFirst(); - if (ctx.get(attr.localName) != null) - error("Duplicate namespace declaration for prefix", - attr.localName); - if (XMLConstants.XML_NS_PREFIX.equals(attr.localName)) - { - if (!XMLConstants.XML_NS_URI.equals(attr.value)) - error("can't redeclare xml prefix"); - else - return false; // treat as attribute - } - if (XMLConstants.XML_NS_URI.equals(attr.value)) - error("can't bind non-xml prefix to XML namespace"); - if (XMLConstants.XMLNS_ATTRIBUTE.equals(attr.localName)) - error("can't redeclare xmlns prefix"); - if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attr.value)) - error("can't bind non-xmlns prefix to XML Namespace namespace"); - if ("".equals(attr.value) && !input.xml11) - error("illegal use of 1.1-style prefix unbinding in 1.0 document"); - ctx.put(attr.localName, attr.value); - return true; - } - return false; - } - - /** - * Parse a closing tag. - */ - private void readEndElement() - throws IOException, XMLStreamException - { - // pop element off stack - String expected = (String) stack.removeLast(); - require(expected); - skipWhitespace(); - require('>'); - // Make element name available - buf.setLength(0); - buf.append(expected); - if (validating && doctype != null) - endElementValidationHook(); - } - - /** - * Validate the end of an element. - * Called on an end-element or empty element if validating. - */ - private void endElementValidationHook() - throws XMLStreamException - { - validateEndElement(); - validationStack.removeLast(); - if (stack.isEmpty()) - currentContentModel = null; - else - { - String parent = (String) stack.getLast(); - currentContentModel = doctype.getElementModel(parent); - } - } - - /** - * Parse a comment. - */ - private void readComment(boolean inDTD) - throws IOException, XMLStreamException - { - boolean saved = expandPE; - expandPE = false; - buf.setLength(0); - readUntil(TEST_END_COMMENT); - require('>'); - expandPE = saved; - if (inDTD) - doctype.addComment(buf.toString()); - } - - /** - * Parse a processing instruction. - */ - private void readPI(boolean inDTD) - throws IOException, XMLStreamException - { - boolean saved = expandPE; - expandPE = false; - piTarget = readNmtoken(true); - if (piTarget.indexOf(':') != -1) - error("illegal character in PI target", new Character(':')); - if ("xml".equalsIgnoreCase(piTarget)) - error("illegal PI target", piTarget); - if (tryRead(TEST_END_PI)) - piData = null; - else - { - if (!tryWhitespace()) - error("whitespace required between PI target and data"); - buf.setLength(0); - readUntil(TEST_END_PI); - piData = buf.toString(); - } - expandPE = saved; - if (inDTD) - doctype.addPI(piTarget, piData); - } - - /** - * Parse an entity reference. - */ - private void readReference() - throws IOException, XMLStreamException - { - buf.setLength(0); - String entityName = readNmtoken(true); - require(';'); - buf.setLength(0); - buf.append(entityName); - } - - /** - * Read an CDATA section. - */ - private void readCDSect() - throws IOException, XMLStreamException - { - buf.setLength(0); - readUntil(TEST_END_CDATA); - } - - /** - * Read character data. - * @return the type of text read (CHARACTERS or SPACE) - */ - private int readCharData(String prefix) - throws IOException, XMLStreamException - { - boolean white = true; - buf.setLength(0); - if (prefix != null) - buf.append(prefix); - boolean done = false; - boolean entities = false; - while (!done) - { - // Block read - mark(tmpBuf.length); - int len = read(tmpBuf, 0, tmpBuf.length); - if (len == -1) - { - if (inputStack.size() > 1) - { - popInput(); - // report end-entity - done = true; - } - else - throw new EOFException(); - } - for (int i = 0; i < len && !done; i++) - { - int c = tmpBuf[i]; - switch (c) - { - case 0x20: - case 0x09: - case 0x0a: - case 0x0d: - buf.append(Character.toChars(c)); - break; // whitespace - case 0x26: // '&' - reset(); - read(tmpBuf, 0, i); - // character reference? - mark(3); - c = readCh(); // & - c = readCh(); - if (c == 0x23) // '#' - { - mark(1); - c = readCh(); - boolean hex = (c == 0x78); // 'x' - if (!hex) - reset(); - char[] ch = readCharacterRef(hex ? 16 : 10); - buf.append(ch, 0, ch.length); - for (int j = 0; j < ch.length; j++) - { - switch (ch[j]) - { - case 0x20: - case 0x09: - case 0x0a: - case 0x0d: - break; // whitespace - default: - white = false; - } - } - } - else - { - // entity reference - reset(); - c = readCh(); // & - String entityName = readNmtoken(true); - require(';'); - String text = - (String) PREDEFINED_ENTITIES.get(entityName); - if (text != null) - buf.append(text); - else - { - pushInput("", "&" + entityName + ";", false, false); - done = true; - break; - } - } - // continue processing - i = -1; - mark(tmpBuf.length); - len = read(tmpBuf, 0, tmpBuf.length); - if (len == -1) - { - if (inputStack.size() > 1) - { - popInput(); - done = true; - } - else - throw new EOFException(); - } - entities = true; - break; // end of text sequence - case 0x3e: // '>' - int l = buf.length(); - if (l > 1 && - buf.charAt(l - 1) == ']' && - buf.charAt(l - 2) == ']') - error("Character data may not contain unescaped ']]>'"); - buf.append(Character.toChars(c)); - break; - case 0x3c: // '<' - reset(); - // read i characters - int count = 0, remaining = i; - do - { - int r = read(tmpBuf, 0, remaining); - count += r; - remaining -= r; - } - while (count < i); - i = len; - if (coalescing && tryRead(TEST_CDATA)) - readUntil(TEST_END_CDATA); // read CDATA section into buf - else - done = true; // end of text sequence - break; - default: - if (input.xml11) - { - if (!isXML11Char(c) || isXML11RestrictedChar(c)) - error("illegal XML 1.1 character", - "U+" + Integer.toHexString(c)); - } - else if (!isChar(c)) - error("illegal XML character", - "U+" + Integer.toHexString(c)); - white = false; - buf.append(Character.toChars(c)); - } - } - // if text buffer >= 2MB, return it as a chunk - // to avoid excessive memory use - if (buf.length() >= 2097152) - done = true; - } - if (entities) - normalizeCRLF(buf); - return white ? XMLStreamConstants.SPACE : XMLStreamConstants.CHARACTERS; - } - - /** - * Expands the specified entity. - */ - private void expandEntity(String name, boolean inAttr, boolean normalize) - throws IOException, XMLStreamException - { - if (doctype != null) - { - Object value = doctype.getEntity(name); - if (value != null) - { - if (xmlStandalone == Boolean.TRUE) - { - // VC: Standalone Document Declaration - if (doctype.isEntityExternal(name)) - error("reference to external entity in standalone document"); - else if (value instanceof ExternalIds) - { - ExternalIds ids = (ExternalIds) value; - if (ids.notationName != null && - doctype.isNotationExternal(ids.notationName)) - error("reference to external notation in " + - "standalone document"); - } - } - if (value instanceof String) - { - String text = (String) value; - if (inAttr && text.indexOf('<') != -1) - error("< in attribute value"); - pushInput(name, text, !inAttr, normalize); - } - else if (inAttr) - error("reference to external entity in attribute value", name); - else - pushInput(name, (ExternalIds) value, !inAttr, normalize); - return; - } - } - error("reference to undeclared entity", name); - } - - /** - * Indicates whether the specified entity is unparsed. - */ - private boolean isUnparsedEntity(String name) - { - if (doctype != null) - { - Object value = doctype.getEntity(name); - if (value != null && value instanceof ExternalIds) - return ((ExternalIds) value).notationName != null; - } - return false; - } - - /** - * Read an equals sign. - */ - private void readEq() - throws IOException, XMLStreamException - { - skipWhitespace(); - require('='); - skipWhitespace(); - } - - /** - * Character read for reading literals. - * @param recognizePEs whether to recognize parameter-entity references - */ - private int literalReadCh(boolean recognizePEs) - throws IOException, XMLStreamException - { - int c = recognizePEs ? readCh() : read(); - while (c == -1) - { - if (inputStack.size() > 1) - { - inputStack.removeLast(); - input = (Input) inputStack.getLast(); - // Don't issue end-entity - c = recognizePEs ? readCh() : read(); - } - else - throw new EOFException(); - } - return c; - } - - /** - * Read a string literal. - */ - private String readLiteral(int flags, boolean recognizePEs) - throws IOException, XMLStreamException - { - boolean saved = expandPE; - int delim = readCh(); - if (delim != 0x27 && delim != 0x22) - error("expected '\"' or \"'\"", "U+" + Integer.toHexString(delim)); - literalBuf.setLength(0); - if ((flags & LIT_DISABLE_PE) != 0) - expandPE = false; - boolean entities = false; - int inputStackSize = inputStack.size(); - do - { - int c = literalReadCh(recognizePEs); - if (c == delim && inputStackSize == inputStack.size()) - break; - switch (c) - { - case 0x0a: - case 0x0d: - if ((flags & (LIT_ATTRIBUTE | LIT_PUBID)) != 0) - c = 0x20; // normalize to space - break; - case 0x09: - if ((flags & LIT_ATTRIBUTE) != 0) - c = 0x20; // normalize to space - break; - case 0x26: // '&' - mark(2); - c = readCh(); - if (c == 0x23) // '#' - { - if ((flags & LIT_DISABLE_CREF) != 0) - { - reset(); - c = 0x26; // '&' - } - else - { - mark(1); - c = readCh(); - boolean hex = (c == 0x78); // 'x' - if (!hex) - reset(); - char[] ref = readCharacterRef(hex ? 16 : 10); - for (int i = 0; i < ref.length; i++) - literalBuf.append(ref[i]); - entities = true; - continue; - } - } - else - { - if ((flags & LIT_DISABLE_EREF) != 0) - { - reset(); - c = 0x26; // '&' - } - else - { - reset(); - String entityName = readNmtoken(true); - require(';'); - String text = - (String) PREDEFINED_ENTITIES.get(entityName); - if (text != null) - literalBuf.append(text); - else - expandEntity(entityName, - (flags & LIT_ATTRIBUTE) != 0, - true); - entities = true; - continue; - } - } - break; - case 0x3c: // '<' - if ((flags & LIT_ATTRIBUTE) != 0) - error("attribute values may not contain '<'"); - break; - case -1: - if (inputStack.size() > 1) - { - popInput(); - continue; - } - throw new EOFException(); - default: - if ((c < 0x0020 || c > 0xfffd) || - (c >= 0xd800 && c < 0xdc00) || - (input.xml11 && (c >= 0x007f) && - (c <= 0x009f) && (c != 0x0085))) - error("illegal character", "U+" + Integer.toHexString(c)); - } - literalBuf.append(Character.toChars(c)); - } - while (true); - expandPE = saved; - if (entities) - normalizeCRLF(literalBuf); - if ((flags & LIT_NORMALIZE) > 0) - literalBuf = normalize(literalBuf); - return literalBuf.toString(); - } - - /** - * Performs attribute-value normalization of the text buffer. - * This discards leading and trailing whitespace, and replaces sequences - * of whitespace with a single space. - */ - private StringBuffer normalize(StringBuffer buf) - { - StringBuffer acc = new StringBuffer(); - int len = buf.length(); - int avState = 0; - for (int i = 0; i < len; i++) - { - char c = buf.charAt(i); - if (c == ' ') - avState = (avState == 0) ? 0 : 1; - else - { - if (avState == 1) - acc.append(' '); - acc.append(c); - avState = 2; - } - } - return acc; - } - - /** - * Replace any CR/LF pairs in the buffer with LF. - * This may be necessary if combinations of CR or LF were declared as - * (character) entity references in the input. - */ - private void normalizeCRLF(StringBuffer buf) - { - int len = buf.length() - 1; - for (int i = 0; i < len; i++) - { - char c = buf.charAt(i); - if (c == '\r' && buf.charAt(i + 1) == '\n') - { - buf.deleteCharAt(i--); - len--; - } - } - } - - /** - * Parse and expand a parameter entity reference. - */ - private void expandPEReference() - throws IOException, XMLStreamException - { - String name = readNmtoken(true, new StringBuffer()); - require(';'); - mark(1); // ensure we don't reset to before the semicolon - if (doctype != null) - { - String entityName = "%" + name; - Object entity = doctype.getEntity(entityName); - if (entity != null) - { - if (xmlStandalone == Boolean.TRUE) - { - if (doctype.isEntityExternal(entityName)) - error("reference to external parameter entity in " + - "standalone document"); - } - if (entity instanceof String) - { - pushInput(name, (String) entity, false, input.normalize); - //pushInput(name, " " + (String) entity + " "); - } - else - { - //pushInput("", " "); - pushInput(name, (ExternalIds) entity, false, input.normalize); - //pushInput("", " "); - } - } - else - error("reference to undeclared parameter entity", name); - } - else - error("reference to parameter entity without doctype", name); - } - - /** - * Parse the digits in a character reference. - * @param base the base of the digits (10 or 16) - */ - private char[] readCharacterRef(int base) - throws IOException, XMLStreamException - { - CPStringBuilder b = new CPStringBuilder(); - for (int c = readCh(); c != 0x3b && c != -1; c = readCh()) - b.append(Character.toChars(c)); - try - { - int ord = Integer.parseInt(b.toString(), base); - if (input.xml11) - { - if (!isXML11Char(ord)) - error("illegal XML 1.1 character reference " + - "U+" + Integer.toHexString(ord)); - } - else - { - if ((ord < 0x20 && !(ord == 0x0a || ord == 0x09 || ord == 0x0d)) - || (ord >= 0xd800 && ord <= 0xdfff) - || ord == 0xfffe || ord == 0xffff - || ord > 0x0010ffff) - error("illegal XML character reference " + - "U+" + Integer.toHexString(ord)); - } - return Character.toChars(ord); - } - catch (NumberFormatException e) - { - error("illegal characters in character reference", b.toString()); - return null; - } - } - - /** - * Parses an NMTOKEN or Name production. - * @param isName if a Name, otherwise an NMTOKEN - */ - private String readNmtoken(boolean isName) - throws IOException, XMLStreamException - { - return readNmtoken(isName, nmtokenBuf); - } - - /** - * Parses an NMTOKEN or Name production using the specified buffer. - * @param isName if a Name, otherwise an NMTOKEN - * @param buf the character buffer to use - */ - private String readNmtoken(boolean isName, StringBuffer buf) - throws IOException, XMLStreamException - { - buf.setLength(0); - int c = readCh(); - if (isName) - { - if (!isNameStartCharacter(c, input.xml11)) - error("not a name start character", - "U+" + Integer.toHexString(c)); - } - else - { - if (!isNameCharacter(c, input.xml11)) - error("not a name character", - "U+" + Integer.toHexString(c)); - } - buf.append(Character.toChars(c)); - do - { - mark(1); - c = readCh(); - switch (c) - { - case 0x25: // '%' - case 0x3c: // '<' - case 0x3e: // '>' - case 0x26: // '&' - case 0x2c: // ',' - case 0x7c: // '|' - case 0x2a: // '*' - case 0x2b: // '+' - case 0x3f: // '?' - case 0x29: // ')' - case 0x3d: // '=' - case 0x27: // '\'' - case 0x22: // '"' - case 0x5b: // '[' - case 0x20: // ' ' - case 0x09: // '\t' - case 0x0a: // '\n' - case 0x0d: // '\r' - case 0x3b: // ';' - case 0x2f: // '/' - case -1: - reset(); - return intern(buf.toString()); - default: - if (!isNameCharacter(c, input.xml11)) - error("not a name character", - "U+" + Integer.toHexString(c)); - else - buf.append(Character.toChars(c)); - } - } - while (true); - } - - /** - * Indicates whether the specified Unicode character is an XML 1.1 Char. - */ - public static boolean isXML11Char(int c) - { - return ((c >= 0x0001 && c <= 0xD7FF) || - (c >= 0xE000 && c < 0xFFFE) || - (c >= 0x10000 && c <= 0x10FFFF)); - } - - /** - * Indicates whether the specified Unicode character is an XML 1.1 - * RestrictedChar. - */ - public static boolean isXML11RestrictedChar(int c) - { - return ((c >= 0x0001 && c <= 0x0008) || - (c >= 0x000B && c <= 0x000C) || - (c >= 0x000E && c <= 0x001F) || - (c >= 0x007F && c <= 0x0084) || - (c >= 0x0086 && c <= 0x009F)); - } - - /** - * Indicates whether the specified text matches the Name or Nmtoken - * production. - */ - private boolean isNmtoken(String text, boolean isName) - { - try - { - int[] cp = UnicodeReader.toCodePointArray(text); - if (cp.length == 0) - return false; - if (isName) - { - if (!isNameStartCharacter(cp[0], input.xml11)) - return false; - } - else - { - if (!isNameCharacter(cp[0], input.xml11)) - return false; - } - for (int i = 1; i < cp.length; i++) - { - if (!isNameCharacter(cp[i], input.xml11)) - return false; - } - return true; - } - catch (IOException e) - { - return false; - } - } - - /** - * Indicates whether the specified Unicode character is a Name start - * character. - */ - public static boolean isNameStartCharacter(int c, boolean xml11) - { - if (xml11) - return ((c >= 0x0041 && c <= 0x005a) || - (c >= 0x0061 && c <= 0x007a) || - c == 0x3a | - c == 0x5f | - (c >= 0xC0 && c <= 0xD6) || - (c >= 0xD8 && c <= 0xF6) || - (c >= 0xF8 && c <= 0x2FF) || - (c >= 0x370 && c <= 0x37D) || - (c >= 0x37F && c <= 0x1FFF) || - (c >= 0x200C && c <= 0x200D) || - (c >= 0x2070 && c <= 0x218F) || - (c >= 0x2C00 && c <= 0x2FEF) || - (c >= 0x3001 && c <= 0xD7FF) || - (c >= 0xF900 && c <= 0xFDCF) || - (c >= 0xFDF0 && c <= 0xFFFD) || - (c >= 0x10000 && c <= 0xEFFFF)); - else - return (c == 0x5f || c == 0x3a || isLetter(c)); - } - - /** - * Indicates whether the specified Unicode character is a Name non-initial - * character. - */ - public static boolean isNameCharacter(int c, boolean xml11) - { - if (xml11) - return ((c >= 0x0041 && c <= 0x005a) || - (c >= 0x0061 && c <= 0x007a) || - (c >= 0x0030 && c <= 0x0039) || - c == 0x3a | - c == 0x5f | - c == 0x2d | - c == 0x2e | - c == 0xB7 | - (c >= 0xC0 && c <= 0xD6) || - (c >= 0xD8 && c <= 0xF6) || - (c >= 0xF8 && c <= 0x2FF) || - (c >= 0x300 && c <= 0x37D) || - (c >= 0x37F && c <= 0x1FFF) || - (c >= 0x200C && c <= 0x200D) || - (c >= 0x203F && c <= 0x2040) || - (c >= 0x2070 && c <= 0x218F) || - (c >= 0x2C00 && c <= 0x2FEF) || - (c >= 0x3001 && c <= 0xD7FF) || - (c >= 0xF900 && c <= 0xFDCF) || - (c >= 0xFDF0 && c <= 0xFFFD) || - (c >= 0x10000 && c <= 0xEFFFF)); - else - return (c == 0x2e || c == 0x2d || c == 0x5f || c == 0x3a || - isLetter(c) || isDigit(c) || - isCombiningChar(c) || isExtender(c)); - } - - /** - * Indicates whether the specified Unicode character matches the Letter - * production. - */ - public static boolean isLetter(int c) - { - if ((c >= 0x0041 && c <= 0x005A) || - (c >= 0x0061 && c <= 0x007A) || - (c >= 0x00C0 && c <= 0x00D6) || - (c >= 0x00D8 && c <= 0x00F6) || - (c >= 0x00F8 && c <= 0x00FF) || - (c >= 0x0100 && c <= 0x0131) || - (c >= 0x0134 && c <= 0x013E) || - (c >= 0x0141 && c <= 0x0148) || - (c >= 0x014A && c <= 0x017E) || - (c >= 0x0180 && c <= 0x01C3) || - (c >= 0x01CD && c <= 0x01F0) || - (c >= 0x01F4 && c <= 0x01F5) || - (c >= 0x01FA && c <= 0x0217) || - (c >= 0x0250 && c <= 0x02A8) || - (c >= 0x02BB && c <= 0x02C1) || - c == 0x0386 || - (c >= 0x0388 && c <= 0x038A) || - c == 0x038C || - (c >= 0x038E && c <= 0x03A1) || - (c >= 0x03A3 && c <= 0x03CE) || - (c >= 0x03D0 && c <= 0x03D6) || - c == 0x03DA || - c == 0x03DC || - c == 0x03DE || - c == 0x03E0 || - (c >= 0x03E2 && c <= 0x03F3) || - (c >= 0x0401 && c <= 0x040C) || - (c >= 0x040E && c <= 0x044F) || - (c >= 0x0451 && c <= 0x045C) || - (c >= 0x045E && c <= 0x0481) || - (c >= 0x0490 && c <= 0x04C4) || - (c >= 0x04C7 && c <= 0x04C8) || - (c >= 0x04CB && c <= 0x04CC) || - (c >= 0x04D0 && c <= 0x04EB) || - (c >= 0x04EE && c <= 0x04F5) || - (c >= 0x04F8 && c <= 0x04F9) || - (c >= 0x0531 && c <= 0x0556) || - c == 0x0559 || - (c >= 0x0561 && c <= 0x0586) || - (c >= 0x05D0 && c <= 0x05EA) || - (c >= 0x05F0 && c <= 0x05F2) || - (c >= 0x0621 && c <= 0x063A) || - (c >= 0x0641 && c <= 0x064A) || - (c >= 0x0671 && c <= 0x06B7) || - (c >= 0x06BA && c <= 0x06BE) || - (c >= 0x06C0 && c <= 0x06CE) || - (c >= 0x06D0 && c <= 0x06D3) || - c == 0x06D5 || - (c >= 0x06E5 && c <= 0x06E6) || - (c >= 0x0905 && c <= 0x0939) || - c == 0x093D || - (c >= 0x0958 && c <= 0x0961) || - (c >= 0x0985 && c <= 0x098C) || - (c >= 0x098F && c <= 0x0990) || - (c >= 0x0993 && c <= 0x09A8) || - (c >= 0x09AA && c <= 0x09B0) || - c == 0x09B2 || - (c >= 0x09B6 && c <= 0x09B9) || - (c >= 0x09DC && c <= 0x09DD) || - (c >= 0x09DF && c <= 0x09E1) || - (c >= 0x09F0 && c <= 0x09F1) || - (c >= 0x0A05 && c <= 0x0A0A) || - (c >= 0x0A0F && c <= 0x0A10) || - (c >= 0x0A13 && c <= 0x0A28) || - (c >= 0x0A2A && c <= 0x0A30) || - (c >= 0x0A32 && c <= 0x0A33) || - (c >= 0x0A35 && c <= 0x0A36) || - (c >= 0x0A38 && c <= 0x0A39) || - (c >= 0x0A59 && c <= 0x0A5C) || - c == 0x0A5E || - (c >= 0x0A72 && c <= 0x0A74) || - (c >= 0x0A85 && c <= 0x0A8B) || - c == 0x0A8D || - (c >= 0x0A8F && c <= 0x0A91) || - (c >= 0x0A93 && c <= 0x0AA8) || - (c >= 0x0AAA && c <= 0x0AB0) || - (c >= 0x0AB2 && c <= 0x0AB3) || - (c >= 0x0AB5 && c <= 0x0AB9) || - c == 0x0ABD || - c == 0x0AE0 || - (c >= 0x0B05 && c <= 0x0B0C) || - (c >= 0x0B0F && c <= 0x0B10) || - (c >= 0x0B13 && c <= 0x0B28) || - (c >= 0x0B2A && c <= 0x0B30) || - (c >= 0x0B32 && c <= 0x0B33) || - (c >= 0x0B36 && c <= 0x0B39) || - c == 0x0B3D || - (c >= 0x0B5C && c <= 0x0B5D) || - (c >= 0x0B5F && c <= 0x0B61) || - (c >= 0x0B85 && c <= 0x0B8A) || - (c >= 0x0B8E && c <= 0x0B90) || - (c >= 0x0B92 && c <= 0x0B95) || - (c >= 0x0B99 && c <= 0x0B9A) || - c == 0x0B9C || - (c >= 0x0B9E && c <= 0x0B9F) || - (c >= 0x0BA3 && c <= 0x0BA4) || - (c >= 0x0BA8 && c <= 0x0BAA) || - (c >= 0x0BAE && c <= 0x0BB5) || - (c >= 0x0BB7 && c <= 0x0BB9) || - (c >= 0x0C05 && c <= 0x0C0C) || - (c >= 0x0C0E && c <= 0x0C10) || - (c >= 0x0C12 && c <= 0x0C28) || - (c >= 0x0C2A && c <= 0x0C33) || - (c >= 0x0C35 && c <= 0x0C39) || - (c >= 0x0C60 && c <= 0x0C61) || - (c >= 0x0C85 && c <= 0x0C8C) || - (c >= 0x0C8E && c <= 0x0C90) || - (c >= 0x0C92 && c <= 0x0CA8) || - (c >= 0x0CAA && c <= 0x0CB3) || - (c >= 0x0CB5 && c <= 0x0CB9) || - c == 0x0CDE || - (c >= 0x0CE0 && c <= 0x0CE1) || - (c >= 0x0D05 && c <= 0x0D0C) || - (c >= 0x0D0E && c <= 0x0D10) || - (c >= 0x0D12 && c <= 0x0D28) || - (c >= 0x0D2A && c <= 0x0D39) || - (c >= 0x0D60 && c <= 0x0D61) || - (c >= 0x0E01 && c <= 0x0E2E) || - c == 0x0E30 || - (c >= 0x0E32 && c <= 0x0E33) || - (c >= 0x0E40 && c <= 0x0E45) || - (c >= 0x0E81 && c <= 0x0E82) || - c == 0x0E84 || - (c >= 0x0E87 && c <= 0x0E88) || - c == 0x0E8A || - c == 0x0E8D || - (c >= 0x0E94 && c <= 0x0E97) || - (c >= 0x0E99 && c <= 0x0E9F) || - (c >= 0x0EA1 && c <= 0x0EA3) || - c == 0x0EA5 || - c == 0x0EA7 || - (c >= 0x0EAA && c <= 0x0EAB) || - (c >= 0x0EAD && c <= 0x0EAE) || - c == 0x0EB0 || - (c >= 0x0EB2 && c <= 0x0EB3) || - c == 0x0EBD || - (c >= 0x0EC0 && c <= 0x0EC4) || - (c >= 0x0F40 && c <= 0x0F47) || - (c >= 0x0F49 && c <= 0x0F69) || - (c >= 0x10A0 && c <= 0x10C5) || - (c >= 0x10D0 && c <= 0x10F6) || - c == 0x1100 || - (c >= 0x1102 && c <= 0x1103) || - (c >= 0x1105 && c <= 0x1107) || - c == 0x1109 || - (c >= 0x110B && c <= 0x110C) || - (c >= 0x110E && c <= 0x1112) || - c == 0x113C || - c == 0x113E || - c == 0x1140 || - c == 0x114C || - c == 0x114E || - c == 0x1150 || - (c >= 0x1154 && c <= 0x1155) || - c == 0x1159 || - (c >= 0x115F && c <= 0x1161) || - c == 0x1163 || - c == 0x1165 || - c == 0x1167 || - c == 0x1169 || - (c >= 0x116D && c <= 0x116E) || - (c >= 0x1172 && c <= 0x1173) || - c == 0x1175 || - c == 0x119E || - c == 0x11A8 || - c == 0x11AB || - (c >= 0x11AE && c <= 0x11AF) || - (c >= 0x11B7 && c <= 0x11B8) || - c == 0x11BA || - (c >= 0x11BC && c <= 0x11C2) || - c == 0x11EB || - c == 0x11F0 || - c == 0x11F9 || - (c >= 0x1E00 && c <= 0x1E9B) || - (c >= 0x1EA0 && c <= 0x1EF9) || - (c >= 0x1F00 && c <= 0x1F15) || - (c >= 0x1F18 && c <= 0x1F1D) || - (c >= 0x1F20 && c <= 0x1F45) || - (c >= 0x1F48 && c <= 0x1F4D) || - (c >= 0x1F50 && c <= 0x1F57) || - c == 0x1F59 || - c == 0x1F5B || - c == 0x1F5D || - (c >= 0x1F5F && c <= 0x1F7D) || - (c >= 0x1F80 && c <= 0x1FB4) || - (c >= 0x1FB6 && c <= 0x1FBC) || - c == 0x1FBE || - (c >= 0x1FC2 && c <= 0x1FC4) || - (c >= 0x1FC6 && c <= 0x1FCC) || - (c >= 0x1FD0 && c <= 0x1FD3) || - (c >= 0x1FD6 && c <= 0x1FDB) || - (c >= 0x1FE0 && c <= 0x1FEC) || - (c >= 0x1FF2 && c <= 0x1FF4) || - (c >= 0x1FF6 && c <= 0x1FFC) || - c == 0x2126 || - (c >= 0x212A && c <= 0x212B) || - c == 0x212E || - (c >= 0x2180 && c <= 0x2182) || - (c >= 0x3041 && c <= 0x3094) || - (c >= 0x30A1 && c <= 0x30FA) || - (c >= 0x3105 && c <= 0x312C) || - (c >= 0xAC00 && c <= 0xD7A3)) - return true; // BaseChar - if ((c >= 0x4e00 && c <= 0x9fa5) || - c == 0x3007 || - (c >= 0x3021 && c <= 0x3029)) - return true; // Ideographic - return false; - } - - /** - * Indicates whether the specified Unicode character matches the Digit - * production. - */ - public static boolean isDigit(int c) - { - return ((c >= 0x0030 && c <= 0x0039) || - (c >= 0x0660 && c <= 0x0669) || - (c >= 0x06F0 && c <= 0x06F9) || - (c >= 0x0966 && c <= 0x096F) || - (c >= 0x09E6 && c <= 0x09EF) || - (c >= 0x0A66 && c <= 0x0A6F) || - (c >= 0x0AE6 && c <= 0x0AEF) || - (c >= 0x0B66 && c <= 0x0B6F) || - (c >= 0x0BE7 && c <= 0x0BEF) || - (c >= 0x0C66 && c <= 0x0C6F) || - (c >= 0x0CE6 && c <= 0x0CEF) || - (c >= 0x0D66 && c <= 0x0D6F) || - (c >= 0x0E50 && c <= 0x0E59) || - (c >= 0x0ED0 && c <= 0x0ED9) || - (c >= 0x0F20 && c <= 0x0F29)); - } - - /** - * Indicates whether the specified Unicode character matches the - * CombiningChar production. - */ - public static boolean isCombiningChar(int c) - { - return ((c >= 0x0300 && c <= 0x0345) || - (c >= 0x0360 && c <= 0x0361) || - (c >= 0x0483 && c <= 0x0486) || - (c >= 0x0591 && c <= 0x05A1) || - (c >= 0x05A3 && c <= 0x05B9) || - (c >= 0x05BB && c <= 0x05BD) || - c == 0x05BF || - (c >= 0x05C1 && c <= 0x05C2) || - c == 0x05C4 || - (c >= 0x064B && c <= 0x0652) || - c == 0x0670 || - (c >= 0x06D6 && c <= 0x06DC) || - (c >= 0x06DD && c <= 0x06DF) || - (c >= 0x06E0 && c <= 0x06E4) || - (c >= 0x06E7 && c <= 0x06E8) || - (c >= 0x06EA && c <= 0x06ED) || - (c >= 0x0901 && c <= 0x0903) || - c == 0x093C || - (c >= 0x093E && c <= 0x094C) || - c == 0x094D || - (c >= 0x0951 && c <= 0x0954) || - (c >= 0x0962 && c <= 0x0963) || - (c >= 0x0981 && c <= 0x0983) || - c == 0x09BC || - c == 0x09BE || - c == 0x09BF || - (c >= 0x09C0 && c <= 0x09C4) || - (c >= 0x09C7 && c <= 0x09C8) || - (c >= 0x09CB && c <= 0x09CD) || - c == 0x09D7 || - (c >= 0x09E2 && c <= 0x09E3) || - c == 0x0A02 || - c == 0x0A3C || - c == 0x0A3E || - c == 0x0A3F || - (c >= 0x0A40 && c <= 0x0A42) || - (c >= 0x0A47 && c <= 0x0A48) || - (c >= 0x0A4B && c <= 0x0A4D) || - (c >= 0x0A70 && c <= 0x0A71) || - (c >= 0x0A81 && c <= 0x0A83) || - c == 0x0ABC || - (c >= 0x0ABE && c <= 0x0AC5) || - (c >= 0x0AC7 && c <= 0x0AC9) || - (c >= 0x0ACB && c <= 0x0ACD) || - (c >= 0x0B01 && c <= 0x0B03) || - c == 0x0B3C || - (c >= 0x0B3E && c <= 0x0B43) || - (c >= 0x0B47 && c <= 0x0B48) || - (c >= 0x0B4B && c <= 0x0B4D) || - (c >= 0x0B56 && c <= 0x0B57) || - (c >= 0x0B82 && c <= 0x0B83) || - (c >= 0x0BBE && c <= 0x0BC2) || - (c >= 0x0BC6 && c <= 0x0BC8) || - (c >= 0x0BCA && c <= 0x0BCD) || - c == 0x0BD7 || - (c >= 0x0C01 && c <= 0x0C03) || - (c >= 0x0C3E && c <= 0x0C44) || - (c >= 0x0C46 && c <= 0x0C48) || - (c >= 0x0C4A && c <= 0x0C4D) || - (c >= 0x0C55 && c <= 0x0C56) || - (c >= 0x0C82 && c <= 0x0C83) || - (c >= 0x0CBE && c <= 0x0CC4) || - (c >= 0x0CC6 && c <= 0x0CC8) || - (c >= 0x0CCA && c <= 0x0CCD) || - (c >= 0x0CD5 && c <= 0x0CD6) || - (c >= 0x0D02 && c <= 0x0D03) || - (c >= 0x0D3E && c <= 0x0D43) || - (c >= 0x0D46 && c <= 0x0D48) || - (c >= 0x0D4A && c <= 0x0D4D) || - c == 0x0D57 || - c == 0x0E31 || - (c >= 0x0E34 && c <= 0x0E3A) || - (c >= 0x0E47 && c <= 0x0E4E) || - c == 0x0EB1 || - (c >= 0x0EB4 && c <= 0x0EB9) || - (c >= 0x0EBB && c <= 0x0EBC) || - (c >= 0x0EC8 && c <= 0x0ECD) || - (c >= 0x0F18 && c <= 0x0F19) || - c == 0x0F35 || - c == 0x0F37 || - c == 0x0F39 || - c == 0x0F3E || - c == 0x0F3F || - (c >= 0x0F71 && c <= 0x0F84) || - (c >= 0x0F86 && c <= 0x0F8B) || - (c >= 0x0F90 && c <= 0x0F95) || - c == 0x0F97 || - (c >= 0x0F99 && c <= 0x0FAD) || - (c >= 0x0FB1 && c <= 0x0FB7) || - c == 0x0FB9 || - (c >= 0x20D0 && c <= 0x20DC) || - c == 0x20E1 || - (c >= 0x302A && c <= 0x302F) || - c == 0x3099 || - c == 0x309A); - } - - /** - * Indicates whether the specified Unicode character matches the Extender - * production. - */ - public static boolean isExtender(int c) - { - return (c == 0x00B7 || - c == 0x02D0 || - c == 0x02D1 || - c == 0x0387 || - c == 0x0640 || - c == 0x0E46 || - c == 0x0EC6 || - c == 0x3005 || - (c >= 0x3031 && c <= 0x3035) || - (c >= 0x309D && c <= 0x309E) || - (c >= 0x30FC && c <= 0x30FE)); - } - - /** - * Indicates whether the specified Unicode character matches the Char - * production. - */ - public static boolean isChar(int c) - { - return (c >= 0x20 && c < 0xd800) || - (c >= 0xe00 && c < 0xfffe) || - (c >= 0x10000 && c < 0x110000) || - c == 0xa || c == 0x9 || c == 0xd; - } - - /** - * Interns the specified text or not, depending on the value of - * stringInterning. - */ - private String intern(String text) - { - return stringInterning ? text.intern() : text; - } - - /** - * Report a parsing error. - */ - private void error(String message) - throws XMLStreamException - { - error(message, null); - } - - /** - * Report a parsing error. - */ - private void error(String message, Object info) - throws XMLStreamException - { - if (info != null) - { - if (info instanceof String) - message += ": \"" + ((String) info) + "\""; - else if (info instanceof Character) - message += ": '" + ((Character) info) + "'"; - } - throw new XMLStreamException(message); - } - - /** - * Perform validation of a start-element event. - */ - private void validateStartElement(String elementName) - throws XMLStreamException - { - if (currentContentModel == null) - { - // root element - // VC: Root Element Type - if (!elementName.equals(doctype.rootName)) - error("root element name must match name in DTD"); - return; - } - // VC: Element Valid - switch (currentContentModel.type) - { - case ContentModel.EMPTY: - error("child element found in empty element", elementName); - break; - case ContentModel.ELEMENT: - LinkedList ctx = (LinkedList) validationStack.getLast(); - ctx.add(elementName); - break; - case ContentModel.MIXED: - MixedContentModel mm = (MixedContentModel) currentContentModel; - if (!mm.containsName(elementName)) - error("illegal element for content model", elementName); - break; - } - } - - /** - * Perform validation of an end-element event. - */ - private void validateEndElement() - throws XMLStreamException - { - if (currentContentModel == null) - { - // root element - // VC: IDREF - if (!idrefs.containsAll(ids)) - error("IDREF values must match the value of some ID attribute"); - return; - } - // VC: Element Valid - switch (currentContentModel.type) - { - case ContentModel.ELEMENT: - LinkedList ctx = (LinkedList) validationStack.getLast(); - ElementContentModel ecm = (ElementContentModel) currentContentModel; - validateElementContent(ecm, ctx); - break; - } - } - - /** - * Perform validation of character data. - */ - private void validatePCData(String text) - throws XMLStreamException - { - // VC: Element Valid - switch (currentContentModel.type) - { - case ContentModel.EMPTY: - error("character data found in empty element", text); - break; - case ContentModel.ELEMENT: - boolean white = true; - int len = text.length(); - for (int i = 0; i < len; i++) - { - char c = text.charAt(i); - if (c != ' ' && c != '\t' && c != '\n' && c != '\r') - { - white = false; - break; - } - } - if (!white) - error("character data found in element with element content", text); - else if (xmlStandalone == Boolean.TRUE && currentContentModel.external) - // VC: Standalone Document Declaration - error("whitespace in element content of externally declared " + - "element in standalone document"); - break; - } - } - - /** - * Validates the specified validation context (list of child elements) - * against the element content model for the current element. - */ - private void validateElementContent(ElementContentModel model, - LinkedList children) - throws XMLStreamException - { - // Use regular expression - CPStringBuilder buf = new CPStringBuilder(); - for (Iterator i = children.iterator(); i.hasNext(); ) - { - buf.append((String) i.next()); - buf.append(' '); - } - String c = buf.toString(); - String regex = createRegularExpression(model); - if (!c.matches(regex)) - error("element content "+model.text+" does not match expression "+regex, c); - } - - /** - * Creates the regular expression used to validate an element content - * model. - */ - private String createRegularExpression(ElementContentModel model) - { - if (model.regex == null) - { - CPStringBuilder buf = new CPStringBuilder(); - buf.append('('); - for (Iterator i = model.contentParticles.iterator(); i.hasNext(); ) - { - ContentParticle cp = (ContentParticle) i.next(); - if (cp.content instanceof String) - { - buf.append('('); - buf.append((String) cp.content); - buf.append(' '); - buf.append(')'); - if (cp.max == -1) - { - if (cp.min == 0) - buf.append('*'); - else - buf.append('+'); - } - else if (cp.min == 0) - buf.append('?'); - } - else - { - ElementContentModel ecm = (ElementContentModel) cp.content; - buf.append(createRegularExpression(ecm)); - } - if (model.or && i.hasNext()) - buf.append('|'); - } - buf.append(')'); - if (model.max == -1) - { - if (model.min == 0) - buf.append('*'); - else - buf.append('+'); - } - else if (model.min == 0) - buf.append('?'); - model.regex = buf.toString(); - } - return model.regex; - } - - /** - * Performs validation of a document type declaration event. - */ - void validateDoctype() - throws XMLStreamException - { - for (Iterator i = doctype.entityIterator(); i.hasNext(); ) - { - Map.Entry entry = (Map.Entry) i.next(); - Object entity = entry.getValue(); - if (entity instanceof ExternalIds) - { - ExternalIds ids = (ExternalIds) entity; - if (ids.notationName != null) - { - // VC: Notation Declared - ExternalIds notation = doctype.getNotation(ids.notationName); - if (notation == null) - error("Notation name must match the declared name of a " + - "notation", ids.notationName); - } - } - } - } - - /** - * Simple test harness for reading an XML file. - * args[0] is the filename of the XML file - * If args[1] is "-x", enable XInclude processing - */ - public static void main(String[] args) - throws Exception - { - boolean validating = false; - boolean namespaceAware = false; - boolean xIncludeAware = false; - int pos = 0; - while (pos < args.length && args[pos].startsWith("-")) - { - if ("-x".equals(args[pos])) - xIncludeAware = true; - else if ("-v".equals(args[pos])) - validating = true; - else if ("-n".equals(args[pos])) - namespaceAware = true; - pos++; - } - if (pos >= args.length) - { - System.out.println("Syntax: XMLParser [-n] [-v] [-x] <file> [<file2> [...]]"); - System.out.println("\t-n: use namespace aware mode"); - System.out.println("\t-v: use validating parser"); - System.out.println("\t-x: use XInclude aware mode"); - System.exit(2); - } - while (pos < args.length) - { - XMLParser p = new XMLParser(new java.io.FileInputStream(args[pos]), - absolutize(null, args[pos]), - validating, // validating - namespaceAware, // namespaceAware - true, // coalescing, - true, // replaceERefs - true, // externalEntities - true, // supportDTD - true, // baseAware - true, // stringInterning - true, // extendedEventTypes - null, - null); - XMLStreamReader reader = p; - if (xIncludeAware) - reader = new XIncludeFilter(p, args[pos], true, true, true); - try - { - int event; - //do - while (reader.hasNext()) - { - event = reader.next(); - Location loc = reader.getLocation(); - System.out.print(loc.getLineNumber() + ":" + - loc.getColumnNumber() + " "); - switch (event) - { - case XMLStreamConstants.START_DOCUMENT: - System.out.println("START_DOCUMENT version=" + - reader.getVersion() + - " encoding=" + - reader.getEncoding()); - break; - case XMLStreamConstants.END_DOCUMENT: - System.out.println("END_DOCUMENT"); - break; - case XMLStreamConstants.START_ELEMENT: - System.out.println("START_ELEMENT " + - reader.getName()); - int l = reader.getNamespaceCount(); - for (int i = 0; i < l; i++) - System.out.println("\tnamespace " + - reader.getNamespacePrefix(i) + "='" + - reader.getNamespaceURI(i)+"'"); - l = reader.getAttributeCount(); - for (int i = 0; i < l; i++) - System.out.println("\tattribute " + - reader.getAttributeName(i) + "='" + - reader.getAttributeValue(i) + "'"); - break; - case XMLStreamConstants.END_ELEMENT: - System.out.println("END_ELEMENT " + reader.getName()); - break; - case XMLStreamConstants.CHARACTERS: - System.out.println("CHARACTERS '" + - encodeText(reader.getText()) + "'"); - break; - case XMLStreamConstants.CDATA: - System.out.println("CDATA '" + - encodeText(reader.getText()) + "'"); - break; - case XMLStreamConstants.SPACE: - System.out.println("SPACE '" + - encodeText(reader.getText()) + "'"); - break; - case XMLStreamConstants.DTD: - System.out.println("DTD " + reader.getText()); - break; - case XMLStreamConstants.ENTITY_REFERENCE: - System.out.println("ENTITY_REFERENCE " + reader.getText()); - break; - case XMLStreamConstants.COMMENT: - System.out.println("COMMENT '" + - encodeText(reader.getText()) + "'"); - break; - case XMLStreamConstants.PROCESSING_INSTRUCTION: - System.out.println("PROCESSING_INSTRUCTION " + - reader.getPITarget() + " " + - reader.getPIData()); - break; - case START_ENTITY: - System.out.println("START_ENTITY " + reader.getText()); - break; - case END_ENTITY: - System.out.println("END_ENTITY " + reader.getText()); - break; - default: - System.out.println("Unknown event: " + event); - } - } - } - catch (XMLStreamException e) - { - Location l = reader.getLocation(); - System.out.println("At line "+l.getLineNumber()+ - ", column "+l.getColumnNumber()+ - " of "+l.getSystemId()); - throw e; - } - pos++; - } - } - - /** - * Escapes control characters in the specified text. For debugging. - */ - private static String encodeText(String text) - { - CPStringBuilder b = new CPStringBuilder(); - int len = text.length(); - for (int i = 0; i < len; i++) - { - char c = text.charAt(i); - switch (c) - { - case '\t': - b.append("\\t"); - break; - case '\n': - b.append("\\n"); - break; - case '\r': - b.append("\\r"); - break; - default: - b.append(c); - } - } - return b.toString(); - } - - /** - * An attribute instance. - */ - class Attribute - { - - /** - * Attribute name. - */ - final String name; - - /** - * Attribute type as declared in the DTD, or CDATA otherwise. - */ - final String type; - - /** - * Whether the attribute was specified or defaulted. - */ - final boolean specified; - - /** - * The attribute value. - */ - final String value; - - /** - * The namespace prefix. - */ - final String prefix; - - /** - * The namespace local-name. - */ - final String localName; - - Attribute(String name, String type, boolean specified, String value) - { - this.name = name; - this.type = type; - this.specified = specified; - this.value = value; - int ci = name.indexOf(':'); - if (ci == -1) - { - prefix = null; - localName = intern(name); - } - else - { - prefix = intern(name.substring(0, ci)); - localName = intern(name.substring(ci + 1)); - } - } - - public boolean equals(Object other) - { - if (other instanceof Attribute) - { - Attribute a = (Attribute) other; - if (namespaceAware) - { - if (!a.localName.equals(localName)) - return false; - String auri = getNamespaceURI(a.prefix); - String uri = getNamespaceURI(prefix); - if (uri == null && (auri == null || - (input.xml11 && "".equals(auri)))) - return true; - if (uri != null) - { - if ("".equals(uri) && input.xml11 && "".equals(auri)) - return true; - return uri.equals(auri); - } - return false; - } - else - return a.name.equals(name); - } - return false; - } - - public String toString() - { - CPStringBuilder buf = new CPStringBuilder(getClass().getName()); - buf.append('['); - buf.append("name="); - buf.append(name); - if (value != null) - { - buf.append(",value="); - buf.append(value); - } - if (type != null) - { - buf.append(",type="); - buf.append(type); - } - if (specified) - buf.append(",specified"); - buf.append(']'); - return buf.toString(); - } - - } - - /** - * Representation of a DTD. - */ - class Doctype - { - - /** - * Name of the root element. - */ - final String rootName; - - /** - * Public ID, if any, of external subset. - */ - final String publicId; - - /** - * System ID (URL), if any, of external subset. - */ - final String systemId; - - /** - * Map of element names to content models. - */ - private final LinkedHashMap elements = new LinkedHashMap(); - - /** - * Map of element names to maps of attribute declarations. - */ - private final LinkedHashMap attlists = new LinkedHashMap(); - - /** - * Map of entity names to entities (String or ExternalIds). - */ - private final LinkedHashMap entities = new LinkedHashMap(); - - /** - * Map of notation names to ExternalIds. - */ - private final LinkedHashMap notations = new LinkedHashMap(); - - /** - * Map of anonymous keys to comments. - */ - private final LinkedHashMap comments = new LinkedHashMap(); - - /** - * Map of anonymous keys to processing instructions (String[2] - * containing {target, data}). - */ - private final LinkedHashMap pis = new LinkedHashMap(); - - /** - * List of keys to all markup entries in the DTD. - */ - private final LinkedList entries = new LinkedList(); - - /** - * Set of the entities defined in the external subset. - */ - private final HashSet externalEntities = new HashSet(); - - /** - * Set of the notations defined in the external subset. - */ - private final HashSet externalNotations = new HashSet(); - - /** - * Counter for making anonymous keys. - */ - private int anon = 1; - - /** - * Constructor. - */ - Doctype(String rootName, String publicId, String systemId) - { - this.rootName = rootName; - this.publicId = publicId; - this.systemId = systemId; - } - - /** - * Adds an element declaration. - * @param name the element name - * @param text the content model text - * @param model the parsed content model - */ - void addElementDecl(String name, String text, ContentModel model) - { - if (elements.containsKey(name)) - return; - model.text = text; - model.external = (inputStack.size() != 1); - elements.put(name, model); - entries.add("E" + name); - } - - /** - * Adds an attribute declaration. - * @param ename the element name - * @param aname the attribute name - * @param decl the attribute declaration details - */ - void addAttributeDecl(String ename, String aname, AttributeDecl decl) - { - LinkedHashMap attlist = (LinkedHashMap) attlists.get(ename); - if (attlist == null) - { - attlist = new LinkedHashMap(); - attlists.put(ename, attlist); - } - else if (attlist.containsKey(aname)) - return; - attlist.put(aname, decl); - String key = "A" + ename; - if (!entries.contains(key)) - entries.add(key); - } - - /** - * Adds an entity declaration. - * @param name the entity name - * @param text the entity replacement text - * @param inExternalSubset if we are in the exernal subset - */ - void addEntityDecl(String name, String text, boolean inExternalSubset) - { - if (entities.containsKey(name)) - return; - entities.put(name, text); - entries.add("e" + name); - if (inExternalSubset) - externalEntities.add(name); - } - - /** - * Adds an entity declaration. - * @param name the entity name - * @param ids the external IDs - * @param inExternalSubset if we are in the exernal subset - */ - void addEntityDecl(String name, ExternalIds ids, boolean inExternalSubset) - { - if (entities.containsKey(name)) - return; - entities.put(name, ids); - entries.add("e" + name); - if (inExternalSubset) - externalEntities.add(name); - } - - /** - * Adds a notation declaration. - * @param name the notation name - * @param ids the external IDs - * @param inExternalSubset if we are in the exernal subset - */ - void addNotationDecl(String name, ExternalIds ids, boolean inExternalSubset) - { - if (notations.containsKey(name)) - return; - notations.put(name, ids); - entries.add("n" + name); - if (inExternalSubset) - externalNotations.add(name); - } - - /** - * Adds a comment. - */ - void addComment(String text) - { - String key = Integer.toString(anon++); - comments.put(key, text); - entries.add("c" + key); - } - - /** - * Adds a processing instruction. - */ - void addPI(String target, String data) - { - String key = Integer.toString(anon++); - pis.put(key, new String[] {target, data}); - entries.add("p" + key); - } - - /** - * Returns the content model for the specified element. - * @param name the element name - */ - ContentModel getElementModel(String name) - { - return (ContentModel) elements.get(name); - } - - /** - * Returns the attribute definition for the given attribute - * @param ename the element name - * @param aname the attribute name - */ - AttributeDecl getAttributeDecl(String ename, String aname) - { - LinkedHashMap attlist = (LinkedHashMap) attlists.get(ename); - return (attlist == null) ? null : (AttributeDecl) attlist.get(aname); - } - - /** - * Indicates whether the specified attribute was declared in the DTD. - * @param ename the element name - * @param aname the attribute name - */ - boolean isAttributeDeclared(String ename, String aname) - { - LinkedHashMap attlist = (LinkedHashMap) attlists.get(ename); - return (attlist == null) ? false : attlist.containsKey(aname); - } - - /** - * Returns an iterator over the entries in the attribute list for the - * given element. - * @param ename the element name - */ - Iterator attlistIterator(String ename) - { - LinkedHashMap attlist = (LinkedHashMap) attlists.get(ename); - return (attlist == null) ? Collections.EMPTY_LIST.iterator() : - attlist.entrySet().iterator(); - } - - /** - * Returns the entity (String or ExternalIds) for the given entity name. - */ - Object getEntity(String name) - { - return entities.get(name); - } - - /** - * Indicates whether the specified entity was declared in the external - * subset. - */ - boolean isEntityExternal(String name) - { - return externalEntities.contains(name); - } - - /** - * Returns an iterator over the entity map entries. - */ - Iterator entityIterator() - { - return entities.entrySet().iterator(); - } - - /** - * Returns the notation IDs for the given notation name. - */ - ExternalIds getNotation(String name) - { - return (ExternalIds) notations.get(name); - } - - /** - * Indicates whether the specified notation was declared in the external - * subset. - */ - boolean isNotationExternal(String name) - { - return externalNotations.contains(name); - } - - /** - * Returns the comment associated with the specified (anonymous) key. - */ - String getComment(String key) - { - return (String) comments.get(key); - } - - /** - * Returns the processing instruction associated with the specified - * (anonymous) key. - */ - String[] getPI(String key) - { - return (String[]) pis.get(key); - } - - /** - * Returns an iterator over the keys of the markup entries in this DTD, - * in the order declared. - */ - Iterator entryIterator() - { - return entries.iterator(); - } - - } - - /** - * Combination of an ExternalID and an optional NDataDecl. - */ - class ExternalIds - { - - /** - * The public ID. - */ - String publicId; - - /** - * The system ID. - */ - String systemId; - - /** - * The notation name declared with the NDATA keyword. - */ - String notationName; - } - - /** - * A content model. - */ - abstract class ContentModel - { - static final int EMPTY = 0; - static final int ANY = 1; - static final int ELEMENT = 2; - static final int MIXED = 3; - - int min; - int max; - final int type; - String text; - boolean external; - - ContentModel(int type) - { - this.type = type; - min = 1; - max = 1; - } - - } - - /** - * The EMPTY content model. - */ - class EmptyContentModel - extends ContentModel - { - - EmptyContentModel() - { - super(ContentModel.EMPTY); - min = 0; - max = 0; - } - - } - - /** - * The ANY content model. - */ - class AnyContentModel - extends ContentModel - { - - AnyContentModel() - { - super(ContentModel.ANY); - min = 0; - max = -1; - } - - } - - /** - * An element content model. - */ - class ElementContentModel - extends ContentModel - { - - LinkedList contentParticles; - boolean or; - String regex; // regular expression cache - - ElementContentModel() - { - super(ContentModel.ELEMENT); - contentParticles = new LinkedList(); - } - - void addContentParticle(ContentParticle cp) - { - contentParticles.add(cp); - } - - } - - class ContentParticle - { - - int min = 1; - int max = 1; - Object content; // Name (String) or ElementContentModel - - } - - /** - * A mixed content model. - */ - class MixedContentModel - extends ContentModel - { - - private HashSet names; - - MixedContentModel() - { - super(ContentModel.MIXED); - names = new HashSet(); - } - - void addName(String name) - { - names.add(name); - } - - boolean containsName(String name) - { - return names.contains(name); - } - - } - - /** - * An attribute definition. - */ - class AttributeDecl - { - - /** - * The attribute type (CDATA, ID, etc). - */ - final String type; - - /** - * The default value. - */ - final String value; - - /** - * The value type (#FIXED, #IMPLIED, etc). - */ - final int valueType; - - /** - * The enumeration text. - */ - final String enumeration; - - /** - * The enumeration tokens. - */ - final HashSet values; - - /** - * Whether this attribute declaration occurred in the external subset. - */ - final boolean external; - - AttributeDecl(String type, String value, - int valueType, String enumeration, - HashSet values, boolean external) - { - this.type = type; - this.value = value; - this.valueType = valueType; - this.enumeration = enumeration; - this.values = values; - this.external = external; - } - - } - - /** - * An XML input source. - */ - static class Input - implements Location - { - - int line = 1, markLine; - int column, markColumn; - int offset, markOffset; - final String publicId, systemId, name; - final boolean report; // report start- and end-entity - final boolean normalize; // normalize CR, etc to LF - - InputStream in; - Reader reader; - UnicodeReader unicodeReader; - boolean initialized; - boolean encodingDetected; - String inputEncoding; - boolean xml11; - - Input(InputStream in, Reader reader, String publicId, String systemId, - String name, String inputEncoding, boolean report, - boolean normalize) - { - if (inputEncoding == null) - inputEncoding = "UTF-8"; - this.inputEncoding = inputEncoding; - this.publicId = publicId; - this.systemId = systemId; - this.name = name; - this.report = report; - this.normalize = normalize; - if (in != null) - { - if (reader != null) - throw new IllegalStateException("both byte and char streams "+ - "specified"); - if (normalize) - in = new CRLFInputStream(in); - in = new BufferedInputStream(in); - this.in = in; - } - else - { - this.reader = normalize ? new CRLFReader(reader) : reader; - unicodeReader = new UnicodeReader(this.reader); - } - initialized = false; - } - - // -- Location -- - - public int getCharacterOffset() - { - return offset; - } - - public int getColumnNumber() - { - return column; - } - - public int getLineNumber() - { - return line; - } - - public String getPublicId() - { - return publicId; - } - - public String getSystemId() - { - return systemId; - } - - void init() - throws IOException - { - if (initialized) - return; - if (in != null) - detectEncoding(); - initialized = true; - } - - void mark(int len) - throws IOException - { - markOffset = offset; - markLine = line; - markColumn = column; - if (unicodeReader != null) - unicodeReader.mark(len); - else - in.mark(len); - } - - /** - * Character read. - */ - int read() - throws IOException - { - offset++; - int ret = (unicodeReader != null) ? unicodeReader.read() : in.read(); - if (normalize && - (ret == 0x0d || (xml11 && (ret == 0x85 || ret == 0x2028)))) - { - // Normalize CR etc to LF - ret = 0x0a; - } - // Locator handling - if (ret == 0x0a) - { - line++; - column = 0; - } - else - column++; - return ret; - } - - /** - * Block read. - */ - int read(int[] b, int off, int len) - throws IOException - { - int ret; - if (unicodeReader != null) - { - ret = unicodeReader.read(b, off, len); - } - else - { - byte[] b2 = new byte[len]; - ret = in.read(b2, 0, len); - if (ret != -1) - { - String s = new String(b2, 0, ret, inputEncoding); - int[] c = UnicodeReader.toCodePointArray(s); - ret = c.length; - System.arraycopy(c, 0, b, off, ret); - } - } - if (ret != -1) - { - // Locator handling - for (int i = 0; i < ret; i++) - { - int c = b[off + i]; - if (normalize && - (c == 0x0d || (xml11 && (c == 0x85 || c == 0x2028)))) - { - // Normalize CR etc to LF - c = 0x0a; - b[off + i] = c; - } - if (c == 0x0a) - { - line++; - column = 0; - } - else - column++; - } - } - return ret; - } - - void reset() - throws IOException - { - if (unicodeReader != null) - unicodeReader.reset(); - else - in.reset(); - offset = markOffset; - line = markLine; - column = markColumn; - } - - // Detection of input encoding - - private static final int[] SIGNATURE_UCS_4_1234 = - new int[] { 0x00, 0x00, 0x00, 0x3c }; - private static final int[] SIGNATURE_UCS_4_4321 = - new int[] { 0x3c, 0x00, 0x00, 0x00 }; - private static final int[] SIGNATURE_UCS_4_2143 = - new int[] { 0x00, 0x00, 0x3c, 0x00 }; - private static final int[] SIGNATURE_UCS_4_3412 = - new int[] { 0x00, 0x3c, 0x00, 0x00 }; - private static final int[] SIGNATURE_UCS_2_12 = - new int[] { 0xfe, 0xff }; - private static final int[] SIGNATURE_UCS_2_21 = - new int[] { 0xff, 0xfe }; - private static final int[] SIGNATURE_UCS_2_12_NOBOM = - new int[] { 0x00, 0x3c, 0x00, 0x3f }; - private static final int[] SIGNATURE_UCS_2_21_NOBOM = - new int[] { 0x3c, 0x00, 0x3f, 0x00 }; - private static final int[] SIGNATURE_UTF_8 = - new int[] { 0x3c, 0x3f, 0x78, 0x6d }; - private static final int[] SIGNATURE_UTF_8_BOM = - new int[] { 0xef, 0xbb, 0xbf }; - - /** - * Detect the input encoding. - */ - private void detectEncoding() - throws IOException - { - int[] signature = new int[4]; - in.mark(4); - for (int i = 0; i < 4; i++) - signature[i] = in.read(); - in.reset(); - - // 4-byte encodings - if (equals(SIGNATURE_UCS_4_1234, signature)) - { - in.read(); - in.read(); - in.read(); - in.read(); - setInputEncoding("UTF-32BE"); - encodingDetected = true; - } - else if (equals(SIGNATURE_UCS_4_4321, signature)) - { - in.read(); - in.read(); - in.read(); - in.read(); - setInputEncoding("UTF-32LE"); - encodingDetected = true; - } - else if (equals(SIGNATURE_UCS_4_2143, signature) || - equals(SIGNATURE_UCS_4_3412, signature)) - throw new UnsupportedEncodingException("unsupported UCS-4 byte ordering"); - - // 2-byte encodings - else if (equals(SIGNATURE_UCS_2_12, signature)) - { - in.read(); - in.read(); - setInputEncoding("UTF-16BE"); - encodingDetected = true; - } - else if (equals(SIGNATURE_UCS_2_21, signature)) - { - in.read(); - in.read(); - setInputEncoding("UTF-16LE"); - encodingDetected = true; - } - else if (equals(SIGNATURE_UCS_2_12_NOBOM, signature)) - { - //setInputEncoding("UTF-16BE"); - throw new UnsupportedEncodingException("no byte-order mark for UCS-2 entity"); - } - else if (equals(SIGNATURE_UCS_2_21_NOBOM, signature)) - { - //setInputEncoding("UTF-16LE"); - throw new UnsupportedEncodingException("no byte-order mark for UCS-2 entity"); - } - // ASCII-derived encodings - else if (equals(SIGNATURE_UTF_8, signature)) - { - // UTF-8 input encoding implied, TextDecl - } - else if (equals(SIGNATURE_UTF_8_BOM, signature)) - { - in.read(); - in.read(); - in.read(); - setInputEncoding("UTF-8"); - encodingDetected = true; - } - } - - private static boolean equals(int[] b1, int[] b2) - { - for (int i = 0; i < b1.length; i++) - { - if (b1[i] != b2[i]) - return false; - } - return true; - } - - void setInputEncoding(String encoding) - throws IOException - { - if (encoding.equals(inputEncoding)) - return; - if ("UTF-16".equalsIgnoreCase(encoding) && - inputEncoding.startsWith("UTF-16")) - return; - if (encodingDetected) - throw new UnsupportedEncodingException("document is not in its " + - "declared encoding " + - inputEncoding + - ": " + encoding); - inputEncoding = encoding; - finalizeEncoding(); - } - - void finalizeEncoding() - throws IOException - { - if (reader != null) - return; - reader = new BufferedReader(new InputStreamReader(in, inputEncoding)); - unicodeReader = new UnicodeReader(reader); - mark(1); - } - - } - -} diff --git a/libjava/classpath/gnu/xml/stream/XMLStreamWriterImpl.java b/libjava/classpath/gnu/xml/stream/XMLStreamWriterImpl.java deleted file mode 100644 index 83b8f723986..00000000000 --- a/libjava/classpath/gnu/xml/stream/XMLStreamWriterImpl.java +++ /dev/null @@ -1,1016 +0,0 @@ -/* XMLStreamWriterImpl.java -- - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath 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, or (at your option) -any later version. - -GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.xml.stream; - -import java.io.IOException; -import java.io.Writer; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Set; - -import javax.xml.XMLConstants; -import javax.xml.namespace.NamespaceContext; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; - -import org.xml.sax.helpers.NamespaceSupport; - -/** - * Simple XML stream writer. - * - * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> - */ -public class XMLStreamWriterImpl - implements XMLStreamWriter -{ - - /** - * The underlying character stream to write to. - */ - protected final Writer writer; - - /** - * The encoding being used. - * Note that this must match the encoding of the character stream. - */ - protected final String encoding; - - /** - * Whether prefix defaulting is being used. - * If true and a prefix has not been defined for a namespace specified on - * an element or an attribute, a new prefix and namespace declaration will - * be created. - */ - protected final boolean prefixDefaulting; - - /** - * The namespace context used to determine the namespace-prefix mappings - * in scope. - */ - protected NamespaceContext namespaceContext; - - /** - * The stack of elements in scope. - * Used to close the remaining elements. - */ - private LinkedList elements; - - /** - * Whether a start element has been opened but not yet closed. - */ - private boolean inStartElement; - - /** - * Whether we are in an empty element. - */ - private boolean emptyElement; - - private NamespaceSupport namespaces; - private int count = 0; - - private boolean xml11; - private boolean hasXML11RestrictedChars; - - /** - * Constructor. - * @see #writer - * @see #encoding - * @see #prefixDefaulting - */ - protected XMLStreamWriterImpl(Writer writer, String encoding, - boolean prefixDefaulting) - { - this.writer = writer; - this.encoding = encoding; - this.prefixDefaulting = prefixDefaulting; - elements = new LinkedList(); - namespaces = new NamespaceSupport(); - } - - /** - * Write the end of a start-element event. - * This will close the element if it was defined to be an empty element. - */ - private void endStartElement() - throws IOException - { - if (!inStartElement) - return; - if (emptyElement) - { - writer.write('/'); - elements.removeLast(); - namespaces.popContext(); - emptyElement = false; - } - writer.write('>'); - inStartElement = false; - } - - public void writeStartElement(String localName) - throws XMLStreamException - { - try - { - if (!isName(localName)) - throw new IllegalArgumentException("illegal Name: " + localName); - - endStartElement(); - namespaces.pushContext(); - - writer.write('<'); - writer.write(localName); - - elements.addLast(new String[] { null, localName }); - inStartElement = true; - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeStartElement(String namespaceURI, String localName) - throws XMLStreamException - { - try - { - if (namespaceURI != null && !isURI(namespaceURI)) - throw new IllegalArgumentException("illegal URI: " + namespaceURI); - if (!isName(localName)) - throw new IllegalArgumentException("illegal Name: " + localName); - - endStartElement(); - namespaces.pushContext(); - - String prefix = getPrefix(namespaceURI); - boolean isDeclared = (prefix != null); - if (!isDeclared) - { - if (prefixDefaulting) - prefix = createPrefix(namespaceURI); - else - throw new XMLStreamException("namespace " + namespaceURI + - " has not been declared"); - } - writer.write('<'); - if (!"".equals(prefix)) - { - writer.write(prefix); - writer.write(':'); - } - writer.write(localName); - inStartElement = true; - if (!isDeclared) - { - writeNamespaceImpl(prefix, namespaceURI); - } - - elements.addLast(new String[] { prefix, localName }); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - /** - * Creates a new unique prefix in the document. - * Subclasses may override this method to provide a suitably unique prefix - * for the given namespace. - * @param namespaceURI the namespace URI - */ - protected String createPrefix(String namespaceURI) - { - Set prefixes = new HashSet(); - for (Enumeration e = namespaces.getPrefixes(); e.hasMoreElements(); ) - prefixes.add(e.nextElement()); - String ret; - do - { - ret = "ns" + (count++); - } - while (prefixes.contains(ret)); - return ret; - } - - public void writeStartElement(String prefix, String localName, - String namespaceURI) - throws XMLStreamException - { - try - { - if (namespaceURI != null && !isURI(namespaceURI)) - throw new IllegalArgumentException("illegal URI: " + namespaceURI); - if (prefix != null && !isPrefix(prefix)) - throw new IllegalArgumentException("illegal NCName: " + prefix); - if (!isNCName(localName)) - throw new IllegalArgumentException("illegal NCName: " + localName); - - endStartElement(); - namespaces.pushContext(); - - String currentPrefix = getPrefix(namespaceURI); - boolean isCurrent = prefix.equals(currentPrefix); - writer.write('<'); - if (!"".equals(prefix)) - { - writer.write(prefix); - writer.write(':'); - } - writer.write(localName); - if (prefixDefaulting && !isCurrent) - { - writeNamespaceImpl(prefix, namespaceURI); - } - - elements.addLast(new String[] { prefix, localName }); - inStartElement = true; - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeEmptyElement(String namespaceURI, String localName) - throws XMLStreamException - { - writeStartElement(namespaceURI, localName); - emptyElement = true; - } - - public void writeEmptyElement(String prefix, String localName, - String namespaceURI) - throws XMLStreamException - { - writeStartElement(prefix, localName, namespaceURI); - emptyElement = true; - } - - public void writeEmptyElement(String localName) - throws XMLStreamException - { - writeStartElement(localName); - emptyElement = true; - } - - public void writeEndElement() - throws XMLStreamException - { - if (elements.isEmpty()) - throw new IllegalStateException("no matching start element"); - try - { - endStartElement(); - String[] element = (String[]) elements.removeLast(); - namespaces.popContext(); - - writer.write('<'); - writer.write('/'); - if (element[0] != null && !"".equals(element[0])) - { - writer.write(element[0]); - writer.write(':'); - } - writer.write(element[1]); - writer.write('>'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeEndDocument() - throws XMLStreamException - { - while (!elements.isEmpty()) - writeEndElement(); - } - - public void close() - throws XMLStreamException - { - flush(); - } - - public void flush() - throws XMLStreamException - { - try - { - writer.flush(); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeAttribute(String localName, String value) - throws XMLStreamException - { - if (!inStartElement) - throw new IllegalStateException(); - try - { - if (!isName(localName)) - throw new IllegalArgumentException("illegal Name: " + localName); - if (!isChars(value)) - throw new IllegalArgumentException("illegal character: " + value); - - writer.write(' '); - writer.write(localName); - writer.write('='); - writer.write('"'); - if (hasXML11RestrictedChars) - writeEncodedWithRestrictedChars(value, true); - else - writeEncoded(value, true); - writer.write('"'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeAttribute(String prefix, String namespaceURI, - String localName, String value) - throws XMLStreamException - { - if (!inStartElement) - throw new IllegalStateException(); - try - { - if (namespaceURI != null && !isURI(namespaceURI)) - throw new IllegalArgumentException("illegal URI: " + namespaceURI); - if (prefix != null && !isPrefix(prefix)) - throw new IllegalArgumentException("illegal NCName: " + prefix); - if (!isNCName(localName)) - throw new IllegalArgumentException("illegal NCName: " + localName); - if (!isChars(value)) - throw new IllegalArgumentException("illegal character: " + value); - - String currentPrefix = getPrefix(namespaceURI); - if (currentPrefix == null) - { - if (prefixDefaulting) - writeNamespaceImpl(prefix, namespaceURI); - else - throw new XMLStreamException("namespace " + namespaceURI + - " is not bound"); - } - else if (!currentPrefix.equals(prefix)) - throw new XMLStreamException("namespace " + namespaceURI + - " is bound to prefix " + - currentPrefix); - writer.write(' '); - if (!"".equals(prefix)) - { - writer.write(prefix); - writer.write(':'); - } - writer.write(localName); - writer.write('='); - writer.write('"'); - if (hasXML11RestrictedChars) - writeEncodedWithRestrictedChars(value, true); - else - writeEncoded(value, true); - writer.write('"'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeAttribute(String namespaceURI, String localName, - String value) - throws XMLStreamException - { - if (!inStartElement) - throw new IllegalStateException(); - try - { - if (namespaceURI != null && !isURI(namespaceURI)) - throw new IllegalArgumentException("illegal URI: " + namespaceURI); - if (!isName(localName)) - throw new IllegalArgumentException("illegal Name: " + localName); - if (!isChars(value)) - throw new IllegalArgumentException("illegal character: " + value); - - String prefix = getPrefix(namespaceURI); - if (prefix == null) - { - if (prefixDefaulting) - { - prefix = XMLConstants.DEFAULT_NS_PREFIX; - writeNamespaceImpl(prefix, namespaceURI); - } - else - throw new XMLStreamException("namespace " + namespaceURI + - " is not bound"); - } - writer.write(' '); - if (!"".equals(prefix)) - { - writer.write(prefix); - writer.write(':'); - } - writer.write(localName); - writer.write('='); - writer.write('"'); - if (hasXML11RestrictedChars) - writeEncodedWithRestrictedChars(value, true); - else - writeEncoded(value, true); - writer.write('"'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeNamespace(String prefix, String namespaceURI) - throws XMLStreamException - { - if (prefix == null || "".equals(prefix) || "xmlns".equals(prefix)) - { - writeDefaultNamespace(namespaceURI); - return; - } - if (!inStartElement) - throw new IllegalStateException(); - try - { - if (!isURI(namespaceURI)) - throw new IllegalArgumentException("illegal URI: " + namespaceURI); - if (!isPrefix(prefix)) - throw new IllegalArgumentException("illegal NCName: " + prefix); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - writeNamespaceImpl(prefix, namespaceURI); - } - - private void writeNamespaceImpl(String prefix, String namespaceURI) - throws XMLStreamException - { - try - { - if (prefix == null) - prefix = XMLConstants.DEFAULT_NS_PREFIX; - - setPrefix(prefix, namespaceURI); - - writer.write(' '); - writer.write("xmlns"); - if (!XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) - { - writer.write(':'); - writer.write(prefix); - } - writer.write('='); - writer.write('"'); - writer.write(namespaceURI); - writer.write('"'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeDefaultNamespace(String namespaceURI) - throws XMLStreamException - { - if (!inStartElement) - throw new IllegalStateException(); - if (!isURI(namespaceURI)) - throw new IllegalArgumentException("illegal URI: " + namespaceURI); - writeNamespaceImpl(XMLConstants.DEFAULT_NS_PREFIX, namespaceURI); - } - - public void writeComment(String data) - throws XMLStreamException - { - if (data == null) - return; - try - { - if (!isChars(data)) - throw new IllegalArgumentException("illegal XML character: " + data); - if (data.indexOf("--") != -1) - throw new IllegalArgumentException("illegal comment: " + data); - - endStartElement(); - - writer.write("<!--"); - if (hasXML11RestrictedChars) - { - int[] seq = UnicodeReader.toCodePointArray(data); - for (int i = 0; i < seq.length; i++) - { - int c = seq[i]; - if (XMLParser.isXML11RestrictedChar(c)) - writer.write("&#x" + Integer.toHexString(c) + ";"); - else - writer.write(Character.toChars(i)); - } - } - else - writer.write(data); - writer.write("-->"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeProcessingInstruction(String target) - throws XMLStreamException - { - writeProcessingInstruction(target, null); - } - - public void writeProcessingInstruction(String target, String data) - throws XMLStreamException - { - try - { - if (!isName(target) || "xml".equalsIgnoreCase(target)) - throw new IllegalArgumentException("illegal PITarget: " + target); - if (data != null && !isChars(data)) - throw new IllegalArgumentException("illegal XML character: " + data); - - endStartElement(); - - writer.write('<'); - writer.write('?'); - writer.write(target); - if (data != null) - { - writer.write(' '); - if (hasXML11RestrictedChars) - { - int[] seq = UnicodeReader.toCodePointArray(data); - for (int i = 0; i < seq.length; i++) - { - int c = seq[i]; - if (XMLParser.isXML11RestrictedChar(c)) - writer.write("&#x" + Integer.toHexString(c) + ";"); - else - writer.write(Character.toChars(i)); - } - } - else - writer.write(data); - } - writer.write('?'); - writer.write('>'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeCData(String data) - throws XMLStreamException - { - try - { - if (!isChars(data) || hasXML11RestrictedChars) - throw new IllegalArgumentException("illegal XML character: " + data); - if (data.indexOf("]]") != -1) - throw new IllegalArgumentException("illegal CDATA section: " + data); - - endStartElement(); - - writer.write("<![CDATA["); - writer.write(data); - writer.write("]]>"); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeDTD(String dtd) - throws XMLStreamException - { - try - { - // XXX: Should we parse the doctypedecl at this point to ensure - // wellformedness? - writer.write("<!DOCTYPE "); - writer.write(dtd); - writer.write('>'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeEntityRef(String name) - throws XMLStreamException - { - try - { - if (!isName(name)) - throw new IllegalArgumentException("illegal Name: " + name); - - endStartElement(); - - writer.write('&'); - writer.write(name); - writer.write(';'); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeStartDocument() - throws XMLStreamException - { - writeStartDocument(null, null); - } - - public void writeStartDocument(String version) - throws XMLStreamException - { - writeStartDocument(null, version); - } - - public void writeStartDocument(String encoding, String version) - throws XMLStreamException - { - if (version == null) - version = "1.0"; - else if ("1.1".equals(version)) - xml11 = true; - encoding = this.encoding; // YES: the parameter must be ignored - if (encoding == null) - encoding = "UTF-8"; - if (!"1.0".equals(version) && !"1.1".equals(version)) - throw new IllegalArgumentException(version); - try - { - writer.write("<?xml version=\""); - writer.write(version); - writer.write("\" encoding=\""); - writer.write(encoding); - writer.write("\"?>"); - writer.write(System.getProperty("line.separator")); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeCharacters(String text) - throws XMLStreamException - { - if (text == null) - return; - try - { - if (!isChars(text)) - throw new IllegalArgumentException("illegal XML character: " + text); - - endStartElement(); - - if (hasXML11RestrictedChars) - writeEncodedWithRestrictedChars(text, false); - else - writeEncoded(text, false); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - } - - public void writeCharacters(char[] text, int start, int len) - throws XMLStreamException - { - writeCharacters(new String(text, start, len)); - } - - public String getPrefix(String uri) - throws XMLStreamException - { - String prefix = namespaces.getPrefix(uri); - if (prefix == null && namespaceContext != null) - prefix = namespaceContext.getPrefix(uri); - return prefix; - } - - public void setPrefix(String prefix, String uri) - throws XMLStreamException - { - try - { - if (!isURI(uri)) - throw new IllegalArgumentException("illegal URI: " + uri); - if (!isPrefix(prefix)) - throw new IllegalArgumentException("illegal NCName: " + prefix); - } - catch (IOException e) - { - XMLStreamException e2 = new XMLStreamException(e); - e2.initCause(e); - throw e2; - } - if (!namespaces.declarePrefix(prefix, uri)) - throw new XMLStreamException("illegal prefix " + prefix); - } - - public void setDefaultNamespace(String uri) - throws XMLStreamException - { - if (!isURI(uri)) - throw new IllegalArgumentException("illegal URI: " + uri); - if (!namespaces.declarePrefix(XMLConstants.DEFAULT_NS_PREFIX, uri)) - throw new XMLStreamException("illegal default namespace prefix"); - } - - public void setNamespaceContext(NamespaceContext context) - throws XMLStreamException - { - namespaceContext = context; - } - - public NamespaceContext getNamespaceContext() - { - return namespaceContext; - } - - public Object getProperty(String name) - throws IllegalArgumentException - { - throw new IllegalArgumentException(name); - } - - /** - * Write the specified text, ensuring that the content is suitably encoded - * for XML. - * @param text the text to write - * @param inAttr whether we are in an attribute value - */ - private void writeEncoded(String text, boolean inAttr) - throws IOException - { - char[] chars = text.toCharArray(); - int start = 0; - int end = chars.length; - int len = 0; - for (int i = start; i < end; i++) - { - char c = chars[i]; - if (c == '<' || c == '>' || c == '&') - { - writer.write(chars, start, len); - if (c == '<') - writer.write("<"); - else if (c == '>') - writer.write(">"); - else - writer.write("&"); - start = i + 1; - len = 0; - } - else if (inAttr && (c == '"' || c == '\'')) - { - writer.write(chars, start, len); - if (c == '"') - writer.write("""); - else - writer.write("'"); - start = i + 1; - len = 0; - } - else - len++; - } - if (len > 0) - writer.write(chars, start, len); - } - - /** - * Writes the specified text, in the knowledge that some of the - * characters are XML 1.1 restricted characters. - */ - private void writeEncodedWithRestrictedChars(String text, boolean inAttr) - throws IOException - { - int[] seq = UnicodeReader.toCodePointArray(text); - for (int i = 0; i < seq.length; i++) - { - int c = seq[i]; - switch (c) - { - case 0x3c: // '<' - writer.write("<"); - break; - case 0x3e: // '>' - writer.write(">"); - break; - case 0x26: // '&' - writer.write("&"); - break; - case 0x22: // '"' - if (inAttr) - writer.write("""); - else - writer.write(c); - break; - case 0x27: // '\'' - if (inAttr) - writer.write("'"); - else - writer.write(c); - break; - default: - if (XMLParser.isXML11RestrictedChar(c)) - writer.write("&#x" + Integer.toHexString(c) + ";"); - else - { - char[] chars = Character.toChars(c); - writer.write(chars, 0, chars.length); - } - } - } - } - - private boolean isName(String text) - throws IOException - { - if (text == null) - return false; - int[] seq = UnicodeReader.toCodePointArray(text); - if (seq.length < 1) - return false; - if (!XMLParser.isNameStartCharacter(seq[0], xml11)) - return false; - for (int i = 1; i < seq.length; i++) - { - if (!XMLParser.isNameCharacter(seq[i], xml11)) - return false; - } - return true; - } - - private boolean isPrefix(String text) - throws IOException - { - if (XMLConstants.DEFAULT_NS_PREFIX.equals(text)) { - return true; - } - return isNCName(text); - } - - private boolean isNCName(String text) - throws IOException - { - if (text == null) - return false; - int[] seq = UnicodeReader.toCodePointArray(text); - if (seq.length < 1) - return false; - if (!XMLParser.isNameStartCharacter(seq[0], xml11) || seq[0] == 0x3a) - return false; - for (int i = 1; i < seq.length; i++) - { - if (!XMLParser.isNameCharacter(seq[i], xml11) || seq[i] == 0x3a) - return false; - } - return true; - } - - private boolean isChars(String text) - throws IOException - { - if (text == null) - return false; - int[] seq = UnicodeReader.toCodePointArray(text); - hasXML11RestrictedChars = false; - if (xml11) - { - for (int i = 0; i < seq.length; i++) - { - if (!XMLParser.isXML11Char(seq[i])) - return false; - if (XMLParser.isXML11RestrictedChar(seq[i])) - hasXML11RestrictedChars = true; - } - } - else - { - for (int i = 0; i < seq.length; i++) - { - if (!XMLParser.isChar(seq[i])) - return false; - } - } - return true; - } - - private boolean isURI(String text) - { - if (text == null) - return false; - char[] chars = text.toCharArray(); - if (chars.length < 1) - return false; - for (int i = 0; i < chars.length; i++) - { - if (chars[i] < 0x20 || chars[i] >= 0x7f) - return false; - } - return true; - } - -} |