/*
* @(#)$Id: ComplexContentBodyState.java,v 1.10 2001/10/10 23:19:46 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.xmlschema;
import com.sun.msv.grammar.Expression;
import com.sun.msv.grammar.ReferenceContainer;
import com.sun.msv.grammar.xmlschema.AttributeWildcard;
import com.sun.msv.grammar.xmlschema.ComplexTypeExp;
import com.sun.msv.grammar.xmlschema.XMLSchemaSchema;
import com.sun.msv.reader.State;
import com.sun.msv.reader.SequenceState;
import com.sun.msv.util.StartTagInfo;
/**
* used to parse restriction/extension element as a child of complexContent element.
*
* @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a>
*/
public class ComplexContentBodyState extends SequenceState implements AnyAttributeOwner {
/** ComplexType object that we are now constructing. */
protected ComplexTypeExp parentDecl;
/**
* if this state is used to parse <extension>, then true.
* if this state is used to parse <restension>, then false.
*/
protected boolean extension;
protected ComplexContentBodyState( ComplexTypeExp parentDecl, boolean extension ) {
this.parentDecl = parentDecl;
this.extension = extension;
}
protected State createChildState( StartTagInfo tag ) {
final XMLSchemaReader reader = (XMLSchemaReader)this.reader;
State s;
if( super.exp==Expression.epsilon ) {
// model group must be the first expression child.
s = reader.createModelGroupState(this,tag);
if(s!=null ) return s;
}
// attribute, attributeGroup, and anyAttribtue can be specified
// after content model is given.
return reader.createAttributeState(this,tag);
}
public void setAttributeWildcard( AttributeWildcard local ) {
parentDecl.wildcard = local;
}
protected Expression initialExpression() {
// if nothing is specified, then empty
return Expression.epsilon;
}
protected Expression annealExpression( Expression exp ) {
// hook this ComplexTypeExp into the base type's restrictions list.
final XMLSchemaReader reader = (XMLSchemaReader)this.reader;
exp = super.annealExpression(exp);
String refQName = startTag.getAttribute("base");
if( refQName==null ) {
reader.reportError( reader.ERR_MISSING_ATTRIBUTE, startTag.qName, "base" );
return exp;
// recover by abandoning proper derivation processing
}
String[] r = reader.splitQName(refQName);
if(r==null) {
reader.reportError( reader.ERR_UNDECLARED_PREFIX, refQName );
return exp;
// recover by abandoning proper derivation processing
}
if( reader.isSchemaNamespace(r[0]) && r[1].equals("anyType") )
// derivation from anyType means this expression is the root of
// derivation. So we don't have to connect this complex type to
// the super class.
return exp;
ComplexTypeExp baseType =
reader.getOrCreateSchema(r[0]/*uri*/).complexTypes.getOrCreate(r[1]/*local name*/);
if( baseType==null ) return exp; // recover by abandoning further processing of this declaration.
reader.backwardReference.memorizeLink(baseType);
/* if( extension )
baseType.extensions.exp = reader.pool.createChoice(
baseType.extensions.exp,
parentDecl.selfWType );
// actual content model will be <baseTypeContentModel>,<AddedContentModel>
else
baseType.restrictions.exp = reader.pool.createChoice(
baseType.restrictions.exp,
parentDecl.selfWType );
*/
// set other fields of the ComplexTypeExp.
parentDecl.derivationMethod = extension?parentDecl.EXTENSION:parentDecl.RESTRICTION;
parentDecl.complexBaseType = baseType;
return combineToBaseType( baseType, exp );
}
/**
* combines the base type content model and this content model
*/
protected Expression combineToBaseType( ComplexTypeExp baseType, Expression addedExp ) {
if( extension )
return reader.pool.createSequence( baseType.body, addedExp );
else
return addedExp;
}
}