/* * @(#)$Id: AttributeState.java,v 1.9 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.grammar.Expression; import com.sun.msv.grammar.SimpleNameClass; import com.sun.msv.reader.ExpressionState; import com.sun.msv.reader.State; 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 <attribute> element. * * @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a> */ public class AttributeState extends ExpressionState implements FacetStateParent { protected XSTypeIncubator incubator; public XSTypeIncubator getIncubator() { return incubator; } protected void startSelf() { super.startSelf(); final RELAXCoreReader reader = (RELAXCoreReader)this.reader; String type = startTag.getAttribute("type"); if(type==null) type="string"; incubator = reader.resolveXSDatatype(type).createIncubator(); } protected Expression makeExpression() { try { final String name = startTag.getAttribute("name"); final String required = startTag.getAttribute("required"); if( name==null ) { reader.reportError( reader.ERR_MISSING_ATTRIBUTE, "attribute","name" ); // recover by ignoring this attribute. // since attributes are combined by sequence, so epsilon is appropriate. return Expression.epsilon; } Expression exp = reader.pool.createAttribute( new SimpleNameClass("",name), incubator.derive(null,null) ); // unless required attribute is specified, it is considered optional if(! "true".equals(required) ) exp = reader.pool.createOptional(exp); return exp; } 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 ) { return ((RELAXCoreReader)reader).createFacetState(this,tag); // facets } }