You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2006/05/02 02:26:45 UTC

svn commit: r398752 - in /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker: accesslayer/JdbcAccessImpl.java accesslayer/RsIterator.java core/PersistenceBrokerImpl.java metadata/ClassDescriptor.java

Author: arminw
Date: Mon May  1 17:26:42 2006
New Revision: 398752

URL: http://svn.apache.org/viewcvs?rev=398752&view=rev
Log:
add initial LOB field support

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java?rev=398752&r1=398751&r2=398752&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java Mon May  1 17:26:42 2006
@@ -581,6 +581,10 @@
                 Map row = new HashMap();
                 cld.getRowReader().readObjectArrayFrom(rs_stmt, row);
                 result = cld.getRowReader().readObjectFrom(row);
+
+                // TODO: Wrap LOB-fields in RowReader in next major version
+                // wrap LOB fields
+                broker.serviceLobHelper().wrapLobFields(cld, result);
             }
             // close resources
             rs_stmt.close();

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java?rev=398752&r1=398751&r2=398752&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java Mon May  1 17:26:42 2006
@@ -488,6 +488,11 @@
                             // Maps ReferenceDescriptors to HashSets of owners
                             pb.getReferenceBroker().retrieveReferences(result, cld, unforced);
                             pb.getReferenceBroker().retrieveCollections(result, cld, unforced);
+
+                            // TODO: Wrap LOB-fields in RowReader in next major version
+                            // wrap LOB fields
+                            pb.serviceLobHelper().wrapLobFields(cld, result);
+
                             getCache().disableMaterializationCache();
                         }
                         catch(RuntimeException e)
@@ -509,6 +514,15 @@
                     // map all field values from the current result set
                     rowReader.readObjectArrayFrom(getRsAndStmt(), row);
                     rowReader.refreshObject(result, row);
+
+                    // TODO: Wrap LOB-fields in RowReader in next major version
+                    // wrap LOB fields
+                    pb.serviceLobHelper().wrapLobFields(cld, result);
+                }
+                else
+                {
+                    // refresh LOB fields
+                    pb.serviceLobHelper().internalAutoRefresh(result, cld);
                 }
                 pb.checkRefreshRelationships(result, oid, cld);
             }

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java?rev=398752&r1=398751&r2=398752&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java Mon May  1 17:26:42 2006
@@ -25,6 +25,8 @@
 import java.util.Set;
 
 import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.ojb.broker.Identity;
 import org.apache.ojb.broker.IdentityFactory;
 import org.apache.ojb.broker.ManageableCollection;
@@ -37,6 +39,10 @@
 import org.apache.ojb.broker.TransactionInProgressException;
 import org.apache.ojb.broker.TransactionNotInProgressException;
 import org.apache.ojb.broker.TransientObjectException;
+import org.apache.ojb.broker.PersistenceBrokerInternal;
+import org.apache.ojb.broker.PersistenceBroker;
+import org.apache.ojb.broker.lob.LobHelper;
+import org.apache.ojb.broker.lob.LobHelperImpl;
 import org.apache.ojb.broker.accesslayer.ChainingIterator;
 import org.apache.ojb.broker.accesslayer.ConnectionManagerFactory;
 import org.apache.ojb.broker.accesslayer.ConnectionManagerIF;
@@ -74,6 +80,9 @@
 import org.apache.ojb.broker.util.BrokerHelper;
 import org.apache.ojb.broker.util.IdentityArrayList;
 import org.apache.ojb.broker.util.ObjectModification;
+import org.apache.ojb.broker.util.ClassHelper;
+import org.apache.ojb.broker.util.configuration.Configuration;
+import org.apache.ojb.broker.util.configuration.ConfigurationException;
 import org.apache.ojb.broker.util.logging.Logger;
 import org.apache.ojb.broker.util.logging.LoggerFactory;
 import org.apache.ojb.broker.util.sequence.SequenceManager;
