InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("project_schema.xml");
Database db = null;
try {
DatabaseReader reader = new DatabaseReader();
db = (Database) reader.parse( is );
} catch (IntrospectionException ie) {
throw new RuntimeException("Error creating DatabaseReader for project_schema.xml");
} catch (IOException ioe ) {
throw new RuntimeException("Error loading project_schema.xml");
} catch (SAXException saxe ) {
throw new RuntimeException("Error parsing project_schema.xml");
}
System.out.println(db);
for (Iterator iter = db.getTables().iterator();iter.hasNext();) {
org.apache.commons.sql.model.Table t
= (org.apache.commons.sql.model.Table) iter.next();
System.out.println(t);
System.out.println(t.getName()); }
produces the following output:
[EMAIL PROTECTED];tableCount=1] [EMAIL PROTECTED] null
The number of tables is correct, but I feel certain that it should not be named null giventhe following project_schema.xml (still in defaults for the field sizes... I'll deal with that after I write something to the database successfully):
<database name="fdbtest2"> <table name="LocationBase"> <column name="id" javaName="id" type="INTEGER" primaryKey="true" required="true" /> <column name="country" javaName="country" type="VARCHAR" size="24" /> <column name="stateOrRegion" javaName="stateOrRegion" type="VARCHAR" size="24" /> <column name="subRegion" javaName="subRegion" type="VARCHAR" size="24" /> <column name="city" javaName="city" type="VARCHAR" size="24" /> </table> </database>
Sadly it appears that commons-sql's DatabaseReader is just a fairly simple extension of a betwixt BeanReader...
package org.apache.commons.sql.io;
import java.beans.IntrospectionException;
import org.apache.commons.betwixt.XMLIntrospector; import org.apache.commons.betwixt.io.BeanReader; import org.apache.commons.betwixt.strategy.HyphenatedNameMapper; import org.apache.commons.sql.model.Database;
/**
* This class parsers XML and creates a fully populated Database bean.
* This class is-a Digester and so can support configuration via custom rules.
*
* @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a>
* @version $Revision: 1.14 $
*/
public class DatabaseReader extends BeanReader {
public DatabaseReader() throws IntrospectionException {
setXMLIntrospector( newXMLIntrospector() );
registerBeanClass(Database.class);
}
/**
* A factory method to create the default introspector used to turn
* the Database object model into XML
*/ protected static XMLIntrospector newXMLIntrospector() {
XMLIntrospector introspector = new XMLIntrospector();
// configure the style of the XML, to brief and attribute based introspector.setAttributesForPrimitives(true); introspector.setWrapCollectionsInElement(false);
// set the mixed case name mapper introspector.setElementNameMapper(new HyphenatedNameMapper()); //introspector.setElementNameMapper(new DecapitalizeNameMapper());
return introspector; } }
and so this is probably a betwixt bug. I hope someone who understands betwixt can verify this.... (hence the cross post to commons-dev).
-Gus
Andy Malakov wrote:
Hello All,
It looks like a bug:
Class o.a.ojb.broker.metadata.MetadataManager.copyOfGlobalRepository() uses SerializationUtils.clone() to return a copy of OJB repository. At the same time some objects in repository graph have transient fields which become un-initialized (null) after the clone.
For example, o.a.ojb.broker.metadata.fieldaccess.AnonymousPersistentField has fkCache map that will become null in clone, and will cause NullPointerException when get()/set() will be executed.
Method copyOfGlobalRepository() is required for per-thread handling of metadata.
Thank you, Andy
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]