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 br...@apache.org on 2004/08/24 04:18:38 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/dirty OptimisticTransactionTest.java AllTests.java DirtyBrokerTest.java UnitTest.java
brianm 2004/08/23 19:18:38
Modified: src/java/org/apache/ojb/dirty BrokerStateMonitor.java
DirtyBrokerFactory.java DirtyPersistenceBroker.java
ObjectRegistrationListener.java
UnitFlushListener.java
src/test/org/apache/ojb/dirty AllTests.java
DirtyBrokerTest.java UnitTest.java
Added: src/java/org/apache/ojb/dirty/grafolia
OJBTrackerFactory.java
src/java/org/apache/ojb/dirty/ops Change.java
ChangeList.java Delete.java Insert.java Update.java
src/java/org/apache/ojb/dirty DelegatingDirtyBroker.java
ObjectStateChangeListener.java
ObjectTransaction.java UnitObjectTransaction.java
src/test/org/apache/ojb/dirty OptimisticTransactionTest.java
Removed: src/java/org/apache/ojb/dirty Change.java ChangeList.java
Insert.java UnitAdaptor.java Update.java
Log:
* Lots of refactoring on the dirty broker classes.
* Started adding support for explicit optimistic transactions
* Using OJB specific facades in front of the Grafolia libraries (ObjectTransaction in front of Unit)
* Starting to implement OJB specific factories for Grafolia unit
Revision Changes Path
1.1 db-ojb/src/java/org/apache/ojb/dirty/grafolia/OJBTrackerFactory.java
Index: OJBTrackerFactory.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty.grafolia;
import org.apache.commons.grafolia.TrackerFactory;
import org.apache.commons.grafolia.StateTracker;
import org.apache.commons.grafolia.State;
import org.apache.commons.grafolia.managed.ManagedTrackerFactory;
public class OJBTrackerFactory implements TrackerFactory
{
private final TrackerFactory delegate;
public OJBTrackerFactory()
{
delegate = new ManagedTrackerFactory();
}
public StateTracker build(final Object instance, final State initial)
{
return delegate.build(instance, initial);
}
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/ops/Change.java
Index: Change.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty.ops;
import org.apache.ojb.broker.PersistenceBroker;
public interface Change
{
Object getObject();
void execute(PersistenceBroker broker);
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/ops/ChangeList.java
Index: ChangeList.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty.ops;
import org.apache.commons.grafolia.analysis.GraphAnalysis;
import org.apache.commons.grafolia.analysis.ObjectInfo;
import org.apache.commons.graph.domain.dependency.DependencyGraph;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.util.IdentityMapFactory;
import org.apache.ojb.dirty.ops.Change;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
import java.util.Collections;
public class ChangeList
{
private final ArrayList changes = new ArrayList();
public void add(Change change)
{
this.changes.add(change);
}
public void clear()
{
changes.clear();
}
public void execute(final PersistenceBroker broker, final GraphAnalysis analysis)
{
final List my_changes = this.sort(analysis, changes);
for (int i = 0; i < my_changes.size(); i++)
{
final Change change = (Change) my_changes.get(i);
change.execute(broker);
}
}
/**
* @todo This is UGLY UGLY UGLY
*/
private List sort(final GraphAnalysis analysis, final ArrayList changes)
{
final Map objectToDeps = IdentityMapFactory.getIdentityMap();
final Map objectToChange = IdentityMapFactory.getIdentityMap();
for (int i = 0; i < changes.size(); i++)
{
final Change change = (Change) changes.get(i);
final Object object = change.getObject();
final ObjectInfo info = analysis.getObjectInfo(object);
final HashSet deps = new HashSet();
objectToDeps.put(object, deps);
deps.addAll(info.getReferringObjects());
objectToChange.put(object, change);
final Collection refsViaCollection = getCollectionRefs(analysis, info);
for (Iterator iterator = refsViaCollection.iterator(); iterator.hasNext();)
{
final Object o = iterator.next();
final Set innerDeps = (Set) (objectToDeps.containsKey(o)
? objectToDeps.get(o)
: new HashSet());
objectToDeps.put(o, innerDeps);
innerDeps.add(object);
}
}
final DependencyGraph graph = new DependencyGraph();
for (Iterator iterator = objectToDeps.entrySet().iterator(); iterator.hasNext();)
{
final Map.Entry entry = (Map.Entry) iterator.next();
final Object obj = entry.getKey();
final Set odeps = (Set) entry.getValue();
final HashSet cdeps = new HashSet();
for (Iterator iterator1 = odeps.iterator(); iterator1.hasNext();)
{
final Object o = iterator1.next();
final Change c = (Change) objectToChange.get(o);
cdeps.add(c);
}
graph.addDependencies(objectToChange.get(obj), cdeps);
}
final List deps = graph.getSortedDependencies();
final ArrayList sortedChanges = new ArrayList(deps.size());
for (int i = 0; i < deps.size(); i++)
{
final Object val = deps.get(i);
if (val == null) continue;
if (val instanceof Collection) continue;
if ((! (val instanceof Change)) && objectToChange.get(val) == null) continue;
sortedChanges.add(( val instanceof Change
? val
: objectToChange.get(val)));
}
Collections.reverse(sortedChanges);
return sortedChanges;
}
private static Collection getCollectionRefs(final GraphAnalysis analysis, final ObjectInfo info)
{
final HashSet objects = new HashSet();
for (Iterator iterator = info.getReferringCollections().iterator(); iterator.hasNext();)
{
final Collection collection = (Collection) iterator.next();
final ObjectInfo collection_info = analysis.getObjectInfo(collection);
objects.addAll(collection_info.getReferringObjects());
}
return objects;
}
// public static class TopologicalComparator
// {
// public static final int BEFORE = -1;
// public static final int AFTER = 1;
// public static final int EQUAL = 0;
// public static final int NO_COMPARISON = Integer.MAX_VALUE;
//
// private final GraphAnalysis analysis;
//
// public TopologicalComparator(final GraphAnalysis analysis)
// {
// this.analysis = analysis;
// }
//
// /**
// * @return one of the constants on defined in
// * {@link org.apache.ojb.dirty.ops.ChangeList.TopologicalComparator}
// */
// public int compare(final Change changeOne, final Change changeTwo)
// {
// final Object object_one = changeOne.getObject();
// final Object object_two = changeTwo.getObject();
// final ObjectInfo info_one = analysis.getObjectInfo(object_one);
// final ObjectInfo info_two = analysis.getObjectInfo(object_two);
//
// final Collection object_refs_via_collections_one = getCollectionRefs(analysis, info_one);
// final Collection object_refs_via_collection_two = getCollectionRefs(analysis, info_one);
//
// if (object_refs_via_collections_one.contains(object_two))
// {
// if (info_one.getReferringObjects().contains(object_two))
// {
// throw new IllegalStateException("Unresolvable FK Dependencies");
// }
// return AFTER;
// }
// if (object_refs_via_collection_two.contains(object_one))
// {
// if (info_two.getReferringObjects().contains(object_one))
// {
// throw new IllegalStateException("Unresolvable FK Dependencies");
// }
// return BEFORE;
// }
//
// if (info_one.getReferringObjects().contains(object_two)) return BEFORE;
// if (info_two.getReferringObjects().contains(object_one)) return AFTER;
//
// return NO_COMPARISON;
// }
// }
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/ops/Delete.java
Index: Delete.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty.ops;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.dirty.ops.Change;
public class Delete implements Change
{
private final Object deleted;
public Delete(final Object updated)
{
this.deleted = updated;
}
public Object getObject()
{
return deleted;
}
public String toString()
{
return "delete: " + deleted;
}
public void execute(final PersistenceBroker broker)
{
broker.store(deleted);
}
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/ops/Insert.java
Index: Insert.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty.ops;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.dirty.ops.Change;
public class Insert implements Change
{
private final Object inserted;
public Insert(final Object inserted)
{
this.inserted = inserted;
}
public Object getObject()
{
return inserted;
}
public void execute(final PersistenceBroker broker)
{
broker.store(inserted);
}
public String toString()
{
return "insert: " + inserted;
}
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/ops/Update.java
Index: Update.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty.ops;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.dirty.ops.Change;
public class Update implements Change
{
private final Object updated;
public Update(final Object updated)
{
this.updated = updated;
}
public Object getObject()
{
return updated;
}
public void execute(final PersistenceBroker broker)
{
broker.store(updated);
}
public String toString()
{
return "update: " + updated;
}
}
1.2 +16 -16 db-ojb/src/java/org/apache/ojb/dirty/BrokerStateMonitor.java
Index: BrokerStateMonitor.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/dirty/BrokerStateMonitor.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- BrokerStateMonitor.java 9 Aug 2004 23:38:31 -0000 1.1
+++ BrokerStateMonitor.java 24 Aug 2004 02:18:37 -0000 1.2
@@ -19,47 +19,47 @@
public class BrokerStateMonitor implements PBStateListener
{
- private final UnitAdaptor adaptor;
+ private final ObjectTransaction tx;
- BrokerStateMonitor(final UnitAdaptor adaptor)
+ BrokerStateMonitor(final ObjectTransaction tx)
{
- this.adaptor = adaptor;
+ this.tx = tx;
}
- public void afterOpen(PBStateEvent event)
+ public void afterOpen(final PBStateEvent event)
{
}
- public void beforeBegin(PBStateEvent event)
+ public void beforeBegin(final PBStateEvent event)
{
}
- public void afterBegin(PBStateEvent event)
+ public void afterBegin(final PBStateEvent event)
{
- adaptor.begin();
+ if (!tx.isOptimistic()) tx.begin();
}
- public void beforeCommit(PBStateEvent event)
+ public void beforeCommit(final PBStateEvent event)
{
- if (!adaptor.isTransactionInProgress()) return;
- adaptor.commit();
+ if (!tx.isOpen() || tx.isOptimistic() ) return;
+ tx.commit();
}
- public void afterCommit(PBStateEvent event)
+ public void afterCommit(final PBStateEvent event)
{
}
- public void beforeRollback(PBStateEvent event)
+ public void beforeRollback(final PBStateEvent event)
{
- if (!adaptor.isTransactionInProgress()) return;
- adaptor.rollback();
+ if (!tx.isOpen()) return;
+ tx.rollback();
}
- public void afterRollback(PBStateEvent event)
+ public void afterRollback(final PBStateEvent event)
{
}
- public void beforeClose(PBStateEvent event)
+ public void beforeClose(final PBStateEvent event)
{
}
}
1.3 +47 -70 db-ojb/src/java/org/apache/ojb/dirty/DirtyBrokerFactory.java
Index: DirtyBrokerFactory.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/dirty/DirtyBrokerFactory.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DirtyBrokerFactory.java 14 Aug 2004 20:10:07 -0000 1.2
+++ DirtyBrokerFactory.java 24 Aug 2004 02:18:37 -0000 1.3
@@ -14,32 +14,60 @@
*/
package org.apache.ojb.dirty;
+import org.apache.commons.grafolia.AttachementFactory;
import org.apache.commons.grafolia.DefaultUnit;
+import org.apache.commons.grafolia.FieldAccessor;
+import org.apache.commons.grafolia.IdentityFactory;
+import org.apache.commons.grafolia.TrackerFactory;
+import org.apache.commons.grafolia.Unit;
+import org.apache.commons.grafolia.access.DirectFieldAccessor;
+import org.apache.commons.grafolia.detach.JDOStyleAttachmentFactory;
+import org.apache.commons.grafolia.identity.ObjectIdentityFactory;
import org.apache.ojb.broker.OJB;
import org.apache.ojb.broker.PBKey;
import org.apache.ojb.broker.PersistenceBroker;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
+import org.apache.ojb.dirty.grafolia.OJBTrackerFactory;
public class DirtyBrokerFactory
{
private final PBKey key;
private final OJB ojb;
+ private final TrackerFactory trackerFactory;
+ private final AttachementFactory attachementFactory;
+ private final IdentityFactory identityFactory;
+ private final FieldAccessor fieldAccessor;
public DirtyBrokerFactory()
{
ojb = new OJB();
- PersistenceBroker pb = ojb.lookupBroker();
- key = pb.getPBKey();
- pb.close();
+ PersistenceBroker broker = null;
+ try
+ {
+ broker = ojb.lookupBroker();
+ key = broker.getPBKey();
+ }
+ finally
+ {
+ if (broker != null) broker.close();
+ }
+ trackerFactory = new OJBTrackerFactory();
+ identityFactory = new ObjectIdentityFactory();
+ fieldAccessor = new DirectFieldAccessor();
+ attachementFactory = new JDOStyleAttachmentFactory(identityFactory,
+ fieldAccessor,
+ trackerFactory);
}
public DirtyBrokerFactory(final PBKey key)
{
ojb = new OJB();
this.key = key;
+ trackerFactory = new OJBTrackerFactory();
+ identityFactory = new ObjectIdentityFactory();
+ fieldAccessor = new DirectFieldAccessor();
+ attachementFactory = new JDOStyleAttachmentFactory(identityFactory,
+ fieldAccessor,
+ trackerFactory);
}
public DirtyBrokerFactory(final String db, final String login, final String pass)
@@ -50,6 +78,12 @@
{
broker = ojb.lookupBroker(db, login, pass);
key = broker.getPBKey();
+ trackerFactory = new OJBTrackerFactory();
+ identityFactory = new ObjectIdentityFactory();
+ fieldAccessor = new DirectFieldAccessor();
+ attachementFactory = new JDOStyleAttachmentFactory(identityFactory,
+ fieldAccessor,
+ trackerFactory);
}
finally
{
@@ -60,70 +94,13 @@
public DirtyPersistenceBroker getBroker()
{
final PersistenceBroker broker = ojb.lookupBroker(key);
- final UnitAdaptor adaptor = new UnitAdaptor(broker, new DefaultUnit());
- broker.addListener(new ObjectRegistrationListener(adaptor));
- broker.addListener(new BrokerStateMonitor(adaptor));
- Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(),
- new Class[]{DirtyPersistenceBroker.class},
- new MyInvocationHandler(broker, adaptor));
- return (DirtyPersistenceBroker) proxy;
- }
-
- private static class MyInvocationHandler implements InvocationHandler
- {
- private final PersistenceBroker broker;
- private final UnitAdaptor unit;
+ final Unit unit = new DefaultUnit(trackerFactory, identityFactory, attachementFactory);
- public MyInvocationHandler(final PersistenceBroker broker, final UnitAdaptor unit)
- {
- this.broker = broker;
- this.unit = unit;
- }
+ final ObjectTransaction tx = new UnitObjectTransaction(broker, unit);
+ broker.addListener(new BrokerStateMonitor(tx));
+ broker.addListener(new ObjectRegistrationListener(tx));
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
- {
- if (method.getDeclaringClass().equals(DirtyPersistenceBroker.class))
- {
- return unit.getUnit();
- }
- else
- {
- return method.invoke(broker, args);
- }
- }
+ final DelegatingDirtyBroker db = new DelegatingDirtyBroker(tx, broker);
+ return db;
}
-// private final PBKey key;
-//
-// public DirtyBrokerFactory()
-// {
-// this(PersistenceBrokerFactory.getDefaultKey());
-// }
-//
-// public DirtyBrokerFactory(final PBKey key)
-// {
-// this.key = key;
-// }
-//
-// public DirtyBrokerFactory(final String db, final String login, final String pass)
-// {
-// PersistenceBroker broker = null;
-// try
-// {
-// broker = PersistenceBrokerFactory.createPersistenceBroker(db, login, pass);
-// key = broker.getPBKey();
-// }
-// finally
-// {
-// if (broker != null) broker.close();
-// }
-// }
-//
-// public PersistenceBroker getBroker()
-// {
-// final PersistenceBroker broker = PersistenceBrokerFactory.createPersistenceBroker(key);
-// final UnitAdaptor adaptor = new UnitAdaptor(broker, new DefaultUnit());
-// broker.addListener(new ObjectRegistrationListener(adaptor));
-// broker.addListener(new BrokerStateMonitor(adaptor));
-// return broker;
-// }
}
1.2 +1 -1 db-ojb/src/java/org/apache/ojb/dirty/DirtyPersistenceBroker.java
Index: DirtyPersistenceBroker.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/dirty/DirtyPersistenceBroker.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DirtyPersistenceBroker.java 14 Aug 2004 20:10:07 -0000 1.1
+++ DirtyPersistenceBroker.java 24 Aug 2004 02:18:37 -0000 1.2
@@ -19,5 +19,5 @@
public interface DirtyPersistenceBroker extends PersistenceBroker
{
- public Unit getUnit();
+ public ObjectTransaction getObjectTransaction();
}
1.4 +13 -13 db-ojb/src/java/org/apache/ojb/dirty/ObjectRegistrationListener.java
Index: ObjectRegistrationListener.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/dirty/ObjectRegistrationListener.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ObjectRegistrationListener.java 15 Aug 2004 13:13:09 -0000 1.3
+++ ObjectRegistrationListener.java 24 Aug 2004 02:18:37 -0000 1.4
@@ -14,46 +14,46 @@
*/
package org.apache.ojb.dirty;
-import org.apache.ojb.broker.PBLifeCycleListener;
import org.apache.ojb.broker.PBLifeCycleEvent;
+import org.apache.ojb.broker.PBLifeCycleListener;
import org.apache.ojb.broker.PersistenceBrokerException;
public class ObjectRegistrationListener implements PBLifeCycleListener
{
- private final UnitAdaptor adaptor;
+ private final ObjectTransaction tx;
- ObjectRegistrationListener(final UnitAdaptor adaptor)
+ ObjectRegistrationListener(final ObjectTransaction adaptor)
{
- this.adaptor = adaptor;
+ this.tx = adaptor;
}
- public void beforeInsert(PBLifeCycleEvent event) throws PersistenceBrokerException
+ public void afterLookup(final PBLifeCycleEvent event) throws PersistenceBrokerException
{
+ if (!tx.isOpen()) return;
+ tx.register(event.getTarget());
}
- public void afterInsert(PBLifeCycleEvent event) throws PersistenceBrokerException
+ public void beforeInsert(final PBLifeCycleEvent event) throws PersistenceBrokerException
{
}
- public void beforeUpdate(PBLifeCycleEvent event) throws PersistenceBrokerException
+ public void afterInsert(final PBLifeCycleEvent event) throws PersistenceBrokerException
{
}
- public void afterUpdate(PBLifeCycleEvent event) throws PersistenceBrokerException
+ public void beforeUpdate(final PBLifeCycleEvent event) throws PersistenceBrokerException
{
}
- public void beforeDelete(PBLifeCycleEvent event) throws PersistenceBrokerException
+ public void afterUpdate(final PBLifeCycleEvent event) throws PersistenceBrokerException
{
}
- public void afterDelete(PBLifeCycleEvent event) throws PersistenceBrokerException
+ public void beforeDelete(final PBLifeCycleEvent event) throws PersistenceBrokerException
{
}
- public void afterLookup(PBLifeCycleEvent event) throws PersistenceBrokerException
+ public void afterDelete(final PBLifeCycleEvent event) throws PersistenceBrokerException
{
- if (!adaptor.isTransactionInProgress()) return;
- adaptor.register(event.getTarget());
}
}
1.2 +14 -23 db-ojb/src/java/org/apache/ojb/dirty/UnitFlushListener.java
Index: UnitFlushListener.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/dirty/UnitFlushListener.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- UnitFlushListener.java 9 Aug 2004 23:38:31 -0000 1.1
+++ UnitFlushListener.java 24 Aug 2004 02:18:37 -0000 1.2
@@ -16,39 +16,30 @@
import org.apache.commons.grafolia.Unit;
import org.apache.commons.grafolia.analysis.GraphAnalysis;
-import org.apache.commons.grafolia.hooks.UpdateListener;
-import org.apache.commons.grafolia.hooks.InsertListener;
import org.apache.commons.grafolia.hooks.FlushListener;
+import org.apache.ojb.broker.PersistenceBroker;
+import org.apache.ojb.dirty.ops.ChangeList;
-import java.util.Collection;
-
-public class UnitFlushListener implements UpdateListener, InsertListener, FlushListener
+public class UnitFlushListener implements FlushListener
{
- private final UnitAdaptor adaptor;
-
- public UnitFlushListener(UnitAdaptor adaptor)
- {
- this.adaptor = adaptor;
- }
-
- public void onUpdate(Unit unit, Object dirty)
- {
- adaptor.update(dirty);
- }
-
+ private final ChangeList changes;
+ private final PersistenceBroker broker;
- public void onInsert(Unit unit, Object inserted)
+ public UnitFlushListener(final ChangeList changes,
+ final PersistenceBroker broker)
{
- if (! (inserted instanceof Collection)) adaptor.insert(inserted);
+ this.changes = changes;
+ this.broker = broker;
}
- public void OnFlushStart(Unit unit)
+ public void OnFlushStart(final Unit unit)
{
- // we don't care
+ // ignore
}
- public void onFlushFinish(Unit unit, GraphAnalysis analysis)
+ public void onFlushFinish(final Unit unit, final GraphAnalysis analysis)
{
- adaptor.flushed(analysis);
+ changes.execute(broker, analysis);
+ changes.clear();
}
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/DelegatingDirtyBroker.java
Index: DelegatingDirtyBroker.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.IdentityFactory;
import org.apache.ojb.broker.PersistenceBrokerEvent;
import org.apache.ojb.broker.PBLifeCycleEvent;
import org.apache.ojb.broker.PBStateEvent;
import org.apache.ojb.broker.PersistenceBrokerException;
import org.apache.ojb.broker.PBListener;
import org.apache.ojb.broker.TransactionNotInProgressException;
import org.apache.ojb.broker.TransactionInProgressException;
import org.apache.ojb.broker.TransactionAbortedException;
import org.apache.ojb.broker.PBKey;
import org.apache.ojb.broker.PersistenceConfiguration;
import org.apache.ojb.broker.MtoNImplementor;
import org.apache.ojb.broker.ManageableCollection;
import org.apache.ojb.broker.Identity;
import org.apache.ojb.broker.query.Query;
import org.apache.ojb.broker.metadata.DescriptorRepository;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.cache.ObjectCache;
import org.apache.ojb.broker.util.sequence.SequenceManager;
import org.apache.ojb.broker.util.BrokerHelper;
import org.apache.ojb.broker.util.ObjectModification;
import org.apache.ojb.broker.util.configuration.Configuration;
import org.apache.ojb.broker.util.configuration.ConfigurationException;
import org.apache.ojb.broker.accesslayer.StatementManagerIF;
import org.apache.ojb.broker.accesslayer.ConnectionManagerIF;
import org.apache.ojb.broker.accesslayer.JdbcAccess;
import org.apache.ojb.broker.accesslayer.OJBIterator;
import org.apache.ojb.broker.accesslayer.sql.SqlGenerator;
import org.apache.commons.grafolia.Unit;
import java.util.Collection;
import java.util.Enumeration;
public class DelegatingDirtyBroker implements DirtyPersistenceBroker
{
private final ObjectTransaction tx;
private final PersistenceBroker base;
public DelegatingDirtyBroker(final ObjectTransaction tx, final PersistenceBroker base)
{
this.tx = tx;
this.base = base;
}
public ObjectTransaction getObjectTransaction()
{
return tx;
}
public StatementManagerIF serviceStatementManager()
{
return base.serviceStatementManager();
}
public ConnectionManagerIF serviceConnectionManager()
{
return base.serviceConnectionManager();
}
public SqlGenerator serviceSqlGenerator()
{
return base.serviceSqlGenerator();
}
public JdbcAccess serviceJdbcAccess()
{
return base.serviceJdbcAccess();
}
public SequenceManager serviceSequenceManager()
{
return base.serviceSequenceManager();
}
public BrokerHelper serviceBrokerHelper()
{
return base.serviceBrokerHelper();
}
public ObjectCache serviceObjectCache()
{
return base.serviceObjectCache();
}
public IdentityFactory serviceIdentity()
{
return base.serviceIdentity();
}
public void fireBrokerEvent(final PersistenceBrokerEvent event)
{
base.fireBrokerEvent(event);
}
public void fireBrokerEvent(final PBLifeCycleEvent event)
{
base.fireBrokerEvent(event);
}
public void fireBrokerEvent(final PBStateEvent event)
{
base.fireBrokerEvent(event);
}
public void removeAllListeners() throws PersistenceBrokerException
{
base.removeAllListeners();
}
public void removeAllListeners(final boolean permanent) throws PersistenceBrokerException
{
base.removeAllListeners(permanent);
}
public void addListener(final PBListener listener) throws PersistenceBrokerException
{
base.addListener(listener);
}
public void addListener(final PBListener listener, final boolean permanent) throws PersistenceBrokerException
{
base.addListener(listener, permanent);
}
public void removeListener(final PBListener listener) throws PersistenceBrokerException
{
base.removeListener(listener);
}
public void abortTransaction() throws TransactionNotInProgressException
{
base.abortTransaction();
}
public void beginTransaction()
throws TransactionInProgressException, TransactionAbortedException
{
base.beginTransaction();
}
public void commitTransaction()
throws TransactionNotInProgressException, TransactionAbortedException
{
base.commitTransaction();
}
public boolean isInTransaction() throws PersistenceBrokerException
{
return base.isInTransaction();
}
public boolean close()
{
return base.close();
}
public boolean isClosed()
{
return base.isClosed();
}
public DescriptorRepository getDescriptorRepository()
{
return base.getDescriptorRepository();
}
public PBKey getPBKey()
{
return base.getPBKey();
}
public ClassDescriptor getClassDescriptor(Class clazz) throws PersistenceBrokerException
{
return base.getClassDescriptor(clazz);
}
public boolean hasClassDescriptor(Class clazz)
{
return base.hasClassDescriptor(clazz);
}
public Class getTopLevelClass(Class clazz) throws PersistenceBrokerException
{
return base.getTopLevelClass(clazz);
}
public PersistenceConfiguration getConfiguration()
{
return base.getConfiguration();
}
public void clearCache() throws PersistenceBrokerException
{
base.clearCache();
}
public void removeFromCache(Object objectOrIdentity) throws PersistenceBrokerException
{
base.removeFromCache(objectOrIdentity);
}
public void store(Object obj,
ObjectModification modification) throws PersistenceBrokerException
{
base.store(obj, modification);
}
public void store(Object obj) throws PersistenceBrokerException
{
base.store(obj);
}
public void delete(Object obj) throws PersistenceBrokerException
{
base.delete(obj);
}
public void deleteMtoNImplementor(MtoNImplementor m2nImpl) throws PersistenceBrokerException
{
base.deleteMtoNImplementor(m2nImpl);
}
public void addMtoNImplementor(MtoNImplementor m2nImpl) throws PersistenceBrokerException
{
base.addMtoNImplementor(m2nImpl);
}
public void deleteByQuery(Query query) throws PersistenceBrokerException
{
base.deleteByQuery(query);
}
public void retrieveAllReferences(Object pInstance) throws PersistenceBrokerException
{
base.retrieveAllReferences(pInstance);
}
public void retrieveReference(Object pInstance, String pAttributeName) throws PersistenceBrokerException
{
base.retrieveReference(pInstance, pAttributeName);
}
public int getCount(Query query) throws PersistenceBrokerException
{
return base.getCount(query);
}
public Collection getCollectionByQuery(Query query) throws PersistenceBrokerException
{
return base.getCollectionByQuery(query);
}
public ManageableCollection getCollectionByQuery(Class collectionClass, Query query)
throws PersistenceBrokerException
{
return base.getCollectionByQuery(collectionClass, query);
}
public OJBIterator getIteratorByQuery(Query query) throws PersistenceBrokerException
{
return base.getIteratorByQuery(query);
}
public OJBIterator getReportQueryIteratorByQuery(Query query) throws PersistenceBrokerException
{
return base.getReportQueryIteratorByQuery(query);
}
public Object getObjectByIdentity(Identity id) throws PersistenceBrokerException
{
return base.getObjectByIdentity(id);
}
public Object getObjectByQuery(Query query) throws PersistenceBrokerException
{
return base.getObjectByQuery(query);
}
public Enumeration getPKEnumerationByQuery(Class PrimaryKeyClass, Query query)
throws PersistenceBrokerException
{
return base.getPKEnumerationByQuery(PrimaryKeyClass, query);
}
public void configure(Configuration pConfig) throws ConfigurationException
{
base.configure(pConfig);
}
public org.odbms.Query query()
{
return base.query();
}
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/ObjectStateChangeListener.java
Index: ObjectStateChangeListener.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty;
import org.apache.commons.grafolia.Unit;
import org.apache.commons.grafolia.analysis.GraphAnalysis;
import org.apache.commons.grafolia.hooks.UpdateListener;
import org.apache.commons.grafolia.hooks.InsertListener;
import org.apache.commons.grafolia.hooks.FlushListener;
import org.apache.commons.grafolia.hooks.DeleteListener;
import org.apache.ojb.dirty.ops.ChangeList;
import org.apache.ojb.dirty.ops.Update;
import org.apache.ojb.dirty.ops.Insert;
import org.apache.ojb.dirty.ops.Delete;
import java.util.Collection;
public class ObjectStateChangeListener implements UpdateListener, InsertListener, DeleteListener
{
private final ChangeList changes;
public ObjectStateChangeListener(final ChangeList adaptor)
{
this.changes = adaptor;
}
public void onUpdate(final Unit unit, final Object dirty)
{
changes.add(new Update(dirty));
}
public void onInsert(final Unit unit, final Object inserted)
{
if (! (inserted instanceof Collection)) changes.add(new Insert(inserted));
}
public void onDelete(final Unit unit, final Object instance)
{
changes.add(new Delete(instance));
}
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/ObjectTransaction.java
Index: ObjectTransaction.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty;
import org.apache.commons.grafolia.State;
import java.util.Collection;
public interface ObjectTransaction
{
/**
* Register an object as PERSISTENT_CLEAN
*/
Object register(Object root);
/**
* Make a TRANSIENT instance PERSISTENT_NEW
*/
Object insert(Object beer);
/**
* Make a collection of TRANSIENT instances PERSISTENT_NEW
*/
Collection insert(Collection beers);
/**
* Make a PERSISTENT_* instance PERSISTENT_DELETED
*/
void delete(Object instance);
/**
* Begin an object level transaction
*/
void begin();
/**
* Flush all changes down to the datastore (still in context of
* a datastore transaction if one is in progress)
*/
void flush();
/**
* Flush changes and commit (will percolate to datastore)
*/
void commit();
/**
* Is a transaction in progress
*/
boolean isOpen();
/**
* Rollback object space changes
*/
void rollback();
/**
* Detach <code>objects</code> from the transaction. Any changes to
* these objects will be flushed to the persistence store before
* detach.
*/
Collection detach(Collection objects);
/**
* Re-attach a collection of detached objects. Objects which have changed,
* or are not already bound, will be registered as PERSISTENT_DIRTY
*/
Collection attach(Collection objects);
/**
* Detach a single instance
*/
Object detach(Object beer);
/**
* Attach a single instance
*/
Object attach(Object beer);
/**
* Obtain the present transactional state of <code>object</code>
*/
State getState(Object object);
/**
* Specify whether this should be an optimistic transaction
* <p>
* Note that all instances participating in an optimistic transaction
* will need to have a version column mapped, or the changes will
* be assumed to be valid (iow, last commit wins)
*/
void setOptimistic(boolean optimistic);
boolean isOptimistic();
}
1.1 db-ojb/src/java/org/apache/ojb/dirty/UnitObjectTransaction.java
Index: UnitObjectTransaction.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty;
import org.apache.commons.grafolia.State;
import org.apache.commons.grafolia.Unit;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.dirty.ops.ChangeList;
import java.util.Collection;
public class UnitObjectTransaction implements ObjectTransaction
{
private final Unit unit;
private final ChangeList changes;
private boolean optimistic = false;
private final PersistenceBroker broker;
public UnitObjectTransaction(final PersistenceBroker broker, final Unit unit)
{
this.broker = broker;
this.unit = unit;
this.changes = new ChangeList();
final ObjectStateChangeListener listener = new ObjectStateChangeListener(changes);
unit.addUpdateListener(listener);
unit.addDeleteListener(listener);
unit.addInsertListener(listener);
unit.addFlushListener(new UnitFlushListener(changes, broker));
}
public Object register(final Object root)
{
return unit.register(root);
}
public Object insert(final Object beer)
{
return unit.insert(beer);
}
public Collection insert(final Collection beers)
{
return unit.insert(beers);
}
public void delete(final Object instance)
{
unit.delete(instance);
}
public void begin()
{
unit.begin();
if (!optimistic) broker.beginTransaction();
}
public State getState(final Object object)
{
return unit.getState(object);
}
public void setOptimistic(final boolean optimistic)
{
this.optimistic = optimistic;
}
public boolean isOptimistic()
{
return optimistic;
}
public void flush()
{
unit.flush();
}
public void commit()
{
final boolean pb_tx = broker.isInTransaction();
if (optimistic && !pb_tx) broker.beginTransaction();
unit.commit();
if (optimistic && !pb_tx) broker.commitTransaction();
if (!optimistic) broker.commitTransaction();
}
public boolean isOpen()
{
return unit.isOpen();
}
public void rollback()
{
unit.rollback();
if (!optimistic) broker.abortTransaction();
}
public Collection detach(final Collection objects)
{
return unit.detach(objects);
}
public Collection attach(final Collection objects)
{
return unit.attach(objects);
}
public Object detach(final Object beer)
{
return unit.detach(beer);
}
public Object attach(final Object beer)
{
return unit.attach(beer);
}
}
1.2 +3 -1 db-ojb/src/test/org/apache/ojb/dirty/AllTests.java
Index: AllTests.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/dirty/AllTests.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AllTests.java 9 Aug 2004 23:38:32 -0000 1.1
+++ AllTests.java 24 Aug 2004 02:18:38 -0000 1.2
@@ -22,8 +22,10 @@
{
public static Test suite()
{
- TestSuite suite = new TestSuite("Dirty Tests");
+ final TestSuite suite = new TestSuite("Dirty Tests");
suite.addTest(new TestSuite(DirtyBrokerFactoryTest.class));
+ suite.addTest(new TestSuite(DirtyBrokerTest.class));
+ suite.addTest(new TestSuite(UnitTest.class));
return suite;
}
}
1.5 +4 -4 db-ojb/src/test/org/apache/ojb/dirty/DirtyBrokerTest.java
Index: DirtyBrokerTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/dirty/DirtyBrokerTest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DirtyBrokerTest.java 15 Aug 2004 13:13:08 -0000 1.4
+++ DirtyBrokerTest.java 24 Aug 2004 02:18:38 -0000 1.5
@@ -138,11 +138,11 @@
broker.beginTransaction();
person = (Person) broker.getObjectByIdentity(broker.serviceIdentity().buildIdentity(person));
- Address address = new Address("USA", "Wilmington", "Wombat Court");
+ final Address address = new Address("USA", "Wilmington", "Wombat Court");
// should be disabled to have valid test -- broker.store(address);
person.addOtherAddress("Store", address);
- Address mainAddress = new Address("USA", "Wilmington-Main", "Wombat Court");
+ final Address mainAddress = new Address("USA", "Wilmington-Main", "Wombat Court");
person.setMainAddress(mainAddress);
broker.commitTransaction();
@@ -150,10 +150,10 @@
broker.clearCache();
person = (Person) broker.getObjectByIdentity(broker.serviceIdentity().buildIdentity(person));
- Collection others = person.getOtherAddresses();
+ final Collection others = person.getOtherAddresses();
assertNotNull(others);
assertEquals(1, others.size());
- AddressDesc desc = (AddressDesc) others.iterator().next();
+ final AddressDesc desc = (AddressDesc) others.iterator().next();
assertNotNull(desc);
assertEquals(address.getCity(), desc.getAddress().getCity());
1.2 +40 -8 db-ojb/src/test/org/apache/ojb/dirty/UnitTest.java
Index: UnitTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/dirty/UnitTest.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- UnitTest.java 14 Aug 2004 20:10:08 -0000 1.1
+++ UnitTest.java 24 Aug 2004 02:18:38 -0000 1.2
@@ -29,9 +29,9 @@
public void setUp() throws Exception
{
- PersistenceBroker broker = factory.getBroker();
+ final PersistenceBroker broker = factory.getBroker();
broker.beginTransaction();
- Criteria all = null;
+ final Criteria all = null;
broker.deleteByQuery(QueryFactory.newQuery(AddressDesc.class, all));
broker.deleteByQuery(QueryFactory.newQuery(Person.class, all));
@@ -43,21 +43,21 @@
public void testGetUnit()
{
- DirtyPersistenceBroker broker = factory.getBroker();
+ final DirtyPersistenceBroker broker = factory.getBroker();
broker.beginTransaction();
- Unit unit = broker.getUnit();
+ final ObjectTransaction unit = broker.getObjectTransaction();
assertNotNull(unit);
broker.commitTransaction();
}
public void testLazyGraphInsert()
{
- DirtyPersistenceBroker broker = factory.getBroker();
+ final DirtyPersistenceBroker broker = factory.getBroker();
broker.beginTransaction();
- Unit unit = broker.getUnit();
- Person person = new Person("Chris", "Double");
+ final ObjectTransaction unit = broker.getObjectTransaction();
+ final Person person = new Person("Chris", "Double");
person.setMainAddress(new Address("USA", "New York", "5th Avenue"));
person.addOtherAddress("vacation", new Address("USA", "Lake George", "Reed St"));
@@ -69,8 +69,40 @@
broker.clearCache();
- Collection addresses = broker.getCollectionByQuery(QueryFactory.newQuery(Address.class,
+ final Collection addresses = broker.getCollectionByQuery(QueryFactory.newQuery(Address.class,
(Criteria)null));
assertEquals(2, addresses.size());
+ }
+
+ public void _testLazyDeletion()
+ {
+ final DirtyPersistenceBroker broker = factory.getBroker();
+
+ broker.beginTransaction();
+ //Unit unit = broker.getUnit();
+ ObjectTransaction unit = broker.getObjectTransaction();
+ final Person person;
+ person = new Person("Chris", "Double");
+ person.setMainAddress(new Address("USA", "New York", "5th Avenue"));
+
+ unit.insert(person);
+
+ broker.commitTransaction();
+
+ broker.clearCache();
+
+ broker.beginTransaction();
+ unit = broker.getObjectTransaction();
+ final Address main =
+ (Address) broker.getObjectByIdentity(
+ broker.serviceIdentity().buildIdentity(person.getMainAddress()));
+ unit.delete(main);
+ broker.commitTransaction();
+
+ broker.clearCache();
+
+ final Collection addresses = broker.getCollectionByQuery(QueryFactory.newQuery(Address.class,
+ (Criteria)null));
+ assertEquals(0, addresses.size());
}
}
1.1 db-ojb/src/test/org/apache/ojb/dirty/OptimisticTransactionTest.java
Index: OptimisticTransactionTest.java
===================================================================
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ojb.dirty;
import junit.framework.TestCase;
public class OptimisticTransactionTest extends TestCase
{
private final DirtyBrokerFactory factory = new DirtyBrokerFactory();
private DirtyPersistenceBroker broker;
private ObjectTransaction tx;
public void setUp()
{
broker = factory.getBroker();
tx = broker.getObjectTransaction();
}
public void tearDown()
{
if (!broker.isClosed()) broker.close();
}
public void testBeginStates()
{
tx.setOptimistic(true);
tx.begin();
assertTrue(tx.isOpen());
assertFalse(broker.isInTransaction());
}
public void testUnitCommitFlushesInNonTransactionalBroker()
{
tx.setOptimistic(true);
tx.begin();
final Person brian = new Person();
brian.setFirstname("Brian");
tx.insert(brian);
tx.commit();
broker.clearCache();
final Person same = (Person) broker.getObjectByIdentity(broker.serviceIdentity().buildIdentity(brian));
assertNotNull(same);
assertEquals(brian.getId(), same.getId());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org