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 th...@apache.org on 2003/12/05 23:45:40 UTC
cvs commit: db-ojb/src/jdori/org/apache/ojb/jdori/sql OjbStorePMF.java OjbExtent.java OjbFieldManager.java OjbStoreManager.java
thma 2003/12/05 14:45:40
Modified: src/jdori/org/apache/ojb/jdori/sql OjbStorePMF.java
OjbExtent.java OjbFieldManager.java
OjbStoreManager.java
Log:
Fixed the Problem of missing StateManagers in Extent based queries.
Thanks to Gus for investigation and putting some pressure on me.
Revision Changes Path
1.3 +6 -0 db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbStorePMF.java
Index: OjbStorePMF.java
===================================================================
RCS file: /home/cvs/db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbStorePMF.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- OjbStorePMF.java 9 Jun 2003 16:12:25 -0000 1.2
+++ OjbStorePMF.java 5 Dec 2003 22:45:40 -0000 1.3
@@ -77,7 +77,13 @@
private final HashMap storeManagers = new HashMap();
private static HashMap trackedClassesMap = getTrackedClasses();
+
+ private static final OjbStorePMF INSTANCE = new OjbStorePMF();
+ public static OjbStorePMF getInstance()
+ {
+ return INSTANCE;
+ }
/**
* Constructor for PMF.
1.2 +61 -11 db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbExtent.java
Index: OjbExtent.java
===================================================================
RCS file: /home/cvs/db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbExtent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- OjbExtent.java 24 Dec 2002 12:06:01 -0000 1.1
+++ OjbExtent.java 5 Dec 2003 22:45:40 -0000 1.2
@@ -53,37 +53,52 @@
* <http://www.apache.org/>.
*/
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Iterator;
import javax.jdo.PersistenceManager;
+import javax.jdo.spi.PersistenceCapable;
+import org.apache.ojb.broker.Identity;
import org.apache.ojb.broker.PersistenceBroker;
-import org.apache.ojb.broker.accesslayer.RsIterator;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.Query;
import org.apache.ojb.broker.query.QueryFactory;
+import com.sun.jdori.FieldManager;
+import com.sun.jdori.PersistenceManagerInternal;
+import com.sun.jdori.StateManagerInternal;
+import com.sun.jdori.model.jdo.JDOClass;
+
/**
* @see javax.jdo.Extent
* @author Thomas Mahler
*/
public class OjbExtent implements javax.jdo.Extent
{
- private RsIterator iterator;
+ private Collection extentCollection;
private Class clazz;
private PersistenceBroker broker;
+ private PersistenceManagerInternal pmi;
/**
* Constructor for OjbExtent.
*/
- public OjbExtent(Class pClazz, PersistenceBroker pBroker)
+ public OjbExtent(Class pClazz, PersistenceBroker pBroker, PersistenceManagerInternal pPmi)
{
- clazz = pClazz;
+ clazz = pClazz;
+ broker = pBroker;
+ pmi = pPmi;
Criteria selectExtent = null;
Query q = QueryFactory.newQuery(clazz, selectExtent);
- broker = pBroker;
- iterator = (RsIterator) broker.getIteratorByQuery(q);
+
+ // the PB loads plain java objects
+ Collection pojoInstances = broker.getCollectionByQuery(q);
+ // To bring these instances under JDO management,
+ // each instance must be provided with its own StateManager
+ extentCollection = provideStateManagers(pojoInstances);
}
/**
@@ -91,7 +106,7 @@
*/
public Iterator iterator()
{
- return iterator;
+ return extentCollection.iterator();
}
/**
@@ -116,7 +131,7 @@
*/
public PersistenceManager getPersistenceManager()
{
- return null;
+ return pmi.getCurrentWrapper();
}
/**
@@ -124,15 +139,50 @@
*/
public void closeAll()
{
- iterator.releaseDbResources();
+ // noop
}
/**
* @see javax.jdo.Extent#close(Iterator)
*/
- public void close(Iterator it)
+ public void close(Iterator pIterator)
{
- iterator.releaseDbResources();
+ // noop
}
+
+ /**
+ * This methods enhances the objects loaded by a broker query
+ * with a JDO StateManager an brings them under JDO control.
+ * @param pojos the OJB pojos as obtained by the broker
+ * @return the collection of JDO PersistenceCapable instances
+ */
+ protected Collection provideStateManagers(Collection pojos)
+ {
+ PersistenceCapable pc;
+ int [] fieldNums;
+ Iterator iter = pojos.iterator();
+ Collection result = new ArrayList();
+
+ while (iter.hasNext())
+ {
+ // obtain a StateManager
+ pc = (PersistenceCapable) iter.next();
+ Identity oid = new Identity(pc, broker);
+ StateManagerInternal smi = pmi.getStateManager(oid, pc.getClass());
+
+ // fetch attributes into StateManager
+ JDOClass jdoClass = Helper.getJDOClass(pc.getClass());
+ fieldNums = jdoClass.getManagedFieldNumbers();
+
+ FieldManager fm = new OjbFieldManager(pc, broker);
+ smi.replaceFields(fieldNums, fm);
+ smi.retrieve();
+
+ // get JDO PersistencecCapable instance from SM and add it to result collection
+ Object instance = smi.getObject();
+ result.add(instance);
+ }
+ return result;
+ }
}
1.5 +3 -27 db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbFieldManager.java
Index: OjbFieldManager.java
===================================================================
RCS file: /home/cvs/db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbFieldManager.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- OjbFieldManager.java 1 Dec 2003 21:31:21 -0000 1.4
+++ OjbFieldManager.java 5 Dec 2003 22:45:40 -0000 1.5
@@ -53,7 +53,6 @@
* <http://www.apache.org/>.
*/
-import javax.jdo.JDOFatalInternalException;
import javax.jdo.spi.PersistenceCapable;
import org.apache.ojb.broker.PersistenceBroker;
@@ -61,13 +60,8 @@
import org.apache.ojb.broker.metadata.ClassDescriptor;
import com.sun.jdori.FieldManager;
-import com.sun.jdori.common.model.jdo.JDOModelFactoryImpl;
-import com.sun.jdori.common.model.runtime.RuntimeJavaModelFactory;
-import com.sun.jdori.model.java.JavaModel;
-import com.sun.jdori.model.java.JavaModelFactory;
import com.sun.jdori.model.jdo.JDOClass;
import com.sun.jdori.model.jdo.JDOField;
-import com.sun.jdori.model.jdo.JDOModel;
/**
* @author Thomas Mahler
@@ -282,27 +276,9 @@
this.pc = pc;
}
- JDOClass getJDOClass(Class c)
- {
- JDOClass rc = null;
- try
- {
- ClassLoader cl = c.getClassLoader();
- JavaModelFactory javaModelFactory = RuntimeJavaModelFactory.getInstance();
- JavaModel javaModel = javaModelFactory.getJavaModel(c.getClassLoader());
- JDOModel m = JDOModelFactoryImpl.getInstance().getJDOModel(javaModel);
- rc = m.getJDOClass(c.getName());
- }
- catch (RuntimeException ex)
- {
- throw new JDOFatalInternalException("Not a JDO class: " + c.getName());
- }
- return rc;
- }
-
String getAttributeName(int fieldNum)
{
- JDOClass jdoClass = getJDOClass(pc.getClass());
+ JDOClass jdoClass = Helper.getJDOClass(pc.getClass());
JDOField jdoField = jdoClass.getField(fieldNum);
String attributeName = jdoField.getName();
return attributeName;
@@ -317,9 +293,9 @@
String attributeName = getAttributeName(fieldNum);
ClassDescriptor cld = broker.getClassDescriptor(pc.getClass());
- // field could a primitive typed attribute...
+ // field could be a primitive typed attribute...
AttributeDescriptorBase fld = cld.getFieldDescriptorByName(attributeName);
- // field could a reference attribute...
+ // field could be a reference attribute...
if (fld == null)
{
fld = cld.getObjectReferenceDescriptorByName(attributeName);
1.6 +5 -50 db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbStoreManager.java
Index: OjbStoreManager.java
===================================================================
RCS file: /home/cvs/db-ojb/src/jdori/org/apache/ojb/jdori/sql/OjbStoreManager.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- OjbStoreManager.java 1 Dec 2003 21:31:21 -0000 1.5
+++ OjbStoreManager.java 5 Dec 2003 22:45:40 -0000 1.6
@@ -53,7 +53,6 @@
* <http://www.apache.org/>.
*/
-import java.lang.reflect.Field;
import java.util.BitSet;
import java.util.Iterator;
@@ -73,13 +72,8 @@
import com.sun.jdori.PersistenceManagerInternal;
import com.sun.jdori.StateManagerInternal;
import com.sun.jdori.StoreManager;
-import com.sun.jdori.common.model.jdo.JDOModelFactoryImpl;
-import com.sun.jdori.common.model.runtime.RuntimeJavaModelFactory;
import com.sun.jdori.common.query.BasicQueryResult;
-import com.sun.jdori.model.java.JavaModel;
-import com.sun.jdori.model.java.JavaModelFactory;
import com.sun.jdori.model.jdo.JDOClass;
-import com.sun.jdori.model.jdo.JDOModel;
import com.sun.jdori.query.QueryResult;
import com.sun.jdori.query.QueryResultHelper;
@@ -224,10 +218,10 @@
{
oid = new Identity(instance,broker);
}
- broker. removeFromCache(instance);
+ broker.removeFromCache(instance);
PersistenceCapable pc = (PersistenceCapable) broker.getObjectByIdentity(oid);
- JDOClass jdoClass = this.getJDOClass(pc.getClass());
+ JDOClass jdoClass = Helper.getJDOClass(pc.getClass());
if (fieldNums == null)
{
fieldNums = jdoClass.getManagedFieldNumbers();
@@ -245,24 +239,6 @@
}
}
- JDOClass getJDOClass(Class c)
- {
- JDOClass rc = null;
- try
- {
- ClassLoader cl = c.getClassLoader();
- JavaModelFactory javaModelFactory = RuntimeJavaModelFactory.getInstance();
- JavaModel javaModel = javaModelFactory.getJavaModel(c.getClassLoader());
- JDOModel m = JDOModelFactoryImpl.getInstance().getJDOModel(javaModel);
- rc = m.getJDOClass(c.getName());
- }
- catch (RuntimeException ex)
- {
- throw new JDOFatalInternalException("Not a JDO class: " + c.getName());
- }
- return rc;
- }
-
/**
* @see com.sun.jdori.StoreManager#getExtent
*/
@@ -272,7 +248,7 @@
PersistenceManagerInternal pm)
{
PersistenceBroker broker = connector.getBroker();
- return new OjbExtent(pcClass, broker);
+ return new OjbExtent(pcClass, broker, pm);
}
/**
@@ -361,7 +337,7 @@
while (it.hasNext())
{
StateManagerInternal sm = (StateManagerInternal) it.next();
- logger.debug("OjbStoreManager.flush: " + sm.getInternalObjectId() + ", " + getLCState(sm));
+ logger.debug("OjbStoreManager.flush: " + sm.getInternalObjectId() + ", " + Helper.getLCState(sm));
sm.preStore();
sm.replaceSCOFields();
sm.flush(this);
@@ -380,28 +356,7 @@
}
}
- /**
- * @return the LifeCycleState of a StateManager instance
- */
- protected Object getLCState(StateManagerInternal sm)
- {
- // unfortunately the LifeCycleState classes ar package private.
- // so we have to do some dirty reflection hack to access them
- try
- {
- Field myLC = sm.getClass().getDeclaredField("myLC");
- myLC.setAccessible(true);
- return myLC.get(sm);
- }
- catch (NoSuchFieldException e)
- {
- return e;
- }
- catch (IllegalAccessException e)
- {
- return e;
- }
- }
+
/**
* @see com.sun.jdori.StoreManager#newObjectIdInstance
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org