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/07/15 16:17:30 UTC

svn commit: r422228 [1/2] - in /db/ojb/trunk: ./ src/java/org/apache/ojb/broker/accesslayer/ src/java/org/apache/ojb/broker/accesslayer/conversions/ src/java/org/apache/ojb/broker/accesslayer/sql/

Author: arminw
Date: Sat Jul 15 07:17:29 2006
New Revision: 422228

URL: http://svn.apache.org/viewvc?rev=422228&view=rev
Log:
merge trunk with 1.0.x

Modified:
    db/ojb/trunk/build-torque.xml
    db/ojb/trunk/build.properties
    db/ojb/trunk/build.xml
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryDBCPImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/PlainPrefetcher.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReferencePrefetcher.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReader.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsQueryObject.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/FieldConversion.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/IntList2VarcharFieldConversion.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/StringList2VarcharFieldConversion.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/StringVector2VarcharFieldConversion.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/TimeList2VarcharFieldConversion.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/sql/SqlExistStatement.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/sql/SqlGeneratorDefaultImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/sql/SqlInsertStatement.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/sql/SqlQueryStatement.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectByPkStatement.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java

Modified: db/ojb/trunk/build-torque.xml
URL: http://svn.apache.org/viewvc/db/ojb/trunk/build-torque.xml?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/build-torque.xml (original)
+++ db/ojb/trunk/build-torque.xml Sat Jul 15 07:17:29 2006
@@ -1,5 +1,21 @@
 <project name="Torque" default="main" basedir=".">
   <!--
+#/* Copyright 2002-2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+  <!--
     Note - You should not have to edit this file.
 
     Instead, if calling build-torque.xml directly, edit the build.properties
@@ -22,7 +38,7 @@
   <property file="${torque.contextProperties}"/>
   <property name="lib.dir" value="lib"/>
   <property name="torque.lib.dir" value="${lib.dir}"/>
-  <property name="torque.jar" value="torque-gen-3.1.jar"/>
+
 
   <!--
     Build the classpath. Specifically point to each file we're including to avoid
@@ -33,14 +49,6 @@
   -->
   <path id="torque-classpath">
     <fileset dir="${torque.lib.dir}">
-      <include name="**/commons-collections-2.1.jar"/>
-      <include name="**/commons-lang-1.0.1.jar"/>
-      <include name="**/log4j-1.2.8.jar"/>
-      <include name="**/${torque.jar}"/>
-      <include name="**/velocity-1.3.1.jar"/>
-      <include name="**/village-2.0-dev-20030825.jar"/>
-      <include name="**/xercesImpl-2.0.2.jar"/>
-      <include name="**/xmlParserAPIs-2.0.2.jar"/>
       <include name="**/*.jar"/>
     </fileset>
   </path>

Modified: db/ojb/trunk/build.properties
URL: http://svn.apache.org/viewvc/db/ojb/trunk/build.properties?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/build.properties (original)
+++ db/ojb/trunk/build.properties Sat Jul 15 07:17:29 2006
@@ -22,7 +22,6 @@
 # implemented profiles:
 #
 profile=hsqldb
-
 # use the mssqldb-JSQLConnect profile for Microsoft SQL Server and
 # you will automatically JSQLConnect driver, from http://www.j-netdirect.com/
 # MBAIRD: This is my driver of preference for MS SQL Server, I find the OEM'd
@@ -32,7 +31,6 @@
 #profile=mssqldb-ms
 #profile=mysql
 #profile=db2
-#profile=derby
 #profile=oracle
 #profile=oracle9i
 #profile=msaccess
@@ -41,6 +39,7 @@
 #profile=sybase
 #profile=sapdb
 #profile=maxdb
+#profile=derby
 #profile=mckoi
 #profile=firebird
 
@@ -145,10 +144,10 @@
 org.apache.ojb.broker.accesslayer,\
 org.apache.ojb.broker.accesslayer.conversions,\
 org.apache.ojb.broker.core.*,\
-org.apache.ojb.broker.dirty,\
 org.apache.ojb.broker.metadata,\
 org.apache.ojb.broker.metadata.fieldaccess,\
 org.apache.ojb.broker.cache,\
+org.apache.ojb.broker.lob,\
 org.apache.ojb.broker.locking,\
 org.apache.ojb.broker.util,\
 org.apache.ojb.broker.util.logging,\
@@ -164,20 +163,21 @@
 org.apache.ojb.junit,\
 org.apache.ojb.performance
 
-copyright=(C) 2002 - 2006 Apache Software Foundation <br>All rights reserved. Published under the Apache License 2.0. <br> <a href="http://db.apache.org/ojb">http://db.apache.org/ojb</a>
-icon=<img src="../images/ojb-200.png" alt="ObJectRelationalBridge">
-br=<br>
-hr=<hr>
+copyright=(C) 2002 - 2006 Apache Software Foundation \
+<br/>All rights reserved. Published under the Apache License 2.0. \
+<br/><a href="http://db.apache.org/ojb">http://db.apache.org/ojb</a>
+icon=<img src="../images/ojb-400-white.png" alt="ObJectRelationalBridge">
+br=<br/>
 
 
 # project name and version info
 name=ObJectRelationalBridge
 project-name=db-ojb
-major=1
-minor=1
+major=2
+minor=0
 build=0
 version=${major}.${minor}.${build}
-versiondate=2005-10-15
+versiondate=2006-XX-XX
 ojb-filename-prefix=${project-name}-${version}
 
 #

Modified: db/ojb/trunk/build.xml
URL: http://svn.apache.org/viewvc/db/ojb/trunk/build.xml?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/build.xml (original)
+++ db/ojb/trunk/build.xml Sat Jul 15 07:17:29 2006
@@ -17,11 +17,6 @@
  */
 -->
 <!-- @version $Id$ -->
-<!--
-     ObJectRelationalBridge ANT build configuration.
-     initial author: Thomas Mahler
-     contains modifications by Chris Greenlee and others.
--->
 
 <project name="ObJectRelationalBridge" default="all" basedir=".">
 
@@ -64,6 +59,13 @@
         <path refid="compilation-classpath"/>
     </path>
 
+    <!-- classpath used for OJB's test suite -->
+    <path id="junit-classpath">
+        <path refid="runtime-classpath"/>
+        <!-- this jar was used in OJB's test suite -->
+        <pathelement path="${build.test}/tmp/test-res.jar"/>
+    </path>
+
     <property name="runtime.classpath" refid="runtime-classpath"/>
 
 
@@ -395,19 +397,6 @@
     </target>
 
     <!-- ================================================================== -->
-    <!-- dump testdb using torque                                        -->
-    <!-- ================================================================== -->
-    <target name="dump-testdb"
-            description="dump testdb using torque">
-        <ant dir="."
-             antfile="${torque.buildFile}"
-             target="project-datadtd-classpath"/>
-        <ant dir="."
-             antfile="${torque.buildFile}"
-             target="project-datadump-classpath"/>
-    </target>
-
-    <!-- ================================================================== -->
     <!-- prepare testdb using DdlUtils                                      -->
     <!-- ================================================================== -->
     <target name="prepare-testdb-ddlutils"
@@ -468,6 +457,19 @@
     </target>
 
     <!-- ================================================================== -->
+    <!-- dump testdb using torque                                        -->
+    <!-- ================================================================== -->
+    <target name="dump-testdb"
+            description="dump testdb using torque">
+        <ant dir="."
+             antfile="${torque.buildFile}"
+             target="project-datadtd-classpath"/>
+        <ant dir="."
+             antfile="${torque.buildFile}"
+             target="project-datadump-classpath"/>
+    </target>
+
+    <!-- ================================================================== -->
     <!-- Build the JAR file using main-opt                                  -->
     <!-- ================================================================== -->
 
@@ -589,17 +591,7 @@
         <!-- 3. additional jar files -->
         <copy todir="${build.servlet}/WEB-INF/lib">
             <fileset dir="${lib}">
-                <include name="**/*.jar"/>
-                <exclude name="jdo*.jar"/>
-                <exclude name="ant-*.jar"/>
-                <exclude name="xerces*.jar"/>
-                <exclude name="xml-*.jar"/>
-                <exclude name="xalan*.jar"/>
-                <exclude name="jakarta-regexp*.jar"/>
-                <exclude name="torque*.jar"/>
-                <exclude name="velocity*.jar"/>
-                <exclude name="xdoclet*.jar"/>
-                <exclude name="xjava*.jar"/>
+                <include name="commons-*.jar"/>
             </fileset>
         </copy>
 
@@ -1151,6 +1143,35 @@
            basedir="${build.mavendist}"/>
   </target> 
  
