/* * @(#)$Id: RELAXIslandSchema.java,v 1.8 2001/05/24 16:53:32 Bear 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.relaxns.grammar.relax; import org.iso_relax.dispatcher.ElementDecl; import org.iso_relax.dispatcher.IslandSchema; import org.iso_relax.dispatcher.SchemaProvider; import org.xml.sax.SAXException; import org.xml.sax.ErrorHandler; import com.sun.msv.relaxns.verifier.IslandSchemaImpl; import com.sun.msv.relaxns.grammar.DeclImpl; import com.sun.msv.relaxns.grammar.ExternalElementExp; import com.sun.msv.grammar.Expression; import com.sun.msv.grammar.ExpressionPool; import com.sun.msv.grammar.ReferenceExp; import com.sun.msv.grammar.Grammar; import com.sun.msv.grammar.relax.RELAXModule; import com.sun.msv.grammar.relax.ElementRules; import com.sun.msv.grammar.relax.HedgeRules; import com.sun.msv.grammar.relax.AttPoolClause; import com.sun.msv.verifier.regexp.REDocumentDeclaration; import java.util.Set; import java.util.Iterator; /** * IslandSchema implementation for RELXA module. * * @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a> */ public class RELAXIslandSchema extends IslandSchemaImpl { /** underlying RELAX module which this IslandSchema is representing */ protected final RELAXModule module; protected Set pendingAnyOtherElements; public RELAXIslandSchema( RELAXModule module, Set pendingAnyOtherElements ) { this.module = module; this.pendingAnyOtherElements = pendingAnyOtherElements; // export elementRules as ElementDecl ReferenceExp[] refs= module.elementRules.getAll(); for( int i=0; i<refs.length; i++ ) if( ((ElementRules)refs[i]).exported ) elementDecls.put( refs[i].name, new DeclImpl(refs[i]) ); // export hedgeRules as ElementDecl. // each exportable hedgeRule must be of length 1, // but it should have already checked. refs = module.hedgeRules.getAll(); for( int i=0; i<refs.length; i++ ) if ( ((HedgeRules)refs[i]).exported ) elementDecls.put( refs[i].name, new DeclImpl(refs[i]) ); // export attPools as AttributesDecl ExportedAttPoolGenerator expGen = new ExportedAttPoolGenerator( module.pool ); refs = module.attPools.getAll(); for( int i=0; i<refs.length; i++ ) if( ((AttPoolClause)refs[i]).exported ) attributesDecls.put( refs[i].name, new DeclImpl( refs[i].name, expGen.create(module,refs[i].exp) ) ); } protected Grammar getGrammar() { return module; } public void bind( SchemaProvider provider, ErrorHandler handler ) throws SAXException { {// wrap up anyOtherElements. Expression pseudoContentModel = createChoiceOfAllExportedRules(provider); Iterator itr = pendingAnyOtherElements.iterator(); while( itr.hasNext() ) ((AnyOtherElementExp)itr.next()).wrapUp(module,pseudoContentModel,provider,handler); pendingAnyOtherElements = null; } Binder binder = new Binder( provider, handler, module.pool ); bind( module.elementRules, binder ); bind( module.hedgeRules, binder ); bind( module.attPools, binder ); bind( module.tags, binder ); } /** * creates a choice expression of all exported rules in the given provider. * * this expression is used as a pseudo content model of anyOtherElement. */ private Expression createChoiceOfAllExportedRules( SchemaProvider provider ) { Expression exp = Expression.nullSet; Iterator itr = provider.iterateNamespace(); while( itr.hasNext() ) { String namespace = (String)itr.next(); IslandSchema is = provider.getSchemaByNamespace(namespace); ElementDecl[] rules = is.getElementDecls(); for( int j=0; j<rules.length; j++ ) exp = module.pool.createChoice(exp, new ExternalElementExp(module.pool,namespace,rules[j].getName(),null)); } return exp; } }