aboutsummaryrefslogtreecommitdiff
path: root/src/share/jaxws_classes/com/sun/xml/internal/xsom/impl/parser/NGCCRuntimeEx.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/jaxws_classes/com/sun/xml/internal/xsom/impl/parser/NGCCRuntimeEx.java')
-rw-r--r--src/share/jaxws_classes/com/sun/xml/internal/xsom/impl/parser/NGCCRuntimeEx.java516
1 files changed, 0 insertions, 516 deletions
diff --git a/src/share/jaxws_classes/com/sun/xml/internal/xsom/impl/parser/NGCCRuntimeEx.java b/src/share/jaxws_classes/com/sun/xml/internal/xsom/impl/parser/NGCCRuntimeEx.java
deleted file mode 100644
index 41f64cee..00000000
--- a/src/share/jaxws_classes/com/sun/xml/internal/xsom/impl/parser/NGCCRuntimeEx.java
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.xml.internal.xsom.impl.parser;
-
-import com.sun.xml.internal.xsom.XSDeclaration;
-import com.sun.xml.internal.xsom.XmlString;
-import com.sun.xml.internal.xsom.XSSimpleType;
-import com.sun.xml.internal.xsom.impl.ForeignAttributesImpl;
-import com.sun.xml.internal.xsom.impl.SchemaImpl;
-import com.sun.xml.internal.xsom.impl.UName;
-import com.sun.xml.internal.xsom.impl.Const;
-import com.sun.xml.internal.xsom.impl.parser.state.NGCCRuntime;
-import com.sun.xml.internal.xsom.impl.parser.state.Schema;
-import com.sun.xml.internal.xsom.impl.util.Uri;
-import com.sun.xml.internal.xsom.parser.AnnotationParser;
-import org.relaxng.datatype.ValidationContext;
-import org.xml.sax.Attributes;
-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.helpers.LocatorImpl;
-
-import java.io.IOException;
-import java.net.URI;
-import java.text.MessageFormat;
-import java.util.Stack;
-
-/**
- * NGCCRuntime extended with various utility methods for
- * parsing XML Schema.
- *
- * @author Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
- */
-public class NGCCRuntimeEx extends NGCCRuntime implements PatcherManager {
-
- /** coordinator. */
- public final ParserContext parser;
-
- /** The schema currently being parsed. */
- public SchemaImpl currentSchema;
-
- /** The @finalDefault value of the current schema. */
- public int finalDefault = 0;
- /** The @blockDefault value of the current schema. */
- public int blockDefault = 0;
-
- /**
- * The @elementFormDefault value of the current schema.
- * True if local elements are qualified by default.
- */
- public boolean elementFormDefault = false;
-
- /**
- * The @attributeFormDefault value of the current schema.
- * True if local attributes are qualified by default.
- */
- public boolean attributeFormDefault = false;
-
- /**
- * True if the current schema is in a chameleon mode.
- * This changes the way QNames are interpreted.
- *
- * Life is very miserable with XML Schema, as you see.
- */
- public boolean chameleonMode = false;
-
- /**
- * URI that identifies the schema document.
- * Maybe null if the system ID is not available.
- */
- private String documentSystemId;
-
- /**
- * Keep the local name of elements encountered so far.
- * This information is passed to AnnotationParser as
- * context information
- */
- private final Stack<String> elementNames = new Stack<String>();
-
- /**
- * Points to the schema document (the parser of it) that included/imported
- * this schema.
- */
- private final NGCCRuntimeEx referer;
-
- /**
- * Points to the {@link SchemaDocumentImpl} that represents the
- * schema document being parsed.
- */
- public SchemaDocumentImpl document;
-
- NGCCRuntimeEx( ParserContext _parser ) {
- this(_parser,false,null);
- }
-
- private NGCCRuntimeEx( ParserContext _parser, boolean chameleonMode, NGCCRuntimeEx referer ) {
- this.parser = _parser;
- this.chameleonMode = chameleonMode;
- this.referer = referer;
-
- // set up the default namespace binding
- currentContext = new Context("","",null);
- currentContext = new Context("xml","http://www.w3.org/XML/1998/namespace",currentContext);
- }
-
- public void checkDoubleDefError( XSDeclaration c ) throws SAXException {
- if(c==null || ignorableDuplicateComponent(c)) return;
-
- reportError( Messages.format(Messages.ERR_DOUBLE_DEFINITION,c.getName()) );
- reportError( Messages.format(Messages.ERR_DOUBLE_DEFINITION_ORIGINAL), c.getLocator() );
- }
-
- public static boolean ignorableDuplicateComponent(XSDeclaration c) {
- if(c.getTargetNamespace().equals(Const.schemaNamespace)) {
- if(c instanceof XSSimpleType)
- // hide artificial "double definitions" on simple types
- return true;
- if(c.isGlobal() && c.getName().equals("anyType"))
- return true; // ditto for anyType
- }
- return false;
- }
-
-
-
- /* registers a patcher that will run after all the parsing has finished. */
- public void addPatcher( Patch patcher ) {
- parser.patcherManager.addPatcher(patcher);
- }
- public void addErrorChecker( Patch patcher ) {
- parser.patcherManager.addErrorChecker(patcher);
- }
- public void reportError( String msg, Locator loc ) throws SAXException {
- parser.patcherManager.reportError(msg,loc);
- }
- public void reportError( String msg ) throws SAXException {
- reportError(msg,getLocator());
- }
-
-
- /**
- * Resolves relative URI found in the document.
- *
- * @param namespaceURI
- * passed to the entity resolver.
- * @param relativeUri
- * value of the schemaLocation attribute. Can be null.
- *
- * @return
- * non-null if {@link EntityResolver} returned an {@link InputSource},
- * or if the relativeUri parameter seems to be pointing to something.
- * Otherwise it returns null, in which case import/include should be abandoned.
- */
- private InputSource resolveRelativeURL( String namespaceURI, String relativeUri ) throws SAXException {
- try {
- String baseUri = getLocator().getSystemId();
- if(baseUri==null)
- // if the base URI is not available, the document system ID is
- // better than nothing.
- baseUri=documentSystemId;
-
- EntityResolver er = parser.getEntityResolver();
- String systemId = null;
-
- if (relativeUri!=null)
- systemId = Uri.resolve(baseUri,relativeUri);
-
- if (er!=null) {
- InputSource is = er.resolveEntity(namespaceURI,systemId);
- if (is == null) {
- try {
- String normalizedSystemId = URI.create(systemId).normalize().toASCIIString();
- is = er.resolveEntity(namespaceURI,normalizedSystemId);
- } catch (Exception e) {
- // just ignore, this is a second try, return the fallback if this breaks
- }
- }
- if (is != null) {
- return is;
- }
- }
-
- if (systemId!=null)
- return new InputSource(systemId);
- else
- return null;
- } catch (IOException e) {
- SAXParseException se = new SAXParseException(e.getMessage(),getLocator(),e);
- parser.errorHandler.error(se);
- return null;
- }
- }
-
- /** Includes the specified schema. */
- public void includeSchema( String schemaLocation ) throws SAXException {
- NGCCRuntimeEx runtime = new NGCCRuntimeEx(parser,chameleonMode,this);
- runtime.currentSchema = this.currentSchema;
- runtime.blockDefault = this.blockDefault;
- runtime.finalDefault = this.finalDefault;
-
- if( schemaLocation==null ) {
- SAXParseException e = new SAXParseException(
- Messages.format( Messages.ERR_MISSING_SCHEMALOCATION ), getLocator() );
- parser.errorHandler.fatalError(e);
- throw e;
- }
-
- runtime.parseEntity( resolveRelativeURL(null,schemaLocation),
- true, currentSchema.getTargetNamespace(), getLocator() );
- }
-
- /** Imports the specified schema. */
- public void importSchema( String ns, String schemaLocation ) throws SAXException {
- NGCCRuntimeEx newRuntime = new NGCCRuntimeEx(parser,false,this);
- InputSource source = resolveRelativeURL(ns,schemaLocation);
- if(source!=null)
- newRuntime.parseEntity( source, false, ns, getLocator() );
- // if source == null,
- // we can't locate this document. Let's just hope that
- // we already have the schema components for this schema
- // or we will receive them in the future.
- }
-
- /**
- * Called when a new document is being parsed and checks
- * if the document has already been parsed before.
- *
- * <p>
- * Used to avoid recursive inclusion. Note that the same
- * document will be parsed multiple times if they are for different
- * target namespaces.
- *
- * <h2>Document Graph Model</h2>
- * <p>
- * The challenge we are facing here is that you have a graph of
- * documents that reference each other. Each document has an unique
- * URI to identify themselves, and references are done by using those.
- * The graph may contain cycles.
- *
- * <p>
- * Our goal here is to parse all the documents in the graph, without
- * parsing the same document twice. This method implements this check.
- *
- * <p>
- * One complication is the chameleon schema; a document can be parsed
- * multiple times if they are under different target namespaces.
- *
- * <p>
- * Also, note that when you resolve relative URIs in the @schemaLocation,
- * their base URI is *NOT* the URI of the document.
- *
- * @return true if the document has already been processed and thus
- * needs to be skipped.
- */
- public boolean hasAlreadyBeenRead() {
- if( documentSystemId!=null ) {
- if( documentSystemId.startsWith("file:///") )
- // change file:///abc to file:/abc
- // JDK File.toURL method produces the latter, but according to RFC
- // I don't think that's a valid URL. Since two different ways of
- // producing URLs could produce those two different forms,
- // we need to canonicalize one to the other.
- documentSystemId = "file:/"+documentSystemId.substring(8);
- } else {
- // if the system Id is not provided, we can't test the identity,
- // so we have no choice but to read it.
- // the newly created SchemaDocumentImpl will be unique one
- }
-
- assert document ==null;
- document = new SchemaDocumentImpl( currentSchema, documentSystemId );
-
- SchemaDocumentImpl existing = parser.parsedDocuments.get(document);
- if(existing==null) {
- parser.parsedDocuments.put(document,document);
- } else {
- document = existing;
- }
-
- assert document !=null;
-
- if(referer!=null) {
- assert referer.document !=null : "referer "+referer.documentSystemId+" has docIdentity==null";
- referer.document.references.add(this.document);
- this.document.referers.add(referer.document);
- }
-
- return existing!=null;
- }
-
- /**
- * Parses the specified entity.
- *
- * @param importLocation
- * The source location of the import/include statement.
- * Used for reporting errors.
- */
- public void parseEntity( InputSource source, boolean includeMode, String expectedNamespace, Locator importLocation )
- throws SAXException {
-
- documentSystemId = source.getSystemId();
- try {
- Schema s = new Schema(this,includeMode,expectedNamespace);
- setRootHandler(s);
- try {
- parser.parser.parse(source,this, getErrorHandler(), parser.getEntityResolver());
- } catch( IOException fnfe ) {
- SAXParseException se = new SAXParseException(fnfe.toString(), importLocation, fnfe);
- parser.errorHandler.warning(se);
- }
- } catch( SAXException e ) {
- parser.setErrorFlag();
- throw e;
- }
- }
-
- /**
- * Creates a new instance of annotation parser.
- */
- public AnnotationParser createAnnotationParser() {
- if(parser.getAnnotationParserFactory()==null)
- return DefaultAnnotationParser.theInstance;
- else
- return parser.getAnnotationParserFactory().create();
- }
-
- /**
- * Gets the element name that contains the annotation element.
- * This method works correctly only when called by the annotation handler.
- */
- public String getAnnotationContextElementName() {
- return elementNames.get( elementNames.size()-2 );
- }
-
- /** Creates a copy of the current locator object. */
- public Locator copyLocator() {
- return new LocatorImpl(getLocator());
- }
-
- public ErrorHandler getErrorHandler() {
- return parser.errorHandler;
- }
-
- @Override
- public void onEnterElementConsumed(String uri, String localName, String qname, Attributes atts)
- throws SAXException {
- super.onEnterElementConsumed(uri, localName, qname, atts);
- elementNames.push(localName);
- }
-
- @Override
- public void onLeaveElementConsumed(String uri, String localName, String qname) throws SAXException {
- super.onLeaveElementConsumed(uri, localName, qname);
- elementNames.pop();
- }
-
-
-
-//
-//
-// ValidationContext implementation
-//
-//
- // this object lives longer than the parser itself,
- // so it's important for this object not to have any reference
- // to the parser.
- private static class Context implements ValidationContext {
- Context( String _prefix, String _uri, Context _context ) {
- this.previous = _context;
- this.prefix = _prefix;
- this.uri = _uri;
- }
-
- public String resolveNamespacePrefix(String p) {
- if(p.equals(prefix)) return uri;
- if(previous==null) return null;
- else return previous.resolveNamespacePrefix(p);
- }
-
- private final String prefix;
- private final String uri;
- private final Context previous;
-
- // XSDLib don't use those methods, so we cut a corner here.
- public String getBaseUri() { return null; }
- public boolean isNotation(String arg0) { return false; }
- public boolean isUnparsedEntity(String arg0) { return false; }
- }
-
- private Context currentContext=null;
-
- /** Returns an immutable snapshot of the current context. */
- public ValidationContext createValidationContext() {
- return currentContext;
- }
-
- public XmlString createXmlString(String value) {
- if(value==null) return null;
- else return new XmlString(value,createValidationContext());
- }
-
- @Override
- public void startPrefixMapping( String prefix, String uri ) throws SAXException {
- super.startPrefixMapping(prefix,uri);
- currentContext = new Context(prefix,uri,currentContext);
- }
- @Override
- public void endPrefixMapping( String prefix ) throws SAXException {
- super.endPrefixMapping(prefix);
- currentContext = currentContext.previous;
- }
-
-
-
-
-
-//
-//
-// Utility functions
-//
-//
-
-
- /** Parses UName under the given context. */
- public UName parseUName( String qname ) throws SAXException {
- int idx = qname.indexOf(':');
- if(idx<0) {
- String uri = resolveNamespacePrefix("");
-
- // chamelon behavior. ugly...
- if( uri.equals("") && chameleonMode )
- uri = currentSchema.getTargetNamespace();
-
- // this is guaranteed to resolve
- return new UName(uri,qname,qname);
- } else {
- String prefix = qname.substring(0,idx);
- String uri = currentContext.resolveNamespacePrefix(prefix);
- if(uri==null) {
- // prefix failed to resolve.
- reportError(Messages.format(
- Messages.ERR_UNDEFINED_PREFIX,prefix));
- uri="undefined"; // replace with a dummy
- }
- return new UName( uri, qname.substring(idx+1), qname );
- }
- }
-
- public boolean parseBoolean(String v) {
- if(v==null) return false;
- v=v.trim();
- return v.equals("true") || v.equals("1");
- }
-
-
- @Override
- protected void unexpectedX(String token) throws SAXException {
- SAXParseException e = new SAXParseException(MessageFormat.format(
- "Unexpected {0} appears at line {1} column {2}",
- token,
- getLocator().getLineNumber(),
- getLocator().getColumnNumber()),
- getLocator());
-
- parser.errorHandler.fatalError(e);
- throw e; // we will abort anyway
- }
-
- public ForeignAttributesImpl parseForeignAttributes( ForeignAttributesImpl next ) {
- ForeignAttributesImpl impl = new ForeignAttributesImpl(createValidationContext(),copyLocator(),next);
-
- Attributes atts = getCurrentAttributes();
- for( int i=0; i<atts.getLength(); i++ ) {
- if(atts.getURI(i).length()>0) {
- impl.addAttribute(
- atts.getURI(i),
- atts.getLocalName(i),
- atts.getQName(i),
- atts.getType(i),
- atts.getValue(i)
- );
- }
- }
-
- return impl;
- }
-
-
- public static final String XMLSchemaNSURI = "http://www.w3.org/2001/XMLSchema";
-}