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:22:36 UTC

svn commit: r422233 [1/4] - in /db/ojb/trunk/src/java/org/apache/ojb/broker: ./ metadata/ metadata/torque/ platforms/ query/ util/ util/dbhandling/

Author: arminw
Date: Sat Jul 15 07:22:34 2006
New Revision: 422233

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

Modified:
    db/ojb/trunk/src/java/org/apache/ojb/broker/OJB.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBroker.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldDescriptor.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldType.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/JdbcType.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/JdbcTypesHelper.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/MetadataManager.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/ObjectReferenceDescriptor.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/RepositoryElements.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/RepositoryPersistor.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/RepositoryTags.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/RepositoryXmlHandler.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/SuperReferenceDescriptor.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/torque/TorqueForeignKeyGenerator.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/Platform.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/PlatformDerbyImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/PlatformMySQLImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/PlatformPostgreSQLImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/PlatformSapdbImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/platforms/PlatformWLOracle9iImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/query/QueryByCriteriaImpl.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/query/ReportQuery.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/util/BrokerHelper.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/util/ClassHelper.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/util/ExceptionHelper.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/util/GUID.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/util/IdentityArrayList.java
    db/ojb/trunk/src/java/org/apache/ojb/broker/util/dbhandling/DatabaseHandlingTask.java

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/OJB.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/OJB.java?rev=422233&r1=422232&r2=422233&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/OJB.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/OJB.java Sat Jul 15 07:22:34 2006
@@ -57,15 +57,16 @@
      * Force INSERT on {@link PersistenceBroker#store(Object, org.apache.ojb.broker.util.ObjectModification)}
      * method.
      */
-    public static final ObjectModification INSERT = ObjectModificationImpl.INSERT;
+    public static final ObjectModification INSERT = ObjectModification.INSERT;
     /**
      * Force UPDATE on {@link PersistenceBroker#store(Object, org.apache.ojb.broker.util.ObjectModification)}
      * method.
      */
-    public static final ObjectModification UPDATE = ObjectModificationImpl.UPDATE;
+    public static final ObjectModification UPDATE = ObjectModification.UPDATE;
 
     private Logger log = LoggerFactory.getLogger(OJB.class);
 
+    private String ojbPropertiesPath;
     /** The container */
     private ComponentContainer container;
     /** Whether this runtime is fully initialized */
@@ -114,7 +115,8 @@
         helper.initWithDefaults(container);
         if (loadConf)
         {
-            helper.loadProperties(container, System.getProperty(DEFAULT_PROPERTIES_FILE, DEFAULT_PROPERTIES_FILE), false);
+            this.ojbPropertiesPath = System.getProperty(DEFAULT_PROPERTIES_FILE, DEFAULT_PROPERTIES_FILE);
+            helper.loadProperties(container, ojbPropertiesPath, false);
         }
         // setting singleton instances
         container.setSingletonInstance(getClass(), this);
@@ -148,6 +150,16 @@
         lockManager = (LockManager) container.getSingletonInstance(LockManager.class);
 
         isInitialized = true;
+    }
+
+    /**
+     * Returns the path of OJB's property file.
+     *
+     * @return The property file path.
+     */
+    public String getOjbPropertiesPath()
+    {
+        return ojbPropertiesPath;
     }
 
     /**

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBroker.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBroker.java?rev=422233&r1=422232&r2=422233&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBroker.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBroker.java Sat Jul 15 07:22:34 2006
@@ -31,6 +31,7 @@
 import org.apache.ojb.broker.util.BrokerHelper;
 import org.apache.ojb.broker.util.ObjectModification;
 import org.apache.ojb.broker.util.sequence.SequenceManager;
+import org.apache.ojb.broker.lob.LobHelper;
 import org.odbms.ObjectContainer;
 
 /**
@@ -50,22 +51,38 @@
     // *************************************************************************
 
     /**
+     * Returns the {@link org.apache.ojb.broker.lob.LobHelper} instance
+     * associated with this broker.
+     *
+     * @return The LOB helper
+     */
+    public LobHelper serviceLobHelper();
+
+    /**
      * Returns the {@link org.apache.ojb.broker.accesslayer.StatementManager} instance associated with this broker.
+     *
+     * @return The statement manager
      */
     public StatementManager serviceStatementManager();
 
     /**
      * Returns the {@link org.apache.ojb.broker.accesslayer.ConnectionManagerIF} instance associated with this broker.
+     *
+     * @return The connection manager
      */
     public ConnectionManagerIF serviceConnectionManager();
 
     /**
      * Returns the {@link org.apache.ojb.broker.accesslayer.sql.SqlGenerator} instance associated with this broker.
+     *
+     * @return The SQL generator
      */
     public SqlGenerator serviceSqlGenerator();
 
     /**
      * Returns the {@link org.apache.ojb.broker.accesslayer.JdbcAccess} instance associated with this broker.
+     *
+     * @return The JDBC access object
      */
     public JdbcAccess serviceJdbcAccess();
 
