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]
