/* * @(#)$Id: InlineElementState.java,v 1.12 2002/06/24 19:57:59 kk122374 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.reader.relax.core; import com.sun.msv.datatype.xsd.XSDatatype; //import com.sun.msv.datatype.xsd.TypeIncubator; import com.sun.msv.grammar.Expression; import com.sun.msv.grammar.SimpleNameClass; import com.sun.msv.grammar.relax.ElementRule; import com.sun.msv.grammar.relax.TagClause; import com.sun.msv.grammar.relax.AttPoolClause; import com.sun.msv.reader.State; import com.sun.msv.reader.ExpressionState; import com.sun.msv.reader.datatype.xsd.FacetStateParent; import com.sun.msv.reader.datatype.xsd.XSDatatypeExp; import com.sun.msv.reader.datatype.xsd.XSTypeIncubator; import com.sun.msv.util.StartTagInfo; import org.relaxng.datatype.DatatypeException; /** * parses <element> element. * * @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a> */ public class InlineElementState extends ExpressionState implements FacetStateParent { /** this field is set to null if this element has label attribute. */ protected XSTypeIncubator incubator; public XSTypeIncubator getIncubator() { return incubator; } protected State createChildState( StartTagInfo tag ) { if( incubator!=null ) return ((RELAXCoreReader)reader).createFacetState(this,tag); // facets else return null; // nothing is allowed when @label is used. } protected void startSelf() { super.startSelf(); final RELAXCoreReader reader = (RELAXCoreReader)this.reader; String type = startTag.getAttribute("type"); String label = startTag.getAttribute("label"); if( type!=null && label!=null ) reader.reportError( reader.ERR_CONFLICTING_ATTRIBUTES, "type", "label" ); // recover by ignoring one attribute. if( type==null && label==null ) { reader.reportError( reader.ERR_MISSING_ATTRIBUTE_2, "element", "type", "label" ); type="string"; } if( label!=null ) { incubator = null; } else { incubator = reader.resolveXSDatatype(type).createIncubator(); } } protected Expression makeExpression() { try { final RELAXCoreReader reader = (RELAXCoreReader)this.reader; final String name = startTag.getAttribute("name"); if( name==null ) { reader.reportError( reader.ERR_MISSING_ATTRIBUTE, "element","name" ); // recover by ignoring this element. return Expression.nullSet; } Expression contentModel; if( incubator!=null ) { contentModel = incubator.derive(null,null); } else { // @label is used String label = startTag.getAttribute("label"); if(label==null) throw new Error(); contentModel = reader.module.hedgeRules.getOrCreate(label); reader.backwardReference.memorizeLink(contentModel); } TagClause c = new TagClause(); c.nameClass = new SimpleNameClass( ((RELAXCoreReader)reader).module.targetNamespace, name ); final String role = startTag.getAttribute("role"); if( role==null ) c.exp = Expression.epsilon; // no attribute else { // role attribute AttPoolClause att = reader.module.attPools.getOrCreate(role); c.exp = att; reader.backwardReference.memorizeLink(att); } // create anonymous ElementRule. this rule will never be added to // RefContainer. return new ElementRule( reader.pool, c, contentModel ); } catch( DatatypeException e ) { // derivation failed reader.reportError( e, reader.ERR_BAD_TYPE, e.getMessage() ); // recover by using harmless expression. anything will do. return Expression.nullSet; } } }