+    <!-- =================================================================== -->
+	<!-- create jar resource for a specific test in OJB's test-suite         -->
+	<!-- =================================================================== -->
+    <target name="prepare-test-suite" description="Prepare OJB's test suite">
+        <property name="res.src" value="${src.test}/org/apache/ojb"/>
+        <property name="res.tmp.dir" value="${build.test}/tmp"/>
+        <property name="res.jar.name" value="test-res.jar" />
+        <property name="res.jar.dir" value="${res.tmp.dir}" />
+
+        <delete dir="${res.tmp.dir}" />
+        <mkdir dir="${res.tmp.dir}" />
+        <mkdir dir="${res.tmp.dir}/tmp" />
+
+        <copy todir="${res.tmp.dir}/tmp">
+            <fileset dir="${res.src}">
+              <include name="repository.dtd Test_Repository_Renamed_DTD.xml"/>
+            </fileset>
+        </copy>
+        <copy file="${res.src}/repository.dtd" tofile="${res.jar.dir}/tmp/test_renamed_repository.dtd"/>
+        <copy file="${res.src}/Test_Repository_Renamed_DTD.xml" todir="${res.jar.dir}/tmp"/>
+
+        <jar jarfile="${res.jar.dir}/tmp/${res.jar.name}"
+            basedir="${res.jar.dir}/tmp">
+        </jar>
+
+        <copy file="${res.jar.dir}/tmp/${res.jar.name}" todir="${res.jar.dir}"/>
+        <delete dir="${res.tmp.dir}/tmp" />
+    </target>
+
     <!-- ================================================================== -->
     <!-- Perform JUnit Tests                                                -->
     <!-- ================================================================== -->
@@ -1163,10 +1184,10 @@
     	description="Performs all JUnit regression tests."/>
 
     <!-- property 'test.package' has to be set at command line -->
-    <target name="run-test" depends="junit-environment-check, prepare-repository, copy-testdb">
+    <target name="run-test" depends="junit-environment-check, prepare-repository, copy-testdb, prepare-test-suite">
         <junit printsummary="yes" showoutput="true" fork="yes" dir="${build.test}/ojb">
         	<jvmarg value="-DOJB.bootLogLevel=INFO" />
-            <classpath refid="runtime-classpath"/>
+            <classpath refid="junit-classpath"/>
             <formatter type="plain" />
             <test name="${test.package}"
                   haltonfailure="no"
@@ -1177,7 +1198,7 @@
     </target>
 
     <target name="junit-no-compile"
-    	    depends="junit-environment-check,prepare,prepare-testdb,junit-no-compile-no-prepare,junit-no-compile-no-prepare-selected"
+    	    depends="junit-environment-check,prepare,prepare-testdb, prepare-test-suite, junit-no-compile-no-prepare,junit-no-compile-no-prepare-selected"
     />
 
     <target name="junit-no-compile-no-prepare"
@@ -1185,7 +1206,7 @@
         <junit printsummary="yes" fork="yes" dir="${build.test}/ojb">
         	<jvmarg value="-DOJB.bootLogLevel=INFO" />
             <jvmarg value="-DOJB.skip.issues=${OJB.skip.issues}" />
-            <classpath refid="runtime-classpath"/>
+            <classpath refid="junit-classpath"/>
             <formatter type="plain" />
             <formatter type="xml" />
 
@@ -1198,15 +1219,15 @@
                   haltonfailure="no"
                   outfile="target/test/tests-odmg" >
             </test>
-            <test name="org.apache.ojb.soda.AllTests"
-                  haltonfailure="no"
-                  outfile="target/test/tests-soda" >
-            </test>
-
-            <test name="org.apache.ojb.otm.AllTests"
-                  haltonfailure="no"
-                  outfile="target/test/tests-otm" >
-            </test>
+            <!--<test name="org.apache.ojb.soda.AllTests"-->
+                  <!--haltonfailure="no"-->
+                  <!--outfile="target/test/tests-soda" >-->
+            <!--</test>-->
+<!---->
+            <!--<test name="org.apache.ojb.otm.AllTests"-->
+                  <!--haltonfailure="no"-->
+                  <!--outfile="target/test/tests-otm" >-->
+            <!--</test>-->
 
         </junit>
     </target>
@@ -1217,7 +1238,7 @@
             <jvmarg value="-DOJB.bootLogLevel=INFO" />
             <jvmarg value="-DOJB.skip.issues=${OJB.skip.issues}" />
 <!--            <jvmarg value="-Xrunyjpagent:alloc,onexit=memory"/> -->
-            <classpath refid="runtime-classpath"/>
+            <classpath refid="junit-classpath"/>
             <formatter type="plain" />
             <formatter type="xml" />
 
@@ -1251,7 +1272,7 @@
         <junit printsummary="yes" fork="yes" dir="${build.test}/ojb">
             <jvmarg value="-DOJB.bootLogLevel=INFO"/>
             <jvmarg value="-DOJB.skip.issues=${OJB.skip.issues}"/>
-            <classpath refid="runtime-classpath"/>
+            <classpath refid="junit-classpath"/>
             <formatter type="plain"/>
             <formatter type="xml"/>
             <test name="org.apache.ojb.broker.sqlcount.AllTests"
@@ -1273,6 +1294,7 @@
     <target name="copy-testdb" depends="prepare">
     	<delete file="${build.test}/OJB.properties"/>
     	<delete file="${build.test}/OJB.script"/>
+    	<delete file="${build.test}/OJB.log"/>
     	<copy file="${src.test}/org/apache/ojb/quick-db/OJB.properties" tofile="${build.test}/OJB.properties"/>
     	<copy file="${src.test}/org/apache/ojb/quick-db/OJB.script" tofile="${build.test}/OJB.script"/>
 
@@ -1289,7 +1311,7 @@
         <java fork="yes" classname="org.apache.ojb.compare.CompareApiPerformanceTests"
               dir="${build.test}/ojb" taskname="ojb" failonerror="true" >
             <classpath refid="runtime-classpath"/>
-            <arg value="2500"/>
+            <arg value="1500"/>
             <arg value="3"/>
             <jvmarg value="-Xms128m"/>
             <jvmarg value="-Xmx256m"/>
@@ -1326,13 +1348,13 @@
             <arg value=
             "org.apache.ojb.compare.OJBPerfTest$JdbcPerfTest,
             org.apache.ojb.compare.OJBPerfTest$PBPerfTest,
-            org.apache.ojb.compare.OJBPerfTest$ODMGPerfTest,
-            org.apache.ojb.compare.OJBPerfTest$OTMPerfTest"
+            org.apache.ojb.compare.OJBPerfTest$ODMGPerfTest"
             />
             <arg value="6"/> <!-- test loops, default was 6 -->
             <arg value="12"/> <!-- performed threads, default was 12 -->
 			<arg value="500"/> <!-- number of managed objects per thread, default was 500 -->
             <arg value="false"/> <!-- if 'false' we use performance mode, 'true' we do run in stress mode -->
+            <arg value="true"/> <!-- if 'true' all log messages will be print -->
             <jvmarg value="-Xms128m"/>
             <jvmarg value="-Xmx256m"/>
         </java>
@@ -1340,8 +1362,8 @@
         <ant target="copy-testdb"/>
     </target>
 
+    <!-- compile perf classes -->
     <target name="perf-test-jar" depends="init">
-        <!-- compile perf classes -->
         <javac srcdir="${build.srctest}"
             includes="**/performance/*"
 			destdir="${build.desttest}"

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java Sat Jul 15 07:17:29 2006
@@ -43,7 +43,6 @@
 /**
  * Relationship Prefetcher for Collections.
  *
- * @author <a href="mailto:jbraeuchi@gmx.ch">Jakob Braeuchi</a>
  * @version $Id$
  */
 public class CollectionPrefetcher extends RelationshipPrefetcherImpl