@@ -78,24 +95,32 @@
 
     /**
      * Returns the {@link org.apache.ojb.broker.util.sequence.SequenceManager} instance associated with this broker.
+     *
+     * @return The sequence manager
      */
     public SequenceManager serviceSequenceManager();
 
     /**
-     * Returns the {@link org.apache.ojb.broker.util.BrokerHelper} instance associated with this broker.
-     * Makes some helper methods available.
+     * Returns the {@link org.apache.ojb.broker.util.BrokerHelper} instance associated with this broker, which
+     * makes some additional helper methods available.
+     *
+     * @return The broker helper object
      */
     public BrokerHelper serviceBrokerHelper();
 
     /**
      * Returns the {@link org.apache.ojb.broker.cache.ObjectCache} instance associated
      * with this broker.
+     *
+     * @return The object cache
      * @deprecated use {@link #serviceSessionCache()} instead.
      */
     public ObjectCache serviceObjectCache();
 
     /**
      * Returns the used {@link org.apache.ojb.broker.cache.SessionCache} instance.
+     *
+     * @return The session cache object.
      */
     public SessionCache serviceSessionCache();
 
@@ -111,26 +136,31 @@
     // *************************************************************************
 
     /**
-     * Performs a broker event to inform all managed
-     * {@link PBListener} implementations.
+     * Fires a broker event to inform all registered {@link PBListener} instances.
+     *
+     * @param event The event to fire
      */
     public void fireBrokerEvent(PersistenceBrokerEvent event);
 
     /**
-     * Performs a broker event to inform all managed
-     * {@link PBListener} implementations.
+     * Fires a life cycle event to inform all registered {@link PBListener} instances.
+     *
+     * @param event The event to fire
      */
     public void fireBrokerEvent(PBLifeCycleEvent event);
 
     /**
-     * Performs a broker event to inform all managed
-     * {@link PBListener} implementations.
+     * Fires a state event to inform all registered {@link PBListener} instances.
+     *
+     * @param event The event to fire
      */
     public void fireBrokerEvent(PBStateEvent event);
 
     /**
      * Removes all temporary listeners from this PersistenceBroker instance
-     * - Handle with care!
+     * <b>NOTE:</b> Use with care, because some internals rely on this mechanism.
+     *
+     * @see #removeListener(PBListener)
      */
     public void removeAllListeners() throws PersistenceBrokerException;
 
@@ -138,8 +168,11 @@
      * If parameter <code>permanet</code> was <code>true</code> all permanent and temporary listeners
      * will be removed from this PersistenceBroker instance.
      * <br/>
-     * <b>NOTE:</b> Handle with care!
+     * <b>NOTE:</b> Use with care, because some internals rely on this mechanism.
      *
+     * @param permanent If <em>false</em> all temporary listener will be removed. If
+     * <em>true</em> temporaray and permanent listern will be removed from this instance.
+     * @see #removeListener(PBListener)
      * @see #removeListener(PBListener listener)
      */
     public void removeAllListeners(boolean permanent) throws PersistenceBrokerException;
@@ -169,12 +202,17 @@
      * implementation {@link org.apache.ojb.broker.core.PersistenceBrokerFactoryDefaultImpl}
      * and add the listener at creation of the {@link org.apache.ojb.broker.PersistenceBroker}
      * instances.
+     *
+     * @param listener  The listener to add
+     * @param permanent Whether the listener will stay registered after closing
+     *                  the broker
      */
     public void addListener(PBListener listener, boolean permanent) throws PersistenceBrokerException;
 
     /**
-     * Removes a listener from this PersistenceBroker instance
-     * @param listener
+     * Removes the specified listener from this broker.
+     *
+     * @param listener The listener to remove
      */
     public void removeListener(PBListener listener) throws PersistenceBrokerException;
 
@@ -184,55 +222,51 @@
     // *************************************************************************
 
     /**
-     * Abort and close the transaction.
-     * Calling abort abandons all persistent object modifications and releases the
-     * associated locks.
-     * <br>
-     * If transaction is not in progress a TransactionNotInProgressException is thrown
+     * Aborts and closes the current transaction. This abandons all persistent object modifications
+     * and releases the associated locks.
+     *
+     * @throws TransactionNotInProgressException If no transaction is currently in progress
      */
     public void abortTransaction() throws TransactionNotInProgressException;
 
     /**
-     * Begin a transaction against the underlying RDBMS.
-     * Calling <code>beginTransaction</code> multiple times,
-     * without an intervening call to <code>commitTransaction</code> or <code>abortTransaction</code>,
-     * causes the exception <code>TransactionInProgressException</code> to be thrown
-     * on the second and subsequent calls.
+     * Begins a transaction against the underlying RDBMS.
+     *
+     * @throws TransactionInProgressException If there is already a transaction in progress
      */
     public void beginTransaction()
             throws TransactionInProgressException, TransactionAbortedException;
 
     /**
-     * Commit and close the transaction.
-     * Calling <code>commit</code> commits to the database all
-     * UPDATE, INSERT and DELETE statements called within the transaction and
-     * releases any locks held by the transaction.
-     * If beginTransaction() has not been called before, a
-     * TransactionNotInProgressException exception is thrown.
-     * If the transaction cannot be commited a TransactionAbortedException exception is thrown.
+     * Commits and closes the current transaction. This commits all database-changing statements (e.g.
+     * UPDATE, INSERT and DELETE) issued within the transaction since the last commit to the database,
+     * and releases any locks held by the transaction.
+     *
+     * @throws TransactionNotInProgressException If there is no transaction currently in progress
+     * @throws TransactionAbortedException       If the transaction cannot be committed
      */
     public void commitTransaction()
             throws TransactionNotInProgressException, TransactionAbortedException;
 
