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/06/16 23:41:10 UTC

svn commit: r414934 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/

Author: arminw
Date: Fri Jun 16 14:41:09 2006
New Revision: 414934

URL: http://svn.apache.org/viewvc?rev=414934&view=rev
Log:
adapt classes to support the improved handling of advanced jdbc data types (like JAVA_OBJECT)

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessFactory.java
    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/PkEnumeration.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessFactory.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessFactory.java?rev=414934&r1=414933&r2=414934&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessFactory.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessFactory.java Fri Jun 16 14:41:09 2006
@@ -16,11 +16,12 @@
  */
 
 import org.apache.ojb.broker.PersistenceBroker;
+import org.apache.ojb.broker.PersistenceBrokerInternal;
 import org.apache.ojb.broker.util.factory.ConfigurableFactory;
 
 /**
+ * Factory to create {@link JdbcAccess} instances.
  *
- * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
  * @version $Id$
  */
 public class JdbcAccessFactory extends ConfigurableFactory
@@ -43,6 +44,6 @@
 
     public JdbcAccess createJdbcAccess(PersistenceBroker broker)
     {
-        return (JdbcAccess) createNewInstance(PersistenceBroker.class, broker);
+        return (JdbcAccess) createNewInstance(PersistenceBrokerInternal.class, broker);
     }
 }

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java?rev=414934&r1=414933&r2=414934&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 Fri Jun 16 14:41:09 2006
@@ -25,12 +25,12 @@
 
 import org.apache.ojb.broker.Identity;
 import org.apache.ojb.broker.OptimisticLockException;
-import org.apache.ojb.broker.PersistenceBroker;
 import org.apache.ojb.broker.PersistenceBrokerException;
+import org.apache.ojb.broker.PersistenceBrokerInternal;
 import org.apache.ojb.broker.PersistenceBrokerSQLException;
-import org.apache.ojb.broker.lob.LobHandle;
 import org.apache.ojb.broker.accesslayer.sql.SelectStatement;
 import org.apache.ojb.broker.core.ValueContainer;
+import org.apache.ojb.broker.lob.LobHandle;
 import org.apache.ojb.broker.metadata.ArgumentDescriptor;
 import org.apache.ojb.broker.metadata.ClassDescriptor;
 import org.apache.ojb.broker.metadata.FieldDescriptor;
@@ -45,11 +45,10 @@
 import org.apache.ojb.broker.util.sequence.SequenceManagerException;
 
 /**
- * JdbcAccess is responsible for establishing performing
- * SQL Queries against remote Databases.
- * It hides all knowledge about JDBC from the BrokerImpl
+ * JdbcAccess is responsible for establishing performing SQL Queries against remote
+ * Databases. It hides all knowledge about JDBC from the associated
+ * {@link org.apache.ojb.broker.PersistenceBroker}.
  *
- * @author <a href="mailto:thma@apache.org">Thomas Mahler</a>
  * @version $Id$
  */
 public class JdbcAccessImpl implements JdbcAccess
@@ -62,13 +61,13 @@
     /**
      * The broker in use.
      */
-    protected PersistenceBroker broker;
+    protected PersistenceBrokerInternal broker;
 
     /**
      * constructor is private, use getInstance to get
      * the singleton instance of this class
      */
-    public JdbcAccessImpl(PersistenceBroker broker)
+    public JdbcAccessImpl(PersistenceBrokerInternal broker)
     {
         this.broker = broker;
         logger = LoggerFactory.getLogger(this.getClass());
@@ -294,7 +293,7 @@
                 rs = stmt.executeQuery();
             }
 
