Added: incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManager.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManager.java?view=auto&rev=159273 ============================================================================== --- incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManager.java (added) +++ incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManager.java Mon Mar 28 10:25:05 2005 @@ -0,0 +1,904 @@ +/* + * Copyright 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. + * 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. + */ + +/* + * PersistenceManager.java + * + */ + +package javax.jdo; + +import java.util.Collection; +import java.util.Map; +import java.util.Properties; +import java.util.Comparator; +import java.lang.Class; + +import javax.jdo.spi.StateInterrogation; + +import javax.jdo.listener.InstanceLifecycleListener; + +import javax.jdo.datastore.Sequence; +import javax.jdo.datastore.JDOConnection; + +/** <code>PersistenceManager</code> is the primary interface for JDO-aware application + * components. It is the factory for <code>Query</code> and <code>Transaction</code> instances, + * and contains methods to manage the life cycle of <code>PersistenceCapable</code> + * instances. + * + * <P>A <code>PersistenceManager</code> is obtained from the + * [EMAIL PROTECTED] PersistenceManagerFactory} + * (recommended) or by construction. + * @version 2.0 + */ + +public interface PersistenceManager { + /** + * A <code>PersistenceManager</code> instance can be used until it is closed. + * @return <code>true</code> if this <code>PersistenceManager</code> has been closed. + * @see #close() + */ + boolean isClosed (); + + /** Close this <code>PersistenceManager</code> so that no further requests may be + * made on it. A <code>PersistenceManager</code> instance can be used + * only until it is closed. + * + * <P>Closing a <code>PersistenceManager</code> might release it to the pool of available + * <code>PersistenceManager</code>s, or might be garbage collected, at the option of + * the JDO implementation. Before being used again to satisfy a + * <code>getPersistenceManager()</code> request, the default values for options will + * be restored to their values as specified in the <code>PersistenceManagerFactory</code>. + * + * <P>This method closes the <code>PersistenceManager</code>. + */ + void close (); + + /** Return the <code>Transaction</code> instance associated with a <code>PersistenceManager</code>. + * There is one <code>Transaction</code> instance associated with each <code>PersistenceManager</code> + * instance. The <code>Transaction</code> instance supports options as well as + * transaction completion requests. + * @return the <code>Transaction</code> associated with this + * <code>PersistenceManager</code>. + */ + Transaction currentTransaction(); + + /** Mark an instance as no longer needed in the cache. + * Eviction is normally done automatically by the <code>PersistenceManager</code> + * at transaction completion. This method allows the application to + * explicitly provide a hint to the <code>PersistenceManager</code> that the instance + * is no longer needed in the cache. + * @param pc the instance to evict from the cache. + */ + void evict (Object pc); + + /** Mark an array of instances as no longer needed in the cache. + * @see #evict(Object pc) + * @param pcs the array of instances to evict from the cache. + */ + void evictAll (Object[] pcs); + + /** Mark a <code>Collection</code> of instances as no longer needed in the cache. + * @see #evict(Object pc) + * @param pcs the <code>Collection</code> of instances to evict from the cache. + */ + void evictAll (Collection pcs); + + /** Mark all persistent-nontransactional instances as no longer needed + * in the cache. It transitions + * all persistent-nontransactional instances to hollow. Transactional + * instances are subject to eviction based on the RetainValues setting. + * @see #evict(Object pc) + */ + void evictAll (); + + /** Refresh the state of the instance from the data store. + * + * <P>In an optimistic transaction, the state of instances in the cache + * might not match the state in the data store. This method is used to + * reload the state of the instance from the data store so that a subsequent + * commit is more likely to succeed. + * <P>Outside a transaction, this method will refresh nontransactional state. + * @param pc the instance to refresh. + */ + void refresh (Object pc); + + /** Refresh the state of an array of instances from the data store. + * + * @see #refresh(Object pc) + * @param pcs the array of instances to refresh. + */ + void refreshAll (Object[] pcs); + + /** Refresh the state of a <code>Collection</code> of instances from the data store. + * + * @see #refresh(Object pc) + * @param pcs the <code>Collection</code> of instances to refresh. + */ + void refreshAll (Collection pcs); + + /** Refresh the state of all applicable instances from the data store. + * <P>If called with an active transaction, all transactional instances + * will be refreshed. If called outside an active transaction, all + * nontransactional instances will be refreshed. + * @see #refresh(Object pc) + */ + void refreshAll (); + + /** + * Refreshes all instances in the exception that failed verification. + * + * @since 2.0 + */ + void refreshAll (JDOException jdoe); + + /** Create a new <code>Query</code> with no elements. + * @return the new <code>Query</code>. + */ + Query newQuery (); + + /** Create a new <code>Query</code> using elements from another <code>Query</code>. + * The other <code>Query</code> must have been created by the same JDO implementation. + * It might be active + * in a different <code>PersistenceManager</code> or might have been serialized and restored. + * <P>All of the settings of the other <code>Query</code> are copied to this <code>Query</code>, + * except for the candidate <code>Collection</code> or <code>Extent</code>. + * @return the new <code>Query</code> + * @param compiled another <code>Query</code> from the same JDO implementation + */ + Query newQuery (Object compiled); + + /** Create a Construct a new query instance using the specified String + * as the single-string representation of the query. + * @param query the single-string query + * @return the new <code>Query</code> + * @since 2.0 + */ + Query newQuery (String query); + + /** Create a new <code>Query</code> using the specified language. + * @param language the language of the query parameter + * @param query the query, which is of a form determined by the language + * @return the new <code>Query</code> + */ + Query newQuery (String language, Object query); + + /** Create a new <code>Query</code> specifying the <code>Class</code> of the candidate instances. + * @param cls the <code>Class</code> of the candidate instances + * @return the new <code>Query</code> + */ + Query newQuery (Class cls); + + /** Create a new <code>Query</code> with the <code>Class</code> of the + * candidate instances and candidate <code>Extent</code>. + * @param cln the <code>Extent</code> of candidate instances + * @return the new <code>Query</code> + */ + Query newQuery (Extent cln); + + /** Create a new <code>Query</code> with the candidate <code>Class</code> + * and <code>Collection</code>. + * @param cls the <code>Class</code> of results + * @param cln the <code>Collection</code> of candidate instances + * @return the new <code>Query</code> + */ + Query newQuery (Class cls, Collection cln); + + /** Create a new <code>Query</code> with the <code>Class</code> of the + * candidate instances and filter. + * @param cls the <code>Class</code> of results + * @param filter the filter for candidate instances + * @return the new <code>Query</code> + */ + Query newQuery (Class cls, String filter); + + /** Create a new <code>Query</code> with the <code>Class</code> of the candidate instances, + * candidate <code>Collection</code>, and filter. + * @param cls the <code>Class</code> of candidate instances + * @param cln the <code>Collection</code> of candidate instances + * @param filter the filter for candidate instances + * @return the new <code>Query</code> + */ + Query newQuery (Class cls, Collection cln, String filter); + + /** Create a new <code>Query</code> with the + * candidate <code>Extent</code> and filter; the class + * is taken from the <code>Extent</code>. + * @param cln the <code>Extent</code> of candidate instances + * @param filter the filter for candidate instances + * @return the new <code>Query</code> + */ + Query newQuery (Extent cln, String filter); + + /** + * Create a new <code>Query</code> with the given candidate class + * from a named query. The query name given must be the name of a + * query defined in metadata. + * @param cls the <code>Class</code> of candidate instances + * @param queryName the name of the query to look up in metadata + * @return the new <code>Query</code> + */ + Query newNamedQuery (Class cls, String queryName); + + /** The <code>PersistenceManager</code> manages a collection of instances in the data + * store based on the class of the instances. This method returns an + * <code>Extent</code> of instances in the data store that might be iterated or + * given to a <code>Query</code>. The <code>Extent</code> itself might not reference any + * instances, but only hold the class name and an + * indicator as to whether subclasses are included in the <code>Extent</code>. + * <P>Note that the <code>Extent</code> might be very large. + * @param persistenceCapableClass <code>Class</code> of instances + * @param subclasses whether to include instances of subclasses + * @return an <code>Extent</code> of the specified <code>Class</code> + * @see Query + */ + Extent getExtent (Class persistenceCapableClass, boolean subclasses); + + /** + * Equivalent to <code>getExtent (persistenceCapableClass, + * true)</code>. + * @see #getExtent(Class,boolean) + * @since 2.0 + */ + Extent getExtent (Class persistenceCapableClass); + + /** This method locates a persistent instance in the cache of instances + * managed by this <code>PersistenceManager</code>. + * The <code>getObjectById</code> method attempts + * to find an instance in the cache with the specified JDO identity. + * The <code>oid</code> parameter object might have been returned by an earlier call + * to <code>getObjectId</code> or <code>getTransactionalObjectId</code>, + * or might have been constructed by the application. + * <P>If the <code>PersistenceManager</code> is unable to resolve the <code>oid</code> parameter + * to an ObjectId instance, then it throws a <code>JDOUserException</code>. + * <P>If the <code>validate</code> flag is <code>false</code>, and there is already an instance in the + * cache with the same JDO identity as the <code>oid</code> parameter, then this method + * returns it. There is no change made to the state of the returned + * instance. + * <P>If there is not an instance already in the cache with the same JDO + * identity as the <code>oid</code> parameter, then this method creates an instance + * with the specified JDO identity and returns it. If there is no + * transaction in progress, the returned instance will be hollow or + * persistent-nontransactional, at the choice of the implementation. + * <P>If there is a transaction in progress, the returned instance will + * be hollow, persistent-nontransactional, or persistent-clean, at the + * choice of the implementation. + * <P>It is an implementation decision whether to access the data store, + * if required to determine the exact class. This will be the case of + * inheritance, where multiple <code>PersistenceCapable</code> classes share the + * same ObjectId class. + * <P>If the validate flag is <code>false</code>, and the instance does not exist in + * the data store, then this method might not fail. It is an + * implementation choice whether to fail immediately with a + * <code>JDODataStoreException</code>. But a subsequent access of the fields of the + * instance will throw a <code>JDODataStoreException</code> if the instance does not + * exist at that time. Further, if a relationship is established to this + * instance, then the transaction in which the association was made will + * fail. + * <P>If the <code>validate</code> flag is <code>true</code>, and there is already a transactional + * instance in the cache with the same JDO identity as the <code>oid</code> parameter, + * then this method returns it. There is no change made to the state of + * the returned instance. + * <P>If there is an instance already in the cache with the same JDO + * identity as the <code>oid</code> parameter, but the instance is not transactional, + * then it must be verified in the data store. If the instance does not + * exist in the datastore, then a <code>JDODataStoreException</code> is thrown. + * <P>If there is not an instance already in the cache with the same JDO + * identity as the <code>oid</code> parameter, then this method creates an instance + * with the specified JDO identity, verifies that it exists in the data + * store, and returns it. If there is no transaction in progress, the + * returned instance will be hollow or persistent-nontransactional, + * at the choice of the implementation. + * <P>If there is a data store transaction in progress, the returned + * instance will be persistent-clean. + * If there is an optimistic transaction in progress, the returned + * instance will be persistent-nontransactional. + * @see #getObjectId(Object pc) + * @see #getTransactionalObjectId(Object pc) + * @return the <code>PersistenceCapable</code> instance with the specified ObjectId + * @param oid an ObjectId + * @param validate if the existence of the instance is to be validated + */ + Object getObjectById (Object oid, boolean validate); + + /** + * Looks up the instance of the given type with the given key. + * @param cls The type of object to load + * @param key either the string representation of the object id, or + * an object representation of a single field identity key + * @return the corresponding persistent instance + * @since 2.0 + */ + Object getObjectById (Class cls, Object key); + + /** + * Looks up the instance corresponding to the specified oid. This is + * equivalent to <code>getObjectById(oid, true); + * @param oid The object id of the object to load + * @return the corresponding persistent instance + */ + Object getObjectById (Object oid); + + /** The ObjectId returned by this method represents the JDO identity of + * the instance. The ObjectId is a copy (clone) of the internal state + * of the instance, and changing it does not affect the JDO identity of + * the instance. + * <P>The <code>getObjectId</code> method returns an ObjectId instance that represents + * the object identity of the specified JDO instance. The identity is + * guaranteed to be unique only in the context of the JDO + * <code>PersistenceManager</code> that created the identity, and only for two types + * of JDO Identity: those that are managed by the application, and + * those that are managed by the data store. + * <P>If the object identity is being changed in the transaction, by the + * application modifying one or more of the application key fields, + * then this method returns the identity as of the beginning of the + * transaction. The value returned by <code>getObjectId</code> will be different + * following <code>afterCompletion</code> processing for successful transactions. + * <P>Within a transaction, the ObjectId returned will compare equal to + * the ObjectId returned by only one among all JDO instances associated + * with the <code>PersistenceManager</code> regardless of the type of ObjectId. + * <P>The ObjectId does not necessarily contain any internal state of the + * instance, nor is it necessarily an instance of the class used to + * manage identity internally. Therefore, if the application makes a + * change to the ObjectId instance returned by this method, there is + * no effect on the instance from which the ObjectId was obtained. + * <P>The <code>getObjectById</code> method can be used between instances of + * <code>PersistenceManager</code> of different JDO vendors only for instances of + * persistence capable classes using application-managed (primary key) + * JDO identity. If it is used for instances of classes using datastore + * identity, the method might succeed, but there are no guarantees that + * the parameter and return instances are related in any way. + * @see #getTransactionalObjectId(Object pc) + * @see #getObjectById(Object oid, boolean validate) + * @param pc the <code>PersistenceCapable</code> instance + * @return the ObjectId of the instance + */ + Object getObjectId (Object pc); + + /** The ObjectId returned by this method represents the JDO identity of + * the instance. The ObjectId is a copy (clone) of the internal state + * of the instance, and changing it does not affect the JDO identity of + * the instance. + * <P>If the object identity is being changed in the transaction, by the + * application modifying one or more of the application key fields, + * then this method returns the current identity in the transaction. + * <P>If there is no transaction in progress, or if none of the key fields + * is being modified, then this method will return the same value as + * <code>getObjectId</code>. + * @see #getObjectId(Object pc) + * @see #getObjectById(Object oid, boolean validate) + * @param pc a <code>PersistenceCapable</code> instance + * @return the ObjectId of the instance + */ + Object getTransactionalObjectId (Object pc); + + /** + * This method returns an object id instance corresponding to the pcClass + * and key arguments. + * @param pcClass the <code>Class</code> of the persistence-capable instance + * @param key the value of the key field for single-field identity. + * @return an instance of the object identity class + */ + Object newObjectIdInstance (Class pcClass, Object key); + + /** + * Return the objects with the given oids. + * @param oids the oids of the objects to return + * @param validate if true, the existance of the objects in + * the datastore will be validated. + * @return the objects that were looked up, in the + * same order as the oids parameter. + * @see #getObjectById(Object,boolean) + * @since 2.0 + */ + Collection getObjectsById (Collection oids, boolean validate); + + /** + * Return the objects with the given oids. This method is equivalent + * to calling [EMAIL PROTECTED] #getObjectsById(Collection, boolean)} + * with the validate flag true. + * @param oids the oids of the objects to return + * @return the objects that were looked up, in the + * same order as the oids parameter. + * @see #getObjectsById(Collection,boolean) + * @since 2.0 + */ + Collection getObjectsById (Collection oids); + + /** + * Return the objects with the given oids. + * @param oids the oids of the objects to return + * @param validate if true, the existance of the objects in + * the datastore will be validated. + * @return the objects that were looked up, in the + * same order as the oids parameter. + * @see #getObjectById(Object,boolean) + * @since 2.0 + */ + Object[] getObjectsById (Object[] oids, boolean validate); + + /** + * Return the objects with the given oids. This method is equivalent + * to calling [EMAIL PROTECTED] #getObjectsById(Object[],boolean)} + * with the validate flag true. + * @param oids the oids of the objects to return + * @return the objects that were looked up, in the + * same order as the oids parameter. + * @see #getObjectsById(Object[],boolean) + * @since 2.0 + */ + Object[] getObjectsById (Object[] oids); + + /** Make the transient instance persistent in this <code>PersistenceManager</code>. + * This method must be called in an active transaction. + * The <code>PersistenceManager</code> assigns an ObjectId to the instance and + * transitions it to persistent-new. + * The instance will be managed in the <code>Extent</code> associated with its <code>Class</code>. + * The instance will be put into the data store at commit. + * The closure of instances of <code>PersistenceCapable</code> classes + * reachable from persistent + * fields will be made persistent at commit. [This is known as + * persistence by reachability.] + * @param pc a transient instance of a <code>Class</code> that implements + * <code>PersistenceCapable</code> + */ + void makePersistent (Object pc); + + /** Make an array of instances persistent. + * @param pcs an array of transient instances + * @see #makePersistent(Object pc) + */ + void makePersistentAll (Object[] pcs); + + /** Make a <code>Collection</code> of instances persistent. + * @param pcs a <code>Collection</code> of transient instances + * @see #makePersistent(Object pc) + */ + void makePersistentAll (Collection pcs); + + /** Delete the persistent instance from the data store. + * This method must be called in an active transaction. + * The data store object will be removed at commit. + * Unlike <code>makePersistent</code>, which makes the closure of the instance persistent, + * the closure of the instance is not deleted from the data store. + * This method has no effect if the instance is already deleted in the + * current transaction. + * This method throws <code>JDOUserException</code> if the instance is transient or + * is managed by another <code>PersistenceManager</code>. + * + * @param pc a persistent instance + */ + void deletePersistent (Object pc); + + /** Delete an array of instances from the data store. + * @param pcs a <code>Collection</code> of persistent instances + * @see #deletePersistent(Object pc) + */ + void deletePersistentAll (Object[] pcs); + + /** Delete a <code>Collection</code> of instances from the data store. + * @param pcs a <code>Collection</code> of persistent instances + * @see #deletePersistent(Object pc) + */ + void deletePersistentAll (Collection pcs); + + /** Make an instance transient, removing it from management by this + * <code>PersistenceManager</code>. + * + * <P>The instance loses its JDO identity and it is no longer associated + * with any <code>PersistenceManager</code>. The state of fields is preserved unchanged. + * @param pc the instance to make transient. + */ + void makeTransient (Object pc); + + /** Make an array of instances transient, removing them from management by this + * <code>PersistenceManager</code>. + * + * <P>The instances lose their JDO identity and they are no longer associated + * with any <code>PersistenceManager</code>. The state of fields is preserved unchanged. + * @param pcs the instances to make transient. + */ + void makeTransientAll (Object[] pcs); + + /** Make a <code>Collection</code> of instances transient, removing them from + * management by this <code>PersistenceManager</code>. + * + * <P>The instances lose their JDO identity and they are no longer associated + * with any <code>PersistenceManager</code>. The state of fields is preserved unchanged. + * @param pcs the instances to make transient. + */ + void makeTransientAll (Collection pcs); + + /** Make an instance subject to transactional boundaries. + * + * <P>Transient instances normally do not observe transaction boundaries. + * This method makes transient instances sensitive to transaction completion. + * If an instance is modified in a transaction, and the transaction rolls back, + * the state of the instance is restored to the state before the first change + * in the transaction. + * + * <P>For persistent instances read in optimistic transactions, this method + * allows the application to make the state of the instance part of the + * transactional state. At transaction commit, the state of the instance in + * the cache is compared to the state of the instance in the data store. If they + * are not the same, then an exception is thrown. + * @param pc the instance to make transactional. + */ + void makeTransactional (Object pc); + + /** Make an array of instances subject to transactional boundaries. + * @param pcs the array of instances to make transactional. + * @see #makeTransactional(Object pc) + */ + void makeTransactionalAll (Object[] pcs); + + /** Make a <code>Collection</code> of instances subject to transactional boundaries. + * @param pcs the <code>Collection</code> of instances to make transactional. + * @see #makeTransactional(Object pc) + */ + void makeTransactionalAll (Collection pcs); + + /** Make an instance non-transactional after commit. + * + * <P>Normally, at transaction completion, instances are evicted from the + * cache. This method allows an application to identify an instance as + * not being evicted from the cache at transaction completion. Instead, + * the instance remains in the cache with nontransactional state. + * + * @param pc the instance to make nontransactional. + */ + void makeNontransactional (Object pc); + + /** Make an array of instances non-transactional after commit. + * + * @param pcs the array of instances to make nontransactional. + * @see #makeNontransactional(Object pc) + */ + void makeNontransactionalAll (Object[] pcs); + + /** Make a <code>Collection</code> of instances non-transactional after commit. + * + * @param pcs the <code>Collection</code> of instances to make nontransactional. + * @see #makeNontransactional(Object pc) + */ + void makeNontransactionalAll (Collection pcs); + + /** Retrieve field values of an instance from the store. This tells + * the <code>PersistenceManager</code> that the application intends to use the + * instance, and its field values must be retrieved. + * <P>The <code>PersistenceManager</code> might use policy information about the + * class to retrieve associated instances. + * @param pc the instance + */ + void retrieve (Object pc); + + /** Retrieve field values of instances from the store. This tells + * the <code>PersistenceManager</code> that the application intends to use the + * instances, and all field values must be retrieved. + * <P>The <code>PersistenceManager</code> might use policy information about the + * class to retrieve associated instances. + * @param pcs the instances + */ + void retrieveAll (Collection pcs); + + /** Retrieve field values of instances from the store. This tells + * the <code>PersistenceManager</code> that the application intends to use the + * instances, and their field values should be retrieved. The fields + * in the default fetch group must be retrieved, and the implementation + * might retrieve more fields than the default fetch group. + * <P>The <code>PersistenceManager</code> might use policy information about the + * class to retrieve associated instances. + * @param pcs the instances + * @param DFGOnly whether to retrieve only the default fetch group fields + * @since 1.0.1 + */ + void retrieveAll (Collection pcs, boolean DFGOnly); + + /** Retrieve field values of instances from the store. This tells + * the <code>PersistenceManager</code> that the application intends to use the + * instances, and all field values must be retrieved. + * <P>The <code>PersistenceManager</code> might use policy information about the + * class to retrieve associated instances. + * @param pcs the instances + */ + void retrieveAll (Object[] pcs); + + /** Retrieve field values of instances from the store. This tells + * the <code>PersistenceManager</code> that the application intends to use the + * instances, and their field values should be retrieved. The fields + * in the default fetch group must be retrieved, and the implementation + * might retrieve more fields than the default fetch group. + * <P>The <code>PersistenceManager</code> might use policy information about the + * class to retrieve associated instances. + * @param pcs the instances + * @param DFGOnly whether to retrieve only the default fetch group fields + * @since 1.0.1 + */ + void retrieveAll (Object[] pcs, boolean DFGOnly); + + /** The application can manage the <code>PersistenceManager</code> instances + * more easily by having an application object associated with each + * <code>PersistenceManager</code> instance. + * @param o the user instance to be remembered by the <code>PersistenceManager</code> + * @see #getUserObject + */ + void setUserObject (Object o); + + /** The application can manage the <code>PersistenceManager</code> instances + * more easily by having an application object associated with each + * <code>PersistenceManager</code> instance. + * @return the user object associated with this <code>PersistenceManager</code> + * @see #setUserObject + */ + Object getUserObject (); + + /** This method returns the <code>PersistenceManagerFactory</code> used to create + * this <code>PersistenceManager</code>. + * @return the <code>PersistenceManagerFactory</code> that created + * this <code>PersistenceManager</code> + */ + PersistenceManagerFactory getPersistenceManagerFactory(); + + /** Return the <code>Class</code> that implements the JDO Identity for the + * specified <code>PersistenceCapable</code> class. The application can use the + * returned <code>Class</code> to construct a JDO Identity instance for + * application identity <code>PersistenceCapable</code> classes. This JDO Identity + * instance can then be used to get an instance of the + * <code>PersistenceCapable</code> class for use in the application. + * + * <P>In order for the application to construct an instance of the ObjectId class + * it needs to know the class being used by the JDO implementation. + * @param cls the <code>PersistenceCapable Class</code> + * @return the <code>Class</code> of the ObjectId of the parameter + * @see #getObjectById + */ + Class getObjectIdClass(Class cls); + + /** Set the Multithreaded flag for this <code>PersistenceManager</code>. Applications + * that use multiple threads to invoke methods or access fields from + * instances managed by this <code>PersistenceManager</code> must set this flag to <code>true</code>. + * Instances managed by this <code>PersistenceManager</code> include persistent or + * transactional instances of <code>PersistenceCapable</code> classes, as well as + * helper instances such as <code>Query</code>, <code>Transaction</code>, or <code>Extent</code>. + * @param flag the Multithreaded setting. + */ + void setMultithreaded (boolean flag); + + /** Get the current Multithreaded flag for this <code>PersistenceManager</code>. + * @see #setMultithreaded + * @return the Multithreaded setting. + */ + boolean getMultithreaded(); + + /** Set the ignoreCache parameter for queries. + * + * <P>IgnoreCache set to <code>true</code> specifies that for all <code>Query</code> instances created by this + * <code>PersistenceManager</code>, the default is the cache should be ignored for queries. + * @param flag the ignoreCache setting. + */ + void setIgnoreCache(boolean flag); + + /** Get the ignoreCache setting for queries. + * + * <P>IgnoreCache set to <code>true</code> specifies that for all <code>Query</code> instances created by this + * <code>PersistenceManager</code>, the default is the cache should be ignored for queries. + * @return the ignoreCache setting. + */ + boolean getIgnoreCache(); + /** + * Detach the specified object from the <code>PersistenceManager</code>. + * @param pc the instance to detach + * @return the detached instance + * @see #detachCopyAll(Object[]) + * @since 2.0 + */ + Object detachCopy (Object pc); + + /** + * Detach the specified objects from the <code>PersistenceManager</code>. + * @param pcs the instances to detach + * @return the detached instances + * @see #detachCopyAll(Object[]) + * @since 2.0 + */ + Collection detachCopyAll (Collection pcs); + + /** + * Detach the specified objects from the + * <code>PersistenceManager</code>. The objects returned can be + * manipulated and re-attached with + * [EMAIL PROTECTED] #attachCopyAll(Object[], boolean)}. + * The detached instances will be + * unmanaged copies of the specified parameters, and are suitable + * for serialization and manipulation outside of a JDO + * environment. When detaching instances, only fields in the + * current [EMAIL PROTECTED] FetchPlan} will be traversed. Thus, to detach a + * graph of objects, relations to other persistent instances must + * either be in the <code>default-fetch-group</code>, or in the + * current custom [EMAIL PROTECTED] FetchPlan}. + * @param pcs the instances to detach + * @return the detached instances + * @throws JDOUserException if any of the instances do not + * @see #attachCopyAll(Object[], boolean) + * @see #getFetchPlan + * @since 2.0 + */ + Object[] detachCopyAll (Object [] pcs); + + /** + * Import the specified object into the + * <code>PersistenceManager</code>. + * @param pc instance to import + * @param makeTransactional if <code>true</code>, this method will + * mark transactional the persistent instances corresponding + * to all instances in the closure of the detached graph. + * @return the re-attached instance + * @see #attachCopyAll(Object[],boolean) + * @since 2.0 + */ + Object attachCopy (Object pc, boolean makeTransactional); + + /** + * Import the specified objects into the + * <code>PersistenceManager</code>. + * @param pcs Collection of instances to import + * @param makeTransactional if <code>true</code>, this method will + * mark transactional the persistent instances corresponding + * to all instances in the closure of the detached graph. + * @return the re-attached instances + * @see #attachCopyAll(Object[],boolean) + * @since 2.0 + */ + Collection attachCopyAll (Collection pcs, boolean makeTransactional); + + /** + * Import the specified objects into the + * <code>PersistenceManager</code>. Instances that were + * previously detached from this or another + * <code>PersistenceManager</code> will have their changed merged + * into the persistent instances. Instances that are new will be + * persisted as new instances. + * @param pcs array of instances to import + * @param makeTransactional if <code>true</code>, this method will + * mark transactional the persistent instances corresponding + * to all instances in the closure of the detached graph. + * @return the re-attached instances + * @see #detachCopyAll(Object[]) + * @since 2.0 + */ + Object[] attachCopyAll (Object[] pcs, boolean makeTransactional); + + /** + * Put the specified key-value pair into the map of user objects. + * @since 2.0 + */ + Object putUserObject (Object key, Object val); + + /** + * Get the value for the specified key from the map of user objects. + * @param key the key of the object to be returned + * @return the object + * @since 2.0 + */ + Object getUserObject (Object key); + + /** + * Remove the specified key and its value from the map of user objects. + * @param key the key of the object to be removed + * @since 2.0 + */ + Object removeUserObject (Object key); + + /** + * Flushes all dirty, new, and deleted instances to the data + * store. It has no effect if a transaction is not active. + * <p>If a datastore transaction is active, this method + * synchronizes the cache with the datastore and reports any + * exceptions.</p> + * <p>If an optimistic transaction is active, this method obtains + * a datastore connection, synchronizes the cache with the + * datastore using this connection and reports any + * exceptions. The connection obtained by this method is held + * until the end of the transaction.</p> + * <p>If exceptions occur during flush, the implementation will + * set the current transaction's <code>RollbackOnly</code> flag + * (see [EMAIL PROTECTED] Transaction#setRollbackOnly}).</p> + * @since 2.0 + */ + void flush (); + + /** + * Validates the <code>PersistenceManager</code> cache with the + * datastore. This method has no effect if a transaction is not + * active. + * <p>If a datastore transaction is active, this method verifies + * the consistency of instances in the cache against the + * datastore. An implementation might flush instances as if + * [EMAIL PROTECTED] #flush} were called, but it is not required to do + * so.</p> + * <p>If an optimistic transaction is active, this method obtains + * a datastore connection and verifies the consistency of the + * instances in the cache against the datastore. If any + * inconsistencies are detected, a [EMAIL PROTECTED] + * JDOOptimisticVerificationException} is thrown. This exception + * contains a nested [EMAIL PROTECTED] JDOOptimisticVerificationException} + * for each object that failed the consistency check. No + * datastore resources acquired during the execution of this + * method are held beyond the scope of this method.</p> + * @since 2.0 + */ + void checkConsistency (); + + /** + * Returns the <code>FetchPlan</code> used by this + * <code>PersistenceManager</code>. + * @return the FetchPlan + * @since 2.0 + */ + FetchPlan getFetchPlan (); + + /** + * Creates an instance of a persistence-capable interface or + * abstract class. The returned instance is transient. + * @param pcClass Must be an abstract class or interface + * that is declared in the metadata. + * @return the created instance + * @since 2.0 + */ + Object newInstance (Class pcClass); + + /** + * Returns the sequence identified by <code>name</code>. + * @param name the name of the Sequence + * @return the Sequence + * @since 2.0 + */ + Sequence getSequence (String name); + + /** + * If this method is called while a datastore transaction is + * active, the object returned will be enlisted in the current + * transaction. If called in an optimistic transaction or outside + * an active transaction, the object returned will not be + * enlisted in any transaction. + * @return the JDOConnection instance + * @since 2.0 + */ + JDOConnection getDataStoreConnection (); + + /** + * Adds the listener instance to the list of lifecycle event + * listeners. The <code>classes</code> parameter identifies all + * of the classes of interest. If the <code>classes</code> + * parameter is specified as <code>null</code>, events for all + * persistent classes and interfaces will be sent to + * <code>listenerInstance</code>. + * <p>The listenerInstance will be called for each event for which it + * implements the corresponding listenerInstance interface.</p> + * @param listener the lifecycle listener + * @param classes the classes of interest to the listener + * @since 2.0 + */ + void addInstanceLifecycleListener (InstanceLifecycleListener listener, + Class[] classes); + + /** + * Removes the listener instance from the list of lifecycle event listeners. + * @param listener the listener instance to be removed + * @since 2.0 + */ + void removeInstanceLifecycleListener (InstanceLifecycleListener listener); +}
Added: incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManagerFactory.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManagerFactory.java?view=auto&rev=159273 ============================================================================== --- incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManagerFactory.java (added) +++ incubator/jdo/trunk/api20/src/java/javax/jdo/PersistenceManagerFactory.java Mon Mar 28 10:25:05 2005 @@ -0,0 +1,343 @@ +/* + * Copyright 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. + * 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. + */ + +/* + * PersistenceManagerFactory.java + * + */ + +package javax.jdo; + +import java.util.Properties; +import java.util.Collection; + +import javax.jdo.datastore.DataStoreCache; + +/** The <code>PersistenceManagerFactory</code> is the interface to use to obtain + * <code>PersistenceManager</code> instances. All <code>PersistenceManager</code> instances obtained + * from the same <code>PersistenceManagerFactory</code> will have the same default + * properties. + * + * <P><code>PersistenceManagerFactory</code> instances may be configured and + * serialized for later use. They may be stored via JNDI and looked up + * and used later. Any properties configured will be saved and restored. + * + * <P>Once the first <code>PersistenceManager</code> is obtained from the + * <code>PersistenceManagerFactory</code>, the factory can no longer be configured. + * <P>If the <code>ConnectionFactory</code> property is set (non-<code>null</code>) then + * all other Connection properties including <code>ConnectionFactoryName</code> are ignored; + * otherwise, if <code>ConnectionFactoryName</code> is set (non-<code>null</code>) then + * all other Connection properties are ignored. + * Similarly, if the <code>ConnectionFactory2</code> property is set (non-<code>null</code>) then + * <code>ConnectionFactory2Name</code> is ignored. + * <P>Operational state (<code>PersistenceManager</code> pooling, connection pooling, + * operational parameters) must not be serialized. + * + * @version 2.0 + */ + +public interface PersistenceManagerFactory extends java.io.Serializable { + + /** Close this PersistenceManagerFactory. Check for + * JDOPermission("closePersistenceManagerFactory") and if not authorized, + * throw SecurityException. + * <P>If the authorization check succeeds, check to see that all + * PersistenceManager instances obtained from this PersistenceManagerFactory + * have no active transactions. If any PersistenceManager instances have + * an active transaction, throw a JDOUserException, with one nested + * JDOUserException for each PersistenceManager with an active Transaction. + * <P>If there are no active transactions, then close all PersistenceManager + * instances obtained from this PersistenceManagerFactory, mark this + * PersistenceManagerFactory as closed, disallow getPersistenceManager + * methods, and allow all other get methods. If a set method or + * getPersistenceManager method is called after close, then + * JDOUserException is thrown. + * @since 1.0.1 + */ + void close(); + + /** Get an instance of <code>PersistenceManager</code> from this factory. The instance has + * default values for options. + * + * <P>After the first use of <code>getPersistenceManager</code>, no "set" methods will + * succeed. + * + * @return a <code>PersistenceManager</code> instance with default options. + */ + PersistenceManager getPersistenceManager(); + + /** Get an instance of <code>PersistenceManager</code> from this factory. The instance has + * default values for options. The parameters <code>userid</code> and <code>password</code> are used + * when obtaining datastore connections from the connection pool. + * + * <P>After the first use of <code>getPersistenceManager</code>, no "set" methods will + * succeed. + * + * @return a <code>PersistenceManager</code> instance with default options. + * @param userid the userid for the connection + * @param password the password for the connection + */ + PersistenceManager getPersistenceManager(String userid, String password); + + /** Set the user name for the data store connection. + * @param userName the user name for the data store connection. + */ + void setConnectionUserName(String userName); + + /** Get the user name for the data store connection. + * @return the user name for the data store connection. + */ + String getConnectionUserName (); + + /** Set the password for the data store connection. + * @param password the password for the data store connection. + */ + void setConnectionPassword (String password); + + /** Set the URL for the data store connection. + * @param URL the URL for the data store connection. + */ + void setConnectionURL (String URL); + + /** Get the URL for the data store connection. + * @return the URL for the data store connection. + */ + String getConnectionURL (); + + /** Set the driver name for the data store connection. + * @param driverName the driver name for the data store connection. + */ + void setConnectionDriverName (String driverName); + + /** Get the driver name for the data store connection. + * @return the driver name for the data store connection. + */ + String getConnectionDriverName (); + + /** Set the name for the data store connection factory. + * @param connectionFactoryName the name of the data store connection factory. + */ + void setConnectionFactoryName (String connectionFactoryName); + + /** Get the name for the data store connection factory. + * @return the name of the data store connection factory. + */ + String getConnectionFactoryName (); + + /** Set the data store connection factory. JDO implementations + * will support specific connection factories. The connection + * factory interfaces are not part of the JDO specification. + * @param connectionFactory the data store connection factory. + */ + void setConnectionFactory (Object connectionFactory); + + /** Get the data store connection factory. + * @return the data store connection factory. + */ + Object getConnectionFactory (); + + /** Set the name for the second data store connection factory. This is + * needed for managed environments to get nontransactional connections for + * optimistic transactions. + * @param connectionFactoryName the name of the data store connection factory. + */ + void setConnectionFactory2Name (String connectionFactoryName); + + /** Get the name for the second data store connection factory. This is + * needed for managed environments to get nontransactional connections for + * optimistic transactions. + * @return the name of the data store connection factory. + */ + String getConnectionFactory2Name (); + + /** Set the second data store connection factory. This is + * needed for managed environments to get nontransactional connections for + * optimistic transactions. JDO implementations + * will support specific connection factories. The connection + * factory interfaces are not part of the JDO specification. + * @param connectionFactory the data store connection factory. + */ + void setConnectionFactory2 (Object connectionFactory); + + /** Get the second data store connection factory. This is + * needed for managed environments to get nontransactional connections for + * optimistic transactions. + * @return the data store connection factory. + */ + Object getConnectionFactory2 (); + + /** Set the default Multithreaded setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @param flag the default Multithreaded setting. + */ + void setMultithreaded (boolean flag); + + /** Get the default Multithreaded setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @return the default Multithreaded setting. + */ + boolean getMultithreaded(); + + /** Set the default Optimistic setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @param flag the default Optimistic setting. + */ + void setOptimistic (boolean flag); + + /** Get the default Optimistic setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @return the default Optimistic setting. + */ + boolean getOptimistic(); + + /** Set the default RetainValues setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @param flag the default RetainValues setting. + */ + void setRetainValues (boolean flag); + + /** Get the default RetainValues setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @return the default RetainValues setting. + */ + boolean getRetainValues (); + + /** Set the default value for the RestoreValues property. + * If <code>true</code>, at rollback, fields of newly persistent instances + * are restored to + * their values as of the beginning of the transaction, and the instances + * revert to transient. Additionally, fields of modified + * instances of primitive types and immutable reference types + * are restored to their values as of the beginning of the + * transaction. + * <P>If <code>false</code>, at rollback, the values of fields of + * newly persistent instances are unchanged and the instances revert to + * transient. Additionally, dirty instances transition to hollow. + * If an implementation does not support this option, a + * <code>JDOUnsupportedOptionException</code> is thrown. + * @param restoreValues the value of the restoreValues property + */ + void setRestoreValues(boolean restoreValues); + + /** Get the default value for the RestoreValues property. + * @return the value of the restoreValues property + */ + boolean getRestoreValues(); + + /** Set the default NontransactionalRead setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @param flag the default NontransactionalRead setting. + */ + void setNontransactionalRead (boolean flag); + + /** Get the default NontransactionalRead setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @return the default NontransactionalRead setting. + */ + boolean getNontransactionalRead (); + + /** Set the default NontransactionalWrite setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @param flag the default NontransactionalWrite setting. + */ + void setNontransactionalWrite (boolean flag); + + /** Get the default NontransactionalWrite setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @return the default NontransactionalWrite setting. + */ + boolean getNontransactionalWrite (); + + /** Set the default IgnoreCache setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @param flag the default IgnoreCache setting. + */ + void setIgnoreCache (boolean flag); + + /** Get the default IgnoreCache setting for all <code>PersistenceManager</code> instances + * obtained from this factory. + * + * @return the default IngoreCache setting. + */ + boolean getIgnoreCache (); + + /** Return non-configurable properties of this <code>PersistenceManagerFactory</code>. + * Properties with keys <code>VendorName</code> and <code>VersionNumber</code> are required. Other + * keys are optional. + * @return the non-configurable properties of this + * <code>PersistenceManagerFactory</code>. + */ + Properties getProperties(); + + /** The application can determine from the results of this + * method which optional features, and which query languages + * are supported by the JDO implementation. + * <P>Each supported JDO optional feature is represented by a + * <code>String</code> with one of the following values: + * + * <P><code>javax.jdo.option.TransientTransactional + * <BR>javax.jdo.option.NontransactionalRead + * <BR>javax.jdo.option.NontransactionalWrite + * <BR>javax.jdo.option.RetainValues + * <BR>javax.jdo.option.Optimistic + * <BR>javax.jdo.option.ApplicationIdentity + * <BR>javax.jdo.option.DatastoreIdentity + * <BR>javax.jdo.option.NonDatastoreIdentity + * <BR>javax.jdo.option.ArrayList + * <BR>javax.jdo.option.HashMap + * <BR>javax.jdo.option.Hashtable + * <BR>javax.jdo.option.LinkedList + * <BR>javax.jdo.option.TreeMap + * <BR>javax.jdo.option.TreeSet + * <BR>javax.jdo.option.Vector + * <BR>javax.jdo.option.Map + * <BR>javax.jdo.option.List + * <BR>javax.jdo.option.Array + * <BR>javax.jdo.option.NullCollection + * <BR>javax.jdo.option.ChangeApplicationIdentity + * <BR>javax.jdo.option.BinaryCompatibility + * <BR>javax.jdo.option.GetDataStoreConnection + * <BR>javax.jdo.option.UnconstrainedQueryVariables + * <BR>javax.jdo.query.SQL + * <BR>javax.jdo.query.JDOQL + * </code> + * + *<P>The standard JDO query language is represented by a <code>String</code>: + *<P><code>javax.jdo.query.JDOQL</code> + * @return the <code>Collection</code> of <code>String</code>s representing the supported options. + */ + Collection supportedOptions(); + + /** + * Return the [EMAIL PROTECTED] DataStoreCache} that this factory uses for + * controlling a second-level cache. If this factory does not use + * a second-level cache, the returned instance does nothing. This + * method never returns <code>null</code>. + * @since 2.0 + */ + DataStoreCache getDataStoreCache (); +} Added: incubator/jdo/trunk/api20/src/java/javax/jdo/Query.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/api20/src/java/javax/jdo/Query.java?view=auto&rev=159273 ============================================================================== --- incubator/jdo/trunk/api20/src/java/javax/jdo/Query.java (added) +++ incubator/jdo/trunk/api20/src/java/javax/jdo/Query.java Mon Mar 28 10:25:05 2005 @@ -0,0 +1,448 @@ +/* + * Copyright 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. + * 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. + */ + +/* + * Query.java + * + */ + +package javax.jdo; +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; + +/** The <code>Query</code> interface allows applications to obtain persistent instances + * from the data store. + * + * The [EMAIL PROTECTED] PersistenceManager} is the factory for <code>Query</code> instances. There + * may be many <code>Query</code> instances associated with a <code>PersistenceManager</code>. + * Multiple queries might be executed simultaneously by different threads, but the + * implementation might choose to execute them serially. In either case, the + * implementation must be thread safe. + * + * <P>There are three required elements in a <code>Query</code>: the class of the results, + * the candidate collection of instances, and the filter. + * + * <P>There are optional elements: parameter declarations, variable + * declarations, import statements, and an ordering specification. + * <P>The query namespace is modeled after methods in Java: + * <ul> + * <li><code>setClass</code> corresponds to the class definition + * <li><code>declareParameters</code> corresponds to formal parameters of a method + * <li><code>declareVariables</code> corresponds to local variables of a method + * <li><code>setFilter</code> and <code>setOrdering</code> correspond to the method body + * </ul> + * <P>There are two namespaces in queries. Type names have their own + * namespace that is separate from the namespace for fields, variables + * and parameters. + * <P>The method <code>setClass</code> introduces the name of the candidate class in + * the type namespace. The method <code>declareImports</code> introduces the names of + * the imported class or interface types in the type namespace. Imported + * type names must be unique. When used (e.g. in a parameter declaration, + * cast expression, etc.) a type name must be the name of the candidate + * class, the name of a class or interface imported by method + * <code>declareImports</code>, or denote a class or interface from the same + * package as the candidate class. + * <P>The method <code>setClass</code> introduces the names of the candidate class fields. + * <P>The method <code>declareParameters</code> introduces the names of the + * parameters. A name introduced by <code>declareParameters</code> hides the name + * of a candidate class field if equal. Parameter names must be unique. + * <P>The method <code>declareVariables</code> introduces the names of the variables. + * A name introduced by <code>declareVariables</code> hides the name of a candidate + * class field if equal. Variable names must be unique and must not + * conflict with parameter names. + * <P>A hidden field may be accessed using the 'this' qualifier: + * <code>this.fieldName</code>. + * <P>The <code>Query</code> interface provides methods which execute the query + * based on the parameters given. They return a <code>Collection</code> which the + * user can iterate to get results. For future extension, the signature + * of the <code>execute</code> methods specifies that they return an <code>Object</code> which + * must be cast to <code>Collection</code> by the user. + * <P>Any parameters passed to the <code>execute</code> methods are used only for + * this execution, and are not remembered for future execution. + * @version 2.0 + */ + +public interface Query extends Serializable { + + /** + * The string constant used as the first argument to [EMAIL PROTECTED] + * PersistenceManager#newQuery(String,Object)} to identify that + * the created query should obey the JDOQL syntax and semantic + * rules. + * <p>This is the default query language used when creating a + * query with any of the other [EMAIL PROTECTED] + * PersistenceManager#newQuery} methods, except [EMAIL PROTECTED] + * PersistenceManager#newQuery(Object)}, which uses the query + * language of the compiled query template object passed to that + * method.</p> + * @since 2.0 + */ + String JDOQL = "javax.jdo.query.JDOQL"; + + /** + * The string constant used as the first argument to [EMAIL PROTECTED] + * PersistenceManager#newQuery(String,Object)} to identify that + * the created query should use SQL semantics. This is only + * meaningful for relational JDO implementations. + * <p>If this is used, the <code>Object</code> argument to the + * [EMAIL PROTECTED] PersistenceManager#newQuery(String,Object)} method + * should be a <code>String</code> containing a SQL + * <code>SELECT</code> statement.</p> + * @since 2.0 + */ + String SQL = "javax.jdo.query.SQL"; + + /** Set the class of the candidate instances of the query. + * <P>The class specifies the class + * of the candidates of the query. Elements of the candidate collection + * that are of the specified class are filtered before being + * put into the result <code>Collection</code>. + * + * @param cls the <code>Class</code> of the candidate instances. + */ + void setClass(Class cls); + + /** Set the candidate <code>Extent</code> to query. + * @param pcs the candidate <code>Extent</code>. + */ + void setCandidates(Extent pcs); + + /** Set the candidate <code>Collection</code> to query. + * @param pcs the candidate <code>Collection</code>. + */ + void setCandidates(Collection pcs); + + /** Set the filter for the query. + * + * <P>The filter specification is a <code>String</code> containing a Boolean + * expression that is to be evaluated for each of the instances + * in the candidate collection. If the filter is not specified, + * then it defaults to "true", which has the effect of filtering + * the input <code>Collection</code> only for class type. + * <P>An element of the candidate collection is returned in the result if: + * <ul><li>it is assignment compatible to the candidate <code>Class</code> of the <code>Query</code>; and + * <li>for all variables there exists a value for which the filter + * expression evaluates to <code>true</code>. + * </ul> + * <P>The user may denote uniqueness in the filter expression by + * explicitly declaring an expression (for example, <code>e1 != e2</code>). + * <P>Rules for constructing valid expressions follow the Java + * language, except for these differences: + * <ul> + * <li>Equality and ordering comparisons between primitives and instances + * of wrapper classes are valid. + * <li>Equality and ordering comparisons of <code>Date</code> fields and <code>Date</code> + * parameters are valid. + * <li>White space (non-printing characters space, tab, carriage + * return, and line feed) is a separator and is otherwise ignored. + * <li>The assignment operators <code>=</code>, <code>+=</code>, etc. and pre- and post-increment + * and -decrement are not supported. Therefore, there are no side + * effects from evaluation of any expressions. + * <li>Methods, including object construction, are not supported, except + * for <code>Collection.contains(Object o)</code>, <code>Collection.isEmpty()</code>, + * <code>String.startsWith(String s)</code>, and <code>String.endsWith(String e)</code>. + * Implementations might choose to support non-mutating method + * calls as non-standard extensions. + * <li>Navigation through a <code>null</code>-valued field, which would throw + * <code>NullPointerException</code>, is treated as if the filter expression + * returned <code>false</code> for the evaluation of the current set of variable + * values. Other values for variables might still qualify the candidate + * instance for inclusion in the result set. + * <li>Navigation through multi-valued fields (<code>Collection</code> types) is + * specified using a variable declaration and the + * <code>Collection.contains(Object o)</code> method. + * </ul> + * <P>Identifiers in the expression are considered to be in the name + * space of the specified class, with the addition of declared imports, + * parameters and variables. As in the Java language, <code>this</code> is a reserved + * word which means the element of the collection being evaluated. + * <P>Navigation through single-valued fields is specified by the Java + * language syntax of <code>field_name.field_name....field_name</code>. + * <P>A JDO implementation is allowed to reorder the filter expression + * for optimization purposes. + * @param filter the query filter. + */ + void setFilter(String filter); + + /** Set the import statements to be used to identify the fully qualified name of + * variables or parameters. Parameters and unbound variables might + * come from a different class from the candidate class, and the names + * need to be declared in an import statement to eliminate ambiguity. + * Import statements are specified as a <code>String</code> with semicolon-separated + * statements. + * <P>The <code>String</code> parameter to this method follows the syntax of the + * import statement of the Java language. + * @param imports import statements separated by semicolons. + */ + void declareImports(String imports); + + /** Declare the list of parameters query execution. + * + * The parameter declaration is a <code>String</code> containing one or more query + * parameter declarations separated with commas. Each parameter named + * in the parameter declaration must be bound to a value when + * the query is executed. + * <P>The <code>String</code> parameter to this method follows the syntax for formal + * parameters in the Java language. + * @param parameters the list of parameters separated by commas. + */ + void declareParameters(String parameters); + + /** Declare the unbound variables to be used in the query. Variables + * might be used in the filter, and these variables must be declared + * with their type. The unbound variable declaration is a <code>String</code> + * containing one or more unbound variable declarations separated + * with semicolons. It follows the syntax for local variables in + * the Java language. + * @param variables the variables separated by semicolons. + */ + void declareVariables(String variables); + + /** Set the ordering specification for the result <code>Collection</code>. The + * ordering specification is a <code>String</code> containing one or more ordering + * declarations separated by commas. + * + * <P>Each ordering declaration is the name of the field on which + * to order the results followed by one of the following words: + * "<code>ascending</code>" or "<code>descending</code>". + * + *<P>The field must be declared in the candidate class or must be + * a navigation expression starting with a field in the candidate class. + * + *<P>Valid field types are primitive types except <code>boolean</code>; wrapper types + * except <code>Boolean</code>; <code>BigDecimal</code>; <code>BigInteger</code>; + * <code>String</code>; and <code>Date</code>. + * @param ordering the ordering specification. + */ + void setOrdering(String ordering); + + /** Set the ignoreCache option. The default value for this option was + * set by the <code>PersistenceManagerFactory</code> or the + * <code>PersistenceManager</code> used to create this <code>Query</code>. + * + * The ignoreCache option setting specifies whether the query should execute + * entirely in the back end, instead of in the cache. If this flag is set + * to <code>true</code>, an implementation might be able to optimize the query + * execution by ignoring changed values in the cache. For optimistic + * transactions, this can dramatically improve query response times. + * @param ignoreCache the setting of the ignoreCache option. + */ + void setIgnoreCache(boolean ignoreCache); + + /** Get the ignoreCache option setting. + * @return the ignoreCache option setting. + * @see #setIgnoreCache + */ + boolean getIgnoreCache(); + + /** Verify the elements of the query and provide a hint to the query to + * prepare and optimize an execution plan. + */ + void compile(); + + /** Execute the query and return the filtered Collection. + * @return the filtered <code>Collection</code>. + * @see #executeWithArray(Object[] parameters) + */ + Object execute(); + + /** Execute the query and return the filtered <code>Collection</code>. + * @return the filtered <code>Collection</code>. + * @see #executeWithArray(Object[] parameters) + * @param p1 the value of the first parameter declared. + */ + Object execute(Object p1); + + /** Execute the query and return the filtered <code>Collection</code>. + * @return the filtered <code>Collection</code>. + * @see #executeWithArray(Object[] parameters) + * @param p1 the value of the first parameter declared. + * @param p2 the value of the second parameter declared. + */ + Object execute(Object p1, Object p2); + + /** Execute the query and return the filtered <code>Collection</code>. + * @return the filtered <code>Collection</code>. + * @see #executeWithArray(Object[] parameters) + * @param p1 the value of the first parameter declared. + * @param p2 the value of the second parameter declared. + * @param p3 the value of the third parameter declared. + */ + Object execute(Object p1, Object p2, Object p3); + + /** Execute the query and return the filtered <code>Collection</code>. The query + * is executed with the parameters set by the <code>Map</code> values. Each <code>Map</code> entry + * consists of a key which is the name of the parameter in the + * <code>declareParameters</code> method, and a value which is the value used in + * the <code>execute</code> method. The keys in the <code>Map</code> and the declared parameters + * must exactly match or a <code>JDOUserException</code> is thrown. + * @return the filtered <code>Collection</code>. + * @see #executeWithArray(Object[] parameters) + * @param parameters the <code>Map</code> containing all of the parameters. + */ + Object executeWithMap (Map parameters); + + /** Execute the query and return the filtered <code>Collection</code>. + * + * <P>The execution of the query obtains the values of the parameters and + * matches them against the declared parameters in order. The names + * of the declared parameters are ignored. The type of + * the declared parameters must match the type of the passed parameters, + * except that the passed parameters might need to be unwrapped to get + * their primitive values. + * + * <P>The filter, import, declared parameters, declared variables, and + * ordering statements are verified for consistency. + * + * <P>Each element in the candidate <code>Collection</code> is examined to see that it + * is assignment compatible to the <code>Class</code> of the query. It is then evaluated + * by the Boolean expression of the filter. The element passes the filter + * if there exist unique values for all variables for which the filter + * expression evaluates to <code>true</code>. + * @return the filtered <code>Collection</code>. + * @param parameters the <code>Object</code> array with all of the parameters. + */ + Object executeWithArray (Object[] parameters); + + /** Get the <code>PersistenceManager</code> associated with this <code>Query</code>. + * + * <P>If this <code>Query</code> was restored from a serialized form, it has no + * <code>PersistenceManager</code>, and this method returns <code>null</code>. + * @return the <code>PersistenceManager</code> associated with this <code>Query</code>. + */ + PersistenceManager getPersistenceManager(); + + /** Close a query result and release any resources associated with it. The + * parameter is the return from <code>execute(...)</code> and might have iterators open on it. + * Iterators associated with the query result are invalidated: they return <code>false</code> + * to <code>hasNext()</code> and throw <code>NoSuchElementException</code> to <code>next()</code>. + * @param queryResult the result of <code>execute(...)</code> on this <code>Query</code> instance. + */ + void close (Object queryResult); + + /** Close all query results associated with this <code>Query</code> instance, and release all + * resources associated with them. The query results might have iterators open + * on them. Iterators associated with the query results are invalidated: + * they return <code>false</code> to <code>hasNext()</code> and throw + * <code>NoSuchElementException</code> to <code>next()</code>. + */ + void closeAll (); + + /** + * Set the grouping expressions, optionally including a "having" + * clause. When grouping is specified, each result expression + * must either be an expression contained in the grouping, or an + * aggregate evaluated once per group. + * + * @param group a comma-delimited list of expressions, optionally + * followed by the "having" keyword and a boolean expression + * @since 2.0 + */ + void setGrouping (String group); + + /** + * Specify that only the first result of the query should be + * returned, rather than a collection. The execute method will + * return null if the query result size is 0. + * @since 2.0 + */ + void setUnique (boolean unique); + + /** + * Configures what type of data this query should return. If this + * is unset or set to <code>null</code>, this query will return a + * list of the query's candidate class. Otherwise, this query + * will return aggregate function results and / or individual + * field values (projections). + * @param data a comma-delimited list of fields, functions on fields, + * or aggregate functions to return from this query + * @since 2.0 + */ + void setResult (String data); + + /** + * Specify the type of object in which the result of invoking + * [EMAIL PROTECTED] #execute} or one of its siblings. The behavior of this + * method depends the nature of the query being executed. In + * particular, if used in conjunction with [EMAIL PROTECTED] #setResult}, + * the argument to this method should be + * <code>Object[].class</code>, a class with bean-like setters + * for each of the items listed in the result specification, or a + * class with a method called <code>put</code> with two + * <code>Object</code> arguments. + * @since 2.0 + */ + void setResultClass (Class cls); + + /** + * Set the range of results to return. + * @param fromIncl 0-based inclusive start index + * @param toExcl 0-based exclusive end index, or + * [EMAIL PROTECTED] Integer#MAX_VALUE} for no limit. + * @since 2.0 + */ + void setRange (long fromIncl, long toExcl); + + /** + * Add a vendor-specific extension this query. The key and value + * are not standard. + * An implementation must ignore keys that are not recognized. + * @since 2.0 + */ + void addExtension (String key, Object value); + + /** + * Set multiple extensions, or use null to clear extensions. + * Map keys and values are not standard. + * An implementation must ignore entries that are not recognized. + * @param extensions + * @see #addExtension + * @since 2.0 + */ + void setExtensions (Map extensions); + + /** + * Returns the <code>FetchPlan</code> used by this + * <code>Query</code>. Mutations of the returned object will not + * cause this query's owning <code>PersistenceManager</code>'s + * <code>FetchPlan</code> to be mutated. + * @since 2.0 + */ + FetchPlan getFetchPlan (); + + /** + * Deletes all the instances of the candidate class that pass the + * filter. + * @since 2.0 + */ + Object deletePersistentAll (Object[] parameters); + + /** + * Deletes all the instances of the candidate class that pass the + * filter. + * @since 2.0 + */ + Object deletePersistentAll (Map parameters); + + /** + * Deletes all the instances of the candidate class that pass the + * filter. + * @since 2.0 + */ + Object deletePersistentAll (); +} + Added: incubator/jdo/trunk/api20/src/java/javax/jdo/Transaction.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/api20/src/java/javax/jdo/Transaction.java?view=auto&rev=159273 ============================================================================== --- incubator/jdo/trunk/api20/src/java/javax/jdo/Transaction.java (added) +++ incubator/jdo/trunk/api20/src/java/javax/jdo/Transaction.java Mon Mar 28 10:25:05 2005 @@ -0,0 +1,190 @@ +/* + * Copyright 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. + * 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. + */ + +/* + * Transaction.java + * + */ + +package javax.jdo; +import javax.transaction.Synchronization; + +/** The JDO <code>Transaction</code> interface provides for initiation and completion + * of transactions under user control. + * It is a sub-interface of the [EMAIL PROTECTED] PersistenceManager} + * that deals with options and transaction demarcation. + * <P>Transaction options include whether optimistic concurrency + * control should be used for the current transaction, whether instances + * may hold values in the cache outside transactions, and whether + * values should be retained in the cache after transaction completion. These + * options are valid for both managed and non-managed transactions. + * + * <P>Transaction initiation and completion methods have similar semantics to + * <code>javax.transaction.UserTransaction</code> when used outside a managed + * environment. When used in a managed environment, transaction initiation + * and completion methods may only be used with bean-managed transaction semantics. + * @version 2.0 + */ + +public interface Transaction +{ + /** Begin a transaction. The type of transaction is determined by the + * setting of the Optimistic flag. + * @see #setOptimistic + * @see #getOptimistic + * @throws JDOUserException if transactions are managed by a container + * in the managed environment, or if the transaction is already active. + */ + void begin(); + + /** Commit the current transaction. + * @throws JDOUserException if transactions are managed by a container + * in the managed environment, or if the transaction is not active. + */ + void commit(); + + /** Roll back the current transaction. + * @throws JDOUserException if transactions are managed by a container + * in the managed environment, or if the transaction is not active. + */ + void rollback(); + + /** Returns whether there is a transaction currently active. + * @return <code>true</code> if the transaction is active. + */ + boolean isActive(); + + /** + * Returns the rollback-only status of the transaction. When + * begun, the rollback-only status is false. Either the + * application or the JDO implementation may set this flag + * using setRollbackOnly. + * @return <code>true</code> if the transaction has been + * marked for rollback. + * @since 2.0 + */ + boolean getRollbackOnly(); + + /** + * Sets the rollback-only status of the transaction to <code>true</code>. + * After this flag is set to <code>true</code>, the transaction + * can no longer be committed, and any attempt to commit the + * transaction will throw <code>JDOUserException<code>. + * @since 2.0 + */ + void setRollbackOnly(); + + /** If <code>true</code>, allow persistent instances to be read without + * a transaction active. + * If an implementation does not support this option, a + * <code>JDOUnsupportedOptionException</code> is thrown. + * @param nontransactionalRead the value of the nontransactionalRead property + */ + void setNontransactionalRead (boolean nontransactionalRead); + + /** If <code>true</code>, allows persistent instances to be read without + * a transaction active. + * @return the value of the nontransactionalRead property + */ + boolean getNontransactionalRead (); + + /** If <code>true</code>, allow persistent instances to be written without + * a transaction active. + * If an implementation does not support this option, a + * <code>JDOUnsupportedOptionException</code> is thrown. + * @param nontransactionalWrite the value of the nontransactionalRead property + */ + void setNontransactionalWrite (boolean nontransactionalWrite); + + /** If <code>true</code>, allows persistent instances to be written without + * a transaction active. + * @return the value of the nontransactionalWrite property + */ + boolean getNontransactionalWrite (); + + /** If <code>true</code>, at commit instances retain their values and the instances + * transition to persistent-nontransactional. + * If an implementation does not support this option, a + * <code>JDOUnsupportedOptionException</code> is thrown. + * @param retainValues the value of the retainValues property + */ + void setRetainValues(boolean retainValues); + + /** If <code>true</code>, at commit time instances retain their field values. + * @return the value of the retainValues property + */ + boolean getRetainValues(); + + /** If <code>true</code>, at rollback, fields of newly persistent instances + * are restored to + * their values as of the beginning of the transaction, and the instances + * revert to transient. Additionally, fields of modified + * instances of primitive types and immutable reference types + * are restored to their values as of the beginning of the + * transaction. + * <P>If <code>false</code>, at rollback, the values of fields of + * newly persistent instances are unchanged and the instances revert to + * transient. Additionally, dirty instances transition to hollow. + * If an implementation does not support this option, a + * <code>JDOUnsupportedOptionException</code> is thrown. + * @param restoreValues the value of the restoreValues property + */ + void setRestoreValues(boolean restoreValues); + + /** Return the current value of the restoreValues property. + * @return the value of the restoreValues property + */ + boolean getRestoreValues(); + + /** Optimistic transactions do not hold data store locks until commit time. + * If an implementation does not support this option, a + * <code>JDOUnsupportedOptionException</code> is thrown. + * @param optimistic the value of the Optimistic flag. + */ + void setOptimistic(boolean optimistic); + + /** Optimistic transactions do not hold data store locks until commit time. + * @return the value of the Optimistic property. + */ + boolean getOptimistic(); + + /** The user can specify a <code>Synchronization</code> instance to be notified on + * transaction completions. The <code>beforeCompletion</code> method is called prior + * to flushing instances to the data store. + * + * <P>The <code>afterCompletion</code> method is called after performing state + * transitions of persistent and transactional instances, following + * the data store commit or rollback operation. + * <P>Only one <code>Synchronization</code> instance can be registered with the + * <code>Transaction</code>. If the application requires more than one instance to + * receive synchronization callbacks, then the single application instance + * is responsible for managing them, and forwarding callbacks to them. + * @param sync the <code>Synchronization</code> instance to be notified; <code>null</code> for none + */ + void setSynchronization(Synchronization sync); + + /** The user-specified <code>Synchronization</code> instance for this <code>Transaction</code> instance. + * @return the user-specified <code>Synchronization</code> instance. + */ + Synchronization getSynchronization(); + + /** The <code>Transaction</code> instance is always associated with exactly one + * <code>PersistenceManager</code>. + * + * @return the <code>PersistenceManager</code> for this <code>Transaction</code> instance + */ + PersistenceManager getPersistenceManager(); +}