baliuka 02/04/14 06:42:45
Modified: simplestore/docs developers-guide.html users-guide.html
simplestore/src/java/org/apache/commons/simplestore/persistence
PersistenceManager.java Spi.java Storage.java
TypeConverter.java
simplestore/src/java/org/apache/commons/simplestore/persistence/impl
AbstractStorage.java DBStorage.java
Log:
Revision Changes Path
1.4 +150 -5 jakarta-commons-sandbox/simplestore/docs/developers-guide.html
Index: developers-guide.html
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/docs/developers-guide.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- developers-guide.html 3 Apr 2002 18:17:08 -0000 1.3
+++ developers-guide.html 14 Apr 2002 13:42:45 -0000 1.4
@@ -5,10 +5,10 @@
<TITLE>SimpleStore Developers Guide</TITLE>
<style>
- h3{color:navy};
- pre{color:navy};
- code{color:navy};
-
+ h3{color:navy}
+ pre{color:navy}
+ code{color:navy}
+ span{color:red}
</style>
</HEAD>
<BODY link='navy' alink='navy' vlink='navy'>
@@ -134,6 +134,38 @@
Implementation must use <code>Cache</code> for reachability management and
Identity. Single persistent
object instance must be loaded with the same OID. OID object and persistent's class
is unique pair.
Use storege implementations as examples or base classes for custom storage
implementations.
+
+<pre>
+<b>public</b> java.util.Collection retrieve(Class clasz, int index, Object value)
+ throws StorageException{
+
+ <b>final</b> Set objects = new HashSet();
+ <b>final</b> MetaClass mClass = context.getMetaClass(clasz);
+ <b>final</b> String sql = <span>"SELECT "</span>+ mClass.getOIDName() +
<span>" AS "</span> + INTERNAL_OID +
+ <span>", * FROM "</span> + mClass.getName() +
+ <span>" WHERE "</span> + mClass.getPropertyName(index) + <span>"=?"</span>;
+ <span style="color:green">//find uncommited objects first</span>
+ java.util.Collection tObjects =
context.getTransactionManager().getTransaction().getTransactionalObjects();
+ <b>for</b>( java.util.Iterator i = tObjects.iterator(); i.hasNext(); ){
+ MetaObject mo = (MetaObject)i.next();
+ <b>if</b>( mo.getPersistentClass().equals(clasz) ){
+ <b>if</b>( (value == <b>null</b>) && (mo.getProperty(index) ==
<b>null</b>) ){
+ objects.add( mo.getObject() );
+ <b>continue</b>;
+ }
+ if( value != <b>null</b> && value.equals(mo.getProperty(index)) ){
+ objects.add( mo.getObject() );
+ <b>continue</b>;
+ }
+ }
+ }
+ <span style="color:green">//execute SQL statement</span>
+ excecute( sql, <b>new</b> Object[]{value}, new QueryHandler(objects,
clasz));
+
+ <b>return</b> objects;
+ }
+ </pre>
+
</p>
<a name='cache'><h3>Cache</h3></a>
<p>
@@ -156,6 +188,119 @@
distributed objects, Object to XML mapping.
SimpleStore use <a href='http://jakarta.apache.org/bcel'>BCEL</a>
to enhance classes and implement Persistent interface.
+
+ Generated code for <code>java.util.Vector</code>:
+
+<pre>
+<b>public boolean</b> removeElement(Object arg1)
+Code(max_stack = 8, max_locals = 8, code_length = 112)
+<hr>
+0: iconst_1
+1: anewarray <java.lang.Object> (16)
+4: dup
+5: iconst_0
+6: aload_1
+7: aastore
+8: astore_2
+9: aload_0
+10: getfield org.apache.java.util.Vector$$EnhancedBySimplestore$$.h
Lorg/apache/commons/simplestore/tools/MethodInterceptor; (14)
+13: aload_0
+14: getstatic
org.apache.java.util.Vector$$EnhancedBySimplestore$$.METHOD_23
Ljava/lang/reflect/Method; (240)
+17: aload_2
+18: invokeinterface
org.apache.commons.simplestore.tools.MethodInterceptor.<b>beforeInvoke</b>
(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
(49) 4 0
+23: astore_3
+24: aconst_null
+25: astore %4
+27: iconst_0
+28: istore %5
+30: aconst_null
+31: astore %6
+33: aload_0
+34: getfield org.apache.java.util.Vector$$EnhancedBySimplestore$$.h
Lorg/apache/commons/simplestore/tools/MethodInterceptor; (14)
+37: aload_0
+38: getstatic
org.apache.java.util.Vector$$EnhancedBySimplestore$$.METHOD_23
Ljava/lang/reflect/Method; (240)
+41: aload_2
+42: aload_3
+43: invokeinterface
org.apache.commons.simplestore.tools.MethodInterceptor.<b>invokeSuper</b>
(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;)Z
(57) 5 0
+48: ifeq <b>#73</b>
+51: iconst_1
+52: istore %5
+54: new <java.lang.Boolean> (63)
+57: dup
+58: aload_0
+59: aload_1
+60: invokespecial java.util.Vector.<b>removeElement</b> (Ljava/lang/Object;)Z
(243)
+63: invokespecial java.lang.Boolean.<init> (Z)V (70)
+66: astore %4
+68: goto <b>#73</b>
+71: astore %6
+73: aload_0
+74: getfield org.apache.java.util.Vector$$EnhancedBySimplestore$$.h
Lorg/apache/commons/simplestore/tools/MethodInterceptor; (14)
+77: aload_0
+78: getstatic
org.apache.java.util.Vector$$EnhancedBySimplestore$$.METHOD_23
Ljava/lang/reflect/Method; (240)
+81: aload_2
+82: aload_3
+83: iload %5
+85: aload %4
+87: aload %6
+89: invokeinterface
org.apache.commons.simplestore.tools.MethodInterceptor.<b>afterReturn</b>
(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;
(53) 8 0
+94: astore %7
+96: aload %7
+98: ifnonnull <b>#103</b>
+101: iconst_0
+102: ireturn
+103: aload %7
+105: checkcast <java.lang.Boolean> (63)
+108: invokevirtual java.lang.Boolean.<b>booleanValue</b> ()Z (74)
+111: ireturn
+<hr>
+Exception handler(s) =
+From To Handler Type
+54 68 71 java.lang.Throwable(76)
+</pre>
+
+ Decompiled code:
+<pre>
+
+<b> package </b> org.apache.java.util;
+
+<b> public class </b> Vector$$EnhancedBySimplestore$$ <b> extends
</b>java.util.Vector{
+
+ <b>org.apache.commons.simplestore.tools.MethodInterceptor</b> h;
+ //...
+ <b>static java.lang.reflect.Method </b> METHOD_23 =
+ Vector.class.getMethod(<span
style='color:red'>"removeElement"</span>,
+ new Class[]{Object.class}
+ );
+ //...
+
+ <b>public boolean</b> removeElement(Object arg1){
+
+ Object args[] = { arg1 };
+ Object retValFromBefore = h.<b>beforeInvoke</b>(this,METHOD_23,args);
+ boolean invokedSuper = false;
+ Throwable t = null;
+ Object retValFromSuper = null;
+
+ if( h.<b>invokeSuper</b>(this,METHOD_23,args,retValFromBefore) ){
+ invokedSuper = true;
+ try{
+
+ retValFromSuper = new Boolean( <b>super</b>.removeElement(arg1) );
+
+ }catch(Throwable tl){
+ t = tl
+ }
+
+ }
+
+ return ((Boolean) h.<b>afterReturn</b>(this, METHOD_23, args,
+ retValFromBefore, invokedSuper, retValFromSuper,t )
+ ).booleanValue();
+
+}
+</pre>
+ This code will not compile it doe's not handle <code>Throwable</code>.
</p>
<a name='persistent'><h3>Persistent</h3></a>
@@ -176,7 +321,7 @@
<code>Persistent</code> returns this implementation.
This interface is used by Storage implementation too.
<pre>
-public interface MetaObject extends Cloneable {
+<b>public interface</b> MetaObject <b>extends</b> Cloneable {
public Object <b>getOID</b>();
1.8 +3 -3 jakarta-commons-sandbox/simplestore/docs/users-guide.html
Index: users-guide.html
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/docs/users-guide.html,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- users-guide.html 3 Apr 2002 18:17:08 -0000 1.7
+++ users-guide.html 14 Apr 2002 13:42:45 -0000 1.8
@@ -3,9 +3,9 @@
<title>SimpleStore Usere Guide</title>
<style>
- h3{color:navy};
- pre{color:navy};
- code{color:navy};
+ h3{color:navy}
+ pre{color:navy}
+ code{color:navy}
</style>
</head>
1.4 +11 -1
jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/PersistenceManager.java
Index: PersistenceManager.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/PersistenceManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PersistenceManager.java 23 Mar 2002 14:54:52 -0000 1.3
+++ PersistenceManager.java 14 Apr 2002 13:42:45 -0000 1.4
@@ -72,7 +72,7 @@
*
* @author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
- * @version $Id: PersistenceManager.java,v 1.3 2002/03/23 14:54:52 baliuka Exp $
+ * @version $Id: PersistenceManager.java,v 1.4 2002/04/14 13:42:45 baliuka Exp $
*/
public interface PersistenceManager {
@@ -134,8 +134,18 @@
*/
public void removeInstance(Object pc);
+ /** returns state of persistent object
+ * @param pc Persistent
+ * @return true if object is new and uncommited
+ */
public boolean isNew(Object pc);
+ /** returns state of persistent object,
+ * deleted objects are not removed from cache,
+ * Persistence manager can return deleted object if it exists in cache
+ * @param pc Persistent
+ * @return true if object deleted
+ */
public boolean isDeleted(Object pc);
}
1.2 +5 -1
jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/Spi.java
Index: Spi.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/Spi.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Spi.java 1 Apr 2002 17:19:33 -0000 1.1
+++ Spi.java 14 Apr 2002 13:42:45 -0000 1.2
@@ -55,12 +55,16 @@
package org.apache.commons.simplestore.persistence;
/**
+ * This All service provider interfaces extend Spi
*@author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
- *@version $Id: Spi.java,v 1.1 2002/04/01 17:19:33 baliuka Exp $
+ *@version $Id: Spi.java,v 1.2 2002/04/14 13:42:45 baliuka Exp $
*/
public interface Spi {
+ /** Sets persitence context
+ * @param context Configured context object
+ */
public void setContext(Context context);
}
1.7 +25 -6
jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/Storage.java
Index: Storage.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/Storage.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Storage.java 1 Apr 2002 17:08:09 -0000 1.6
+++ Storage.java 14 Apr 2002 13:42:45 -0000 1.7
@@ -63,21 +63,40 @@
*
*@author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
- *@version $Id: Storage.java,v 1.6 2002/04/01 17:08:09 baliuka Exp $
+ *@version $Id: Storage.java,v 1.7 2002/04/14 13:42:45 baliuka Exp $
*/
public interface Storage extends Spi{
- public void storeObject(MetaObject properties) throws StorageException;
-
- public Object retrieveObject(Class clasz, Object id) throws StorageException;
+ /** Used by factory to set context object
+ * @param context Context */
public void setContext(Context context );
+ /**
+ * retrieves all objects of clasz type
+ * @param clasz type
+ * @throws StorageException on storage error
+ * @return set of persistent objects
+ */
public Set retrieveAll(Class clasz) throws StorageException;
-
- public void close() throws StorageException;
+ /**
+ * retrieve object by OID
+ * @param clasz type
+ * @param id OID
+ * @throws StorageException on storage error
+ * @return Persistent object
+ */
+ public Object retrieveObject(Class clasz, Object id) throws StorageException;
+
+ /** retrieve object by property
+ * @param clasz type
+ * @param index property index
+ * @param value property value
+ * @throws StorageException on storage error
+ * @return set of persistent objects
+ */
public java.util.Collection retrieve(Class clasz, int index, Object
value)throws StorageException;
}
1.6 +12 -1
jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/TypeConverter.java
Index: TypeConverter.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/TypeConverter.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TypeConverter.java 1 Apr 2002 17:08:09 -0000 1.5
+++ TypeConverter.java 14 Apr 2002 13:42:45 -0000 1.6
@@ -59,12 +59,23 @@
*
*@author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
- *@version $Id: TypeConverter.java,v 1.5 2002/04/01 17:08:09 baliuka Exp $
+ *@version $Id: TypeConverter.java,v 1.6 2002/04/14 13:42:45 baliuka Exp $
*/
public interface TypeConverter extends Spi{
+ /** Conversts value from storage to app type
+ * @param object value
+ * @param clazz type
+ * @return transformed object
+ */
public Object toAppType(Object object , Class clazz);
+
+ /** Conversts value to storage type
+ * @param object value
+ * @param clazz type
+ * @return transformed object
+ */
public Object toStorageType(Object object , Class clazz);
1.9 +3 -2
jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/AbstractStorage.java
Index: AbstractStorage.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/AbstractStorage.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- AbstractStorage.java 14 Mar 2002 19:42:22 -0000 1.8
+++ AbstractStorage.java 14 Apr 2002 13:42:45 -0000 1.9
@@ -69,7 +69,7 @@
/**
*@author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
- *@version $Id: AbstractStorage.java,v 1.8 2002/03/14 19:42:22 baliuka Exp $
+ *@version $Id: AbstractStorage.java,v 1.9 2002/04/14 13:42:45 baliuka Exp $
*/
public abstract class AbstractStorage
@@ -165,7 +165,8 @@
}
}
-
+
+ public abstract void storeObject(MetaObject properties) throws
StorageException;
protected abstract void createObject(MetaObject properties) throws
StorageException;
1.17 +53 -48
jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/DBStorage.java
Index: DBStorage.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/DBStorage.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- DBStorage.java 24 Mar 2002 06:27:35 -0000 1.16
+++ DBStorage.java 14 Apr 2002 13:42:45 -0000 1.17
@@ -84,12 +84,12 @@
/**
*@author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
- *@version $Id: DBStorage.java,v 1.16 2002/03/24 06:27:35 baliuka Exp $
+ *@version $Id: DBStorage.java,v 1.17 2002/04/14 13:42:45 baliuka Exp $
*/
public class DBStorage extends AbstractStorage implements
org.apache.commons.simplestore.tools.Constants {
private final static String CONNECTION =
"org.apache.commons.simplestore.jdbc.DBStorage.connection";
- private final static String INTERNAL_OID = "INTERNAL_OID";
+ private final static String INTERNAL_OID = "INTERNAL_OID";
//TODO : must be in MetaClass
private static Properties procedures = new Properties();
private ConnectionFactory ds;
@@ -104,7 +104,7 @@
this.ds = ds;
}
-
+
public Object toSQLType(Object object) {
return context.getTypeConverter().toStorageType(object,null);
}
@@ -132,9 +132,9 @@
}
}
}
- if (statement.execute()) {
+ if (statement.execute()) { // SELECT
rs = statement.getResultSet();
- } else {
+ } else { // UPDATE
return statement.getUpdateCount();
}
@@ -165,7 +165,7 @@
}
}
} catch (SQLException se) {
- throw new StorageException(sql, se);
+ throw new StorageException(sql, se.fillInStackTrace());
}
return result;
}
@@ -177,6 +177,7 @@
public Object retrieveObject( final Class clasz, Object id ) throws
StorageException {
+ //try cahce first
Persistent result = (Persistent) context.getCache().get(id);
if (result != null) {
@@ -197,15 +198,16 @@
try {
if ( name.equalsIgnoreCase(mClass.getOIDName())) {
+ //OID is known
return;
}
int propIndex = mClass.getPropertyIndex( name );
- props[ propIndex ] = value;
+ props[ propIndex ] = value;
} catch (Throwable t) {
t.printStackTrace();
- throw new StorageException(t.getMessage(), t);
+ throw new StorageException(t.getMessage(),
t.fillInStackTrace());
}
}
@@ -225,14 +227,16 @@
final MetaClass mClass = context.getMetaClass(clasz);
final String sql = "SELECT "+ mClass.getOIDName() + " AS " + INTERNAL_OID +
", * FROM " + mClass.getName();
final Set objects = new HashSet();
- java.util.Collection tObjects =
context.getTransactionManager().getTransaction().getTransactionalObjects();
+
+ //find uncommited objects first
+ java.util.Collection tObjects =
context.getTransactionManager().getTransaction().getTransactionalObjects();
for( java.util.Iterator i = tObjects.iterator(); i.hasNext(); ){
- MetaObject mo = (MetaObject)i.next();
- if( mo.getPersistentClass().equals(clasz) ){
- objects.add( mo.getObject() );
- }
+ MetaObject mo = (MetaObject)i.next();
+ if( mo.getPersistentClass().equals(clasz) ){
+ objects.add( mo.getObject() );
+ }
}
-
+
excecute( sql, null, new QueryHandler(objects, clasz));
@@ -276,7 +280,7 @@
values.add(properties.getOID());
final String sql = "UPDATE " + name + " SET " + names;
- excecute( sql, values.toArray(), null);
+ excecute( sql, values.toArray(), null);
}
@@ -289,9 +293,7 @@
connection.close();
}
} catch (Exception e) {
-
- e.printStackTrace();
- // TODO
+ throw new StorageException(e.getMessage(), e.fillInStackTrace());
}
}
@@ -331,6 +333,10 @@
}
+ /**
+ * this method doe's not removes object from cache
+ */
+
protected void removeObject(MetaObject obj) throws StorageException {
final MetaClass mClass = context.getMetaClass(obj.getPersistentClass());
@@ -353,7 +359,7 @@
connection.close();
}
} catch (SQLException se) {
- throw new StorageException(se.getMessage(), se);
+ throw new StorageException(se.getMessage(), se.fillInStackTrace());
}
}
@@ -367,61 +373,60 @@
}
} catch (SQLException se) {
- throw new StorageException(se.getMessage(), se);
+ throw new StorageException(se.getMessage(), se.fillInStackTrace());
}
}
protected void internalBegin() throws StorageException {
- try {
- Connection connection = ds.getConnection();
-
context.getTransactionManager().getTransaction().setAttribute(CONNECTION, connection);
-
- } catch (SQLException se) {
- throw new StorageException(se.getMessage(), se);
- }
+ // do nothing
}
private Connection getConnection() {
-
- Connection connection = (Connection)
context.getTransactionManager().getTransaction().getAttribute(CONNECTION);
-
- if (connection == null) {
- throw new IllegalTransactionStateException("Transaction not Started");
+ try{
+ Connection connection = (Connection)
context.getTransactionManager().getTransaction().getAttribute(CONNECTION);
+
+ if (connection == null) {
+ // open new connection
+ connection = ds.getConnection();
+
context.getTransactionManager().getTransaction().setAttribute(CONNECTION, connection);
+ }
+ return connection;
+
+ } catch (SQLException se) {
+ throw new StorageException(se.getMessage(), se.fillInStackTrace());
}
-
- return connection;
}
public java.util.Collection retrieve(Class clasz, int index, Object value)
- throws StorageException{
+ throws StorageException{
final Set objects = new HashSet();
final MetaClass mClass = context.getMetaClass(clasz);
final String sql = "SELECT "+ mClass.getOIDName() + " AS " + INTERNAL_OID +
- ", * FROM " + mClass.getName() +
+ ", * FROM " + mClass.getName() +
" WHERE " + mClass.getPropertyName(index) + "=?";
-
+ //find uncommited objects first
java.util.Collection tObjects =
context.getTransactionManager().getTransaction().getTransactionalObjects();
for( java.util.Iterator i = tObjects.iterator(); i.hasNext(); ){
- MetaObject mo = (MetaObject)i.next();
- if( mo.getPersistentClass().equals(clasz) ){
- if( (value == null) && (mo.getProperty(index) == null) ){
+ MetaObject mo = (MetaObject)i.next();
+ if( mo.getPersistentClass().equals(clasz) ){
+ if( (value == null) && (mo.getProperty(index) == null) ){
objects.add( mo.getObject() );
continue;
- }
- if( value != null && value.equals(mo.getProperty(index)) ){
+ }
+ if( value != null && value.equals(mo.getProperty(index)) ){
objects.add( mo.getObject() );
continue;
- }
- }
-
+ }
+ }
+
}
-
+
excecute( sql, new Object[]{value}, new QueryHandler(objects, clasz));
return objects;
-
+
}
@@ -441,7 +446,7 @@
try {
name = name.toUpperCase();
if (index == 1) {
-
+ //try to find in cache first
Persistent p = (Persistent) context.getCache().get(value);
if ( p != null ) {
props = null;
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>