-
     /**
-     * Returns <tt>true</tt> if the broker performs a transaction, <tt>false</tt>
-     * in the other case.
+     * Determines whether there is currently a transaction in progress.
+     *
+     * @return <code>true</code> if there is a transaction in progress
      */
     public boolean isInTransaction() throws PersistenceBrokerException;
 
     /**
-     * Close this PersistenceBroker so that no further requests may be made on it.
-     * A PersistenceBroker instance can be used only until it is closed.
-     * Closing a PersistenceBroker might release it to the pool of
-     * available PersistenceBrokers, or might be garbage collected, at the option of the implementation.
+     * Closes this broker so that no further requests may be made on it. Closing a broker might release
+     * it to the pool of available brokers, or might be garbage collected, at the option of the implementation.
      *
-     * @return true if successful
+     * @return <code>true</code> if the broker was successfully closed
      */
     public boolean close();
 
     /**
-     * Returns <tt>true</tt> if this instance is closed.
+     * Determines whether this broker is closed.
+     *
+     * @return <tt>true</tt> if this instance is closed
      */
     public boolean isClosed();
 
@@ -245,36 +279,47 @@
     /**
      * Returns the {@link org.apache.ojb.broker.metadata.DescriptorRepository}
      * associated with this broker.
+     *
+     * @return The descriptor repository
      */
     public DescriptorRepository getDescriptorRepository();
 
     /**
      * Get the {@link PBKey} for this broker.
+     *
+     * @return The broker key
      */
     public PBKey getPBKey();
 
     /**
-     * Returns a ClassDescriptor for the persistence capable class.
-     * Throws a PersistenceBrokerException if clazz is not persistence capable,
-     * i.e. if no metadata was defined for this class or class was not found.
+     * Returns the class descriptor for the given persistence capable class.
+     *
+     * @param clazz The target class
+     * @return The class descriptor
+     * @throws PersistenceBrokerException If the class is not persistence capable, i.e.
+     *         if no metadata was defined for this class and hence its class descriptor
+     *         was not found
      */
     public ClassDescriptor getClassDescriptor(Class clazz) throws PersistenceBrokerException;
 
     /**
-     * Same as {@link #getClassDescriptor}, but does not throw an exception when class was not found.
-     * Useful for checking if an object is persistence Capable.
-     * @param clazz target class
-     * @return true if descriptor was found
+     * Determines whether the given class is persistence capable and thus has an associated
+     * class descriptor in the metadata.
+     *
+     * @param clazz The target class
+     * @return <code>true</code> if a class descriptor was found
      */
     public boolean hasClassDescriptor(Class clazz);
 
-
     /**
-     * Returns the top level (extent) class to which the given class belongs.
-     * This may be a (abstract) base-class, an interface or the given class itself, if
-     * no extent is defined.
-     * @throws PersistenceBrokerException if clazz is not persistence capable,
-     * i.e. if clazz is not defined in the DescriptorRepository.
+     * Returns the top level class (most abstract class in terms of extents) from which the
+     * given class extends. This may be a (abstract) base-class, an interface or the given
+     * class itself, if no extent is defined.
+     *
+     * @param clazz The class to get the top level class for
+     * @return The top level class for it
+     * @throws PersistenceBrokerException If the class is not persistence capable,
+     *         if no metadata was defined for this class
      */
     public Class getTopLevelClass(Class clazz) throws PersistenceBrokerException;
 
@@ -291,36 +336,36 @@
     // *************************************************************************
 
     /**
-     * clears the brokers internal cache.
-     * removing is recursive. That is referenced Objects are also
-     * removed from the cache, if the auto-retrieve flag is set
-     * for obj.getClass() in the metadata repository.
-     *
+     * Clears the broker's internal cache.
      */
     public void clearCache() throws PersistenceBrokerException;
 
     /**
-     * Removes the object from the brokers internal cache.
-     * If object is instance of {@link org.apache.ojb.broker.Identity},
-     * the associated object was removed from cache.
-     * <br/>
-     * Note: Removing is not recursive.
+     * Removes the given object or, if it is an instance of {@link org.apache.ojb.broker.Identity},
+     * the object identified by it, from the broker's internal cache. Note that the removal is
+     * not recursive. This means, objects referenced by the removed object will not be
+     * automatically removed from the cache by this operation.
+     *
+     * @param objectOrIdentity The object to be removed from the cache or its identity
      */
     public void removeFromCache(Object objectOrIdentity) throws PersistenceBrokerException;
 
     /**
-     * makes object obj persistent in the underlying persistence system.
-     * E.G. by INSERT INTO ... or UPDATE ...  in an RDBMS.
+     * Makes the given object persistent in the underlying persistence system.
+     * This is usually done by issuing an INSERT ... or UPDATE ...  in an RDBMS.
      * The ObjectModification parameter can be used to generate optimized SQL code
      *
-     * (decide whether insert or update is needed. And for updates only generate code for modified columns)
+     * @param obj The object to store
+     * @param modification Specifies what operation to perform (for generating optimized SQL)
      */
     public void store(Object obj,
                       ObjectModification modification) throws PersistenceBrokerException;
 
     /**
-     * make object obj persistent in the underlying persistence system.
-     * E.G. by INSERT INTO ... or UPDATE ...  in an RDBMS
+     * Make the given object persistent in the underlying persistence system.
+     * This is usually done by issuing an INSERT ... or UPDATE ...  in an RDBMS.
+     *
+     * @param obj The object to store
      */
     public void store(Object obj) throws PersistenceBrokerException;
 
