/* * @(#)$Id: ElementRuleWithTypeState.java,v 1.10 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 org.relaxng.datatype.DatatypeException; import com.sun.msv.reader.State; import com.sun.msv.datatype.xsd.XSDatatype; import com.sun.msv.grammar.Expression; 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; /** * parses <elementRule> with 'type' attribute. * * @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a> */ public class ElementRuleWithTypeState extends ElementRuleBaseState implements FacetStateParent { protected XSTypeIncubator incubator; public XSTypeIncubator getIncubator() { return incubator; } protected void startSelf() { super.startSelf(); final RELAXCoreReader reader = (RELAXCoreReader)this.reader; // existance of type attribute has already checked before // this state is created. incubator = reader.resolveXSDatatype(startTag.getAttribute("type")) .createIncubator(); } protected Expression getContentModel() { try { return incubator.derive(null,null); } catch( DatatypeException e ) { // derivation failed reader.reportError( e, reader.ERR_BAD_TYPE, e.getMessage() ); // recover by using harmless expression. anything will do. return Expression.anyString; } } protected State createChildState( StartTagInfo tag ) { State next = getReader().createFacetState(this,tag); if(next!=null) return next; // facets return super.createChildState(tag); // or delegate to the base class } }