Author: michiel
Date: 2010-03-15 22:40:54 +0100 (Mon, 15 Mar 2010)
New Revision: 41378

Added:
   mmbase/trunk/applications/searchrelate/src/main/java/
   mmbase/trunk/applications/searchrelate/src/main/java/org/
   mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/
   mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/
   
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/OrderSubmitter.java
   
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SearchRelateComponent.java
   
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SessionCleaner.java
Modified:
   
mmbase/trunk/applications/searchrelate/src/main/webapp/mmbase/searchrelate/List.js.jsp
Log:
submitting of the new order in a transaction happend with 'afterPost' events in 
List.js.jsp. All horrible and a bit shakyt. Using fix for   MMB-1941, to device 
a more robust solution

Added: 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/OrderSubmitter.java
===================================================================
--- 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/OrderSubmitter.java
                            (rev 0)
+++ 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/OrderSubmitter.java
    2010-03-15 21:40:54 UTC (rev 41378)
@@ -0,0 +1,130 @@
+/*
+ * 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.searchrelate;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.*;
+import org.mmbase.core.event.*;
+import org.mmbase.bridge.NodeQuery;
+import org.mmbase.bridge.util.Queries;
+
+import org.mmbase.util.logging.Logger;
+import org.mmbase.util.logging.Logging;
+
+/**
+ * This is used by mm-sr:relatednodes to changes in order which were made in a 
transaction.
+ * We do this afterwards because new nodes have negative numbers.
+ *
+ * @author  Michiel Meeuwissen
+ * @version $Id$
+ */
+public class OrderSubmitter implements TransactionEventListener {
+    private static final Logger LOG = 
Logging.getLoggerInstance(OrderSubmitter.class);
+
+    private static final Map<String, OrderSubmitter> instances = new 
ConcurrentHashMap<String, OrderSubmitter>();
+
+    private final String transactionName;
+    private final Map<NodeQuery, List<Integer>> orders = new 
HashMap<NodeQuery, List<Integer>>();
+    private final List<Runnable> endCallBacks = new ArrayList<Runnable>();
+
+    protected OrderSubmitter(String tn) {
+        transactionName = tn;
+    }
+
+    public static OrderSubmitter getInstance(String name) {
+        synchronized(instances) {
+            OrderSubmitter os = instances.get(name);
+            if (os == null) {
+                os = new OrderSubmitter(name);
+                instances.put(name, os);
+                EventManager.getInstance().addEventListener(os);
+                LOG.info("Listening " + os);
+            } else {
+                LOG.info("Already an instance of " + name + " in " + 
instances);
+            }
+            return os;
+        }
+    }
+
+
+    public String getTransactionName() {
+        return transactionName;
+    }
+
+    public void setOrder(NodeQuery nq, List order) {
+
+        // making sure the arrays contaisn integer
+        // (it is produced in jsp, and will probably contain strings in stead)
+        List<Integer> integerOrder = new ArrayList<Integer>();
+        for (Object o : order) {
+            integerOrder.add(org.mmbase.util.Casting.toInt(o));
+        }
+
+        orders.put(nq, integerOrder);
+        LOG.info("Orders " + orders);
+    }
+
+    public void addCallbackForEnd(Runnable r) {
+        if (! endCallBacks.contains(r)) {
+            endCallBacks.add(r);
+        }
+    }
+
+
+
+    public void notify(TransactionEvent e) {
+        if (e.getTransactionName().equals(transactionName)) {
+            LOG.info("" + e);
+            if (e instanceof TransactionEvent.Resolve) {
+                TransactionEvent.Resolve resolve = (TransactionEvent.Resolve) 
e;
+                for (Map.Entry<NodeQuery, List<Integer>> entry : 
orders.entrySet()) {
+                    for (Map.Entry<Integer, Integer> resolution : 
resolve.getResolution().entrySet()) {
+                        int index = 
entry.getValue().indexOf(resolution.getKey());
+                        if (index != -1) {
+                            entry.getValue().set(index, resolution.getValue());
+                        }
+                    }
+                    LOG.info("Resolved " + resolve.getResolution() + " order 
now" + entry.getValue());
+                }
+            }
+            if (e instanceof TransactionEvent.Commit) {
+                for (Map.Entry<NodeQuery, List<Integer>> entry : 
orders.entrySet()) {
+                    int changes = Queries.reorderResult(entry.getKey(), 
entry.getValue());
+                    LOG.info("Made " + changes + " changes for " + entry);
+                }
+            }
+            if (e instanceof TransactionEvent.End) {
+                LOG.info("Will remove " + this);
+                EventManager.getInstance().removeEventListener(this);
+                instances.remove(getTransactionName());
+                for (Runnable r : endCallBacks) {
+                    r.run();
+                }
+            }
+        } else {
+            LOG.info("Ignoring " + e);
+        }
+    }
+    @Override
+    public String toString() {
+        return "OrderSubmitter for " + transactionName;
+    }
+
+    @Override
+    public int hashCode() {
+        return transactionName.hashCode();
+    }
+    @Override
+    public boolean equals(Object o) {
+        return
+            o != null &&
+            o instanceof OrderSubmitter &&
+            ((OrderSubmitter) o).getTransactionName().equals(transactionName);
+    }
+}
+


Property changes on: 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/OrderSubmitter.java
___________________________________________________________________
Name: svn:keywords
   + Id

Added: 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SearchRelateComponent.java
===================================================================
--- 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SearchRelateComponent.java
                             (rev 0)
+++ 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SearchRelateComponent.java
     2010-03-15 21:40:54 UTC (rev 41378)
@@ -0,0 +1,32 @@
+/*
+ * 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.searchrelate;
+import org.mmbase.framework.*;
+import org.mmbase.core.event.EventManager;
+
+import org.mmbase.util.logging.Logger;
+import org.mmbase.util.logging.Logging;
+
+/**
+ *
+ * @author  Michiel Meeuwissen
+ * @version $Id$
+ */
+public class SearchRelateComponent extends BasicComponent {
+    private static final Logger LOG = 
Logging.getLoggerInstance(SearchRelateComponent.class);
+
+
+    public SearchRelateComponent(String name) {
+        super(name);
+    }
+    @Override
+    public void init() {
+        super.init();
+        // Nothing to do after all
+    }
+}
+


Property changes on: 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SearchRelateComponent.java
___________________________________________________________________
Name: svn:keywords
   + Id

Added: 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SessionCleaner.java
===================================================================
--- 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SessionCleaner.java
                            (rev 0)
+++ 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SessionCleaner.java
    2010-03-15 21:40:54 UTC (rev 41378)
@@ -0,0 +1,71 @@
+/*
+ * 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.searchrelate;
+
+import java.io.*;
+import java.util.*;
+import javax.servlet.http.HttpSession;
+
+import org.mmbase.util.logging.Logger;
+import org.mmbase.util.logging.Logging;
+
+/**
+ * SessionCleaners are added to {...@link OrderSubmitter#addCallbackForEnd} by 
order.jspx of mm-sr:relatednodes.  The new order is temporary
+ * stored in the User's session. After commit, it can (and must) be removed 
again, for which this object ios used.
+ *
+ * @author  Michiel Meeuwissen
+ * @version $Id$
+ */
+public class SessionCleaner implements Runnable {
+    private static final Logger LOG = 
Logging.getLoggerInstance(SessionCleaner.class);
+    private static final String KEY = SessionCleaner.class.getName() + ".KEY";
+
+    private final HttpSession session;
+    private final Set<String> keys = new HashSet<String>();
+
+    SessionCleaner(HttpSession session) {
+        this.session = session;
+    }
+
+    public static SessionCleaner getInstance(HttpSession session) {
+        SessionCleaner instance = (SessionCleaner) session.getAttribute(KEY);
+        if (instance == null) {
+            instance = new SessionCleaner(session);
+            session.setAttribute(KEY, instance);
+        }
+        return instance;
+    }
+    public void addKey(String key) {
+        keys.add(key);
+    }
+
+
+
+    public void run() {
+        LOG.info("Removing from session " + keys);
+        for (String key : keys) {
+            session.removeAttribute(key);
+        }
+        session.removeAttribute(KEY);
+    }
+
+    @Override
+    public int hashCode() {
+        return session.getId().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return
+            o != null &&
+            o instanceof SessionCleaner &&
+            ((SessionCleaner) o).session.getId().equals(session.getId());
+    }
+
+
+}
+


Property changes on: 
mmbase/trunk/applications/searchrelate/src/main/java/org/mmbase/searchrelate/SessionCleaner.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: 
mmbase/trunk/applications/searchrelate/src/main/webapp/mmbase/searchrelate/List.js.jsp
===================================================================
--- 
mmbase/trunk/applications/searchrelate/src/main/webapp/mmbase/searchrelate/List.js.jsp
      2010-03-15 21:35:02 UTC (rev 41377)
+++ 
mmbase/trunk/applications/searchrelate/src/main/webapp/mmbase/searchrelate/List.js.jsp
      2010-03-15 21:40:54 UTC (rev 41378)
@@ -1,11 +1,10 @@
-/*
+/**
 <%...@page contentType="text/javascript; charset=UTF-8"
 %><%...@taglib uri="http://www.mmbase.org/mmbase-taglib-2.0"; prefix="mm"
 %><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt";
 %><fmt:bundle basename="org.mmbase.searchrelate.resources.searchrelate">
 <mm:content type="text/javascript" expires="0">
- */
-/**
+ *
  * This javascript binds to a div.list. It happens on document.ready on every 
div.list in the document. You can also call {...@link #init} manually, e.g. 
after an AJAX load.
  *
  * This div is supposed to contain an <ol> with <a class="delete" />, and a <a 
class="create" />
@@ -236,7 +235,6 @@
 
     if ($(this.div).hasClass("POST")) {
         $(this.div).trigger("mmsrRelatedNodesPost", [self]);
-        this.afterPost();
         //console.log("POSTED");
     } else {
         //console.log("not posted");
@@ -954,55 +952,6 @@
     throw("No original position found for " + $(li).text());
 };
 
-List.prototype.afterPost = function() {
-    this.log("posted!" + this.order);
-    //console.log("posted!" + this.rid + " " + this.order);
-    if (this.sortable) {
-        // Submit the new order seperately
-        var order = "";
-        var originalOrder = "";
-        var self = this;
-        var expectedOriginal = 0;
-        var needsSave = false;
-        self.find("ui-sortable", "ol").each(function() {
-           $(this).find(">li").each(function() {
-               if (order != "") {
-                    order += ",";
-                    originalOrder += ",";
-               }
-                var nodeNumber = self.getNodeForLi(this);
-               order += nodeNumber;
-                if (nodeNumber[0] === "-") {
-                    // contained new nodes
-                    needsSave = true;
-                }
-                var originalPos =  self.getOriginalPosition(this);
-                if (originalPos != expectedOriginal) {
-                    needsSave = true;
-                }
-               originalOrder += originalPos;
-                expectedOriginal++;
-           });
-        });
-        var params = this.getListParameters();
-        params.order = order;
-        params.originalOrder = originalOrder;
-        if (needsSave) {
-            this.loader();
-            //console.log("Submitting order for " + this.rid + " " + 
params.originalOrder + "-> " + params.order );
-            $.ajax({ type: "POST",
-                        async: false,
-                        url: 
"${mm:link('/mmbase/searchrelate/list/submitOrder.jspx')}",
-                        data: params,
-                        complete: function(req, textStatus) {
-                        self.status('<fmt:message key="saved" />', true);
-                }
-                });
-        } else {
-            //console.log("No need to save order for " + self.rid + " " + 
order + " " + originalOrder);
-        }
-    }
-};
 
 /**
  * The method is meant to be used in the 'setup' configuration handler ot 
tinyMCE.

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to