@@ -335,120 +380,135 @@
     public void update(Object obj, String[] fields);
 
     /**
-     * deletes the objects obj concrete representation in the underlying persistence system.
-     * E.G. by DELETE FROM ... WHERE ... in an RDBMS
+     * Deletes the given object's persistent representation in the underlying persistence system.
+     * This is usually done by issuing a DELETE ... in an RDBMS
+     *
+     * @param obj The object to delete
      */
     public void delete(Object obj) throws PersistenceBrokerException;
 
     /**
-     * Deletes and MtoN implementor (a row on a indirection table)
-     * As it is today, ojb doesn't handle collection inherence, so collections descriptors
+     * Deletes an m:n implementor which defines the relationship between two persistent objects.
+     * This is usually a row in an indirection table.<br/>
+     * Note that OJB currently doesn't handle collection inheritance, so collections descriptors
      * are written per class. We try to match one of these collection descriptors, iterating from the left side
-     * and looking for possible for classes on the right side using : collection descriptor element . isAssinableFrom(rightClass)
+     * and looking for possible for classes on the right side using isAssignableFrom(rightClass).
      *
      * TODO: handle cache problems
      * TODO: delete more than one row if possible
      *
-     *
-     * <b>Pre-coditions :</b>
-     * <li></li>
-     *
-     * <b>Pos-coditions :</b>
-     * <li></li>
-     *
-     * <b>Assertions :</b>
-     * <li></li>
-     *
-     * @param m2nImpl
-     * @throws PersistenceBrokerException if an error occours
+     * @param m2nImpl The m:n implementor to delete
      */
     public void deleteMtoNImplementor(MtoNImplementor m2nImpl) throws PersistenceBrokerException;
 
     /**
+     * Stores the given m:n implementor int the underlying persistence system.
+     * This is usually done by inserting a row in an indirection table.<br/>
+     * Note that OJB currently doesn't handle collection inheritance, so collections descriptors
+     * are written per class. We try to match one of these collection descriptors, iterating from the left side
+     * and looking for possible for classes on the right side using isAssignableFrom(rightClass).
      *
+     * @param m2nImpl The m:n implementor to delete
      */
     public void addMtoNImplementor(MtoNImplementor m2nImpl) throws PersistenceBrokerException;
 
     /**
-     * Deletes all objects matching the query from the underlying persistence system.
-     * E.G. by DELETE FROM ... WHERE ... in an RDBMS
-     * <p/>
-     * <b>Note:</b> This method directly perform the delete statement ignoring object
-     * references and do not synchronize the cache - take care!
+     * Deletes all objects matching the given query, from the underlying persistence system.
+     * This is usually done via DELETE ... in an RDBMS.<br/>
+     * <b>Note:</b> This method directly perform the delete statement ignoring any object
+     * references and does not synchronize the cache - take care!
+     *
+     * @param query The query determining the objects to delete
      */
     public void deleteByQuery(Query query) throws PersistenceBrokerException;
 
-
-
-
-
     // *************************************************************************
     // Query methods
     // *************************************************************************
 
     /**
-     * Retrieve all Reference- and  Collection-attributes of a given
-     * instance, independent from the used metadata-settings of the
-     * references.
+     * Retrieve all references and collections of the given object irrespective of the
+     * metadata settings defined for them.
      *
-     * @param pInstance the persistent instance
+     * @param obj The persistent object
      */
-    public void retrieveAllReferences(Object pInstance) throws PersistenceBrokerException;
+    public void retrieveAllReferences(Object obj) throws PersistenceBrokerException;
 
     /**
-     * retrieve a single reference- or collection attribute
-     * of a persistent instance.
-     * @param pInstance the persistent instance
-     * @param pAttributeName the name of the Attribute to load
+     * Retrieve the specified reference or collection attribute for the given persistent object.
+     *
+     * @param obj      The persistent object
+     * @param attrName The name of the attribute to retrieve
      */
