You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ba...@apache.org on 2002/02/28 19:28:41 UTC
cvs commit: jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore storage.xml TestPersistent.java TestSample.java
baliuka 02/02/28 10:28:41
Modified: simplestore/src/java/org/apache/commons/simplestore/persistence
MetaClass.java
simplestore/src/java/org/apache/commons/simplestore/persistence/impl
MetaClassImpl.java PersistentProxy.java
simplestore/src/test/org/apache/commons/simplestore
TestPersistent.java TestSample.java
Added: simplestore/src/test/org/apache/commons/simplestore
storage.xml
Log:
implemented foreign keys
Revision Changes Path
1.5 +8 -2 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/MetaClass.java
Index: MetaClass.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/MetaClass.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- MetaClass.java 17 Feb 2002 14:09:03 -0000 1.4
+++ MetaClass.java 28 Feb 2002 18:28:41 -0000 1.5
@@ -61,7 +61,7 @@
*
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: MetaClass.java,v 1.4 2002/02/17 14:09:03 baliuka Exp $
+ *@version $Id: MetaClass.java,v 1.5 2002/02/28 18:28:41 baliuka Exp $
*/
public interface MetaClass {
@@ -92,6 +92,9 @@
public int getPropertyIndex(String field);
+
+
+ public int getPropertyIndex(java.lang.reflect.Member method);
/**
@@ -115,7 +118,10 @@
public String getOIDName();
public Object nextOID();
-
+
+ public boolean isReference(int index);
+
+ public boolean isReference(java.lang.reflect.Member member);
public Persistent newInstance( Object oid );
1.4 +94 -29 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/MetaClassImpl.java
Index: MetaClassImpl.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/MetaClassImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- MetaClassImpl.java 24 Feb 2002 17:01:33 -0000 1.3
+++ MetaClassImpl.java 28 Feb 2002 18:28:41 -0000 1.4
@@ -40,7 +40,7 @@
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * USE, DATA, OR PROFITS; OR BUSINESS INToutUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
@@ -65,7 +65,7 @@
*
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: MetaClassImpl.java,v 1.3 2002/02/24 17:01:33 baliuka Exp $
+ *@version $Id: MetaClassImpl.java,v 1.4 2002/02/28 18:28:41 baliuka Exp $
*/
public class MetaClassImpl implements MetaClass {
@@ -74,6 +74,7 @@
private String sqlName;
private String oidName;
private java.util.Map properties = new java.util.Hashtable();
+ private java.util.Map methods = new java.util.Hashtable();
private java.beans.PropertyDescriptor[] descriptors;
private Context context;
private static OIDGenerator generator = new RandomOIDGenerator();
@@ -87,7 +88,7 @@
for( int i = 0; i < descriptors.length; i++ ){
if ( descriptors[i].getName().equals(id) ){
field = new Field(id,null);
- fields.put(id,fields);
+ fields.put(id,field);
return field;
}
}
@@ -113,7 +114,7 @@
private String referenceField;
/** Holds value of property referencedClass. */
- private String referenceClass;
+ private Class refClass;
/** Getter for property id.
* @return Value of property id.
@@ -160,15 +161,20 @@
/** Getter for property referencedClass.
* @return Value of property referencedClass.
*/
- public String getReferenceClass() {
- return this.referenceClass;
+ public Class getReferenceClass() {
+ return this.refClass;
}
/** Setter for property referencedClass.
* @param referencedClass New value of property referencedClass.
*/
public void setReferenceClass( String referencedClass ) {
- this.referenceClass = referencedClass;
+ try{
+ this.refClass = Class.forName( referencedClass);
+ }catch(Throwable t){
+ t.printStackTrace();
+ throw new java.lang.NoClassDefFoundError(referencedClass);
+ }
}
/** Getter for property validator.
@@ -188,7 +194,7 @@
/** Creates new MetaClassImpl */
- public MetaClassImpl(){
+ public MetaClassImpl()throws Exception{
}
@@ -200,6 +206,15 @@
}
+ public boolean isReference(java.lang.reflect.Member member) {
+
+ return isReference( getPropertyIndex(member) );
+
+ }
+ public boolean isReference(int index) {
+ return null != getField(descriptors[ index ].getName()).getReferenceClass();
+ }
+
/**
* return field name for DB storage
*
@@ -207,8 +222,9 @@
* @return field name
*/
public String getPropertyName( int index ) {
- //TODO :
- return toSQLName(descriptors[ index ].getName());
+
+ return getField(descriptors[ index ].getName()).getName();
+
}
public Persistent newInstance( Object oid ){
@@ -245,8 +261,6 @@
* @return type
*/
public Class getPropertyType( int index ) {
- // TODO : must return JDBC type
- // if Date ...
return descriptors[index].getPropertyType();
}
@@ -282,6 +296,32 @@
return clasz;
}
+ private void indexMethodsFromMetaData(){
+ try{
+
+
+
+ for( int i = 0; i < descriptors.length; i++ ){
+ String name = getField(descriptors[i].getName()).getName();
+ if( name == null ){
+ name = toSQLName(descriptors[i].getName());
+ getField(descriptors[i].getName()).setName(name);
+ }
+ properties.put(name.toUpperCase(),new Integer(i) );
+ if(descriptors[i].getReadMethod() != null)
+ methods.put(descriptors[i].getReadMethod(),new Integer(i));
+ if(descriptors[i].getWriteMethod() != null)
+ methods.put(descriptors[i].getWriteMethod(),new Integer(i));
+
+ }
+ }catch( java.lang.Throwable t ){
+ //TODO :
+ t.printStackTrace();
+ throw new java.lang.RuntimeException(t.getLocalizedMessage());
+ }
+
+ }
+
private void indexMethods(){
try{
@@ -290,17 +330,20 @@
for( int i = 0; i < descriptors.length; i++ ){
properties.put( toSQLName(descriptors[i].getName()),new Integer(i) );
-
+ if(descriptors[i].getReadMethod() != null)
+ methods.put(descriptors[i].getReadMethod(),new Integer(i));
+ if(descriptors[i].getWriteMethod() != null)
+ methods.put(descriptors[i].getWriteMethod(),new Integer(i));
}
}catch( java.lang.Throwable t ){
//TODO :
+ t.printStackTrace();
throw new java.lang.RuntimeException(t.getLocalizedMessage());
}
}
-
static String toSQLName(String clName) {
String result = clName.substring(clName.lastIndexOf('.') + 1, clName.length());
@@ -358,9 +401,19 @@
* @param method read or write method
* @return index
*/
+ public int getPropertyIndex(java.lang.reflect.Member method) {
+
+ Integer index = (Integer)methods.get(method);
+ if(index == null)
+ throw new java.lang.NoSuchMethodError(method.getDeclaringClass().getName()+ "." + method.getName());
+ return index.intValue();
+
+ }
public int getPropertyIndex(String field) {
- //TODO :
- Integer index = (Integer)properties.get(field);
+
+ Integer index = (Integer)properties.get( field.toUpperCase() );
+ if( index == null )
+ throw new java.lang.NoSuchFieldError( clasz.getName() + "." + field );
return index.intValue();
}
@@ -388,7 +441,7 @@
static class StorageHandlerImpl implements StorageHandler {
- MetaClassImpl root = new MetaClassImpl();
+
MetaClassImpl currentClass ;
Field currentField;
@@ -396,7 +449,7 @@
}
- public static final boolean DEBUG = false;
+ public static final boolean DEBUG = true;
public void setDocumentLocator(org.xml.sax.Locator locator ){}
@@ -421,57 +474,69 @@
public final void skippedEntity(java.lang.String name) throws SAXException {}
public void handle_reference(final Attributes meta) throws SAXException {
- if (DEBUG) System.err.println("handle_reference: " + meta);
+ if (DEBUG) System.out.println("handle_reference: " + meta);
currentField.setReferenceClass( meta.getValue("mclass") );
currentField.setReferenceField( meta.getValue("field") );
}
public void start_validator(final Attributes meta) throws SAXException {
- if (DEBUG) System.err.println("start_validator: " + meta);
+ if (DEBUG) System.out.println("start_validator: " + meta);
}
public void end_validator() throws SAXException {
- if (DEBUG) System.err.println("end_validator()");
+ if (DEBUG) System.out.println("end_validator()");
}
public void handle_property(final java.lang.String data, final Attributes meta) throws SAXException {
- if (DEBUG) System.err.println("handle_property: " + data);
+ if (DEBUG) System.out.println("handle_property: " + data);
}
public void start_field(final Attributes meta) throws SAXException {
- if (DEBUG) System.err.println("start_field: " + meta);
+ if (DEBUG) System.out.println("start_field: " + meta);
currentField = currentClass.getField( meta.getValue("id") );
currentField.setName( meta.getValue("name") );
}
public void end_field() throws SAXException {
- if (DEBUG) System.err.println("end_field()");
+ if (DEBUG) System.out.println("end_field()");
}
public void start_storage(final Attributes meta) throws SAXException {
- if (DEBUG) System.err.println("start_storage: " + meta);
+ if (DEBUG) System.out.println("start_storage: " + meta);
}
public void end_storage() throws SAXException {
- if (DEBUG) System.err.println("end_storage()");
+ if ( DEBUG ) System.out.println("end_storage()");
}
public void start_mclass(final Attributes meta) throws SAXException {
- if (DEBUG) System.err.println("start_mclass: " + meta);
+ if ( DEBUG ) System.out.println("start_mclass: " + meta);
try{
- currentClass = (MetaClassImpl)root.forClass( Class.forName( meta.getValue("id")) );
+ Class clasz = Class.forName( meta.getValue("id")) ;
+ currentClass = (MetaClassImpl)persitentClasses.get(clasz);
+ if ( currentClass == null ){
+ currentClass = new MetaClassImpl();
+ currentClass.clasz = clasz;
+ persitentClasses.put(currentClass.clasz,currentClass);
+ }
+
+ currentClass.descriptors = java.beans.Introspector.getBeanInfo( currentClass.clasz ).getPropertyDescriptors();
currentClass.sqlName = meta.getValue("name");
currentClass.oidName = meta.getValue("oid");
+
}catch( Exception e ){
+ e.printStackTrace();
rethrow(e);
}
}
public void end_mclass() throws SAXException {
- if (DEBUG) System.err.println("end_mclass()");
+ if (DEBUG) System.out.println("end_mclass()");
+ currentClass.indexMethodsFromMetaData();
}
private void rethrow(Exception e )throws SAXException {
+ e.printStackTrace();
throw new SAXException( e.getClass().getName() + ":" + e.getMessage());
}
1.8 +17 -7 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/PersistentProxy.java
Index: PersistentProxy.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/PersistentProxy.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- PersistentProxy.java 23 Feb 2002 12:11:30 -0000 1.7
+++ PersistentProxy.java 28 Feb 2002 18:28:41 -0000 1.8
@@ -74,7 +74,7 @@
* baliuka@mwm.lt</a>
*@author Gerhard Froehlich <a href="mailto:g-froehlich@gmx.de">
* g-froehlich@gmx.de</a>
- *@version $Id: PersistentProxy.java,v 1.7 2002/02/23 12:11:30 baliuka Exp $
+ *@version $Id: PersistentProxy.java,v 1.8 2002/02/28 18:28:41 baliuka Exp $
*/
public class PersistentProxy
implements MetaObject, InvocationHandler, Cloneable, Serializable {
@@ -97,6 +97,7 @@
private TypeConverter m_typeConverter = new DefaultTypeConverter();
private Persistent m_object;
private Class m_clazz;
+ private MetaClass m_metaClass;
private Context m_context;
public PersistentProxy(Class clazz,
@@ -107,7 +108,7 @@
m_newCreated = newCreated;
m_context = context;
m_clazz = clazz;
-
+ m_metaClass = context.getMetaClass(clazz);
}
@@ -129,7 +130,7 @@
handler.m_clean = true;
context.getTransactionManager().getTransaction().add( handler );
handler.m_clean = false;
-
+
}
return p;
}
@@ -157,6 +158,7 @@
}
public Object getProperty(String name) {
+
return m_map.get(name);
}
@@ -253,16 +255,24 @@
throw new IllegalStateException("Object properties invalidated");
if (name.startsWith("set")) {
- setProperty(name.substring(3), obj2[0]);
+ if( obj2[0] != null && m_metaClass.isReference(method) ){
+ setProperty(name.substring(3), ((Persistent)obj2[0]).getOID());
+ }else{
+ setProperty(name.substring(3), obj2[0]);
+ }
return null;
- } else if (name.startsWith("get") || name.startsWith("is")) {
- if (method.getName().startsWith("get")) {
+ } else if ( name.startsWith("get") || name.startsWith("is") ) {
+ if ( method.getName().startsWith("get") ) {
name = method.getName().substring(3);
} else {
name = method.getName().substring(2);
}
Object value = getProperty(name);
+ if( value != null && m_metaClass.isReference( method ) ){
+ return m_context.getStorage().
+ retrieveObject(method.getReturnType(),value);
+ }
if ( value == null && method.getReturnType().isPrimitive() ){
return DEFAULTS.get(method.getReturnType());
@@ -273,7 +283,7 @@
}
return m_typeConverter.convert( value , method.getReturnType() );
}
- throw new IllegalStateException("pure method " + method.getName());
+ throw new java.lang.NoSuchMethodError("pure method " + method.getName());
}
public void remove() {
1.3 +16 -2 jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestPersistent.java
Index: TestPersistent.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestPersistent.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestPersistent.java 9 Feb 2002 18:57:05 -0000 1.2
+++ TestPersistent.java 28 Feb 2002 18:28:41 -0000 1.3
@@ -57,10 +57,14 @@
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: TestPersistent.java,v 1.2 2002/02/09 18:57:05 froehlich Exp $
+ *@version $Id: TestPersistent.java,v 1.3 2002/02/28 18:28:41 baliuka Exp $
*/
public interface TestPersistent {
-
+
+ public TestPersistent getParent();
+
+ public void setParent(TestPersistent tp);
+
public boolean getBoolVal();
public void setBoolVal(boolean val);
@@ -81,6 +85,16 @@
public String getStrVal();
+ /** Getter for property strVal1.
+ * @return Value of property strVal1.
+ */
+ public String getStrVal1();
+
+ /** Setter for property strVal1.
+ * @param strVal1 New value of property strVal1.
+ */
+ public void setStrVal1(String strVal1);
+
//TODO : PesistentObjectVal and unknown SerializableObjectVal
}
1.8 +22 -10 jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestSample.java
Index: TestSample.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestSample.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- TestSample.java 23 Feb 2002 12:11:30 -0000 1.7
+++ TestSample.java 28 Feb 2002 18:28:41 -0000 1.8
@@ -72,7 +72,7 @@
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: TestSample.java,v 1.7 2002/02/23 12:11:30 baliuka Exp $
+ *@version $Id: TestSample.java,v 1.8 2002/02/28 18:28:41 baliuka Exp $
*/
public class TestSample extends TestCase {
@@ -91,7 +91,7 @@
junit.textui.TestRunner.main(testCaseName);
}
- public void testCreate() throws java.lang.Exception {
+ public void _testCreate() throws java.lang.Exception {
for (int i = 0; i < 10; i++) {
Transaction transaction = pm.getTransaction();
@@ -110,8 +110,9 @@
object3.setDateVal(new java.util.Date());
object3.setIntVal(i);
object3.setFloatVal(i / 2);
- object3.setStrVal("" + i);
+ object3.setStrVal1("" + i);
object3.setBoolVal(true);
+ object3.setParent(object2);
transaction.commit();
assertEquals("Equals " + oid, object2, object1);
@@ -121,7 +122,7 @@
}
- public void testRetrieve() throws java.lang.Exception {
+ public void _testRetrieve() throws java.lang.Exception {
Transaction transaction = pm.getTransaction();
@@ -138,7 +139,8 @@
System.out.println("DateVal = " + object.getDateVal());
System.out.println("IntVal = " + object.getIntVal());
System.out.println("FloatVal = " + object.getFloatVal());
- System.out.println("StrVal = " + object.getStrVal());
+ System.out.println("StrVal1 = " + object.getStrVal1());
+ System.out.println("Parent Object = " + object.getParent());
}
@@ -147,6 +149,9 @@
}
public void testRollback() throws java.lang.Exception {
+ _testCreate();
+ _testRetrieve();
+
Transaction transaction = pm.getTransaction();
transaction.begin();
@@ -202,16 +207,20 @@
protected void setUp() throws java.lang.Exception {
super.setUp();
+ if( pm != null )
+ return;
+
+ MetaClassImpl.parse("org/apache/commons/simplestore/storage.xml");
- // this datasource is for reentrant connections only !!!
DriverDataSource ds = new DriverDataSource();
ds.setDriver("org.hsqldb.jdbcDriver");
ds.setMaxConnections(1);
ds.setUrl("jdbc:hsqldb:sample");
ds.setUser("sa");
ds.setPassword("");
- String sql = "CREATE TABLE TEST_PERSISTENT ( ID bigint not null primary key, Bool_Val smallint," +
- " Int_Val integer, Float_Val float, Date_Val date, Str_Val longVarChar ) ";
+ String sql = //"DROP TABLE TEST_PERSISTENT";
+ "CREATE TABLE TEST_PERSISTENT ( ID bigint not null primary key, parent_object bigint,Bool_Val smallint," +
+ " Int_Val integer, Float_Val float, Date_Val date, Str_Val longVarChar, s_1_str_val longVarChar ) ";
java.sql.Connection con = ds.getConnection();
try {
@@ -225,9 +234,12 @@
} finally {
con.close();
}
-
+
+ MetaClassImpl mclass = new MetaClassImpl();
DBStorage storage = new DBStorage(ds);
- ContextImpl context = new ContextImpl(new MetaClassImpl(),storage,SoftRefMemoryCache.getInstance(new java.util.HashMap(),0xFF),storage);
+ ContextImpl context = new ContextImpl(mclass,storage,
+ SoftRefMemoryCache.getInstance(new java.util.HashMap(),0xFF),
+ storage );
pm = PersistenceManager.getPersistenceManager(context);
}
1.1 jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/storage.xml
Index: storage.xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE storage >
<storage>
<mclass id="org.apache.commons.simplestore.TestPersistent" name="TEST_PERSISTENT" oid="ID">
<field id="strVal1" name="s_1_str_val"/>
<field id="parent" name="parent_object"/>
<reference mclass="org.apache.commons.simplestore.TestPersistent"
field="parent"/>
</mclass>
</storage>
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>