Digester Factory
22/09/2009
Commentaires fermés
This is a DigesterFactory class that load a XML file into an object using an other XML rule file.
I like this way of loading java object from a XML file, because it’s not intrusive, you just have to give it a rule file that define the way of loading object.
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.xml.sax.SAXException;
/**
* Digester Factory
* This load a Java object from a XML file using Digester framework
*
* @author Gabriel Dromard
*/
public class DigesterFactory {
/*
public static Root loadRoot(File input) throws SAXException, Exception {
// Create the digester instance
Digester digester = new Digester();
// Activate or not the DTD checking
digester.setValidating( false );
// This is needed because digester is sending errors directly to output without raising exceptions othervise
//digester.setErrorHandler(new DefaultSAXErrorHandler());
digester.setErrorHandler(new ErrorHandler() {
public void error(SAXParseException exception) throws SAXException { throw exception; }
public void fatalError(SAXParseException exception) throws SAXException { throw exception; }
public void warning(SAXParseException exception) throws SAXException { throw exception; }
});
// Parsing rules
digester.addObjectCreate( "myxml", Root.class );
//digester.addSetProperties( "descriptor", "type", "type" );
//digester.addSetProperties( "myxml/a/b", new String [] {"type", "target", "header"} , new String [] {"outputType", "outputTarget", "header"} );
digester.addObjectCreate( "myxml/a", A.class );
digester.addSetProperties( "myxml/a", "name", "name" );
digester.addSetProperties( "myxml/a/b", "name" , "bname" );
digester.addSetNext( "myxml/a", "setA");
digester.addObjectCreate( "myxml/a/c", C.class );
digester.addSetProperties( "myxml/a/c", new String [] {"name", "value"} , new String [] {"name", "value"} );
digester.addBeanPropertySetter("myxml/a/c", "description");
digester.addSetNext( "myxml/a/c", "addC");
return (Root)digester.parse( input );
}
*/
/**
* Load an object from a XML file unsing digester framwork
* @param input The data input file defining the Java Object
* @param rules The rules input file defininf the digester rules for loading this Java Object
* @return Return an instance of the a Java Object (defined in rule file)
* @throws SAXException Can be thrown while parsing files.
* @throws Exception Can be MalformedURLException or IOException for the input or rules files.
* @see DigesterFactory#load(File, URL)
* @see DigesterFactory#load(URL, URL)
*/
public static Object load(File input, File rules) throws SAXException, IOException {
Digester digester = DigesterLoader.createDigester(rules.toURI().toURL());
return digester.parse(input);
}
/**
* Load an object from a XML file unsing digester framwork
* @param input The data input URL defining the Java Object
* @param rules The rules input URL defining the digester rules for loading this Java Object
* @return Return an instance of the a Java Object (defined in rule file)
* @throws SAXException Can be thrown while parsing files.
* @throws Exception Can be MalformedURLException or IOException for the input or rules files.
* @see DigesterFactory#load(File, URL)
* @see DigesterFactory#load(File, File)
*/
public static Object load(URL input, URL rules) throws SAXException, IOException {
Digester digester = DigesterLoader.createDigester(rules);
return digester.parse(input.openStream());
}
/**
* Load an object from a XML file unsing digester framwork
* @param input The data input file defining the Java Object
* @param rules The rules input URL defining the digester rules for loading this Java Object
* @return Return an instance of the a Java Object (defined in rule file)
* @throws SAXException Can be thrown while parsing files.
* @throws Exception Can be MalformedURLException or IOException for the input or rules files.
* @see DigesterFactory#load(URL, URL)
* @see DigesterFactory#load(File, File)
*/
public static Object load(File input, URL rules) throws SAXException, IOException {
Digester digester = DigesterLoader.createDigester(rules);
return digester.parse(input);
}
public static void main(String[] args) {
if (args.length == 2) {
try {
//Root o = loadRoot(new File( "input.xml" ));
//Object o = load(new File("input.xml"), new File("digester-input-rules.xml"));
Object o = load(new File(args[0]), new File(args[1]));
/*Display resulting beans*/
System.out.println("=================================");
System.out.println(o.toString());
System.out.println("=================================");
} catch( SAXException saxEx) {
System.err.println("Error in XML parsing: "+saxEx.getMessage());
} catch( Exception exc ) {
exc.printStackTrace(System.err);
}
} else {
System.out.println("Usage: java "+DigesterFactory.class.getName()+" [XML input file] [XML rule]");
}
}
}