/*
* @(#)$Id: ElementRuleBaseState.java,v 1.4 2001/05/01 18:13:08 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.reader.relax.core;
import com.sun.msv.reader.State;
import com.sun.msv.reader.SimpleState;
import com.sun.msv.reader.ExpressionOwner;
import com.sun.msv.grammar.Expression;
import com.sun.msv.grammar.AnyNameClass;
import com.sun.msv.grammar.relax.TagClause;
import com.sun.msv.grammar.relax.ElementRule;
import com.sun.msv.grammar.relax.ElementRules;
import com.sun.msv.util.StartTagInfo;
/**
* Base implementation for ElementRuleWithHedgeState and ElementRuleWithTypeState.
*
* @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a>
*/
abstract class ElementRuleBaseState extends SimpleState
{
protected TagClause clause;
/** gets reader in type-safe fashion */
protected RELAXCoreReader getReader() { return (RELAXCoreReader)reader; }
/** gets content model of this elementRule */
protected abstract Expression getContentModel();
/** notification of inline tag element.
*
* this method is called by InlineTagState after it is parsed
*/
protected void onEndInlineClause( TagClause inlineTag )
{
if(clause!=null)
{// more than one inline tag was specified
reader.reportError( RELAXCoreReader.ERR_MORE_THAN_ONE_INLINE_TAG );
// recover by ignoring previous local tag.
}
clause = inlineTag;
}
protected void endSelf() {
String role = startTag.getAttribute("role");
String label = startTag.getAttribute("label");
if(role==null && label==null) {
reader.reportError( reader.ERR_MISSING_ATTRIBUTE_2,
"elementRule", "role", "label" );
// recover from error by supplying dummy label
label = "<undefined>";
}
if( label==null ) label=role; // label attribute defaults to role attribute.
if( clause==null ) {
// inline <tag> element was not found.
// role element must point to some TagClause
if( role==null ) {
reader.reportError( reader.ERR_MISSING_ATTRIBUTE,
"elementRule","role");
// recover by assuming a harmless Clause
clause = new TagClause();
clause.nameClass = AnyNameClass.theInstance;
clause.exp = Expression.nullSet;
} else {
clause = getReader().module.tags.getOrCreate(role);
}
}
ElementRules er = getReader().module.elementRules.getOrCreate(label);
getReader().setDeclaredLocationOf(er); // remember where this ElementRules is defined
er.addElementRule( reader.pool, new ElementRule( reader.pool, clause, getContentModel() ) );
super.endSelf();
}
protected State createChildState( StartTagInfo tag )
{
if( tag.localName.equals("tag") )
return getReader().getStateFactory().tagInline(this,tag);
return null; // otherwise unknown
}
}