Author: michiel
Date: 2010-03-15 21:54:45 +0100 (Mon, 15 Mar 2010)
New Revision: 41369
Added:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/LocalEvent.java
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEvent.java
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventBroker.java
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventListener.java
Modified:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/module/core/TransactionManager.java
Log:
MMB-1941
Added:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/LocalEvent.java
===================================================================
---
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/LocalEvent.java
(rev 0)
+++
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/LocalEvent.java
2010-03-15 20:54:45 UTC (rev 41369)
@@ -0,0 +1,24 @@
+/*
+ * This software is OSI Certified Open Source Software.
+ * OSI Certified is a certification mark of the Open Source Initiative. The
+ * license (Mozilla version 1.0) can be read at the MMBase site. See
+ * http://www.MMBase.org/license
+ */
+package org.mmbase.core.event;
+
+
+/**
+ * An event that does not need broadcasting to other servers
+ *
+ * @author Michiel Meeuwissen
+ * @since MMBase-1.9.3
+ * @version $Id$
+ */
+public abstract class LocalEvent extends Event {
+
+ private static final long serialVersionUID = 1L;
+ public LocalEvent() {
+ super(null, TYPE_UNSPECIFIED);
+ }
+
+}
Property changes on:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/LocalEvent.java
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEvent.java
===================================================================
---
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEvent.java
(rev 0)
+++
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEvent.java
2010-03-15 20:54:45 UTC (rev 41369)
@@ -0,0 +1,92 @@
+/*
+ * This software is OSI Certified Open Source Software.
+ * OSI Certified is a certification mark of the Open Source Initiative. The
+ * license (Mozilla version 1.0) can be read at the MMBase site. See
+ * http://www.MMBase.org/license
+ */
+package org.mmbase.core.event;
+
+import java.io.*;
+import java.util.*;
+
+import org.mmbase.util.logging.Logger;
+import org.mmbase.util.logging.Logging;
+
+/**
+ *
+ * @author Michiel Meeuwissen
+ * @since MMBase-1.9.3
+ * @version $Id$
+ */
+public abstract class TransactionEvent extends LocalEvent {
+ private static final Logger log =
Logging.getLoggerInstance(TransactionEvent.class);
+
+ protected final String transactionName;
+
+ TransactionEvent(String transactionName) {
+ this.transactionName = transactionName;
+ }
+
+ public String getTransactionName() {
+ return transactionName;
+ }
+
+
+ public static abstract class End extends TransactionEvent {
+ public End(String transactionName) {
+ super(transactionName);
+ }
+ }
+
+ public static class Commit extends End {
+ private static final long serialVersionUID = 1L;
+
+ public Commit(String transactionName) {
+ super(transactionName);
+ }
+ @Override
+ public String toString() {
+ return "commit:" + getTransactionName();
+ }
+ }
+
+ public static class Resolve extends TransactionEvent {
+ private static final long serialVersionUID = 1L;
+ private final Map<Integer, Integer> resolved;
+ public Resolve(String transactionName, Map<Integer, Integer> resolved)
{
+ super(transactionName);
+ this.resolved = resolved;
+ }
+ public Map<Integer, Integer> getResolution() {
+ return resolved;
+ }
+ @Override
+ public String toString() {
+ return "resolve:" + getTransactionName() + " " + getResolution();
+ }
+ }
+
+ public static class Cancel extends End {
+ private static final long serialVersionUID = 1L;
+
+ public Cancel(String transactionName) {
+ super(transactionName);
+ }
+ @Override
+ public String toString() {
+ return "cancel:" + getTransactionName() ;
+ }
+ }
+
+ public static class Create extends TransactionEvent {
+ private static final long serialVersionUID = 1L;
+
+ public Create(String transactionName) {
+ super(transactionName);
+ }
+ @Override
+ public String toString() {
+ return "create:" + getTransactionName() ;
+ }
+ }
+}
Property changes on:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEvent.java
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventBroker.java
===================================================================
---
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventBroker.java
(rev 0)
+++
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventBroker.java
2010-03-15 20:54:45 UTC (rev 41369)
@@ -0,0 +1,55 @@
+/*
+ * This software is OSI Certified Open Source Software.
+ * OSI Certified is a certification mark of the Open Source Initiative. The
+ * license (Mozilla version 1.0) can be read at the MMBase site. See
+ * http://www.MMBase.org/license
+ */
+package org.mmbase.core.event;
+
+
+/**
+ *
+ * @author Michiel Meeuwissen
+ * @since MMBase-1.9.3
+ * @version $Id$
+ */
+public class TransactionEventBroker extends AbstractEventBroker {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see event.AbstractEventBroker#canBrokerFor(java.lang.Class)
+ */
+ public boolean canBrokerForListener(EventListener listener) {
+ return listener instanceof TransactionEventListener;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see event.AbstractEventBroker#shouldNotifyForEvent(event.Event)
+ */
+ public boolean canBrokerForEvent(Event event) {
+ return event instanceof TransactionEvent;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see event.AbstractEventBroker#notifyEventListeners()
+ */
+ protected void notifyEventListener(Event event, EventListener listener) {
+ TransactionEvent te = (TransactionEvent) event; //!!!!!
+ TransactionEventListener tel = (TransactionEventListener) listener;
+ tel.notify(te);
+ }
+
+ /* (non-Javadoc)
+ * @see org.mmbase.core.event.AbstractEventBroker#toString()
+ */
+ @Override
+ public String toString() {
+ return "TransactionEvent Broker";
+ }
+
+}
Property changes on:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventBroker.java
___________________________________________________________________
Name: svn:keywords
+ Id
Added:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventListener.java
===================================================================
---
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventListener.java
(rev 0)
+++
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventListener.java
2010-03-15 20:54:45 UTC (rev 41369)
@@ -0,0 +1,17 @@
+/*
+ * This software is OSI Certified Open Source Software.
+ * OSI Certified is a certification mark of the Open Source Initiative. The
+ * license (Mozilla version 1.0) can be read at the MMBase site. See
+ * http://www.MMBase.org/license
+ */
+package org.mmbase.core.event;
+
+/**
+ *
+ * @author Michiel Meeuwissen
+ * @since MMBase-1.8
+ * @version $Id$
+ */
+public interface TransactionEventListener extends EventListener {
+ public void notify(TransactionEvent event);
+}
Property changes on:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/core/event/TransactionEventListener.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified:
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/module/core/TransactionManager.java
===================================================================
---
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/module/core/TransactionManager.java
2010-03-15 12:02:32 UTC (rev 41368)
+++
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/module/core/TransactionManager.java
2010-03-15 20:54:45 UTC (rev 41369)
@@ -11,6 +11,7 @@
import java.util.*;
import org.mmbase.module.corebuilders.*;
+import org.mmbase.core.event.*;
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;
@@ -32,7 +33,7 @@
* NO: The node does not exists yet, but will be created on commit
* YES: The node already existed befor the transaction started.
* NOLONGER: The node alreayd existed, but will be deleted by the
transaction. Or, it was created and deleted in the transaction.
- * UNDEFINED: Just a value used to indicte that the corresponding _exists
field is not filled
+ * UNDEFINED: Just a value used to indicate that the corresponding _exists
field is not filled
*/
public static enum Exists {
NO,
@@ -52,7 +53,7 @@
private TemporaryNodeManager tmpNodeManager;
private TransactionResolver transactionResolver;
- protected Map<String, Collection<MMObjectNode>> transactions = new
HashMap<String, Collection<MMObjectNode>>();
+ protected final Map<String, Collection<MMObjectNode>> transactions = new
HashMap<String, Collection<MMObjectNode>>();
public static TransactionManager instance;
@@ -126,6 +127,7 @@
// That is a hack.
transactions.put(transactionName, transactionNodes);
+ EventManager.getInstance().propagateEvent(new
TransactionEvent.Create(transactionName));
return transactionNodes;
} else {
throw new TransactionManagerException("Transaction " +
transactionName + " already exists");
@@ -213,14 +215,41 @@
* @todo Review this stuff..
* @since MMBase-1.9
*/
- public boolean resolve(String transactionName) throws
TransactionManagerException {
+ public boolean resolve(final String transactionName) throws
TransactionManagerException {
// MM: I think we need an actual Transaction object! with e.g. a
property 'resolved'.
Collection<MMObjectNode> transaction = getTransaction(transactionName);
if (transaction instanceof Vector) { // a bit of a trick to see if it
is committed already
try {
- getTransactionResolver().resolve(transaction);
+ final Map<String, Integer> resolution =
getTransactionResolver().resolve(transaction);
+ Map<Integer, Integer> integerResolution = new
AbstractMap<Integer, Integer>() {
+ public Set<Map.Entry<Integer, Integer>> entrySet() {
+ return new AbstractSet<Map.Entry<Integer, Integer>>() {
+ public int size() {
+ return resolution.size();
+ }
+ public Iterator<Map.Entry<Integer, Integer>>
iterator() {
+ return new Iterator<Map.Entry<Integer,
Integer>>() {
+ private final Iterator<Map.Entry<String,
Integer>> i = resolution.entrySet().iterator();
+ public boolean hasNext() {
+ return i.hasNext();
+ }
+ public Map.Entry<Integer, Integer> next() {
+ Map.Entry<String, Integer> e =
i.next();
+ return new
org.mmbase.util.Entry<Integer,
Integer>(Integer.parseInt(e.getKey().substring(transactionName.length() + 1)),
+
e.getValue());
+
+ }
+ public void remove() {
+ throw new
UnsupportedOperationException();
+ }
+ };
+ }
+ };
+ }
+ };
+ EventManager.getInstance().propagateEvent(new
TransactionEvent.Resolve(transactionName, integerResolution));
} catch (TransactionManagerException te) {
throw new TransactionManagerException("Can't resolve
transaction " + transactionName + " (it has " + transaction.size() + " nodes)",
te);
}
@@ -236,11 +265,14 @@
try {
resolve(transactionName);
transactions.put(transactionName,
Collections.unmodifiableCollection(transaction)); // makes it recognizable, and
also the transaction is unusable after that
+
if (!performCommits(user, transaction)) {
throw new TransactionManagerException("Can't commit
transaction " + transactionName);
}
+ EventManager.getInstance().propagateEvent(new
TransactionEvent.Commit(transactionName));
+
} finally {
// remove nodes from the temporary node cache
MMObjectBuilder builder = MMBase.getMMBase().getTypeDef();
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs