/* * @(#)$Id: RELAXCoreIslandSchemaReader.java,v 1.7 2001/05/18 00:06:05 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.reader.relax; import com.sun.msv.grammar.Expression; import com.sun.msv.grammar.ExpressionPool; import com.sun.msv.grammar.relax.RELAXModule; import com.sun.msv.reader.relax.core.RELAXCoreReader; import com.sun.msv.reader.GrammarReaderController; import com.sun.msv.reader.State; import com.sun.msv.reader.ExpressionState; import com.sun.msv.relaxns.grammar.relax.RELAXIslandSchema; import com.sun.msv.relaxns.grammar.ExternalElementExp; import com.sun.msv.relaxns.grammar.ExternalAttributeExp; import com.sun.msv.util.StartTagInfo; import com.sun.msv.util.StringPair; import org.iso_relax.dispatcher.IslandSchemaReader; import org.iso_relax.dispatcher.IslandSchema; import org.xml.sax.SAXException; import org.xml.sax.helpers.LocatorImpl; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import java.util.Map; import java.util.Set; /** * reads RELAX-Namespace-extended RELAX Core. * * @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a> */ public class RELAXCoreIslandSchemaReader extends RELAXCoreReader implements IslandSchemaReader { public RELAXCoreIslandSchemaReader( GrammarReaderController controller, SAXParserFactory parserFactory, ExpressionPool pool, String expectedTargetnamespace ) throws SAXException,ParserConfigurationException { super(controller,parserFactory,new StateFactory(),pool,expectedTargetnamespace); } private static class StateFactory extends RELAXCoreReader.StateFactory { public State interface_(State parent,StartTagInfo tag) { return new InterfaceStateEx(); } } // to allow access within this package. protected RELAXModule getModule() { return super.module; } /** returns true if the given state can have "occurs" attribute. */ protected boolean canHaveOccurs( ExpressionState state ) { return super.canHaveOccurs(state) || state instanceof AnyOtherElementState; } public final IslandSchema getSchema() { RELAXModule m = getResult(); if(m==null) return null; else return new RELAXIslandSchema( m, pendingAnyOtherElements ); } public State createExpressionChildState( State parent,StartTagInfo tag ) { if(! RELAXCoreNamespace.equals(tag.namespaceURI) ) return null; if(tag.localName.equals("anyOtherElement")) return new AnyOtherElementState(); return super.createExpressionChildState(parent,tag); } /** map from StringPair(namespace,label) to ExternalElementExp. */ private final Map externalElementExps = new java.util.HashMap(); private ExternalElementExp getExtElementExp( String namespace, String label ) { StringPair name = new StringPair(namespace,label); ExternalElementExp exp = (ExternalElementExp)externalElementExps.get(name); if( exp!=null ) return exp; exp = new ExternalElementExp( pool, namespace, label, new LocatorImpl(locator) ); externalElementExps.put( name, exp ); return exp; } protected Expression resolveElementRef( String namespace, String label ) { if( namespace!=null ) return getExtElementExp( namespace, label ); else return super.resolveElementRef(namespace,label); } protected Expression resolveHedgeRef( String namespace, String label ) { if( namespace!=null ) return getExtElementExp( namespace, label ); else return super.resolveHedgeRef(namespace,label); } protected Expression resolveAttPoolRef( String namespace, String label ) { if( namespace!=null ) return new ExternalAttributeExp(pool,namespace,label,new LocatorImpl(locator)); else return super.resolveAttPoolRef(namespace,label); } /** * set of AnyOtherElementExp object. * * each object will be invoked to do a wrap up by bind method of IslandSchema. */ protected final Set pendingAnyOtherElements = new java.util.HashSet(); }