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

Reply via email to