In the course of creating the XML files for use in our proposed testing framework (overview here), I created a simple file to do it for a bean at a time. It would be nice to be able to run this for multiple beans at a time. Hmm…
(To acclimate: every entity has an associated Wrapper session bean which contains all the relationships and queries. Every Wrapper has a method fetchByEntity( String ) method which retrieves all beans in the database with a particular entity number, which is a way of partitioning the data. EJBClient is just a service locator with some shortcuts, home caching, etc.)
EJBClient client = new EJBClient();
DataSerializer ds = new DataSerializer( null );
String interfaceName = "com.optiron.readi.interfaces.";
for ( int i = 1; i < argv.length; i++ ) {
String beanName = argv[i];
File xmlOutfile = new File( dataDir, beanName + ".xml" );
ds.setFileSource( xmlOutfile );
String beanInterface = interfaceName + beanName;
Class wrapperHomeClass = Class.forName( beanInterface + "WrapperHome" );
Object wrapperHome = client.getWrapperHome( beanName );
Method createMethod = wrapperHomeClass.getMethod( "create", null );
Object wrapper = createMethod.invoke( wrapperHome, null );
Class wrapperClass = Class.forName( beanInterface + "Wrapper" );
Method entityMethod = wrapperClass.getMethod(
"fetchByEntity", new Class[] { String.class } );
List items = (List)entityMethod.invoke(
wrapper, new String[] { entno } );
ds.writeXml( items );
System.out.println( "Wrote bean [" + beanName + "] to " +
"[" + xmlOutfile.getAbsolutePath() + "]" );
}
As a result of this and other work done over the weekend, I'm getting more comfortable with reflection. This is probably a dangerous thing since I use it all the time in Perl :-)