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