-            return new ResultSetAndStatement(sm, stmt, rs, sql);
+            return new ResultSetAndStatement(broker, stmt, rs, sql);
         }
         catch (PersistenceBrokerException e)
         {
@@ -358,7 +357,7 @@
 
             // as we return the resultset for further operations, we cannot release the statement yet.
             // that has to be done by the JdbcAccess-clients (i.e. RsIterator, ProxyRsIterator and PkEnumeration.)
-            return new ResultSetAndStatement(sm, stmt, rs, new SelectStatement()
+            return new ResultSetAndStatement(broker, stmt, rs, new SelectStatement()
             {
                 public Query getQueryInstance()
                 {
@@ -592,16 +591,12 @@
             sm.bindSelect(stmt, oid, cld, false);
             rs = stmt.executeQuery();
             // data available read object, else return null
-            ResultSetAndStatement rs_stmt = new ResultSetAndStatement(broker.serviceStatementManager(), stmt, rs, sql);
+            ResultSetAndStatement rs_stmt = new ResultSetAndStatement(broker, stmt, rs, sql);
             if (rs.next())
             {
                 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();
@@ -723,11 +718,9 @@
             {
                 // Get the value and convert it to it's appropriate
                 // java type.
-                Object value = fmd.getJdbcType().getObjectFromColumn(callable, index);
-
+                Object value = fmd.readValue(broker, callable, index, true);
                 // Set the value of the persistent field.
-                fmd.getPersistentField().set(obj, fmd.getFieldConversion().sqlToJava(value));
-
+                fmd.getPersistentField().set(obj, value);
             }
         }
         catch (SQLException e)

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/PkEnumeration.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/PkEnumeration.java?rev=414934&r1=414933&r2=414934&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/PkEnumeration.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/PkEnumeration.java Fri Jun 16 14:41:09 2006
@@ -34,7 +34,9 @@
  * this class can be used to create enumerations of PrimaryKey objects.
  * This is interesting for EJB finder methods
  * in BMP entity beans which must return such enumerations.
+ *
  * @author Thomas Mahler
+ * @deprecated will be removed in next version.
  * @version $Id$
  */
 public class PkEnumeration implements Enumeration
@@ -110,7 +112,7 @@
             for (int i = 0; i < pkfields.length; i++)
             {
                 fld = pkfields[i];
-                colValue = fld.getJdbcType().getObjectFromColumn(resultSetAndStatment.m_rs, fld.getColumnName());
+                colValue = fld.readValue(resultSetAndStatment, true);
                 fld.getPersistentField().set(obj, colValue);
             }
             // 3. return the representing identity object

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java?rev=414934&r1=414933&r2=414934&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java Fri Jun 16 14:41:09 2006
@@ -21,8 +21,8 @@
 import org.apache.ojb.broker.PersistenceBrokerException;
 import org.apache.ojb.broker.core.PersistenceBrokerImpl;
 import org.apache.ojb.broker.metadata.FieldDescriptor;
-import org.apache.ojb.broker.metadata.JdbcTypesHelper;
 import org.apache.ojb.broker.metadata.JdbcType;
+import org.apache.ojb.broker.metadata.JdbcTypesHelper;
 import org.apache.ojb.broker.query.ReportQuery;
 
 /**
@@ -58,7 +58,6 @@
     {
         Object[] result = new Object[m_attributeCount];
         ReportQuery q =(ReportQuery) getQueryObject().getQuery();
-
         for (int i = 0; i < m_attributeCount; i++)
         {
             try
@@ -68,15 +67,15 @@
                 Object val;
                 if(fld != null)
                 {
-                    val = fld.getJdbcType().getObjectFromColumn(getRsAndStmt().m_rs, i + 1);
-                    val = fld.getFieldConversion().sqlToJava(val);
+                    val = fld.readValue(getRsAndStmt(), i+1, true);
                 }
                 else
                 {
+                    // if we don't know the associated FieldDescriptor we have to use
+                    // basic methods to read in the value
                     int jdbcType = extractJdbcType(i);
                     JdbcType type = JdbcTypesHelper.getJdbcTypeByTypesIndex(new Integer(jdbcType));
                     val = type.getObjectFromColumn(getRsAndStmt().m_rs, i + 1);
-                    //val =JdbcTypesHelper.getObjectFromColumn(getRsAndStmt().m_rs, new Integer(jdbcType), i + 1);
                 }
                 result[i] = val;
             }

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java?rev=414934&r1=414933&r2=414934&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java Fri Jun 16 14:41:09 2006
@@ -18,18 +18,18 @@
 import java.sql.ResultSet;
 import java.sql.Statement;
 
+import org.apache.ojb.broker.PersistenceBrokerInternal;
 import org.apache.ojb.broker.accesslayer.sql.SelectStatement;
+import org.apache.ojb.broker.platforms.Platform;
 
 /**
  * Intern used wrapper for {@link Statement} and {@link ResultSet} instances.
+ * Make sure that after use of this class method {@link #close()} was called.
  *
  * @version $Id$
  */
-public class ResultSetAndStatement
+public final class ResultSetAndStatement
 {
-	// private static Logger log = LoggerFactory.getLogger(ResultSetAndStatement.class);
-
-	private final StatementManagerIF manager;
     private boolean isClosed;
     /*
     arminw: declare final to avoid stmt/rs leaking in use
@@ -38,10 +38,13 @@
     public final ResultSet m_rs;
     public final Statement m_stmt;
     public final SelectStatement m_sql;
+    public final PersistenceBrokerInternal m_broker;
+    public final Platform m_platform;
 
-	public ResultSetAndStatement(StatementManagerIF manager, Statement stmt, ResultSet rs, SelectStatement sql)
+    public ResultSetAndStatement(PersistenceBrokerInternal broker, Statement stmt, ResultSet rs, SelectStatement sql)
     {
-		this.manager = manager;
+        this.m_broker = broker;
+        this.m_platform = broker.serviceConnectionManager().getSupportedPlatform();
         m_stmt = stmt;
         m_rs = rs;
         m_sql = sql;
@@ -49,7 +52,7 @@
     }
 
     /**
-     * do a platform specific resource release.
+     * Do a platform specific resource release.
      * <br/>
      * Note: This method must be called after usage
      * of this class.
@@ -58,7 +61,7 @@
     {
         if(!isClosed)
         {
-            manager.closeResources(m_stmt, m_rs);
+            m_broker.serviceStatementManager().closeResources(m_stmt, m_rs);
             isClosed = true;
         }
     }

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java?rev=414934&r1=414933&r2=414934&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java Fri Jun 16 14:41:09 2006
@@ -33,7 +33,7 @@
  */
 public class RowReaderDefaultImpl implements RowReader
 {
-    /** 
+    /**
      * Used as key in result set row map.
      */
     private static final String OJB_CONCRETE_CLASS_KEY = "ojbTemporaryNoneColumnKey";
@@ -203,8 +203,8 @@
                 else
                 {
                     fields = m_cld.getFieldDescriptor(true);
-                }           
-            }         
+                }
+            }
         }
         readValuesFrom(rs_stmt, row, fields);
     }
@@ -217,7 +217,7 @@
 
         String ojbClass = SqlHelper.getOjbClassName(rs_stmt);
         ClassDescriptor cld;
-        
+
         if (ojbClass != null)
         {
             cld = m_cld.getRepository().getDescriptorFor(ojbClass);
@@ -234,18 +234,19 @@
     public void readValuesFrom(ResultSetAndStatement rs_stmt, Map row, FieldDescriptor[] fields)
     {
         int size = fields.length;
-        Object val;
         FieldDescriptor fld = null;
         try
         {
+            Object value;
             for (int j = 0; j < size; j++)
             {
                 fld = fields[j];
                 if(!row.containsKey(fld.getColumnName()))
                 {
-                    int idx = rs_stmt.m_sql.getColumnIndex(fld);
-                    val = fld.getJdbcType().getObjectFromColumn(rs_stmt.m_rs, null, fld.getColumnName(), idx);
-                    row.put(fld.getColumnName(), fld.getFieldConversion().sqlToJava(val));
+                    // Get the value and convert it to it's appropriate
+                    // java type.
+                    value = fld.readValue(rs_stmt, true);
+                    row.put(fld.getColumnName(), value);
                 }
             }
         }

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java?rev=414934&r1=414933&r2=414934&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 Fri Jun 16 14:41:09 2006
@@ -33,6 +33,8 @@
 import org.apache.ojb.broker.PersistenceBrokerException;
 import org.apache.ojb.broker.PersistenceBrokerInternal;
 import org.apache.ojb.broker.PersistenceBrokerSQLException;
+import org.apache.ojb.broker.lob.LobHandle;
+import org.apache.ojb.broker.platforms.Platform;
 import org.apache.ojb.broker.cache.MaterializationCache;
 import org.apache.ojb.broker.cache.ObjectCacheInternal;
 import org.apache.ojb.broker.core.PersistenceBrokerImpl;
@@ -484,10 +486,6 @@
                             // fill reference and collection attributes
                             ClassDescriptor cld = pb.getClassDescriptor(result.getClass());
 
-                            // TODO: Wrap LOB-fields in RowReader in next major version
-                            // wrap LOB fields
-                            pb.serviceLobHelper().wrapLobFields(cld, result);
-
                             // don't force loading of reference
                             pb.getReferenceBroker().retrieveReferences(result, cld, false);
                             pb.getReferenceBroker().retrieveCollections(result, cld, false);
@@ -515,19 +513,25 @@
                     // 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 if(cld.hasLobField() && pb.serviceLobHelper().isLobAutoRefresh())
                 {
                     /*
-                    TODO: Improve! Find better solution
+                    If the object has LOB content we have to re-read the locator
+                    object of cached objects
                     */
                     FieldDescriptor[] flds = cld.getLobFields();
-                    writeFields(getRsAndStmt(), rowReader, row, flds, result);
-                    pb.serviceLobHelper().wrapLobFields(cld, result);
+                    for(int i = 0; i < flds.length; i++)
+                    {
+                        FieldDescriptor fld = flds[i];
+                        LobHandle lob = (LobHandle) fld.getPersistentField().get(result);
+                        // if LOB content isn't active, we have to re-read content
+                        if(!lob.isActive())
+                        {
+                            rowReader.readValuesFrom(getRsAndStmt(), row, new FieldDescriptor[]{fld});
+                            fld.getPersistentField().set(result, row.get(fld.getColumnName()));
+                        }
+                    }
                 }
                 pb.checkRefreshRelationships(result, oid, cld);
             }
@@ -537,20 +541,6 @@
     }
 
     /**
-     * Write the specified fields from result set into the target object.
-     */
-    private void writeFields(ResultSetAndStatement rs_stmt, RowReader rowReader, Map row, FieldDescriptor[] fields, Object target)
-    {
-        rowReader.readValuesFrom(rs_stmt, row, fields);
-        FieldDescriptor fmd;
-        for (int i = 0; i < fields.length; i++)
-        {
-            fmd = fields[i];
-            fmd.getPersistentField().set(target, row.get(fmd.getColumnName()));
-        }
-    }
-
-    /**
      * Reads primary key information from current RS row and generates a
      *
      * corresponding Identity, and returns a proxy from the Identity.
@@ -642,9 +632,7 @@
         {
             //ignore it
         }
-        if (!supportsAdvancedJDBCCursorControl()
-                || getBroker().serviceConnectionManager().getSupportedPlatform().useCountForResultsetSize()
-                || forwardOnly)
+        if (!supportsAdvancedJDBCCursorControl() || getPlatform().useCountForResultsetSize() || forwardOnly)
         {
             /**
              * MBAIRD: doesn't support the .last .getRow method, use the
@@ -932,6 +920,11 @@
     protected JdbcConnectionDescriptor getConnectionDescriptor()
     {
         return getBroker().serviceConnectionManager().getConnectionDescriptor();
+    }
+
+    protected Platform getPlatform()
+    {
+        return getBroker().serviceConnectionManager().getSupportedPlatform();
     }
 
     /**



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