/* * Copyright (c) 1997, 2012, 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; import com.sun.xml.internal.xsom.XSElementDecl; import com.sun.xml.internal.xsom.XSModelGroup; import com.sun.xml.internal.xsom.XSModelGroupDecl; import com.sun.xml.internal.xsom.XSTerm; import com.sun.xml.internal.xsom.XSWildcard; import com.sun.xml.internal.xsom.impl.parser.SchemaDocumentImpl; import com.sun.xml.internal.xsom.visitor.XSFunction; import com.sun.xml.internal.xsom.visitor.XSTermFunction; import com.sun.xml.internal.xsom.visitor.XSTermFunctionWithParam; import com.sun.xml.internal.xsom.visitor.XSTermVisitor; import com.sun.xml.internal.xsom.visitor.XSVisitor; import com.sun.xml.internal.xsom.visitor.XSWildcardFunction; import com.sun.xml.internal.xsom.visitor.XSWildcardVisitor; import org.xml.sax.Locator; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public abstract class WildcardImpl extends ComponentImpl implements XSWildcard, Ref.Term { protected WildcardImpl( SchemaDocumentImpl owner, AnnotationImpl _annon, Locator _loc, ForeignAttributesImpl _fa, int _mode ) { super(owner,_annon,_loc,_fa); this.mode = _mode; } private final int mode; public int getMode() { return mode; } // compute the union public WildcardImpl union( SchemaDocumentImpl owner, WildcardImpl rhs ) { if(this instanceof Any || rhs instanceof Any) return new Any(owner,null,null,null,mode); if(this instanceof Finite && rhs instanceof Finite) { Set<String> values = new HashSet<String>(); values.addAll( ((Finite)this).names ); values.addAll( ((Finite)rhs ).names ); return new Finite(owner,null,null,null,values,mode); } if(this instanceof Other && rhs instanceof Other) { if( ((Other)this).otherNamespace.equals( ((Other)rhs).otherNamespace) ) return new Other(owner,null,null,null, ((Other)this).otherNamespace, mode ); else // this somewhat strange rule is indeed in the spec return new Other(owner,null,null,null, "", mode ); } Other o; Finite f; if( this instanceof Other ) { o=(Other)this; f=(Finite)rhs; } else { o=(Other)rhs; f=(Finite)this; } if(f.names.contains(o.otherNamespace)) return new Any(owner,null,null,null,mode); else return new Other(owner,null,null,null,o.otherNamespace,mode); } public final static class Any extends WildcardImpl implements XSWildcard.Any { public Any( SchemaDocumentImpl owner, AnnotationImpl _annon, Locator _loc, ForeignAttributesImpl _fa, int _mode ) { super(owner,_annon,_loc,_fa,_mode); } public boolean acceptsNamespace( String namespaceURI ) { return true; } public void visit( XSWildcardVisitor visitor ) { visitor.any(this); } public Object apply( XSWildcardFunction function ) { return function.any(this); } } public final static class Other extends WildcardImpl implements XSWildcard.Other { public Other( SchemaDocumentImpl owner, AnnotationImpl _annon, Locator _loc, ForeignAttributesImpl _fa, String otherNamespace, int _mode ) { super(owner,_annon,_loc,_fa,_mode); this.otherNamespace = otherNamespace; } private final String otherNamespace; public String getOtherNamespace() { return otherNamespace; } public boolean acceptsNamespace( String namespaceURI ) { return !namespaceURI.equals(otherNamespace); } public void visit( XSWildcardVisitor visitor ) { visitor.other(this); } public Object apply( XSWildcardFunction function ) { return function.other(this); } } public final static class Finite extends WildcardImpl implements XSWildcard.Union { public Finite( SchemaDocumentImpl owner, AnnotationImpl _annon, Locator _loc, ForeignAttributesImpl _fa, Set<String> ns, int _mode ) { super(owner,_annon,_loc,_fa,_mode); names = ns; namesView = Collections.unmodifiableSet(names); } private final Set<String> names; private final Set<String> namesView; public Iterator<String> iterateNamespaces() { return names.iterator(); } public Collection<String> getNamespaces() { return namesView; } public boolean acceptsNamespace( String namespaceURI ) { return names.contains(namespaceURI); } public void visit( XSWildcardVisitor visitor ) { visitor.union(this); } public Object apply( XSWildcardFunction function ) { return function.union(this); } } public final void visit( XSVisitor visitor ) { visitor.wildcard(this); } public final void visit( XSTermVisitor visitor ) { visitor.wildcard(this); } public Object apply( XSTermFunction function ) { return function.wildcard(this); } public <T,P> T apply(XSTermFunctionWithParam<T, P> function, P param) { return function.wildcard(this,param); } public Object apply( XSFunction function ) { return function.wildcard(this); } public boolean isWildcard() { return true; } public boolean isModelGroupDecl() { return false; } public boolean isModelGroup() { return false; } public boolean isElementDecl() { return false; } public XSWildcard asWildcard() { return this; } public XSModelGroupDecl asModelGroupDecl() { return null; } public XSModelGroup asModelGroup() { return null; } public XSElementDecl asElementDecl() { return null; } // Ref.Term implementation public XSTerm getTerm() { return this; } }