@@ -68,7 +67,6 @@
     protected Query[] buildPrefetchQueries(Collection owners, Collection children)
     {
         PersistenceBroker pb = getBroker();
-        IdentityFactory idFactory = pb.serviceIdentity();
         ClassDescriptor cld = getOwnerClassDescriptor();
         Class topLevelClass = pb.getTopLevelClass(cld.getClassOfObject());
         Collection queries = new ArrayList(owners.size());
@@ -83,7 +81,7 @@
             owner = iter.next();
             fkValues = getFkTargetValuesForObject(owner);
             
-            id = idFactory.buildIdentity(null, topLevelClass, fkValues);
+            id = pb.serviceIdentity().buildIdentity(null, topLevelClass, fkValues);
             idsSubset.add(id);
             if (idsSubset.size() == pkLimit)
             {
@@ -114,11 +112,11 @@
         {
             String EOL = SystemUtils.LINE_SEPARATOR;
             String msg = EOL + "Can't build prefetch query for collection descriptor belonging to '"
-                    + (cds != null ? cds.getClassDescriptor().getClassNameOfObject() : null) + "', "
-                    + EOL + "field name '" + (cds != null ? cds.getPersistentField().getName() : null) + "', "
+                    + (cds.getClassDescriptor().getClassNameOfObject()) + "', "
+                    + EOL + "field name '" + (cds.getPersistentField().getName()) + "', "
                     + EOL + "item class was '" + (itemCld != null ? itemCld.getClassNameOfObject() : null) + "', "
                     + EOL + "because the length of FK fields was '0'!! Check metadata configuration."
-                    + EOL + " Descriptor: " + (cds != null ? cds.toXML() : null);
+                    + EOL + " Descriptor: " + (cds.toXML());
             throw new OJBRuntimeException(msg);
         }
         QueryByCriteria query = buildPrefetchQuery(ids, fields);

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryDBCPImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryDBCPImpl.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryDBCPImpl.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryDBCPImpl.java Sat Jul 15 07:17:29 2006
@@ -23,6 +23,7 @@
 import org.apache.commons.dbcp.AbandonedConfig;
 import org.apache.commons.dbcp.AbandonedObjectPool;
 import org.apache.commons.dbcp.DriverManagerConnectionFactory;
+import org.apache.commons.dbcp.PoolableConnection;
 import org.apache.commons.dbcp.PoolableConnectionFactory;
 import org.apache.commons.dbcp.PoolingDataSource;
 import org.apache.commons.pool.KeyedObjectPoolFactory;
@@ -38,8 +39,8 @@
 import org.apache.ojb.broker.util.pooling.PoolConfiguration;
 
 /**
- * ConnectionFactory implementation using jakarta-DBCP
- * to pool driver based connections.
+ * ConnectionFactory implementation using Commons DBCP and Commons Pool API
+ * to pool connections.
  *
  * (based on a proposal of Dirk Verbeek - Thanks).
  *
@@ -91,7 +92,12 @@
         try
         {
             // We are using datasources, thus close returns connection to pool
-            con.close();
+
+            // we have to check 'isClosed', because otherwise method
+            // org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.checkOpen
+            // will throw an unexpected exception (see javadoc for Coonection.close()) when
+            // con.close() is called several times.
+            if(!con.isClosed()) con.close();
         }
         catch (SQLException e)
         {
@@ -111,6 +117,11 @@
                 if(connectionPool != null)
                 {
                     log.warn("Release connection pool: " + connectionPool);
+                    if(connectionPool instanceof GenericObjectPool)
+                    {
+                        // deactivates the idle evictor thread
+                        ((GenericObjectPool) connectionPool).setTimeBetweenEvictionRunsMillis(-1);
+                    }
                     connectionPool.close();
                     connectionPool = null;
                     dataSource = null;
@@ -218,7 +229,7 @@
         // the classes that implement the pooling functionality.
         //
         final PoolableConnectionFactory poolableConnectionFactory;
-        poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,
+        poolableConnectionFactory = new OJBPoolableConnectionFactory(connectionFactory,
                 connectionPool,
                 statementPoolFactory,
                 validationQuery,
@@ -232,11 +243,14 @@
                                               AbandonedConfig ac)
     {
         final GenericObjectPool connectionPool;
-        final boolean doRemoveAbandoned = ac != null && ac.getRemoveAbandoned() == true;
+        final boolean doRemoveAbandoned = ac != null && ac.getRemoveAbandoned();
 
-        if (doRemoveAbandoned) {
+        if(doRemoveAbandoned)
+        {
             connectionPool = new AbandonedObjectPool(null, ac);
-        } else {
+        }
+        else
+        {
             connectionPool = new GenericObjectPool();
         }
         connectionPool.setMaxActive(config.maxActive);
@@ -256,7 +270,7 @@
     {
         final JdbcConnectionDescriptor jcd = getJcd();
         final String platform = jcd.getDbms();
-        if (platform.startsWith("Oracle9i"))
+        if(platform.startsWith("Oracle9i"))
         {
             // mkalen: let the platform set Oracle-specific statement pooling
             return null;
@@ -266,23 +280,21 @@
         GenericKeyedObjectPoolFactory statementPoolFactory = null;
         final Properties properties = jcd.getConnectionFactoryDescriptor().getDbcpProperties();
         final String poolStmtParam = properties.getProperty(PARAM_NAME_POOL_STATEMENTS);
-        if (poolStmtParam != null && Boolean.valueOf(poolStmtParam).booleanValue())
+        if(poolStmtParam != null && Boolean.valueOf(poolStmtParam).booleanValue())
         {
-            final String maxOpenPrepStmtString;
-
             int maxOpenPreparedStatements = GenericKeyedObjectPool.DEFAULT_MAX_TOTAL;
-            maxOpenPrepStmtString = properties.getProperty(PARAM_NAME_STATEMENT_POOL_MAX_TOTAL);
-            if (maxOpenPrepStmtString != null)
+            final String maxOpenPrepStmtString = properties.getProperty(PARAM_NAME_STATEMENT_POOL_MAX_TOTAL);
+            if(maxOpenPrepStmtString != null)
             {
                 maxOpenPreparedStatements = Integer.parseInt(maxOpenPrepStmtString);
             }
             // Use the same values as Commons DBCP BasicDataSource
             statementPoolFactory = new GenericKeyedObjectPoolFactory(null,
-                        -1, // unlimited maxActive (per key)
-                        GenericKeyedObjectPool.WHEN_EXHAUSTED_FAIL,
-                        0, // maxWait
-                        1, // maxIdle (per key)
-                        maxOpenPreparedStatements);
+                    -1, // unlimited maxActive (per key)
+                    GenericKeyedObjectPool.WHEN_EXHAUSTED_FAIL,
+                    0, // maxWait
+                    1, // maxIdle (per key)
+                    maxOpenPreparedStatements);
         }
         return statementPoolFactory;
     }
@@ -309,22 +321,16 @@
             final Properties properties = jcd.getConnectionFactoryDescriptor().getDbcpProperties();
             final String allowConnectionUnwrapParam;
             allowConnectionUnwrapParam = properties.getProperty(PARAM_NAME_UNWRAP_ALLOWED);
-            if (allowConnectionUnwrapParam != null &&
-                Boolean.valueOf(allowConnectionUnwrapParam).booleanValue())
-            {
-                allowConnectionUnwrap = true;
-            }
-            else
-            {
-                allowConnectionUnwrap = false;
-            }
+            //allow access to underlying resource by default if property is not set
+            allowConnectionUnwrap = allowConnectionUnwrapParam == null || Boolean.valueOf(allowConnectionUnwrapParam).booleanValue();
         }
         final PoolingDataSource dataSource;
         dataSource = new PoolingDataSource(connectionPool);
         dataSource.setAccessToUnderlyingConnectionAllowed(allowConnectionUnwrap);
 
         final AbandonedConfig ac = buildAbandonedConfiguration(jcd);
-        if (ac.getRemoveAbandoned() && ac.getLogAbandoned()) {
+        if(ac.getRemoveAbandoned() && ac.getLogAbandoned())
+        {
             final LoggerWrapperPrintWriter loggerPiggyBack;
             loggerPiggyBack = new LoggerWrapperPrintWriter(log, Logger.ERROR);
             dataSource.setLogWriter(loggerPiggyBack);
@@ -371,134 +377,6 @@
         return result;
     }
 
-    // ----- deprecated methods, to be removed -----
-
-//    /**
-//     * mkalen: Left for binary API-compatibility with OJB 1.0.3 (don't break users' factories)
-//     * @deprecated since OJB 1.0.4,
-//     * please use {@link #createConnectionPool(org.apache.commons.pool.impl.GenericObjectPool.Config, org.apache.commons.dbcp.AbandonedConfig)}
-//     */
-//    protected ObjectPool createObjectPool(GenericObjectPool.Config config)
-//    {
-//        return createConnectionPool(config, null);
-//    }
-
-//    /**
-//     * mkalen: Left for binary API-compatibility with OJB 1.0.3 (don't break users' factories)
-//     * @deprecated since OJB 1.0.4,
-//     * please use {@link #wrapAsDataSource(org.apache.ojb.broker.metadata.JdbcConnectionDescriptor, org.apache.commons.pool.ObjectPool)}
-//     */
-//    protected PoolingDataSource createPoolingDataSource(ObjectPool connectionPool)
-//    {
-//        // mkalen: not a nice cast but we do not want to break signature and it is safe
-//        // since any new implementations will not be based on this method and the wrapper-
-//        // call here goes to code we control (where we know it's PoolingDataSource)
-//        return (PoolingDataSource) wrapAsDataSource(null, connectionPool);
-//    }
-
-    // ----- end deprecated methods -----
-
-//    protected ObjectPool createConnectionPool(GenericObjectPool.Config config,
-//                                              AbandonedConfig ac)
-//    {
-//        final GenericObjectPool connectionPool;
-//        final boolean doRemoveAbandoned = ac != null && ac.getRemoveAbandoned();
-//
-//        if (doRemoveAbandoned) {
-//            connectionPool = new AbandonedObjectPool(null, ac);
-//        } else {
-//            connectionPool = new GenericObjectPool();
-//        }
-//        connectionPool.setMaxActive(config.maxActive);
-//        connectionPool.setMaxIdle(config.maxIdle);
-//        connectionPool.setMinIdle(config.minIdle);
-//        connectionPool.setMaxWait(config.maxWait);
-//        connectionPool.setTestOnBorrow(config.testOnBorrow);
-//        connectionPool.setTestOnReturn(config.testOnReturn);
-//        connectionPool.setTimeBetweenEvictionRunsMillis(config.timeBetweenEvictionRunsMillis);
-//        connectionPool.setNumTestsPerEvictionRun(config.numTestsPerEvictionRun);
-//        connectionPool.setMinEvictableIdleTimeMillis(config.minEvictableIdleTimeMillis);
-//        connectionPool.setTestWhileIdle(config.testWhileIdle);
-//        return connectionPool;
-//    }
-//
-//    private GenericObjectPool.Config buildPoolConfiguration(JdbcConnectionDescriptor jcd)
-//    {
-//        PoolConfiguration poolConf = new PoolConfiguration();
-//        // read all attributes from descriptor and add them to ..Conf class
-//        poolConf.putAll(jcd.getConnectionFactoryDescriptor().getAttributes());
-//
-//        GenericObjectPool.Config conf = poolConf.getObjectPoolConfig();
-//        return conf;
-//    }
-//
-//    private AbandonedConfig buildAbandonedConfig(JdbcConnectionDescriptor jcd)
-//    {
-//        PoolConfiguration poolConf = new PoolConfiguration();
-//        // read all attributes from descriptor and add them to ..Conf class
-//        poolConf.putAll(jcd.getConnectionFactoryDescriptor().getAttributes());
-//
-//        AbandonedConfig ac = poolConf.getAbandonedConfig();
-//        return ac;
-//    }
-//
-//    protected ObjectPool createObjectPool(GenericObjectPool.Config config)
-//    {
-//        // We'll use a GenericObjectPool instance, although
-//        // any ObjectPool implementation will suffice.
-//        return new GenericObjectPool(null, config);
-//    }
-//
-//    protected KeyedObjectPoolFactory createStatementPoolFactory(JdbcConnectionDescriptor jcd)
-//    {
-//        final String platform = jcd.getDbms();
-//        if (platform.equals("Oracle9i"))
-//        {
-//            // mkalen: let the platform set Oracle-specific statement pooling
-//            return null;
-//        }
-//
-//        final KeyedPoolableObjectFactory objectFactory = getStatementCacheObjectFactory();
-//        final GenericKeyedObjectPool.Config factoryConfig = buildStatementCacheFactoryConfig(jcd);
-//        final KeyedObjectPoolFactory stmtPoolFactory;
-//        stmtPoolFactory = new GenericKeyedObjectPoolFactory(objectFactory, factoryConfig);
-//        return stmtPoolFactory;
-//    }
-//
-//    protected KeyedPoolableObjectFactory getStatementCacheObjectFactory()
-//    {
-//        return null;
-//    }
-//
-//    protected GenericKeyedObjectPool.Config buildStatementCacheFactoryConfig(JdbcConnectionDescriptor jcd)
-//    {
-//        GenericKeyedObjectPool.Config factoryConfig;
-//
-//        // TODO: mkalen: find a way to specify PreparedStatement pooling params
-//        factoryConfig = new GenericKeyedObjectPool.Config();
-//        /*
-//        // We can not use this as that would set Connection pool params on PS-cache...
-//        PoolConfiguration poolConf = new PoolConfiguration();
-//        // read all attributes from descriptor and add them to ..Conf class
-//        poolConf.putAll(jcd.getConnectionFactoryDescriptor().getAttributes());
-//        poolConf.getKeyedObjectPoolConfig();
-//        factoryConfig = poolConf.getKeyedObjectPoolConfig();
-//        */
-//        return factoryConfig;
-//    }
-//
-//    protected PoolingDataSource createPoolingDataSource(ObjectPool pool)
-//    {
-//        PoolingDataSource ds = new PoolingDataSource(pool);
-//        // allow user to access underlying (real) connection
-//        ds.setAccessToUnderlyingConnectionAllowed(true);
-//        return ds;
-//    }
-//
-//    protected org.apache.commons.dbcp.ConnectionFactory createConnectionFactory(JdbcConnectionDescriptor jcd)
-//    {
-//        return new ConPoolFactory(jcd);
-//    }
 
     //**************************************************************************************
     // Inner classes
@@ -520,13 +398,13 @@
         public Connection createConnection() throws SQLException
         {
             final Connection conn = super.createConnection();
-            if (conn != null)
+            if(conn != null)
             {
                 try
                 {
                     initializeJdbcConnection(conn);
                 }
-                catch (LookupException e)
+                catch(LookupException e)
                 {
                     log.error("Platform dependent initialization of connection failed", e);
                 }
@@ -534,6 +412,138 @@
             return conn;
         }
 
+    }
+
+    /**
+     * Specific OJB version of {@link org.apache.commons.dbcp.PoolableConnectionFactory}. This is
+     * needed because the DBCP version cause some unexpected behavior - see overridden methods
+     * {@link #passivateObject(Object)}, {@link #activateObject(Object)} and {@link #makeObject()}.
+     */
+    static class OJBPoolableConnectionFactory extends PoolableConnectionFactory
+    {
+        public OJBPoolableConnectionFactory(org.apache.commons.dbcp.ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit)
+        {
+            super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit);
+}
+
+        public OJBPoolableConnectionFactory(org.apache.commons.dbcp.ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation)
+        {
+            super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation);
+        }
+
+        public OJBPoolableConnectionFactory(org.apache.commons.dbcp.ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, AbandonedConfig config)
+        {
+            super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, config);
+        }
+
+        public OJBPoolableConnectionFactory(org.apache.commons.dbcp.ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, AbandonedConfig config)
+        {
+            super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, config);
+        }
+
+        public OJBPoolableConnectionFactory(org.apache.commons.dbcp.ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config)
+        {
+            super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog, config);
+        }
+
+        public OJBPoolableConnectionFactory(org.apache.commons.dbcp.ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config)
+        {
+            super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog, config);
+        }
+
+        /**
+         * Don't change autocommit state - This is handled by OJB.
+         */
+        public void passivateObject(final Object obj) throws Exception
+        {
+            if(obj instanceof OJBPoolableConnection)
+            {
+                OJBPoolableConnection conn = (OJBPoolableConnection) obj;
+                conn.clearWarnings();
+                // do not change, will be managed by OJB
+                //conn.setAutoCommit(true);
+
+                conn.passivate();
+            }
+            else
+            {
+                super.passivateObject(obj);
+            }
+        }
+
+        /**
+         * Don't change autocommit state, don't rollback connection when autocommit
+         * is set false and connection is not readonly - This is handled by OJB.
+         */
+        public void activateObject(final Object obj) throws Exception
+        {
+            if(obj instanceof OJBPoolableConnection)
+            {
+                OJBPoolableConnection conn = (OJBPoolableConnection) obj;
+                conn.activate();
+                // do not change, will be managed by OJB
+                // conn.setAutoCommit(_defaultAutoCommit);
+                if(_defaultTransactionIsolation != -1 && _defaultTransactionIsolation != conn.getTransactionIsolation())
+                {
+                    conn.setTransactionIsolation(_defaultTransactionIsolation);
+                }
+                if(_defaultReadOnly.booleanValue() != conn.isReadOnly())
+                {
+                    conn.setReadOnly(_defaultReadOnly.booleanValue());
+                }
+                if(_defaultCatalog != null)
+                {
+                    conn.setCatalog(_defaultCatalog);
+                }
+            }
+            else
+            {
+                super.activateObject(obj);
+            }
+        }
+
+        /**
+         * Wraps the {@link org.apache.commons.dbcp.PoolableConnection} with
+         * {@link org.apache.ojb.broker.accesslayer.ConnectionFactoryDBCPImpl.OJBPoolableConnection}
+         * to allow access to protected methods.
+         */
+        synchronized public Object makeObject() throws Exception
+        {
+            PoolableConnection con = (PoolableConnection) super.makeObject();
+            return new OJBPoolableConnection(con, _pool, _config);
+        }
+    }
+
+    /**
+     * Needed to allow usage of methods {@link #activate()} and {@link #passivate()}
+     * in class {@link org.apache.ojb.broker.accesslayer.ConnectionFactoryDBCPImpl.OJBPoolableConnectionFactory}.
+     */
+    static class OJBPoolableConnection extends PoolableConnection
+    {
+        public OJBPoolableConnection(final Connection conn, final ObjectPool pool)
+        {
+            super(conn, pool);
+        }
+
+        public OJBPoolableConnection(final Connection conn, final ObjectPool pool, final AbandonedConfig config)
+        {
+            super(conn, pool, config);
+        }
+
+        protected void activate()
+        {
+            super.activate();
+        }
+
+        protected void passivate() throws SQLException
+        {
+            super.passivate();
+        }
+
+        public synchronized void close() throws SQLException
+        {
+            if(!isClosed()) super.close();
+        }
     }
 
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java Sat Jul 15 07:17:29 2006
@@ -36,6 +36,7 @@
 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.batch.BatchInfo;
 import org.apache.ojb.broker.accesslayer.batch.BatchManager;
 import org.apache.ojb.broker.accesslayer.sql.SelectStatement;