-    public void retrieveReference(Object pInstance, String pAttributeName) throws PersistenceBrokerException;
+    public void retrieveReference(Object obj, String attrName) throws PersistenceBrokerException;
 
     /**
-     * Returns the count of elements a given query will return.
+     * Returns the number of elements that the given query will return.
+     *
+     * @param query The query
+     * @return The number of elements returned by the query
      */
     public int getCount(Query query) throws PersistenceBrokerException;
 
     /**
+     * Retrieves the persistent objects matching the given query. Note that if the Query has
+     * no criteria ALL persistent objects of the class targeted by the query will be returned.
      *
-     * Retrieve a collection of itemClass Objects matching the Query query.
-     * If the Query has no criteria no WHERE-clause is generated, i.e. ALL table rows are selected.
+     * @param query The query
+     * @return The persistent objects matching the query
      */
     public Collection getCollectionByQuery(Query query) throws PersistenceBrokerException;
 
     /**
-     * Retrieve a userdefined Collection that implements the interface Manageable collection
-     * that contains all Objects matching the Query query.
-     * <br>
-     * If query has no criteria no WHERE-clause is generated, i.e. ALL table rows are selected.
+     * Retrieves the persistent objects matching the given query. The resulting collection will
+     * be of the supplied collection type. Note that if the Query has no criteria ALL persistent
+     * objects of the class targeted by the query will be returned.
+     *
+     * @param collectionClass The collection type which needs to implement
+     *                        {@link ManageableCollection}
+     * @param query           The query
+     * @return The persistent objects matching the query
      */
     public ManageableCollection getCollectionByQuery(Class collectionClass, Query query)
             throws PersistenceBrokerException;
 
     /**
-     * returns an Iterator that iterates Objects of class c if calling the .next()
-     * method. The Elements returned come from a SELECT ... WHERE Statement
-     * that is defined by the Query query.
-     * If itemProxy is null, no proxies are used.
+     * Retrieves the persistent objects matching the given query and returns them as an iterator
+     * which may, depending on the configured collection type, be reloading the objects from
+     * the database upon calling {@link java.util.Iterator#next()}. Note that if the Query has no criteria
+     * ALL persistent objects of the class targeted by the query will be returned.
+     *
+     * @param query The query
+     * @return The persistent objects matching the query
      */
     public OJBIterator getIteratorByQuery(Query query) throws PersistenceBrokerException;
 
     /**
-     * Returns an Iterator that iterates Object[] calling the .next()
-     * method. The Elements returned come from a SELECT ... WHERE sqlStatement
-     * The Class c is only used to provide the associated JDBC Connection
+     * Retrieves the rows (as <code>Object[]</code> instances) matching the given query and
+     * returns them as an iterator which may, depending on the configured collection type, be reloading
+     * the objects from the database upon calling {@link java.util.Iterator#next()}.
+     *
+     * @param query The report query
+     * @return The rows matching the query
      */
     public OJBIterator getReportQueryIteratorByQuery(Query query) throws PersistenceBrokerException;
 
     /**
-     * Retrieve an Object by its Identity. Application Developers are encouraged to use getObjectByQuery().
-     * This method is mainly used for internal performant handling of
-     * materialization by OID (e.g. in Proxies)
+     * Retrieve a persistent object from the underlying datastore by its identity. However, users
+     * are encouraged to use {@link #getObjectByQuery(Query)} instead, as this method is mainly
+     * intended to be used for internal handling of materialization by OID (e.g. in Proxies).
+     *
+     * @param id The persistent object's id
+     * @return The persistent object
      */
     public Object getObjectByIdentity(Identity id) throws PersistenceBrokerException;
 
     /**
-     * Retrieve an Object by query.
-     * I.e perform a SELECT ... FROM ... WHERE ...  in an RDBMS
+     * Retrieve the (first) persistent object from the underlying datastore that matches the given
+     * query.
+     *
+     * @param query The query
+     * @return The persistent object
      */
     public Object getObjectByQuery(Query query) throws PersistenceBrokerException;
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java?rev=422233&r1=422232&r2=422233&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java Sat Jul 15 07:22:34 2006
@@ -96,7 +96,7 @@
      * @return the QueryFactory
      */
     public QueryFactoryNew getQueryFactory();
-    
+
     /**
      * Answer the ReferenceBroker.
      * @return QueryReferenceBroker
@@ -193,4 +193,34 @@
      * Return the relationship prefetcher factory.
      */
     public RelationshipPrefetcherFactory getRelationshipPrefetcherFactory();
+
+//    /**
+//     * Returns <em>true</em> if the development checks are enabled.
+//     *
+//     * @see #setTxCheck(boolean)
+//     */
+//    public boolean isTxCheck();
+//
+//    /**
+//     * This setting can be helpful during development if the PersistenceBroker transaction
+//     * demarcation was used (this is true in most cases). If set 'true' on PB#store(...)
+//     * and PB#delete(...) methods calls OJB check for active PB-tx and if no active tx is
+//     * found a error is logged. This can help to avoid store/delete calls without a running
+//     * PB-tx while development. Default setting is 'false'.
+//     * <p/>
+//     * <strong>Note:</strong> When using OJB in a managed
+//     * environment <em>without</em> OJB-caching, it's valid to use store/delete
+//     * calls without a running PB-tx.
+//     *
+//     * @param txCheck Set <em>true</em> to enable the checks
+//     */
+//    public void setTxCheck(boolean txCheck);
+//
+//    /**
+//     * If
+//     * @return
+//     */
+//    public boolean isBrokerLeakDetection();
+//
+//    public void setBrokerLeakDetection(boolean brokerLeakDetection);
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldDescriptor.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldDescriptor.java?rev=422233&r1=422232&r2=422233&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldDescriptor.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldDescriptor.java Sat Jul 15 07:22:34 2006
@@ -16,6 +16,9 @@
  */
 
 import java.io.Serializable;
+import java.sql.Types;
+import java.sql.SQLException;
+import java.sql.CallableStatement;
 import java.util.Comparator;
 
 import org.apache.commons.lang.SerializationUtils;
