/*
* @(#)$Id: ModuleMergeState.java,v 1.2 2001/05/01 18:13:09 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.util.StartTagInfo;
import com.sun.msv.grammar.Expression;
import com.sun.msv.grammar.relax.RELAXModule;
import com.sun.msv.reader.*;
/**
* Used to parse module.
*
* As stand-alone, this state is used to parse a module included by another module.
* By a base class, this state is used to parse a "head" module.
*
* This class checks consistency between targetNamespace attribute
* and the namespace specified by its caller (grammar/module).
*
* @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a>
*/
public class ModuleMergeState extends DivInModuleState
{
protected ModuleMergeState( String expectedTargetNamespace )
{
this.expectedTargetNamespace = expectedTargetNamespace;
}
/** expected targetNamespace for this module.
*
* null indicates that module must have targetNamespace attribute.
*
* <p>
* If RELAX module has 'targetNamespace' attribute, then its value
* must be equal to this value, or this value must be null.
*
* <p>
* If RELAX module doesn't have the attribute, then this value is
* used as the target namespace. If this value is null, then it is
* an error.
*/
protected final String expectedTargetNamespace;
/**
* computed targetNamespace.
*
* actual target namespace depends on expected target namespace
* and module. this field is set in startSelf method.
*/
protected String targetNamespace;
protected void startSelf()
{
super.startSelf();
{// check relaxCoreVersion
final String coreVersion = startTag.getAttribute("relaxCoreVersion");
if( coreVersion==null )
reader.reportWarning( reader.ERR_MISSING_ATTRIBUTE, "module", "relaxCoreVersion" );
else
if(!"1.0".equals(coreVersion))
reader.reportWarning( RELAXCoreReader.WRN_ILLEGAL_RELAXCORE_VERSION, coreVersion );
}
targetNamespace = startTag.getAttribute("targetNamespace");
if(targetNamespace!=null)
{
// check accordance with expected namespace
if( expectedTargetNamespace!=null
&& !expectedTargetNamespace.equals(targetNamespace) )
{// error
reader.reportError( RELAXCoreReader.ERR_INCONSISTENT_TARGET_NAMESPACE,
targetNamespace, expectedTargetNamespace );
// recover by ignoring one specified in the module
targetNamespace = expectedTargetNamespace;
}
}
else
{// no targetnamespace attribute is given.
if( expectedTargetNamespace==null )
{
reader.reportError( RELAXCoreReader.ERR_MISSING_TARGET_NAMESPACE );
targetNamespace = ""; // recover by assuming the default namespace
}
else
targetNamespace = expectedTargetNamespace;
}
}
}