diff options
Diffstat (limited to 'libjava/classpath/gnu/xml/stream/XMLStreamReaderImpl.java')
-rw-r--r-- | libjava/classpath/gnu/xml/stream/XMLStreamReaderImpl.java | 1037 |
1 files changed, 1037 insertions, 0 deletions
diff --git a/libjava/classpath/gnu/xml/stream/XMLStreamReaderImpl.java b/libjava/classpath/gnu/xml/stream/XMLStreamReaderImpl.java new file mode 100644 index 00000000000..568d800ae0d --- /dev/null +++ b/libjava/classpath/gnu/xml/stream/XMLStreamReaderImpl.java @@ -0,0 +1,1037 @@ +/* XMLStreamReaderImpl.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.IOException; +import java.io.Reader; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; +import javax.xml.namespace.NamespaceContext; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.stream.Location; +import javax.xml.stream.XMLResolver; +import javax.xml.stream.XMLReporter; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +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.EndEntity; +import javax.xml.stream.events.EntityDeclaration; +import javax.xml.stream.events.EntityReference; +import javax.xml.stream.events.Namespace; +import javax.xml.stream.events.NotationDeclaration; +import javax.xml.stream.events.ProcessingInstruction; +import javax.xml.stream.events.StartDocument; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.StartEntity; +import javax.xml.stream.events.XMLEvent; + +import org.xml.sax.Attributes; +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.Locator; +import org.xml.sax.SAXException; +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; +import org.xml.sax.helpers.NamespaceSupport; + +/** + * An XML parser. + * + * This implementation uses SAX to create a series of events in memory, + * and then iterates over this series. This has the advantage of being simple + * and unifying the existing XML parsing code. However, it is quite + * memory-inefficient and obviously won't cope with streams of arbitrary + * length. + * + * A future task could be to write a real, progressive/incremental + * implementation of this class. In that case we should consider making that + * the default XML parser implementation and using a SAX wrapper to it to + * provide the GNU SAX implementation. + * + * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> + */ +public class XMLStreamReaderImpl + implements XMLStreamReader, NamespaceContext +{ + + private LinkedList events; + private XMLEvent currentEvent; + private int eventType; + private NamespaceSupport namespaces; + + protected String publicId; + protected String systemId; + + protected XMLResolver resolver; + protected XMLReporter reporter; + protected boolean validating; + protected boolean namespaceAware; + protected boolean coalescing; + protected boolean replacingEntityReferences; + protected boolean externalEntities; + protected boolean supportDTD; + + protected XMLStreamReaderImpl(InputStream in, + String publicId, + String systemId, + XMLResolver resolver, + XMLReporter reporter, + boolean validating, + boolean namespaceAware, + boolean coalescing, + boolean replacingEntityReferences, + boolean externalEntities, + boolean supportDTD) + throws XMLStreamException + { + //this.in = in; + this.publicId = publicId; + this.systemId = systemId; + this.resolver = resolver; + this.reporter = reporter; + this.validating = validating; + this.namespaceAware = namespaceAware; + this.coalescing = coalescing; + this.replacingEntityReferences = replacingEntityReferences; + this.externalEntities = externalEntities; + this.supportDTD = supportDTD; + namespaces = new NamespaceSupport(); + events = new LinkedList(); + + // Configure the SAX parser and perform the parse + try + { + SAXParserFactory f = SAXParserFactory.newInstance(); + f.setNamespaceAware(namespaceAware); + f.setValidating(validating); + SAXParser p = f.newSAXParser(); + XMLReader r = p.getXMLReader(); + CallbackHandler ch = this.new CallbackHandler(r); + r.setFeature("http://xml.org/sax/features/external-general-entities", + externalEntities); + r.setFeature("http://xml.org/sax/features/namespaces", + namespaceAware); + r.setContentHandler(ch); + r.setDTDHandler(ch); + r.setEntityResolver(ch); + r.setErrorHandler(ch); + r.setProperty("http://xml.org/sax/properties/lexical-handler", + ch); + InputSource source = new InputSource(in); + source.setSystemId(systemId); + r.parse(source); + } + catch (SAXException e) + { + events.add(e); + } + catch (IOException e) + { + events.add(e); + } + catch (ParserConfigurationException e) + { + XMLStreamException e2 = new XMLStreamException(e); + e2.initCause(e); + throw e2; + } + } + + protected XMLStreamReaderImpl(Reader reader, + String publicId, + String systemId, + XMLResolver resolver, + XMLReporter reporter, + boolean validating, + boolean namespaceAware, + boolean coalescing, + boolean replacingEntityReferences, + boolean externalEntities, + boolean supportDTD) + throws XMLStreamException + { + //this.reader = reader; + this.publicId = publicId; + this.systemId = systemId; + this.resolver = resolver; + this.reporter = reporter; + this.validating = validating; + this.namespaceAware = namespaceAware; + this.coalescing = coalescing; + this.replacingEntityReferences = replacingEntityReferences; + this.externalEntities = externalEntities; + this.supportDTD = supportDTD; + namespaces = new NamespaceSupport(); + events = new LinkedList(); + + // Configure the SAX parser and perform the parse + try + { + SAXParserFactory f = SAXParserFactory.newInstance(); + f.setNamespaceAware(namespaceAware); + f.setValidating(validating); + SAXParser p = f.newSAXParser(); + XMLReader r = p.getXMLReader(); + CallbackHandler ch = this.new CallbackHandler(r); + r.setFeature("http://xml.org/sax/features/external-general-entities", + externalEntities); + r.setFeature("http://xml.org/sax/features/namespaces", + namespaceAware); + r.setContentHandler(ch); + r.setDTDHandler(ch); + r.setEntityResolver(ch); + r.setErrorHandler(ch); + r.setProperty("http://xml.org/sax/properties/lexical-handler", + ch); + InputSource source = new InputSource(reader); + source.setSystemId(systemId); + r.parse(source); + } + catch (SAXException e) + { + events.add(e); + } + catch (IOException e) + { + events.add(e); + } + catch (ParserConfigurationException e) + { + XMLStreamException e2 = new XMLStreamException(e); + e2.initCause(e); + throw e2; + } + } + + public Object getProperty(String name) + throws IllegalArgumentException + { + throw new IllegalArgumentException(name); + } + + public int next() + throws XMLStreamException + { + if (events.isEmpty()) + throw new XMLStreamException("EOF"); + Object event = events.removeFirst(); + if (event instanceof Exception) + { + Exception e = (Exception) event; + XMLStreamException e2 = new XMLStreamException(e); + e2.initCause(e); + throw e2; + } + currentEvent = (XMLEvent) event; + eventType = currentEvent.getEventType(); + return eventType; + } + + public void require(int type, String namespaceURI, String localName) + throws XMLStreamException + { + // TODO + throw new UnsupportedOperationException(); + } + + public String getElementText() + throws XMLStreamException + { + // TODO + throw new UnsupportedOperationException(); + } + + public int nextTag() + throws XMLStreamException + { + int ret; + do + { + ret = next(); + } + while (ret != XMLStreamConstants.START_ELEMENT && + ret != XMLStreamConstants.END_ELEMENT); + return ret; + } + + public boolean hasNext() + throws XMLStreamException + { + return !events.isEmpty(); + } + + public void close() + throws XMLStreamException + { + } + + public String getNamespaceURI(String prefix) + { + return namespaces.getURI(prefix); + } + + public String getPrefix(String namespaceURI) + { + return namespaces.getPrefix(namespaceURI); + } + + public Iterator getPrefixes(String namespaceURI) + { + LinkedList acc = new LinkedList(); + for (Enumeration e = namespaces.getPrefixes(namespaceURI); + e.hasMoreElements(); ) + acc.add(e.nextElement()); + return acc.iterator(); + } + + public boolean isStartElement() + { + return eventType == START_ELEMENT; + } + + public boolean isEndElement() + { + return eventType == END_ELEMENT; + } + + public boolean isCharacters() + { + return eventType == CHARACTERS || eventType == CDATA; + } + + public boolean isWhiteSpace() + { + return eventType == SPACE; + } + + public String getAttributeValue(String namespaceURI, String localName) + { + StartElement se = (StartElement) currentEvent; + for (Iterator i = se.getAttributes(); i.hasNext(); ) + { + Attribute attr = (Attribute) i.next(); + QName name = attr.getName(); + if (namespaceURI != null && + !namespaceURI.equals(name.getNamespaceURI())) + continue; + if (!localName.equals(name.getLocalPart())) + continue; + return attr.getValue(); + } + return null; + } + + public int getAttributeCount() + { + StartElement se = (StartElement) currentEvent; + int count = 0; + for (Iterator i = se.getAttributes(); i.hasNext(); ) + { + i.next(); + count++; + } + return count; + } + + public QName getAttributeQName(int index) + { + StartElement se = (StartElement) currentEvent; + int count = 0; + for (Iterator i = se.getAttributes(); i.hasNext(); ) + { + Attribute attr = (Attribute) i.next(); + if (index == count) + return attr.getName(); + count++; + } + return null; + } + + public String getAttributeNamespace(int index) + { + QName name = getAttributeQName(index); + return (name == null) ? null : name.getNamespaceURI(); + } + + public String getAttributeName(int index) + { + QName name = getAttributeQName(index); + return (name == null) ? null : name.getLocalPart(); + } + + public String getAttributePrefix(int index) + { + QName name = getAttributeQName(index); + return (name == null) ? null : name.getPrefix(); + } + + public String getAttributeType(int index) + { + StartElement se = (StartElement) currentEvent; + int count = 0; + for (Iterator i = se.getAttributes(); i.hasNext(); ) + { + Attribute attr = (Attribute) i.next(); + if (index == count) + { + QName type = attr.getDTDType(); + return (type == null) ? "CDATA" : type.toString(); + } + count++; + } + return null; + } + + public String getAttributeValue(int index) + { + StartElement se = (StartElement) currentEvent; + int count = 0; + for (Iterator i = se.getAttributes(); i.hasNext(); ) + { + Attribute attr = (Attribute) i.next(); + if (index == count) + return attr.getValue(); + count++; + } + return null; + } + + public boolean isAttributeSpecified(int index) + { + StartElement se = (StartElement) currentEvent; + int count = 0; + for (Iterator i = se.getAttributes(); i.hasNext(); ) + { + Attribute attr = (Attribute) i.next(); + if (index == count) + return attr.isSpecified(); + count++; + } + return false; + } + + public int getNamespaceCount() + { + Iterator i = null; + switch (eventType) + { + case XMLStreamConstants.START_ELEMENT: + i = ((StartElement) currentEvent).getNamespaces(); + break; + case XMLStreamConstants.END_ELEMENT: + i = ((EndElement) currentEvent).getNamespaces(); + break; + default: + throw new IllegalStateException(); + } + int count = 0; + while (i.hasNext()) + { + i.next(); + count++; + } + return count; + } + + public String getNamespacePrefix(int index) + { + Iterator i = null; + switch (eventType) + { + case XMLStreamConstants.START_ELEMENT: + i = ((StartElement) currentEvent).getNamespaces(); + break; + case XMLStreamConstants.END_ELEMENT: + i = ((EndElement) currentEvent).getNamespaces(); + break; + default: + throw new IllegalStateException(); + } + int count = 0; + while (i.hasNext()) + { + Namespace ns = (Namespace) i.next(); + if (index == count) + return ns.getPrefix(); + count++; + } + return null; + } + + public String getNamespaceURI(int index) + { + Iterator i = null; + switch (eventType) + { + case XMLStreamConstants.START_ELEMENT: + i = ((StartElement) currentEvent).getNamespaces(); + break; + case XMLStreamConstants.END_ELEMENT: + i = ((EndElement) currentEvent).getNamespaces(); + break; + default: + throw new IllegalStateException(); + } + int count = 0; + while (i.hasNext()) + { + Namespace ns = (Namespace) i.next(); + if (index == count) + return ns.getNamespaceURI(); + count++; + } + return null; + } + + public NamespaceContext getNamespaceContext() + { + return this; + } + + public int getEventType() + { + return eventType; + } + + public String getText() + { + switch (eventType) + { + case XMLStreamConstants.CHARACTERS: + case XMLStreamConstants.CDATA: + case XMLStreamConstants.SPACE: + return ((Characters) currentEvent).getData(); + case XMLStreamConstants.COMMENT: + return ((Comment) currentEvent).getText(); + case XMLStreamConstants.ENTITY_REFERENCE: + return ((EntityReference) currentEvent).getReplacementText(); + case XMLStreamConstants.DTD: + return ((DTD) currentEvent).getDocumentTypeDeclaration(); + } + return null; + } + + public char[] getTextCharacters() + { + String text = getText(); + return (text == null) ? null : text.toCharArray(); + } + + public int getTextCharacters(int sourceStart, char[] target, + int targetStart, int length) + throws XMLStreamException + { + char[] source = getTextCharacters(); + int len = Math.min(source.length, length); + System.arraycopy(source, sourceStart, target, targetStart, len); + return len; + } + + public int getTextStart() + { + return 0; + } + + public int getTextLength() + { + String text = getText(); + return (text == null) ? 0 : text.length(); + } + + public String getEncoding() + { + // XXX SAX doesn't provide this + return null; + } + + public boolean hasText() + { + return eventType == CHARACTERS || eventType == DTD || + eventType == SPACE || eventType == ENTITY_REFERENCE || + eventType == COMMENT || eventType == DTD; + } + + public Location getLocation() + { + return currentEvent.getLocation(); + } + + public QName getName() + { + switch (eventType) + { + case XMLStreamConstants.START_ELEMENT: + return ((StartElement) currentEvent).getName(); + case XMLStreamConstants.END_ELEMENT: + return ((EndElement) currentEvent).getName(); + case XMLStreamConstants.ATTRIBUTE: + return ((Attribute) currentEvent).getName(); + } + return null; + } + + public String getLocalName() + { + QName name = getName(); + return (name == null) ? null : name.getLocalPart(); + } + + public boolean hasName() + { + return getName() != null; + } + + public String getNamespaceURI() + { + QName name = getName(); + return (name == null) ? null : name.getNamespaceURI(); + } + + public String getPrefix() + { + QName name = getName(); + return (name == null) ? null : name.getPrefix(); + } + + public String getVersion() + { + StartDocument sd = (StartDocument) currentEvent; + return sd.getVersion(); + } + + public boolean isStandalone() + { + StartDocument sd = (StartDocument) currentEvent; + return sd.isStandalone(); + } + + public boolean standaloneSet() + { + StartDocument sd = (StartDocument) currentEvent; + return sd.standaloneSet(); + } + + public String getCharacterEncodingScheme() + { + StartDocument sd = (StartDocument) currentEvent; + return sd.getCharacterEncodingScheme(); + } + + public String getPITarget() + { + ProcessingInstruction pi = (ProcessingInstruction) currentEvent; + return pi.getTarget(); + } + + public String getPIData() + { + ProcessingInstruction pi = (ProcessingInstruction) currentEvent; + return pi.getData(); + } + + /** + * This class is used to construct the event series from SAX callbacks. + */ + class CallbackHandler + implements ContentHandler, DTDHandler, LexicalHandler, + DeclHandler, EntityResolver, ErrorHandler + { + + XMLReader reader; + Locator locator; + Location location; + private boolean inCDATA; + private LinkedList namespaces = new LinkedList(); + private LinkedList notations; + private LinkedList entities; + + CallbackHandler(XMLReader reader) + { + this.reader = reader; + } + + public void setDocumentLocator(Locator locator) + { + this.locator = locator; + location = new LocationImpl(-1, + locator.getColumnNumber(), + locator.getLineNumber(), + locator.getSystemId()); + } + + public void startDocument() + throws SAXException + { + String version = (locator instanceof Locator2) ? + ((Locator2) locator).getXMLVersion() : null; + String encoding = (locator instanceof Locator2) ? + ((Locator2) locator).getEncoding() : null; + boolean standalone = + reader.getFeature("http://xml.org/sax/features/is-standalone"); + boolean standaloneDeclared = standalone; + boolean encodingDeclared = (encoding != null); + events.add(new StartDocumentImpl(location, + location.getLocationURI(), + encoding, + version, + standalone, + standaloneDeclared, + encodingDeclared)); + } + + public void endDocument() + throws SAXException + { + events.add(new EndDocumentImpl(location)); + } + + public void startPrefixMapping(String prefix, String uri) + throws SAXException + { + namespaces.add(new NamespaceImpl(location, prefix, uri)); + } + + public void endPrefixMapping(String prefix) + throws SAXException + { + } + + public void startElement(String namespaceURI, String localName, + String qName, Attributes atts) + throws SAXException + { + LinkedList ns = namespaces; + namespaces = new LinkedList(); + int ci = qName.indexOf(':'); + String prefix = null; + localName = qName; + if (ci != -1) + { + prefix = qName.substring(0, ci); + localName = qName.substring(ci + 1); + } + QName name = new QName(namespaceURI, localName, prefix); + LinkedList attrs = new LinkedList(); + StartElementImpl se = new StartElementImpl(location, name, + attrs, ns, null); + events.add(se); + // Add namespaces + //for (Iterator i = ns.iterator(); i.hasNext(); ) + // events.add(i.next()); + // Add attributes + int len = atts.getLength(); + for (int i = 0; i < len; i++) + { + String attURI = atts.getURI(i); + String attQName = atts.getQName(i); + String value = atts.getValue(i); + QName type = QName.valueOf(atts.getType(i)); + boolean specified = (atts instanceof Attributes2) && + ((Attributes2) atts).isSpecified(i); + ci = attQName.indexOf(':'); + String attPrefix = null; + String attLocalName = attQName; + if (ci != -1) + { + attPrefix = attQName.substring(0, ci); + attLocalName = attQName.substring(ci + 1); + } + if ("xmlns".equals(attPrefix) || "xmlns".equals(attQName)) + continue; + QName attrName = new QName(attURI, attLocalName, attPrefix); + AttributeImpl attr = new AttributeImpl(location, attrName, + value, type, specified); + attrs.add(attr); + //events.add(attr); + } + } + + public void endElement(String namespaceURI, String localName, + String qName) + throws SAXException + { + int ci = qName.indexOf(':'); + String prefix = null; + localName = qName; + if (ci != -1) + { + prefix = qName.substring(0, ci); + localName = qName.substring(ci + 1); + } + QName name = new QName(namespaceURI, localName, prefix); + events.add(new EndElementImpl(location, name, new LinkedList())); + // TODO namespaces out of scope + } + + public void characters(char[] ch, int start, int length) + throws SAXException + { + boolean whitespace = isWhitespace(ch, start, length); + events.add(new CharactersImpl(location, new String(ch, start, length), + whitespace, inCDATA, false)); + } + + public void ignorableWhitespace(char[] ch, int start, int length) + throws SAXException + { + boolean whitespace = isWhitespace(ch, start, length); + events.add(new CharactersImpl(location, new String(ch, start, length), + whitespace, inCDATA, true)); + } + + boolean isWhitespace(char[] ch, int start, int len) + { + int end = start + len; + for (int i = start; i < end; i++) + { + char c = ch[i]; + if (c != ' ' && c != '\t' && c != '\n' && c != '\r') + return false; + } + return true; + } + + public void processingInstruction(String target, String data) + throws SAXException + { + events.add(new ProcessingInstructionImpl(location, target, data)); + } + + public void skippedEntity(String name) + throws SAXException + { + } + + public void startDTD(String name, String publicId, String systemId) + throws SAXException + { + notations = new LinkedList(); + entities = new LinkedList(); + events.add(new DTDImpl(location, null, null, notations, entities)); + } + + public void endDTD() + throws SAXException + { + } + + public void startEntity(String name) + throws SAXException + { + events.add(new StartEntityImpl(location, name)); + } + + public void endEntity(String name) + throws SAXException + { + events.add(new EndEntityImpl(location, name)); + } + + public void startCDATA() + throws SAXException + { + inCDATA = true; + } + + public void endCDATA() + throws SAXException + { + inCDATA = false; + } + + public void comment(char[] ch, int start, int length) + throws SAXException + { + events.add(new CommentImpl(location, new String(ch, start, length))); + } + + public void notationDecl(String name, String publicId, String systemId) + throws SAXException + { + Object n = new NotationDeclarationImpl(location, name, publicId, + systemId); + notations.add(n); + //events.add(n); + } + + public void unparsedEntityDecl(String name, String publicId, + String systemId, String notationName) + throws SAXException + { + Object e = new EntityDeclarationImpl(location, publicId, systemId, + name, notationName, + null, null); + entities.add(e); + //events.add(e); + } + + public void elementDecl(String name, String model) + throws SAXException + { + } + + public void attributeDecl(String eName, String aName, String type, + String valueDefault, String value) + throws SAXException + { + } + + public void internalEntityDecl(String name, String value) + throws SAXException + { + Object e = new EntityDeclarationImpl(location, null, null, + name, null, value, null); + entities.add(e); + //events.add(e); + } + + public void externalEntityDecl(String name, String publicId, + String systemId) + throws SAXException + { + Object e = new EntityDeclarationImpl(location, publicId, systemId, + name, null, null, null); + entities.add(e); + //events.add(e); + } + + public void warning(SAXParseException e) + throws SAXException + { + if (reporter != null) + { + try + { + reporter.report(e.getMessage(), "warning", e, location); + } + catch (XMLStreamException e2) + { + SAXException e3 = new SAXException(e2.getMessage()); + e3.initCause(e2); + throw e3; + } + } + } + + public void error(SAXParseException e) + throws SAXException + { + if (reporter != null) + { + try + { + reporter.report(e.getMessage(), "error", e, location); + } + catch (XMLStreamException e2) + { + SAXException e3 = new SAXException(e2.getMessage()); + e3.initCause(e2); + throw e3; + } + } + } + + public void fatalError(SAXParseException e) + throws SAXException + { + if (reporter != null) + { + try + { + reporter.report(e.getMessage(), "fatal-error", e, location); + } + catch (XMLStreamException e2) + { + SAXException e3 = new SAXException(e2.getMessage()); + e3.initCause(e2); + throw e3; + } + } + } + + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException + { + if (resolver != null) + { + try + { + InputStream in = resolver.resolve(systemId); + if (in != null) + { + InputSource ret = new InputSource(in); + ret.setPublicId(publicId); + ret.setSystemId(systemId); + return ret; + } + } + catch (XMLStreamException e) + { + SAXException e2 = new SAXException(e.getMessage()); + e2.initCause(e); + throw e2; + } + } + return null; + } + + } + +} + |