//Source file: H:\\TEMP\\generated\\ispuml\\mdaTransformation\\rules\\xml\\XmlRuleSetsInitializer.java
package modTransf.rules.xml;
import java.io.InputStream;
import java.io.FileNotFoundException;
import org.apache.commons.digester.Digester;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.net.URL;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import modTransf.engine.EngineException;
import modTransf.engine.Transformation;
import java.io.File;
import java.io.InputStreamReader;
import java.io.FileInputStream;
/**
* A reader to read xml rule files.
*/
public class XmlRuleReader
{
/**
* Log for rules.
* This log is used during rules development.
* It logs rules processing.
*/
protected static Log log = LogFactory.getLog("modTransf.rules.xml.XmlReaderLog");
protected boolean validateParsing = true;
protected String registeredUri[]={
"-//MDA Transformation XML Rules 3.0//EN",
"/modTransf/rules/xml/resources/modtransf-rules_3_0.dtd",
"-//Model Transformation XML Rules 3.0//EN",
"/modTransf/rules/xml/resources/modtransf-rules_3_0.dtd",
};
/** The initialized instance of digester */
protected Digester digester;
/**
* Constructor.
*/
public XmlRuleReader()
{
}
/**
* Load the rules
* @param engine
* @param engineContext
*/
protected void initializeDigester( )
throws FileNotFoundException, EngineException
{
if( this.digester != null )
return;
// initialize the digester
Digester digester = new Digester();
digester.setUseContextClassLoader(true);
//digester.setSchema( registeredUri[1] );
// Register local uri
registerLocalUri( digester, registeredUri);
// set validation
log.info("Set rule validation to '" + validateParsing + "'" );
digester.setValidating(validateParsing);
addDigesterRuleSet(digester);
this.digester = digester;
}
/**
* Add parsing rules to digester.
* This method can be overloaded by subclasses to add or modify the parsing
* rules.
* @param digester
*/
protected void addDigesterRuleSet( Digester digester )
{
digester.addRuleSet(new XmlDigesterRules());
}
/**
* Register URI known locally by the digester.
*
* @param registeredUri String[] Array of {uri, local dtd}*
*/
protected void registerLocalUri( Digester digester, String registeredUri[])
{
// Register local schema and DTD
for(int i=0;i<registeredUri.length; i+=2 )
{
URL url = this.getClass().getResource(registeredUri[i+1]);
if (url != null)
{
digester.register(registeredUri[i], url.toString());
}
else
{
log.warn("WARNING: Can't get URI for '" + registeredUri[i+1] + "'" );
}
} // end loop
}
/**
* Read Transformation from the specified files
*/
public Transformation read( String filename )
throws FileNotFoundException, EngineException
{
initializeDigester();
InputStream input = this.getClass().getResourceAsStream(filename);
if(input==null)
input = new FileInputStream( new File(filename) );
if(input==null)
throw new FileNotFoundException( "rule file '" + filename + "' not found.");
try
{
return (Transformation)digester.parse(input);
}
catch(Exception ex)
{
throw new EngineException( "Error while parsing file '" + filename + "'." , ex );
}
}
/**
* Read Transformation from the specified files
*/
public Transformation read( InputStream input )
throws FileNotFoundException, EngineException
{
initializeDigester();
try
{
return (Transformation)digester.parse(input);
}
catch(Exception ex)
{
throw new EngineException( "Error while parsing input." , ex );
}
}
/**
* Nested class.
* <p>Titre : ModTransf V3</p>
* <p>Description : </p>
* <p>Copyright : Copyright (c) 2005</p>
* <p>Soci�t� : </p>
* @author Cedric Dumoulin
* @version 3.0
*/
protected class TopNode {
Transformation transformation;
public void setTransformation( Transformation transf )
{
this.transformation = transf;
}
public Transformation setTransformation( )
{
return this.transformation;
}
}
}