001: /*
002: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.xml.internal.rngom.nc;
027:
028: import com.sun.xml.internal.rngom.ast.om.ParsedNameClass;
029:
030: import javax.xml.namespace.QName;
031: import java.io.Serializable;
032: import java.util.HashSet;
033: import java.util.Set;
034:
035: /**
036: * Name class is a set of {@link QName}s.
037: */
038: public abstract class NameClass implements ParsedNameClass,
039: Serializable {
040: static final int SPECIFICITY_NONE = -1;
041: static final int SPECIFICITY_ANY_NAME = 0;
042: static final int SPECIFICITY_NS_NAME = 1;
043: static final int SPECIFICITY_NAME = 2;
044:
045: /**
046: * Returns true if the given {@link QName} is a valid name
047: * for this QName.
048: */
049: public abstract boolean contains(QName name);
050:
051: public abstract int containsSpecificity(QName name);
052:
053: /**
054: * Visitor pattern support.
055: */
056: public abstract <V> V accept(NameClassVisitor<V> visitor);
057:
058: /**
059: * Returns true if the name class accepts infinite number of
060: * {@link QName}s.
061: *
062: * <p>
063: * Intuitively, this method returns true if the name class is
064: * some sort of wildcard.
065: */
066: public abstract boolean isOpen();
067:
068: /**
069: * If the name class is closed (IOW !{@link #isOpen()}),
070: * return the set of names in this name class. Otherwise the behavior
071: * is undefined.
072: */
073: public Set<QName> listNames() {
074: final Set<QName> names = new HashSet<QName>();
075: accept(new NameClassWalker() {
076: public Void visitName(QName name) {
077: names.add(name);
078: return null;
079: }
080: });
081: return names;
082: }
083:
084: /**
085: * Returns true if the intersection between this name class
086: * and the specified name class is non-empty.
087: */
088: public final boolean hasOverlapWith(NameClass nc2) {
089: return OverlapDetector.overlap(this , nc2);
090: }
091:
092: /** Sigleton instance that represents "anyName". */
093: public static final NameClass ANY = new AnyNameClass();
094:
095: /**
096: * Sigleton instance that accepts no name.
097: *
098: * <p>
099: * This instance is useful when doing boolean arithmetic over
100: * name classes (such as computing an inverse of a given name class, etc),
101: * even though it can never appear in a RELAX NG surface syntax.
102: *
103: * <p>
104: * Internally, this instance is also used for:
105: * <ol>
106: * <li>Used to recover from errors during parsing.
107: * <li>Mark element patterns with <notAllowed/> content model.
108: * </ol>
109: */
110: public static final NameClass NULL = new NullNameClass();
111: }
|