com.sun.msv.grammar.xmlschema.LaxDefaultNameClass Maven / Gradle / Ivy
/*
* @(#)$Id: LaxDefaultNameClass.java,v 1.12 2004/04/05 17:42:21 kohsuke Exp $
*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the proprietary information of Sun Microsystems, Inc.
* Use is subject to license terms.
*
*/
package com.sun.msv.grammar.xmlschema;
import java.util.Set;
import com.sun.msv.grammar.DifferenceNameClass;
import com.sun.msv.grammar.NameClass;
import com.sun.msv.grammar.NameClassVisitor;
import com.sun.msv.grammar.SimpleNameClass;
import com.sun.msv.util.StringPair;
/**
* Special name class implementation used for the wild card of the "lax" mode.
*
*
* In "lax" mode, we need a name class that matches all undefined names.
* Although it is possible to use DifferenceNameClass for this purpose,
* it is not a cost-efficient way because typically it becomes very large.
* (If there are twenty element declarations, we'll need twenty DifferenceNameClass
* to exclude all defined names).
*
*
* This name class uses a {@link Set} to hold multiple names. If a name
* is contained in that set, it'll be rejected. If a name is not contained,
* it'll be accepted.
*
*
* Special care is taken to make this NC as seamless as possible.
* When the visit method is called, the equivalent name class is constructed
* internally and the visitor will visit that name class. In this way, the visitors
* won't notice the existance of this "special" name class.
*
* @author Kohsuke KAWAGUCHI
*/
public class LaxDefaultNameClass extends NameClass {
/**
* @param _base
* this name class accepts a name if
*
* - it's in the 'base" name class and
*
- it's not one of those excluded names
*/
public LaxDefaultNameClass( NameClass _base ) {
this.base = _base;
names.add( new StringPair(NAMESPACE_WILDCARD,LOCALNAME_WILDCARD) );
}
private NameClass base;
public Object visit( NameClassVisitor visitor ) {
// create equivalent name class and let visitor visit it.
if( equivalentNameClass==null ) {
NameClass nc = base;
StringPair[] items = (StringPair[])names.toArray(new StringPair[0]);
for( int i=0; i