@@ -23,10 +26,13 @@
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
 import org.apache.ojb.broker.OJBRuntimeException;
-import org.apache.ojb.broker.metadata.fieldaccess.AnonymousPersistentField;
+import org.apache.ojb.broker.PersistenceBroker;
 import org.apache.ojb.broker.accesslayer.conversions.FieldConversion;
-import org.apache.ojb.broker.accesslayer.conversions.FieldConversionDefaultImpl;
 import org.apache.ojb.broker.accesslayer.conversions.FieldConversionExt;
+import org.apache.ojb.broker.accesslayer.NullCheck;
+import org.apache.ojb.broker.accesslayer.NullCheckDefaultImpl;
+import org.apache.ojb.broker.accesslayer.ResultSetAndStatement;
+import org.apache.ojb.broker.metadata.fieldaccess.AnonymousPersistentField;
 import org.apache.ojb.broker.util.ClassHelper;
 
 /**
@@ -47,6 +53,8 @@
     public static final String ACCESS_READONLY = RepositoryElements.TAG_ACCESS_READONLY;
     public static final String ACCESS_READWRITE = RepositoryElements.TAG_ACCESS_READWRITE;
 
+    protected static final String JDBC_TYPE_CLASS_PROPERTY = "jdbcTypeClass";
+
     private int m_ColNo;
     private String m_ColumnName;
     private String m_ColumnType;
@@ -64,6 +72,7 @@
     private boolean precisionSpecified = false;
     private boolean lengthSpecified = false;
     private FieldConversion fieldConversion = null;
+    private NullCheck nullCheck = null;
     // true if field is used for optimistic locking BRJ
     private boolean m_locking = false;
     // if locking is true and updateLock is true then
@@ -114,7 +123,9 @@
     }
 
     /**
+     * Return the name of the mapped database column.
      *
+     * @see #getFullColumnName()
      */
     public String getColumnName()
     {
@@ -122,10 +133,14 @@
     }
 
     /**
-     * Answer the qualified ColumnName<br>
+     * Answer the qualified ColumnName
+     * <br>
      * ie: myTab.name
+     *
+     * @return The full column name
+     * @see #getColumnName()
      */
-    public String getFullColumnName()			// BRJ
+    public String getFullColumnName()
     {
         return getClassDescriptor().getFullTableName() + "." + getColumnName();
     }