@@ -65,9 +66,9 @@
 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}.
  *
  * @version $Id$
  */
@@ -191,6 +192,15 @@
 
         // BRJ : provide useful defaults for locking fields
         if(cld.isLocking()) updateLockingValues(cld, obj);
+        // perform application based autoincrement
+        try
+        {
+            preSequenceProcess(cld, obj);
+        }
+        catch(SequenceManagerException e)
+        {
+            throw new PersistenceBrokerException("Insert failed! Can't assign autoincrement field", e);
+        }
 
         if(isStoredProcedure)
         {
@@ -202,7 +212,7 @@
         }
         // if DB Identity columns are used for PK values, we can't use batch
         // updates for object insert
-        if(isInBatchMode(cld) && !cld.useIdentityColumnField())
+        if(isInBatchMode(cld))
         {
             BatchInfo info = new BatchInfo(sql, cld, BatchInfo.TYPE_OBJECT_INSERT);
             try
@@ -225,10 +235,8 @@
                 bindValues(stmt, values, 1, isStoredProcedure);
                 // TODO: return execution result int value in method
                 stmt.executeUpdate();
-
-                // if database Identity Columns are used, query the id from database
-                // other SequenceManager implementations will ignore this call
-                broker.serviceSequenceManager().afterStore(this, cld, obj);
+                // perform identity column based autoincrement
+                postSequenceProcess(cld, obj);
 
                 // Harvest any return values.
                 if(isStoredProcedure) harvestReturnValues(cld.getInsertProcedure(), obj, stmt);
@@ -239,7 +247,7 @@
             }
             catch(SequenceManagerException e)
             {
-                throw new PersistenceBrokerException("Can't lookup new database Identity Column value", e);
+                throw new PersistenceBrokerException("Insert failed! Can't assign value of database identity column", e);
             }
             catch(SQLException e)
             {
@@ -337,6 +345,24 @@
         final String sql = broker.serviceSqlGenerator().getPreparedUpdateStatement(cld, fieldsToUpdate).getStatement();
         final ValueContainer[] values;
         final boolean isStoredProcedure = useCallableUpdateStatement(cld);
+
+        // we can only update LOB content when it's associated with current tx
+        if(cld.hasLobField())
+        {
+            for(int i = 0; i < fieldsToUpdate.length; i++)
+            {
+                FieldDescriptor field = fieldsToUpdate[i];
+                if(field.isLobFieldType())
+                {
+                    Object o = field.getPersistentField().get(obj);
+                    if(o instanceof LobHandle)
+                    {
+                        ((LobHandle) o).checkActive();
+                    }
+                }
+            }
+        }
+
         if(isStoredProcedure)
         {
             /*
@@ -545,7 +571,7 @@
                 rs = stmt.executeQuery();
             }
 
-            return new ResultSetAndStatement(stmtManager, stmt, rs, sql);
+            return new ResultSetAndStatement(broker, stmt, rs, sql);
         }
         catch(PersistenceBrokerException e)
         {
@@ -605,7 +631,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.)
             // arminw: use anonymous inner class to satisfy constructor of
-            return new ResultSetAndStatement(broker.serviceStatementManager(), stmt, rs, new SelectStatement(){
+            return new ResultSetAndStatement(broker, stmt, rs, new SelectStatement(){
                 public Query getQueryInstance()
                 {
                     return null;
@@ -688,7 +714,7 @@
                 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();
@@ -943,10 +969,11 @@
             // If we have a field descriptor, then we can harvest the return value.
             if(obj != null)
             {
-                // Get the value and convert it to it's appropriate java type.
-                Object value = fmd.getJdbcType().getObjectFromColumn(callable, index);
+                // Get the value and convert it to it's appropriate
+                // java type.
+                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)
@@ -955,6 +982,46 @@
                     obj.getClass().getName() + ", field=" + fmd.getAttributeName() + ": " + e.getMessage();
             log.error(msg, e);
             throw new PersistenceBrokerSQLException(msg, e);
+        }
+    }
+
+    /**
+     * Perform assignment of application based autoincrement values
+     */
+    protected void preSequenceProcess(ClassDescriptor cld, Object target) throws SequenceManagerException
+    {
+        // TODO: refactor auto-increment handling, auto-increment should only be supported by PK fields?
+        // FieldDescriptor[] fields = cld.getPkFields();
+        FieldDescriptor[] fields = cld.getFieldDescriptor(false);
+        FieldDescriptor field;
+        for(int i = 0; i < fields.length; i++)
+        {
+            field = fields[i];
+            if(field.isAutoIncrement() && !field.isAccessReadOnly())
+            {
+                Object value = field.getPersistentField().get(target);
+                if(broker.serviceBrokerHelper().representsNull(field, value))
+                {
+                    Object id = broker.serviceSequenceManager().getUniqueValue(field);
+                    field.getPersistentField().set(target, id);
+                }
+            }
+        }
+    }
+
+    /**
+     * Perform assignment of database identity column based autoincrement values
+     */
+    protected void postSequenceProcess(ClassDescriptor cld, Object target) throws SequenceManagerException
+    {
+        // if database Identity Columns are used, query the id from database
+        // other SequenceManager implementations will ignore this call
+        if(cld.useIdentityColumnField())
+        {
+            // execute batch to ensure existance of new id
+            broker.serviceBatchManager().executeBatch();
+            // lookup identity column PK value from DB and set PK in persistent object
+            broker.serviceSequenceManager().afterStore(this, cld, target);
         }
     }
 

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java Sat Jul 15 07:17:29 2006
@@ -44,7 +44,6 @@
 /**
  * Relationship Prefetcher for MtoN-Collections.
  * 
- * @author <a href="mailto:jbraeuchi@gmx.ch">Jakob Braeuchi</a>
  * @version $Id$
  */
 public class MtoNCollectionPrefetcher extends CollectionPrefetcher
@@ -236,8 +235,7 @@
         while (iter.hasNext())
         {
             owner = iter.next();
-            fkValues = helper.extractValueArray(helper.getKeyValues(cld, owner));
-            id = idFactory.buildIdentity(null, topLevelClass, fkValues);
+            id = idFactory.buildIdentity(cld, owner);
             idsSubset.add(id);
             if (idsSubset.size() == pkLimit)
             {

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/PlainPrefetcher.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/PlainPrefetcher.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/PlainPrefetcher.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/PlainPrefetcher.java Sat Jul 15 07:17:29 2006
@@ -31,7 +31,6 @@
 /**
  * Prefetcher for plain list of objects (no relations).
  *
- * @author <a href="mailto:olegnitz@apache.org">Oleg Nitz</a>
  * @version $Id$
  */
 public class PlainPrefetcher extends BasePrefetcher
@@ -64,13 +63,12 @@
         for (Iterator it = realSubjects.iterator(); it.hasNext(); )
         {
             realSubject = it.next();
-            realSubjectsMap.put(new Identity(realSubject, pb), realSubject);
+            realSubjectsMap.put(pb.serviceIdentity().buildIdentity(realSubject), realSubject);
         }
 
         for (Iterator it = proxies.iterator(); it.hasNext(); )
         {
             proxy = it.next();
-            //handler = ProxyHelper.getIndirectionHandler(proxy);
             handler = pb.getConfiguration().getOjb().getProxyFactory().getIndirectionHandler(proxy);
 
             if (handler == null)

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReferencePrefetcher.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReferencePrefetcher.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReferencePrefetcher.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReferencePrefetcher.java Sat Jul 15 07:17:29 2006
@@ -35,7 +35,6 @@
 /**
  * Relationship Prefetcher for References.
  *
- * @author <a href="mailto:jbraeuchi@hotmail.com">Jakob Braeuchi</a>
  * @version $Id$
  */
 public class ReferencePrefetcher extends RelationshipPrefetcherImpl
@@ -63,27 +62,31 @@
         Class topLevelClass = pb.getTopLevelClass(ord.getItemClass());
         HashMap childrenMap = new HashMap(children.size());
         IdentityFactory idFactory = pb.serviceIdentity();
+        Object owner;
+        Object relatedObject;
+        Object fkValues[];
+        Identity id;
 
 
         for (Iterator it = children.iterator(); it.hasNext(); )
         {
-            Object relatedObject = it.next();
+            relatedObject = it.next();
             Object[] targetValues = getFkTargetValuesForObject(relatedObject);
-            Identity id = idFactory.buildIdentity(null, topLevelClass, targetValues);
+            id = idFactory.buildIdentity(null, topLevelClass, targetValues);
             childrenMap.put(id, relatedObject);
         }
 
         for (Iterator it = owners.iterator(); it.hasNext(); )
         {
-            Object owner = it.next();
-            Object[] fkValues = getFkValuesForObject(owner);
+            owner = it.next();
+            fkValues = getFkValuesForObject(owner);
             if (isNull(fkValues))
             {
                 field.set(owner, null);
                 continue;
             }
-            Identity id = idFactory.buildIdentity(null, topLevelClass, fkValues);
-            Object relatedObject = childrenMap.get(id);
+            id = idFactory.buildIdentity(null, topLevelClass, fkValues);
+            relatedObject = childrenMap.get(id);
             field.set(owner, relatedObject);
         }
     }
@@ -122,7 +125,6 @@
         {
             owner = iter.next();
             fkValues = getFkValuesForObject(owner);
-            
             if (isNull(fkValues))
             {
                 continue;
@@ -155,10 +157,7 @@
     protected Query buildPrefetchQuery(Collection ids)
     {
         ClassDescriptor cld = getItemClassDescriptor();
-        FieldDescriptor fds[];
-        
-//        fds = cld.getPkFields();
-        fds = getObjectReferenceDescriptor().getForeignKeyTargetFieldDescriptors(cld);
+        FieldDescriptor fds[] = getObjectReferenceDescriptor().getForeignKeyTargetFieldDescriptors(cld);
         
         return buildPrefetchQuery(ids, fds);
     }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ReportQueryRsIterator.java Sat Jul 15 07:17:29 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.broker.accesslayer;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
  * limitations under the License.
  */
 
-import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 
@@ -23,96 +22,64 @@
 import org.apache.ojb.broker.PersistenceBrokerInternal;
 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.query.ReportQuery;
 import org.apache.ojb.broker.query.ReportQueryByCriteria;
 
 /**
  * RsIterator for ReportQueries
  *
- * @author <a href="mailto:jbraeuchi@gmx.ch">Jakob Braeuchi</a>
  * @version $Id$
  */
 public class ReportQueryRsIterator extends RsIterator
 {
-    private String[] m_attributes;
+
     private int m_attributeCount;
     private int[] m_jdbcTypes;
+
     /**
      * Constructor for ReportQueryRsIterator.
      */
     public ReportQueryRsIterator(RsQueryObject queryObject, PersistenceBrokerInternal broker)
     {
         super(queryObject, broker);
-        try
-        {
-            // BRJ: use only explicit attributes (columns) ! 
-            // ignore those automatically added for ordering or grouping 
-            ReportQuery q = (ReportQuery)queryObject.getQuery();
-            m_attributes = q.getAttributes();
-            m_attributeCount = q.getAttributes().length;
-            
-            init_jdbcTypes();
-        }
-        catch (SQLException e)
-        {
-            releaseDbResources();
-            throw new PersistenceBrokerException(e);
-        }
-    }
- 
-    /**
-     * get the jdbcTypes from the Query or the ResultSet if not available from the Query
-     * @throws SQLException
-     */
-    private void init_jdbcTypes() throws SQLException
-    {
-        ReportQuery q = (ReportQuery) getQueryObject().getQuery();
-        m_jdbcTypes = new int[m_attributeCount];
-        
-        // try to get jdbcTypes from Query
-        if (q.getJdbcTypes() != null)
-        {
-            m_jdbcTypes = q.getJdbcTypes();
-        }
-        else
-        {
-            ResultSetMetaData rsMetaData = getRsAndStmt().m_rs.getMetaData();
-            for (int i = 0; i < m_attributeCount; i++)
-            {
-                m_jdbcTypes[i] = rsMetaData.getColumnType(i + 1);
-            }
-            
-        }
+        // BRJ: use only explicit attributes (columns) !
+        // ignore those automatically added for ordering or grouping
+        ReportQuery q = (ReportQuery)queryObject.getQuery();
+        m_attributeCount = q.getAttributes().length;
     }
-    
+
     /**
      * returns an Object[] representing the columns of the current ResultSet
      * row. There is no OJB object materialization, Proxy generation etc.
-     * involved to maximize performance. 
-     * If a FieldDescriptor is available for the attribute, the retrieved value
-     * is passed to it's FieldConversion. 
+     * involved to maximize performance.
      */
     protected Object getObjectFromResultSet() throws PersistenceBrokerException
     {
         Object[] result = new Object[m_attributeCount];
-        ResultSet rs = getRsAndStmt().m_rs;
-        ReportQueryByCriteria q =(ReportQueryByCriteria) getQueryObject().getQuery();
-        
+        ReportQuery q =(ReportQuery) getQueryObject().getQuery();
         for (int i = 0; i < m_attributeCount; i++)
         {
             try
             {
-                int jdbcType = m_jdbcTypes[i];
-                String attr = m_attributes[i];
-                FieldDescriptor fld = (FieldDescriptor) q.getAttributeFieldDescriptors().get(attr);
-                Object value = JdbcTypesHelper.getObjectFromColumn(rs, new Integer(jdbcType), i + 1);
-                
-                if (fld != null && fld.getFieldConversion() != null)
+                FieldDescriptor fld = null;
+                String attr = q.getAttributes()[i];
+                if(q instanceof ReportQueryByCriteria)
+                fld = (FieldDescriptor) ((ReportQueryByCriteria)q).getAttributeFieldDescriptors().get(attr);
+                Object val;
+                if(fld != null)
                 {
-                    value = fld.getFieldConversion().sqlToJava(value);
+                    val = fld.readValue(getRsAndStmt(), i+1, true);
                 }
-
-                result[i] = value;
+                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);
+                }
+                result[i] = val;
             }
             catch (SQLException e)
             {
@@ -121,4 +88,34 @@
         }
         return result;
     }
+
+    /**
+     * Extracts the jdbc type of the specified result set column index.
+     *
+     * @param rsIndex The result set column index.
+     * @return The jdbc {@link java.sql.Types} type.
+     * @throws SQLException
+     */
+    private int extractJdbcType(int rsIndex) throws SQLException
+    {
+        if(m_jdbcTypes == null)
+        {
+            ReportQuery q = (ReportQuery) getQueryObject().getQuery();
+            if(q.getJdbcTypes() != null)
+            {
+                m_jdbcTypes = q.getJdbcTypes();
+            }
+            else
+            {
+                m_jdbcTypes = new int[m_attributeCount];
+                ResultSetMetaData rsMetaData = getRsAndStmt().m_rs.getMetaData();
+                for (int i = 0; i < m_attributeCount; i++)
+                {
+                    m_jdbcTypes[i] = rsMetaData.getColumnType(i + 1);
+                }
+            }
+        }
+        return m_jdbcTypes[rsIndex];
+    }
+
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/ResultSetAndStatement.java Sat Jul 15 07:17:29 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$
  */
-final public class ResultSetAndStatement
+public final class ResultSetAndStatement
 {
-	// private static Logger log = LoggerFactory.getLogger(ResultSetAndStatement.class);
-
-	private final StatementManager 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(StatementManager 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/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReader.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReader.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReader.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReader.java Sat Jul 15 07:17:29 2006
@@ -18,11 +18,18 @@
 import java.io.Serializable;
 import java.util.Map;
 
+import org.apache.ojb.broker.metadata.FieldDescriptor;
+
 /**
+ * This class is responsible to map a query result set row to the specified
+ * {@link java.util.Map}.
+ *
  * @version $Id$
  */
 public interface RowReader extends Serializable
 {
+    static final long serialVersionUID = -1283322922537162249L;
+
     /**
      * Materialize a single object from the values of the Map row.
      * the implementor of this class must not care for materializing
@@ -35,44 +42,38 @@
     public Object readObjectFrom(Map row, Object enclosingObj);
 
     /**
-     * refresh an existing instance from the values of the Map row.
+     * Refresh an existing instance from the values of the Map row.
+     *
      * @param instance the instance to refresh
      * @param row the Map containing the new values
      */
     public void refreshObject(Object instance, Map row);
 
 
-//	/**
-//	 * Read all fields from the current ResultRow into the Object[] row.#
-//	 * ConversionStrategies are applied here!
-//	 */
-//	public void readObjectArrayFrom(ResultSet rs, Map row);
-
     /**
      * Read all fields from the current ResultRow into the Object[] row.#
      * ConversionStrategies are applied here!
+     *
+     * @param rs Current result set.
+     * @param row The target map.
      */
     public void readObjectArrayFrom(ResultSetAndStatement rs, Map row);
 
-//	/**
-//	 * Read primary key fields from the current ResultRow into the Object[] row.#
-//	 * ConversionStrategies are applied here!
-//	 */
-//	public void readPkValuesFrom(ResultSet rs, Map row);
-
     /**
      * Read primary key fields from the current ResultRow into the Object[] row.#
      * ConversionStrategies are applied here!
+     *
+     * @param rs Current result set.
+     * @param row The target map.
      */
     public void readPkValuesFrom(ResultSetAndStatement rs, Map row);
 
-//    /**
-//     * Set the descriptor this <i>RowReader</i> worked with.
-//     */
-//    public void setClassDescriptor(ClassDescriptor cld);
-//
-//    /**
-//     * Returns the associated {@link org.apache.ojb.broker.metadata.ClassDescriptor}
-//     */
-//    public ClassDescriptor getClassDescriptor();
+    /**
+     * Read the specified field into the row map.
+     *
+     * @param rs Current result set.
+     * @param row The target map.
+     * @param fields The fields to read from result set.
+     */
+    public void readValuesFrom(ResultSetAndStatement rs, Map row, FieldDescriptor[] fields);
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java Sat Jul 15 07:17:29 2006
@@ -154,7 +154,8 @@
                 }
                 catch (Exception ex)
                 {
-                    throw new PersistenceBrokerException("Unable to invoke initialization method:" + initializationMethod.getName() + " for class:" + classDescriptor.getClassOfObject(), ex);
+                    throw new PersistenceBrokerException("Unable to invoke initialization method:"
+                    + initializationMethod.getName() + " for class:" + classDescriptor.getClassOfObject(), ex);
                 }
             }
         }
@@ -277,8 +278,8 @@
             if(ojbDiscriminator != null)
             {
                 ClassDescriptor cld = classDescriptor.getRepository().getDescriptorForDiscriminator(classDescriptor,ojbDiscriminator);
-                fields = cld.getFieldDescriptor(true);
                 row.put(OJB_DISCRIMINATOR_KEY, cld.getClassOfObject());
+                fields = cld.getFieldDescriptor(true);
             }
             else
             {
@@ -320,21 +321,22 @@
         readValuesFrom(rs_stmt, row, pkFields);
     }
 
-    protected void readValuesFrom(ResultSetAndStatement rs_stmt, Map row, FieldDescriptor[] fields)
+    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);
                 }
             }
         }
@@ -349,34 +351,41 @@
 
     protected String extractOjbConcreteClass(ClassDescriptor cld, ResultSet rs, Map row)
     {
+        String result = null;
         FieldDescriptor discriminatorFD = classDescriptor.getDiscriminatorField();
-        if (discriminatorFD == null)
-        {
-            return null;
-        }
-        try
+        if (discriminatorFD != null)
         {
-            Object tmp = discriminatorFD.getJdbcType().getObjectFromColumn(rs, discriminatorFD.getColumnName());
-            // allow field-conversion for discriminator column too
-            String result = (String) discriminatorFD.getFieldConversion().sqlToJava(tmp);
-            result = result != null ? result.trim() : null;
-            if (result == null || result.length() == 0)
-            {
-                throw new PersistenceBrokerException("The discriminator field column for class "
-                        + cld.getClassNameOfObject() + " returned null or 0-length string, discriminator field was: "
-                        + discriminatorFD);
-            }
-
-            // arminw: Make sure that we don't read discriminator field twice from the ResultSet.
-            row.put(discriminatorFD.getColumnName(), result);
-            return result;
-        }
-        catch (SQLException e)
-        {
-            throw new PersistenceBrokerException("Unexpected error while try to read 'ojbConcretClass'"
-                    + " field from result set using column name " + discriminatorFD.getColumnName() + " main class"
-                    + " was " + classDescriptor.getClassNameOfObject(), e);
+            // First check for already existing entry to avoid multiple result set lookup
+            result = (String) row.get(discriminatorFD.getColumnName());
+            if(result == null)
+            {
+                try
+                {
+                    Object tmp = discriminatorFD.getJdbcType().getObjectFromColumn(rs, discriminatorFD.getColumnName());
+                    // allow field-conversion for discriminator column too
+                    result = (String) discriminatorFD.getFieldConversion().sqlToJava(tmp);
+                    result = result != null ? result.trim() : null;
+                    if (result == null || result.length() == 0)
+                    {
+                        throw new PersistenceBrokerException("The discriminator field column for class "
+                                + cld.getClassNameOfObject() + " returned null or 0-length string, discriminator field was: "
+                                + discriminatorFD);
+                    }
+                    else
+                    {
+                        // Make sure that we don't read discriminator field twice from the ResultSet.
+                        row.put(discriminatorFD.getColumnName(), result);
+                    }
+                }
+                catch (SQLException e)
+                {
+                    throw new PersistenceBrokerException("Unexpected error while try to read 'ojbConcretClass'"
+                            + " field from result set using column name " + discriminatorFD.getColumnName() + " main class"
+                            + " was " + classDescriptor.getClassNameOfObject(), e);
+                }
+            }
         }
+        return result;
     }
 
     /**

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsIterator.java Sat Jul 15 07:17:29 2006
@@ -33,10 +33,13 @@
 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.SessionCache;
 import org.apache.ojb.broker.metadata.ClassDescriptor;
 import org.apache.ojb.broker.metadata.DescriptorRepository;
 import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
+import org.apache.ojb.broker.metadata.FieldDescriptor;
 import org.apache.ojb.broker.query.Query;
 import org.apache.ojb.broker.query.QueryByCriteria;
 import org.apache.ojb.broker.query.QueryBySQL;
@@ -142,12 +145,11 @@
      * done or not. Default is <tt>true</tt>.
      */
     private boolean autoRelease = true;
+    private ResourceWrapper resourceListener;
 
     /** if true do not fire PBLifeCycleEvent. */
     private boolean disableLifeCycleEvents = false;
 
-    private ResourceWrapper resourceListener;
-
     /**
      * RsIterator constructor.
      *
@@ -393,12 +395,14 @@
      */
     protected Object getObjectFromResultSet() throws PersistenceBrokerException
     {
-        getRow().clear();
+        Map row = getRow();
+        PersistenceBrokerInternal pb = getBroker();
+        row.clear();
 
+        RowReader reader = pb.getRowReaderFor(getQueryObject().getClassDescriptor());
         // we need the PK values of result set row
         // provide m_row with primary key data of current row
-        RowReader reader = getBroker().getRowReaderFor(getQueryObject().getClassDescriptor());
-        reader.readPkValuesFrom(getRsAndStmt(), getRow());
+        reader.readPkValuesFrom(getRsAndStmt(), row);
 
         // 1.read Identity
         Identity oid = getIdentityFromResultSet();
@@ -409,14 +413,14 @@
         if (result == null)
         {
             // map all field values from the current result set
-            reader.readObjectArrayFrom(getRsAndStmt(), getRow());
+            reader.readObjectArrayFrom(getRsAndStmt(), row);
 
             // 3. If Object is not in cache
             // materialize Object with primitive attributes filled from current row
             // we however have to first retrieve an enclosing class reference if one exists
-            Object enclosingObj = getBroker().materializeEnclosingClassReference(getQueryObject().getClassDescriptor(), getRow());
+            Object enclosingObj = pb.materializeEnclosingClassReference(getQueryObject().getClassDescriptor(), row);
 
-            result = reader.readObjectFrom(getRow(), enclosingObj);
+            result = reader.readObjectFrom(row, enclosingObj);
             // result may still be null!
             if (result != null)
             {
@@ -440,11 +444,11 @@
                          * actual class.
                          */
                         // fill reference and collection attributes
-                        ClassDescriptor cld = getBroker().getClassDescriptor(result.getClass());
+                        ClassDescriptor cld = pb.getClassDescriptor(result.getClass());
 
                         // don't force loading of reference
-                        getBroker().getReferenceBroker().retrieveReferences(result, cld, false);
-                        getBroker().getReferenceBroker().retrieveCollections(result, cld, false);
+                        pb.getReferenceBroker().retrieveReferences(result, cld, false);
+                        pb.getReferenceBroker().retrieveCollections(result, cld, false);
 
                         getCache().disableMaterializationCache();
                     }
@@ -460,16 +464,35 @@
         else
         // Object is in cache
         {
-            ClassDescriptor cld = getBroker().getClassDescriptor(result.getClass());
+            ClassDescriptor cld = pb.getClassDescriptor(result.getClass());
             // if refresh is required, read all values from the result set and
             // update the cache instance from the db
             if (cld.isAlwaysRefresh())
             {
                 // map all field values from the current result set
-                reader.readObjectArrayFrom(getRsAndStmt(), getRow());
-                reader.refreshObject(result, getRow());
+                reader.readObjectArrayFrom(getRsAndStmt(), row);
+                reader.refreshObject(result, row);
             }
-            getBroker().refreshRelationships(result, oid, cld);
+            else if(cld.hasLobField() && pb.serviceLobHelper().isLobAutoRefresh())
+            {
+                /*
+                If the object has LOB content we have to re-read the locator
+                object of cached objects
+                */
+                FieldDescriptor[] flds = cld.getLobFields();
+                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())
+                    {
+                        reader.readValuesFrom(getRsAndStmt(), row, new FieldDescriptor[]{fld});
+                        fld.getPersistentField().set(result, row.get(fld.getColumnName()));
+                    }
+                }
+            }
+            pb.refreshRelationships(result, oid, cld);
         }
 
         return result;
@@ -478,7 +501,7 @@
     /**
      * with a new batch of JDBC 3.0 drivers coming out we can't just check for
      * begins with 2, we need to check the actual version and see if it's
-     * greater than or equal to 2
+     * greater than or equal to 2.
      */
     private boolean supportsAdvancedJDBCCursorControl()
     {
@@ -550,9 +573,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
@@ -622,7 +643,7 @@
      */
     public boolean absolute(int row) throws PersistenceBrokerException
     {
-        boolean retval = false;
+        boolean retval;
         if (supportsAdvancedJDBCCursorControl())
         {
             retval = absoluteAdvanced(row);
@@ -636,8 +657,6 @@
 
     /**
      * absolute for basicJDBCSupport
-     * @param row
-     * @return
      */
     private boolean absoluteBasic(int row)
     {
@@ -680,8 +699,6 @@
 
     /**
      * absolute for advancedJDBCSupport
-     * @param row
-     * @return
      */
     private boolean absoluteAdvanced(int row)
     {
@@ -847,6 +864,11 @@
     protected JdbcConnectionDescriptor getConnectionDescriptor()
     {
         return getBroker().serviceConnectionManager().getConnectionDescriptor();
+    }
+
+    protected Platform getPlatform()
+    {
+        return getBroker().serviceConnectionManager().getSupportedPlatform();
     }
 
     /**

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsQueryObject.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsQueryObject.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsQueryObject.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/RsQueryObject.java Sat Jul 15 07:17:29 2006
@@ -25,7 +25,6 @@
 /**
  * Helper class for {@link RsIterator} queries.
  *
- * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
  * @version $Id$
  */
 class RsQueryObject

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/FieldConversion.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/FieldConversion.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/FieldConversion.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/FieldConversion.java Sat Jul 15 07:17:29 2006
@@ -24,7 +24,7 @@
  * conversion is needed. But if the persistent class attribute is of type <code>int[]</code> a
  * field conversion to a supported field type is needed - e.g. <code>int[] ---> String</code>.
  * <p/>
- * The default implementation {@link FieldConversionDefaultImpl} does not modify its input.
+ * The default implementation {@link #DEFAULT} does not modify its input.
  * OJB users can use predefined implementation and can also
  * build their own conversions that perform arbitrary mappings.
  * The mapping has to defined in the OJB mapping configuration file - more see documentation.
@@ -34,7 +34,6 @@
  */
 public interface FieldConversion extends Serializable
 {
-	static final long serialVersionUID = 2692919097691347845L;
     /**
      * Convert an object of the persistent class to a counterpart object
      * supported by the JDBC specification.
@@ -51,4 +50,22 @@
      * @return The converted Java object
      */
     public Object sqlToJava(Object source) throws ConversionException;
+
+    /**
+     * A default noop implementation of the {@link FieldConversion} interface.
+     */
+    public static final FieldConversion DEFAULT = new FieldConversionDefaultImpl();
+
+    static class FieldConversionDefaultImpl implements FieldConversion
+    {
+        public Object javaToSql(final Object source) throws ConversionException
+        {
+            return source;
+        }
+
+        public Object sqlToJava(final Object source) throws ConversionException
+        {
+            return source;
+        }
+    }
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/IntList2VarcharFieldConversion.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/IntList2VarcharFieldConversion.java?rev=422228&r1=422227&r2=422228&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/IntList2VarcharFieldConversion.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/accesslayer/conversions/IntList2VarcharFieldConversion.java Sat Jul 15 07:17:29 2006
@@ -15,114 +15,24 @@
  * limitations under the License.
  */
 
-import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang.StringUtils;
-
 /**
  * This implementation of the {@link FieldConversion} interface converts
  * between a {@link java.util.List} of {@link java.lang.Integer} objects and a database
  * <em>varchar</em> field.
  *
- * @author Guillaume Nodet
  * @version $Id$
  */
-public class IntList2VarcharFieldConversion implements FieldConversion
+public class IntList2VarcharFieldConversion extends AbstractList2VarcharConversion
 {
-
-    private static final String NULLVALUE = "#NULL#";
-    private static final String EMPTYCOLLEC = "#EMTPY#";
-
     public IntList2VarcharFieldConversion()
     {
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.ojb.broker.accesslayer.conversions.FieldConversion#javaToSql(java.lang.Object)
-     */
-    public Object javaToSql(Object source) throws ConversionException
-    {
-        if (source == null)
-        {
-            return NULLVALUE;
-        }
-
-        try
-        {
-            List intList = (List) source;
-            if (intList.isEmpty())
-            {
-                return EMPTYCOLLEC;
-            }
-
-            StringBuffer result = new StringBuffer();
-            for (int i = 0; i < intList.size(); i++)
-            {
-                Integer obj = (Integer) intList.get(i);
-                String newSt = obj.toString();
-                newSt = StringUtils.replace(newSt, "#", "##");
-                result.append(newSt);
-                result.append("#");
-            }
-            return result.toString();
-        }
-        catch (ClassCastException e)
-        {
-            throw new ConversionException("Object is not a List of Integer it is a"
-                    + source.getClass().getName());
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.ojb.broker.accesslayer.conversions.FieldConversion#sqlToJava(java.lang.Object)
-     */
-    public Object sqlToJava(Object source) throws ConversionException
+    protected void addEntryToList(List resultList, String strEntry)
     {
-
-        if (source == null)
-        {
-            return null;
-        }
-        if (!(source instanceof String))
-        {
-            throw new ConversionException("Object is not a String it is a"
-                    + source.getClass().getName());
-        }
-        if (source.toString().equals(NULLVALUE))
-        {
-            return null;
-        }
-        if (source.toString().equals(EMPTYCOLLEC))
-        {
-            return new ArrayList();
-        }
-
-        List v = new ArrayList();
-        String input = source.toString();
-        int pos = input.indexOf("#");
-
-        while (pos >= 0)
-        {
-            if (pos == 0)
-            {
-                v.add("");
-            }
-            else
-            {
-                v.add(Integer.valueOf(input.substring(0, pos)));
-            }
-
-            if (pos + 1 > input.length())
-            {
-                //# at end causes outof bounds
-                break;
-            }
-
-            input = input.substring(pos + 1, input.length());
-            pos = input.indexOf("#");
-        }
-        return v;
+        String value = checkResult(strEntry);
+        resultList.add(value != null ? Integer.valueOf(value) : null);
     }
-
 }



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