@@ -97,6 +106,15 @@
 {
     private Logger logger = LoggerFactory.getLogger(PersistenceBrokerImpl.class);
 
+    /**
+     * A stack trace of this broker user.
+     * Used when broker leak detection is enabled.
+     */
+    protected String brokerStackTrace;
+    /**
+     * Returns <em>true</em> if broker leak detection is enabled.
+     */
+    protected boolean brokerLeakDetection;
     protected PersistenceBrokerFactoryIF pbf;
     protected BrokerHelper brokerHelper;
     protected MtoNBroker mtoNBroker;
@@ -131,6 +149,7 @@
     private IdentityFactory identityFactory;
     private RelationshipPrefetcherFactory relationshipPrefetcherFactory;
     private ProxyFactory proxyFactory;
+    private LobHelper lobHelper;
     private PBKey pbKey;
 
     /**
@@ -208,11 +227,34 @@
                         connectionManager.getSupportedPlatform());
         mtoNBroker = new MtoNBroker(this);
         referencesBroker = new QueryReferenceBroker(this);
-        identityFactory = new IdentityFactoryImpl(this);
         relationshipPrefetcherFactory = new RelationshipPrefetcherFactory(this);
         proxyFactory = AbstractProxyFactory.getProxyFactory();
     }
 
+    public void configure(Configuration pConfig) throws ConfigurationException
+    {
+        super.configure(pConfig);
+        brokerLeakDetection = pConfig.getBoolean("BrokerLeakDetection", false);
+        Class lobHelperClass = pConfig.getClass("LobHelperClass", LobHelperImpl.class);
+        Class identityFactoryClass = pConfig.getClass("IdentityFactoryClass", IdentityFactoryImpl.class);
+        boolean lobAutoRefresh = pConfig.getBoolean("LobAutoRefresh", false);
+        try
+        {
+            lobHelper = (LobHelper) ClassHelper.newInstance(lobHelperClass, PersistenceBrokerInternal.class, this);
+            identityFactory = (IdentityFactory) ClassHelper.newInstance(identityFactoryClass, PersistenceBroker.class, this);
+            lobHelper.setLobAutoRefresh(lobAutoRefresh);
+        }
+        catch(Exception e)
+        {
+            throw new PersistenceBrokerException("Can't configure this instance", e);
+        }
+    }
+
+    public LobHelper serviceLobHelper()
+    {
+        return lobHelper;
+    }
+
     public MaterializationCache getInternalCache()
     {
         return objectCache;
@@ -281,6 +323,11 @@
         if(!closed)
         {
             refresh();
+            if(brokerLeakDetection)
+            {
+                brokerStackTrace = ExceptionUtils.getFullStackTrace(
+                        new Exception("PersistenceBroker caller stack"));
+            }
         }
         this.isClosed = closed;
     }
@@ -1731,7 +1778,7 @@
         {
             obj = getDBObject(id);
         }
-        else
+        else // cache match
         {
             ClassDescriptor cld = getClassDescriptor(obj.getClass());
             // if specified in the ClassDescriptor the instance must be refreshed
@@ -1739,6 +1786,11 @@
             {
                 refreshInstance(obj, id, cld);
             }
+            else
+            {
+                // refresh LOB-fields
+                serviceLobHelper().internalAutoRefresh(obj, cld);
+            }
             // now refresh all references
             checkRefreshRelationships(obj, id, cld);
         }
@@ -1807,8 +1859,8 @@
             if(oid.isTransient())
             {
                 if(logger.isEnabledFor(Logger.INFO)) logger.info(
-                        "The object to query was detected as transient, will only lookup the cache for object instance. Identity="
-                        + oid + ", the query object was " + query);
+                        "The object to query was detected as transient, will only lookup the cache for object" +
+                                " instance. Identity=" + oid + ", the query object was " + query);
                 result = this.objectCache.lookup(oid);
             }
             else
@@ -2228,9 +2280,19 @@
         try
         {
             super.finalize();
+            // if not closed ==> broker leak detected
             if (!isClosed)
             {
-                logger.warn("Garbage collection: Unclosed PersistenceBroker instance detected, check code for PB leaks");
+                String msg = "Garbage collection: Unclosed PersistenceBroker instance detected, check code for PB leaks.";
+                if(brokerLeakDetection)
+                {
+                    logger.error(msg + " Broker caller stack is: "
+                            + SystemUtils.LINE_SEPARATOR + brokerStackTrace);
+                }
+                else
+                {
+                    logger.warn(msg);
+                }
                 close();
             }
         }

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java?rev=398752&r1=398751&r2=398752&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java Mon May  1 17:26:42 2006
@@ -135,6 +135,10 @@
      */
     private Class factoryClass;
     private int useIdentityColumn = 0;
+    /**
+     * Indicate whether or not this class has LOB fields.
+     */
+    private Boolean hasLobField;
 
     private String baseClass = null;
     /**
@@ -432,6 +436,7 @@
         m_lockingFieldDescriptors = null;
         m_RwFieldDescriptors = null;
         m_RwNonPkFieldDescriptors = null;
+        hasLobField = null;
     }
 
     public boolean removeFieldDescriptor(FieldDescriptor fld)
@@ -449,6 +454,7 @@
         m_lockingFieldDescriptors = null;
         m_RwFieldDescriptors = null;
         m_RwNonPkFieldDescriptors = null;
+        hasLobField = null;
         return result;
     }
 
@@ -2227,5 +2233,27 @@
     public SuperReferenceDescriptor getSuperReference()
     {
         return (SuperReferenceDescriptor) getObjectReferenceDescriptorByName(SuperReferenceDescriptor.SUPER_FIELD_INTERNAL_NAME);
+    }
+
+    /**
+     * Returns <em>true</em> if this class has one or more LOB fields (Blob, Clob).
+     */
+    public boolean hasLobField()
+    {
+        if(hasLobField == null)
+        {
+            hasLobField = Boolean.FALSE;
+            FieldDescriptor[] fields = getFieldDescriptor(true);
+            for(int i = 0; i < fields.length; i++)
+            {
+                FieldDescriptor field = fields[i];
+                if(field.isLobFieldType())
+                {
+                    hasLobField = Boolean.TRUE;
+                    break;
+                }
+            }
+        }
+        return hasLobField.booleanValue();
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org