@@ -159,8 +174,7 @@
      */
     public JdbcType getJdbcType()
     {
-        // check for 'null' in any case, because after serialisation
-        // field can be null
+        // check if jdbcType is assigned
         if(m_jdbcType == null)
         {
             m_jdbcType = lookupJdbcType();
@@ -178,33 +192,62 @@
     private JdbcType lookupJdbcType()
     {
         JdbcType result;
-        String columnType = getColumnType();
-        // if sql type was not set in metadata we use reflection
-        // to determine sql type by reflection
-        if (columnType == null)
-        {
-            try
+        /*
+        we allow to define specific {@link JdbcType} implementations
+        via custom attribute
+        */
+        String jdbcTypeClass = getAttribute(JDBC_TYPE_CLASS_PROPERTY);
+        if(jdbcTypeClass == null || jdbcTypeClass.length() == 0)
+        {
+            String columnType = getColumnType();
+            // if sql type was not set in metadata we use reflection
+            // to determine sql type by reflection
+            if (columnType == null || columnType.length() == 0)
             {
-                result = JdbcTypesHelper.getJdbcTypeByReflection(m_PersistentField.getType().getName());
+                try
+                {
+                        result = JdbcTypesHelper.getJdbcTypeByReflection(m_PersistentField);
+                }
+                catch(Exception e)
+                {
+                    String eol = SystemUtils.LINE_SEPARATOR;
+                    throw new OJBRuntimeException("Can't automatically assign a jdbc field-type for field: "
+                            + eol + this.toXML() + eol + "in class: " + eol + getClassDescriptor(), e);
+                }
             }
-            catch(Exception e)
+            else
             {
-                String eol = SystemUtils.LINE_SEPARATOR;
-                throw new OJBRuntimeException("Can't automatically assign a jdbc field-type for field: "
-                        + eol + this.toXML() + eol + "in class: " + eol + getClassDescriptor(), e);
+                try
+                {
+                    result = JdbcTypesHelper.getJdbcTypeByName(columnType);
+                    // TODO: find better solution, workaround to handle Blob/Clob columns with byte-array/String fields
+                    if(result.getType() == Types.BLOB && (new byte[]{}).getClass().isAssignableFrom(getPersistentField().getType()))
+                    {
+                        result = new JdbcTypes.T_BlobToByteArray();
+                    }
+                    else if(result.getType() == Types.CLOB && String.class.isAssignableFrom(getPersistentField().getType()))
+                    {
+                        result = new JdbcTypes.T_ClobToString();
+                    }
+                }
+                catch(Exception e)
+                {
+                    String eol = SystemUtils.LINE_SEPARATOR;
+                    throw new OJBRuntimeException("Can't assign the specified jdbc field-type '"+columnType+"' for field: "
+                            + eol + this.toXML() + eol + "in class: " + eol + getClassDescriptor(), e);
+                }
             }
         }
         else
         {
             try
             {
-                result = JdbcTypesHelper.getJdbcTypeByName(columnType);
+                result = (JdbcType) ClassHelper.newInstance(jdbcTypeClass);
             }
             catch(Exception e)
             {
-                String eol = SystemUtils.LINE_SEPARATOR;
-                throw new OJBRuntimeException("Can't assign the specified jdbc field-type '"+columnType+"' for field: "
-                        + eol + this.toXML() + eol + "in class: " + eol + getClassDescriptor(), e);
+                throw new MetadataException("Can't create specified " + JdbcType.class.getName()
+                        + " implementation: " + jdbcTypeClass, e);
             }
         }
         return result;
@@ -223,6 +266,7 @@
         buf.append("isAutoincrement", m_autoIncrement);
         buf.append("access", m_access);
         buf.append("sequenceName", m_sequenceName);
+        buf.append("nullCheck", nullCheck.toString());
         buf.append("jdbcType", m_jdbcType);
         buf.append("super_class_fields ", "=> " + super.toString());
         buf.append(SystemUtils.LINE_SEPARATOR);
@@ -238,7 +282,7 @@
         // if no conversion is specified use the default conversion
         if (fieldConversion == null)
         {
-            fieldConversion = new FieldConversionDefaultImpl();
+            fieldConversion = FieldConversion.DEFAULT;
         }
         return fieldConversion;
     }
@@ -279,6 +323,37 @@
         }
     }
 
+    /**
+     * Returns the NullCheck instance used for this field.
+     * @return NullCheck instance for this field
+     */
+    public NullCheck getNullCheck()
+    {
+        // if no explicit class is specified use the default implementation
+        if (nullCheck == null)
+        {
+        	nullCheck = new NullCheckDefaultImpl();
+        }
+        return nullCheck;
+    }
+
+    /**
+     * Creates the NullCheck implementation to use for this field.
+     * @param nullCheckClassName FQCN of the NullCheck implementation to instantiate
+     */
+    public void setNullCheckClassName(String nullCheckClassName)
+    {
+        try
+        {
+            this.nullCheck = (NullCheck) ClassHelper.newInstance(nullCheckClassName);
+        }
+        catch (Exception e)
+        {
+            throw new MetadataException(
+                    "Could not instantiate NullCheck class using default constructor", e);
+        }
+    }
+
     public boolean isIndexed()
     {
         return indexed;
@@ -475,6 +550,82 @@
         return AnonymousPersistentField.class.isAssignableFrom(getPersistentField().getClass());
     }
 
+    /**
+     * Returns <em>true</em> if the field is of type {@link java.sql.Blob}
+     * or {@link java.sql.Clob}.
+     */
+    public boolean isLobFieldType()
+    {
+        return getJdbcType().getFieldType().isLobField();
+    }
+
+
+    /**
+     * Reads in the value of the field/column represented by this <code>FieldDescriptor</code>.
+     *
+     * @param rs_stmt The current used {@link org.apache.ojb.broker.accesslayer.ResultSetAndStatement} instance.
+     * @param convert If set <em>true</em> a
+     * {@link org.apache.ojb.broker.accesslayer.conversions.FieldConversion#sqlToJava(Object)} conversion call
+     * is done.
+     * @return The read in value of this field.
+     * @throws SQLException
+     */
+    public Object readValue(final ResultSetAndStatement rs_stmt, boolean convert)
+            throws SQLException
+    {
+        int idx = rs_stmt.m_sql.getColumnIndex(this);
+        return readValue(rs_stmt, idx, convert);
+    }
+
+    /**
+     * Reads in the value of the field/column represented by this <code>FieldDescriptor</code>.
+     *
+     * @param rs_stmt The current used {@link org.apache.ojb.broker.accesslayer.ResultSetAndStatement} instance.
+     * @param index The result set column index.
+     * @param convert If set <em>true</em> a
+     * {@link org.apache.ojb.broker.accesslayer.conversions.FieldConversion#sqlToJava(Object)} conversion call
+     * is done.
+     * @return The read in value of this field.
+     * @throws SQLException
+     */
+    public Object readValue(final ResultSetAndStatement rs_stmt, int index, boolean convert)
+            throws SQLException
+    {
+        Object val = getJdbcType().getObjectFromColumn(rs_stmt.m_rs, null, getColumnName(), index);
+        val = rs_stmt.m_platform.postPrepareReadInValue(this, val);
+        if(convert) val = getFieldConversion().sqlToJava(val);
+        if(isLobFieldType())
+        {
+            val = rs_stmt.m_broker.serviceLobHelper().wrapLobField(this, val);
+        }
+        return val;
+    }
+
+    /**
+     * Reads in the value of the field/column represented by this <code>FieldDescriptor</code>.
+     *
+     * @param broker The current used <code>PersistenceBroker</code>.
+     * @param stmt The current used <code>CallableStatement</code>.
+     * @param index The result set column index.
+     * @param convert If set <em>true</em> a
+     * {@link org.apache.ojb.broker.accesslayer.conversions.FieldConversion#sqlToJava(Object)} conversion call
+     * is done.
+     * @return The read in value of this field.
+     * @throws SQLException
+     */
+    public Object readValue(final PersistenceBroker broker, final CallableStatement stmt, int index, boolean convert)
+            throws SQLException
+    {
+        Object val = getJdbcType().getObjectFromColumn(stmt, index);
+        val = broker.serviceConnectionManager().getSupportedPlatform().postPrepareReadInValue(this, val);
+        if(convert) val = getFieldConversion().sqlToJava(val);
+        if(isLobFieldType())
+        {
+            val = broker.serviceLobHelper().wrapLobField(this, val);
+        }
+        return val;
+    }
+
     /*
      * @see XmlCapable#toXML()
      */
@@ -556,7 +707,7 @@
         // default-fetch not yet implemented
 
         // conversion
-        if( this.getFieldConversion().getClass() != FieldConversionDefaultImpl.class )
+        if( this.getFieldConversion().getClass() != FieldConversion.DEFAULT.getClass() )
         {
             result.append( "        " );
             result.append( RepositoryTags.getAttribute( FIELD_CONVERSION, getFieldConversion().getClass().getName() ) );
@@ -600,7 +751,7 @@
         return result.toString();
     }
 
-    public Object clone()
+    public Object clone() throws CloneNotSupportedException
     {
         // TODO: think this can be critical, becuase it will serialize all dependent objects too
         return SerializationUtils.deserialize(SerializationUtils.serialize(this));

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldType.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldType.java?rev=422233&r1=422232&r2=422233&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldType.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/FieldType.java Sat Jul 15 07:22:34 2006
@@ -1,9 +1,6 @@
 package org.apache.ojb.broker.metadata;
 
-import java.io.Serializable;
-
-
-/* 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.
@@ -18,6 +15,8 @@
  * limitations under the License.
  */
 
+import java.io.Serializable;
+
 /**
  * OJB implements the mapping conventions for JDBC as specified by the JDBC 3.0 specification and
  * this class representing the jdbc java types of the sql types mappings - e.g.
@@ -50,20 +49,15 @@
     public boolean equals(Object firstValue, Object secondValue);
 
     /**
-     * Returns the sql {@link java.sql.Types} of this field.
+     * Returns <em>true</em> if the field type is mutable, e.g.
+     * <code>Timestamp</code> field. All immutable fields types,
+     * e.g like <code>String</code>, will return <em>false</em>.
      */
-    public int getSqlType();
-
-    /**
-     * Dets the associated sql field type of this field.
-     * @param jdbcType The associated {@link org.apache.ojb.broker.metadata.JdbcType}.
-     */
-    public void setSqlType(JdbcType jdbcType);
+    public boolean isMutable();
 
     /**
-     * Returns <em>true</em> if the field type is mutable, e.g. a jdbc BLOB field or
-     * jdbc TIMESTAMP field.
-     * @return
+     * Returns <em>true</em> if the field is of type {@link java.sql.Blob}
+     * or {@link java.sql.Clob}.
      */
-    public boolean isMutable();
+    public boolean isLobField();
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/JdbcType.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/JdbcType.java?rev=422233&r1=422232&r2=422233&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/JdbcType.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/broker/metadata/JdbcType.java Sat Jul 15 07:22:34 2006
@@ -1,13 +1,6 @@
 package org.apache.ojb.broker.metadata;
 
-import java.sql.ResultSet;
-import java.sql.CallableStatement;
-import java.sql.SQLException;
-import java.io.Serializable;
-
-import org.apache.ojb.broker.util.sequence.SequenceManagerException;
-
-/* Copyright 2003-2004 The Apache Software Foundation
+/* Copyright 2003-2006 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.
@@ -22,6 +15,13 @@
  * limitations under the License.
  */
 
+import java.sql.ResultSet;
+import java.sql.CallableStatement;
+import java.sql.SQLException;
+import java.io.Serializable;
+
+import org.apache.ojb.broker.util.sequence.SequenceManagerException;
+
 /**
  * Represents a jdbc sql type object defined by the JDBC 3.0 specification to handle
  * data conversion (see JDBC 3.0 specification <em>Appendix B, Data Type Conversion Tables</em>).
@@ -60,6 +60,11 @@
     public Object getObjectFromColumn(ResultSet rs, String columnName) throws SQLException;
 
     /**
+     * Convenience method for {@link #getObjectFromColumn(ResultSet, CallableStatement, String, int)}
+     */
+    public Object getObjectFromColumn(ResultSet rs, int columnId) throws SQLException;
+
+    /**
      * Convert the given {@link java.lang.Long} value to
      * a java object representation of this jdbc type.
      */
@@ -71,11 +76,6 @@
     public int getType();
 
     /**
-     * Returns the string representing of the {@link java.sql.Types sql type}.
-     */
-    public String getTypeAsString();
-
-    /**
      * Indicates whether some other object is "equal to" this one.
      */
     public boolean equals(Object obj);
@@ -90,8 +90,4 @@
 //     * Convenience method for {@link #getObjectFromColumn(ResultSet, CallableStatement, String, int)}
 //     */
 //    Object getObjectFromColumn(CallableStatement stmt, String columnName) throws SQLException;
-//    /**
-//     * Convenience method for {@link #getObjectFromColumn(ResultSet, CallableStatement, String, int)}
-//     */
-//    Object getObjectFromColumn(ResultSet rs, int columnId) throws SQLException;
 }



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