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/10 11:48:34 UTC

cvs commit: jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/persistence MetaObject.java PersistentProxy.java TransactionImpl.java

baliuka     02/02/10 02:48:34

  Modified:    simplestore/src/sample/org/apache/commons/simplestore/jdbc
                        DBStorage.java
               simplestore/src/sample/org/apache/commons/simplestore/persistence
                        MetaObject.java PersistentProxy.java
                        TransactionImpl.java
  Log:
  Roolback implementation ( not tested )
  
  Revision  Changes    Path
  1.4       +17 -7     jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/jdbc/DBStorage.java
  
  Index: DBStorage.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/jdbc/DBStorage.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DBStorage.java	9 Feb 2002 18:54:10 -0000	1.3
  +++ DBStorage.java	10 Feb 2002 10:48:33 -0000	1.4
  @@ -61,7 +61,7 @@
   /**
    *@author     Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
    *      baliuka@mwm.lt</a>
  - *@version    $Id: DBStorage.java,v 1.3 2002/02/09 18:54:10 froehlich Exp $
  + *@version    $Id: DBStorage.java,v 1.4 2002/02/10 10:48:33 baliuka Exp $
    */
   public class DBStorage extends AbstractStorage {
   
  @@ -149,7 +149,7 @@
   
           return sb.toString();
       }
  -
  +// TODO :  must be more simple
       public static int excecute(java.sql.Connection connection, String sql, Object[] args, ResultSetHandler eh) throws StorageException {
   
           int result = 0;
  @@ -172,7 +172,7 @@
                           }
                       }
                   }
  -                if (statement.execute()) {
  +                if ( statement.execute() ) {
                       rs = statement.getResultSet();
                   } else {
                       return statement.getUpdateCount();
  @@ -259,6 +259,7 @@
           }
   
           final java.sql.Connection connection = getConnection();
  +        // TODO : ID must be in some mapping
           final String sql = "SELECT * FROM " + toSQLName(clasz.getName()) + " WHERE ID=?";
           result = (Persistent) PersistentProxy.getPersitent(clasz, id, false, this);
           final MetaObject pc = result.getMetaObject();
  @@ -285,7 +286,7 @@
   
               };
   
  -        if (excecute(connection, sql, new Object[]{id}, rsh) == 0) {
  +        if ( excecute(connection, sql, new Object[]{id}, rsh) == 0 ) {
               throw new ObjectNotFound(pc.getOID().toString(), null);
           }
   
  @@ -298,6 +299,7 @@
       public java.util.Set retrieveAll(final Class clasz) throws StorageException {
   
           final java.sql.Connection connection = getConnection();
  +        // TODO : INTERNAL_OID must be in some mapping
           final String sql = "SELECT ID AS INTERNAL_OID, * FROM " + toSQLName(clasz.getName());
           final java.util.Set objects = new java.util.HashSet();
           final InternalTransaction transaction = getTransaction();
  @@ -344,15 +346,19 @@
               }
           }
           names.setCharAt(names.length() - 1, ' ');
  +        // TODO : ID must be in some mapping
           names.append("WHERE ID=?");
           values.add(properties.getOID());
   
           final String sql = "UPDATE " + name + " SET " + names;
   
  -        excecute(connection, sql, values.toArray(), null);
  +       if(  excecute(connection, sql, values.toArray(), null ) == 0 ){
  +           throw new ObjectNotFound(properties.getOID().toString(), null);
  +       }   
   
       }
   
  +    // TODO : mot very meanigful here
       public void close() {
   
           try {
  @@ -395,7 +401,7 @@
                   params += ",?";
               }
           }
  -
  +       //TODO : ID !!!
           final String sql = "INSERT INTO " + toSQLName(clasz.getName()) + "(ID" + names + ")VALUES(?" + params + ")";
   
           excecute(connection, sql, values.toArray(), null);
  @@ -407,9 +413,12 @@
           final java.sql.Connection connection = getConnection();
           final String name = toSQLName(obj.getPersistentClass().getName());
           final Object id = obj.getOID();
  +        // TODO : ID must be in some mapping
           final String sql = "DELETE FROM " + name + " WHERE ID=?";
   
  -        excecute(connection, sql, new Object[]{id}, null);
  +       if( excecute(connection, sql, new Object[]{id}, null) == 0 ){
  +           throw new ObjectNotFound(obj.getOID().toString(), null);
  +       }
       }
   
       protected void internalCommit() throws StorageException {
  @@ -506,6 +515,7 @@
                       return;
                   }
                   String property = toPropertyName(name);
  +                // TODO : ID must be in some mapping
                   if (property.equals("Id") || map == null) {
                       return;
                   }
  
  
  
  1.4       +8 -2      jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/persistence/MetaObject.java
  
  Index: MetaObject.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/persistence/MetaObject.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MetaObject.java	9 Feb 2002 18:51:43 -0000	1.3
  +++ MetaObject.java	10 Feb 2002 10:48:33 -0000	1.4
  @@ -57,10 +57,10 @@
   /**
    *@author     Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
    *      baliuka@mwm.lt</a>
  - *@version    $Id: MetaObject.java,v 1.3 2002/02/09 18:51:43 froehlich Exp $
  + *@version    $Id: MetaObject.java,v 1.4 2002/02/10 10:48:33 baliuka Exp $
    */
   
  -public interface MetaObject {
  +public interface MetaObject extends Cloneable {
   
       public Object getOID();
   
  @@ -85,5 +85,11 @@
       public void setDirty(boolean dirty);
   
       public Persistent getObject();
  +    
  +    public Object clone()throws CloneNotSupportedException;
  +    
  +    public void assign( MetaObject mo);
  +    
  +    
   }
   
  
  
  
  1.5       +96 -75    jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/persistence/PersistentProxy.java
  
  Index: PersistentProxy.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/persistence/PersistentProxy.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PersistentProxy.java	9 Feb 2002 18:51:43 -0000	1.4
  +++ PersistentProxy.java	10 Feb 2002 10:48:33 -0000	1.5
  @@ -59,19 +59,19 @@
   /**
    *@author     Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
    *      baliuka@mwm.lt</a>
  - *@version    $Id: PersistentProxy.java,v 1.4 2002/02/09 18:51:43 froehlich Exp $
  + *@version    $Id: PersistentProxy.java,v 1.5 2002/02/10 10:48:33 baliuka Exp $
    */
  -public class PersistentProxy implements MetaObject, InvocationHandler, java.io.Serializable {
  -
  +public class PersistentProxy implements MetaObject, InvocationHandler,Cloneable, java.io.Serializable {
  +    
       private static Method HASH_CODE;
       private static Method EQUALS;
       private static Method TO_STRING;
       private static Method GET_OID;
       private static Method GET_META_OBJECT;
       private static java.util.Map defaults = new java.util.Hashtable();
  -
  +    
       java.util.Map map = new java.util.HashMap();
  -
  +    
       Object oid = null;
       Persistent object;
       Class pClass;
  @@ -79,8 +79,8 @@
       boolean dirty = false;
       boolean deleted = false;
       boolean newCreated;
  -
  -
  +    
  +    
       /**
        * Creates new ValueProxy
        *
  @@ -90,30 +90,30 @@
        *@param  transactionManager
        */
       public PersistentProxy(Class pClass, Object oid, boolean newCreated, TransactionManager transactionManager) {
  -
  +        
           this.oid = oid;
           this.newCreated = newCreated;
           this.transactionManager = transactionManager;
           this.pClass = pClass;
  -
  +        
       }
  -
  -
  +    
  +    // TODO : "next" interceptor as parameter 
       public static Persistent getPersitent(Class persistent, Object oid, boolean newCreated, TransactionManager transactionManager) {
           PersistentProxy handler = new PersistentProxy(persistent, oid, newCreated, transactionManager);
           Persistent p = (Persistent) Proxy.newProxyInstance(
  -                Thread.currentThread().getContextClassLoader(), new Class[]{persistent, Persistent.class}, handler);
  +        Thread.currentThread().getContextClassLoader(), new Class[]{persistent, Persistent.class}, handler);
           handler.object = p;
           if (newCreated) {
  -
  +            
               MetaObject mo = p.getMetaObject();
               transactionManager.getTransaction().add(mo);
           }
           return p;
       }
  -// TODO must be converter interface
  +    // TODO must be converter interface
       public static Object convertNumber(Number number, Class cls) {
  -
  +        
           if (cls.equals(Byte.class)) {
               return new Byte(number.byteValue());
           } else if (cls.equals(Short.class)) {
  @@ -133,11 +133,11 @@
           } else {
               throw new java.lang.UnsupportedOperationException("Number class = " + number.getClass().getName() + " Target Class " + cls.getName());
           }
  -
  +        
       }
       // TODO must be converter interface
       public static Object convertPrimityve(Number number, Class cls) {
  -
  +        
           if (cls.equals(Byte.TYPE)) {
               return new Byte(number.byteValue());
           } else if (cls.equals(Short.TYPE)) {
  @@ -157,7 +157,7 @@
           } else {
               throw new java.lang.UnsupportedOperationException("Number class = " + number.getClass().getName() + " Target Class " + cls.getName());
           }
  -
  +        
       }
       // TODO must be converter interface
       public static Object convert(Object object, Class cls) {
  @@ -170,32 +170,32 @@
                       return convertPrimityve((Number) object, cls);
                   }
               }
  -
  +            
               if (object == null) {
                   return null;
               }
  -
  +            
               if (cls.isAssignableFrom(object.getClass())) {
                   return object;
               }
  -
  +            
               // if( object instanceof String ){ ?????
               //     return org.apache.commons.beanutils.ConvertUtils.convert((String)object,cls);
               // }
  -
  -
  +            
  +            
               if (cls.isAssignableFrom(Number.class) && object instanceof Number) {
                   return convertNumber((Number) object, cls);
               }
  -
  +            
               if (cls.equals(Boolean.class) && object instanceof Number) {
                   return new Boolean(((Number) object).intValue() != 0);
               }
  -
  +            
               if (cls.equals(Character.TYPE)) {
                   return new Character(object.toString().charAt(0));
               }
  -
  +            
               throw new java.lang.UnsupportedOperationException(cls.getName() + ":" + object);
           } catch (Throwable t) {
               // TODO
  @@ -203,125 +203,125 @@
               throw new RuntimeException(t.getClass().getName() + ":" + t.getMessage());
           }
       }
  -
  +    
       public void setProperty(String name, Object value) {
  -
  +        
           Object old = map.put(name, value);
           if (old == null || !old.equals(value)) {
               dirty = true;
               transactionManager.getTransaction().add(this);
           }
       }
  -
  +    
       public void setDirty(boolean dirty) {
           this.dirty = dirty;
           this.newCreated = false;
       }
  -
  -
  +    
  +    
       public boolean isDeleted() {
           return deleted;
       }
  -
  +    
       public boolean isNew() {
           return newCreated;
       }
  -
  +    
       public MetaObject getMetaObject() {
           return this;
       }
  -
  +    
       public java.util.Map getProperties() {
           return map;
       }
  -
  +    
       public Object getProperty(String name) {
           return map.get(name);
       }
  -
  +    
       public boolean isLoaded() {
           return true;
       }
  -
  +    
       public Class getPersistentClass() {
           return pClass;
       }
  -
  +    
       public Object getOID() {
           return oid;
       }
  -
  +    
       public boolean isDirty() {
           return dirty;
       }
  -
  +    
       public Persistent getObject() {
           return object;
       }
  -
  +    
       public java.lang.Object handleEquals(java.lang.Object obj) {
  -
  +        
           if (obj == null) {
               return new Boolean(false);
           }
  -
  +        
           if (!(obj instanceof Persistent)) {
               return new Boolean(false);
           }
  -
  +        
           Persistent object = (Persistent) obj;
  -
  +        
           if (oid == null) {
  -
  +            
               return new Boolean(oid == object.getOID());
           } else {
  -
  +            
               return new Boolean(oid.equals(object.getOID()));
           }
  -
  +        
       }
  -
  +    
       public java.lang.Object invoke(Object obj, Method method, Object[] obj2) throws java.lang.Throwable {
  -
  +        
           synchronized (this) {
  -
  +            
               if (GET_META_OBJECT.equals(method)) {
                   return this;
               } else if (TO_STRING.equals(method)) {
  -
  +                
                   return oid + "";
               } else if (GET_OID.equals(method)) {
  -
  +                
                   return oid;
               } else if (HASH_CODE.equals(method)) {
  -
  +                
                   if (oid == null) {
                       return new Integer(0);
                   }
                   return new Integer(oid.hashCode());
               } else if (EQUALS.equals(method)) {
  -
  +                
                   return handleEquals(obj2[0]);
  -
  +                
               } else {
  -
  +                
                   return handleProperty(obj, method, obj2);
               }
  -
  +            
           }
       }
  -
  -
  +    
  +    
       public java.lang.Object handleProperty(java.lang.Object obj, java.lang.reflect.Method method, java.lang.Object[] obj2) throws java.lang.Throwable {
  -
  +        
           String name = method.getName();
  -
  +        
           if (name.startsWith("set")) {
  -
  +            
               setProperty(name.substring(3), obj2[0]);
               return null;
           } else if (name.startsWith("get") || name.startsWith("is")) {
  -
  +            
               if (method.getName().startsWith("get")) {
                   name = method.getName().substring(3);
               } else {
  @@ -333,26 +333,26 @@
               }
               return value;
           }
  -
  +        
           throw new java.lang.IllegalStateException("pure method " + method.getName());
  -
  +        
       }
  -
  +    
       public void remove() {
           deleted = true;
       }
  -
  +    
       static {
  -
  +        
           try {
  -
  +            
               GET_OID = Persistent.class.getMethod("getOID", null);
               GET_META_OBJECT = Persistent.class.getMethod("getMetaObject", null);
  -
  +            
               HASH_CODE = Object.class.getMethod("hashCode", null);
               TO_STRING = Object.class.getMethod("toString", null);
               EQUALS = Object.class.getMethod("equals", new Class[]{Object.class});
  -
  +            
               defaults.put(byte.class, new java.lang.Byte((byte) 0));
               defaults.put(short.class, new java.lang.Short((short) 0));
               defaults.put(int.class, new java.lang.Integer(0));
  @@ -361,13 +361,34 @@
               defaults.put(double.class, new java.lang.Double(0));
               defaults.put(char.class, new java.lang.Character('\u0000'));
               defaults.put(boolean.class, new java.lang.Boolean(false));
  -
  +            
           } catch (Exception e) {
               e.printStackTrace();
               throw new Error(e.getMessage());
           }
  -
  +        
  +    }
  +    
  +    public Object clone()throws CloneNotSupportedException{
  +        PersistentProxy cln = (PersistentProxy)super.clone();
  +        cln.dirty = false;
  +        map = (java.util.Map)((java.util.HashMap)map).clone();
  +        return cln;
  +    }
  +    
  +    public void assign(MetaObject mo) {
  +        
  +        map.clear();
  +        map.putAll(mo.getProperties());
  +        oid = mo.getOID();
  +        object = mo.getObject();
  +        pClass = mo.getPersistentClass();
  +        dirty = mo.isDirty();
  +        deleted = mo.isDeleted();
  +        newCreated = mo.isNew();
  +        
  +        
       }
  -
  +    
   }
   
  
  
  
  1.4       +17 -4     jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/persistence/TransactionImpl.java
  
  Index: TransactionImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/sample/org/apache/commons/simplestore/persistence/TransactionImpl.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TransactionImpl.java	10 Feb 2002 10:00:12 -0000	1.3
  +++ TransactionImpl.java	10 Feb 2002 10:48:33 -0000	1.4
  @@ -58,7 +58,7 @@
   /**
    *@author     Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
    *      baliuka@mwm.lt</a>
  - *@version    $Id: TransactionImpl.java,v 1.3 2002/02/10 10:00:12 baliuka Exp $
  + *@version    $Id: TransactionImpl.java,v 1.4 2002/02/10 10:48:33 baliuka Exp $
    */
   
   public class TransactionImpl implements InternalTransaction {
  @@ -68,7 +68,8 @@
       int threadId = getCurrentThreadId();
       InternalTransaction transaction;
       java.util.Set objects;
  -    java.util.Map attributes = new java.util.HashMap();
  +    java.util.Map attributes  = new java.util.HashMap();
  +    java.util.Map storedState = new java.util.HashMap();
       boolean complete = true;
   
       /**
  @@ -121,7 +122,7 @@
           checkState(!complete);
           transaction.commit(objects);
           complete = true;
  -
  +        storedState.clear();
       }
   
       public void begin() {
  @@ -134,13 +135,25 @@
       public void rollback() {
           checkState();
           checkState(!complete);
  +        java.util.Iterator i = objects.iterator();
  +        while(i.hasNext()){
  +          MetaObject mo = (MetaObject)i.next();   
  +          mo.assign( (MetaObject)storedState.get( mo.getOID() ) );// NPE ?
  +        }
  +        storedState.clear();
           transaction.rollback(objects);
           complete = true;
       }
   
       public void add(MetaObject props) {
           checkState();
  -        objects.add(props);
  +        if(objects.add(props)){
  +         try{   
  +          storedState.put(props.getOID(),props.clone());
  +         }catch( java.lang.CloneNotSupportedException cnse ){
  +           throw new java.lang.UnsupportedOperationException(cnse.getMessage());
  +         } 
  +        }
   
       }
   
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>