Author: simoneg
Date: Mon Nov 8 16:09:27 2010
New Revision: 1032615
URL: http://svn.apache.org/viewvc?rev=1032615&view=rev
Log:
Batched multiple updates at least for internal content
Added:
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxDispatchUtils.java
(with props)
Modified:
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuDispatch.aj
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuInternalDispatch.aj
labs/magma/trunk/website-autoajax/src/main/resources/org/apache/magma/website/autoajax/autoajax.js
Modified:
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuDispatch.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuDispatch.aj?rev=1032615&r1=1032614&r2=1032615&view=diff
==============================================================================
---
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuDispatch.aj
(original)
+++
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuDispatch.aj
Mon Nov 8 16:09:27 2010
@@ -80,119 +80,13 @@ public aspect AjaxBuDispatch {
)
);
- rewrite.setTemplatePrefix("template/" +
t.getClass().getPackage().getName() + "/");
- Head head = new Head(rewrite);
- try {
- rewrite.write("<div class='buroot'>");
- rewrite.write("<div class='ajaxhead'>");
- List<Change> computed = diff.compute();
- computed = normalize(computed);
- for (Change change : computed) {
- renderHead(change, head);
- }
- head.finished();
- rewrite.write("</div>");
- rewrite.flush();
-
- for (Change change : computed) {
- renderChange(change, rewrite);
- }
- rewrite.write("</div>");
- } catch (Exception e) {
- throw new MagmaException(e, "Error writing");
- }
- }
-
- List<Change> normalize(List<Change> change) {
- List<Change> ret = new ArrayList<Change>();
- for (Change acc : change) {
- if (acc instanceof ChangeAdd) {
- LocalElement element =
((ChangeAdd)acc).getElement();
- if (element instanceof
InternalHtmlProducerAjaxInfo || element instanceof OrphanHtmlProducerAjaxInfo) {
- ChangeRenew ren = new ChangeRenew();
-
ren.setElement(((CollectedAjaxInfo)element).getParent());
- ret.add(ren);
- continue;
- }
- }
- ret.add(acc);
- }
- return ret;
- }
-
- public void renderHead(Change c, Head h) {
- if (c instanceof ChangeAdd) {
- ((ChangeAdd)c).getElement().renderHead(h);
- } else if (c instanceof ChangeRenew) {
- ((ChangeRenew)c).getElement().renderHead(h);
- }
- }
-
- public void renderChange(Change c, URLRewritingStream rewrite) throws
IOException {
- rewrite.write("<div id=\"" + c.hashCode() + "\" ");
- rewrite.write("class=\"" + renderJs(c) + "\" ");
- if (c instanceof ChangeAdd || c instanceof ChangeRenew) {
- LocalElement element = null;
- if (c instanceof ChangeAdd) {
- element = ((ChangeAdd)c).getElement();
- } else {
- element = ((ChangeRenew)c).getElement();
- }
- if (element instanceof CollectedAjaxInfo) {
- CollectedAjaxInfo cai = (CollectedAjaxInfo)
element;
- rewrite.write(" state=\"");
- recursePrintingState(cai, rewrite);
- rewrite.write("\"");
- }
- rewrite.write(">");
- element.renderBody(rewrite);
- } else {
- rewrite.write(">");
- }
+ List<Change> computed = diff.compute();
+ computed = AjaxDispatchUtils.normalize(computed);
+
+ rewrite.setTemplatePrefix("template/" +
t.getClass().getPackage().getName() + "/");
- rewrite.write("</div>");
- rewrite.flush();
+ AjaxDispatchUtils.renderListOfChanges(computed, rewrite);
}
- private void recursePrintingState(CollectedAjaxInfo cai,
URLRewritingStream rewrite) throws IOException {
-
rewrite.write(StringEscapeUtils.escapeXml(cai.produceJsonRow()));
- List<LocalElement> children = cai.getChildren();
- for (LocalElement subele : children) {
- if (subele instanceof CollectedAjaxInfo) {
- rewrite.write(",");
- recursePrintingState((CollectedAjaxInfo)
subele, rewrite);
- }
- }
- }
-
- public String renderJs(Change c) {
- if (c instanceof ChangeAdd) {
- ChangeAdd ca = (ChangeAdd) c;
- if (ca.getReference() == null) {
- if (ca.getElement() instanceof
TemplateAjaxInfo) {
- return "newpage";
- }
- } else {
- String ref = ca.getReference().getId();
- if (ca.isAfter() == null) {
- return "add inside " + ref;
- } else if (ca.isAfter()) {
- return "add after " + ref;
- } else {
- return "add before " + ref;
- }
- }
- } else if (c instanceof ChangeMove) {
- ChangeMove cm = (ChangeMove) c;
- return "move " + cm.getElement().getId() +
(cm.isAfter() ? " after " : " before ") + cm.getReference().getId();
- } else if (c instanceof ChangeRemove) {
- return "remove " +
((ChangeRemove)c).getElement().getId();
- } else if (c instanceof ChangeRenew) {
- return "renew " + ((ChangeRenew)c).getElement().getId();
- } else {
- throw new MagmaException("{0} is an unknow change
type", c.getClass());
- }
- return "unknown";
- }
}
Modified:
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuInternalDispatch.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuInternalDispatch.aj?rev=1032615&r1=1032614&r2=1032615&view=diff
==============================================================================
---
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuInternalDispatch.aj
(original)
+++
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxBuInternalDispatch.aj
Mon Nov 8 16:09:27 2010
@@ -6,13 +6,20 @@ import javax.servlet.http.HttpServletRes
import org.apache.magma.basics.MagmaException;
import org.apache.magma.basics.startup.Cycle;
import org.apache.magma.website.HtmlProducer;
+import org.apache.magma.website.Producer;
+import org.apache.magma.website.autoajax.data.Change;
+import org.apache.magma.website.autoajax.data.ChangeRenew;
+import org.apache.magma.website.autoajax.webdata.InternalHtmlProducerAjaxInfo;
import org.apache.magma.website.templating.Template;
import org.apache.magma.website.Dispatch;
import org.apache.magma.website.templating.Template;
+import org.apache.magma.website.utils.URLRewritingStream;
import org.apache.magma.website.Head;
import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
-public aspect AjaxBuInternalDispatch {
+public privileged aspect AjaxBuInternalDispatch {
/**
* Handle an ajax-browser-update request for the internals of a single
producer
@@ -23,22 +30,54 @@ public aspect AjaxBuInternalDispatch {
public void Dispatch.handleAJAXBUINT(HtmlProducer producer,
HttpServletRequest req, HttpServletResponse resp) {
setHeaders(producer, resp);
try {
- OutputStream str = Cycle.get().getRewriting();
- if (producer instanceof HtmlProducer) {
- str.write("<div
class=\"buintroot\">".getBytes("UTF-8"));
- str.write("<div
class=\"ajaxhead\">".getBytes("UTF-8"));
- Head h = new Head(str);
- ((HtmlProducer)producer).head(h);
- str.write("</div>".getBytes("UTF-8"));
+ URLRewritingStream str = Cycle.get().getRewriting();
+
+ List<HtmlProducer> producers = new
ArrayList<HtmlProducer>();
+ if (producer instanceof HtmlProducer)
producers.add((HtmlProducer)producer);
+
+ String othersStr = req.getParameter("others");
+ if (othersStr != null) {
+ String[] othsplit = othersStr.split(";");
+ for (String oth : othsplit) {
+ Producer othp = findProducer(oth);
+ if (othp instanceof HtmlProducer)
producers.add((HtmlProducer)othp);
+ }
+ }
+
+ List<Change> changes = new ArrayList<Change>();
+ for (HtmlProducer prod : producers) {
+ ChangeRenew ch = new ChangeRenew();
+ ch.setElement(new
InternalHtmlProducerAjaxInfo(null, prod));
+ changes.add(ch);
+ }
+
+ AjaxDispatchUtils.renderListOfChanges(changes, str);
+
+ /*
+
+ str.write("<div
class=\"buintroot\">".getBytes("UTF-8"));
+ str.write("<div class=\"ajaxhead\">".getBytes("UTF-8"));
+ Head h = new Head(str);
+ for (Producer prod : producers) {
+ if (prod instanceof HtmlProducer) {
+ ((HtmlProducer)producer).head(h);
+ }
+ }
+ str.write("</div>".getBytes("UTF-8"));
+
+
+
+ for (Producer prod : producers) {
str.write("<div class=\"ajaxbuint
".getBytes("UTF-8"));
-
str.write(Template.computePartialProducerClasses((HtmlProducer)
producer).getBytes("UTF-8"));
+ if (prod instanceof HtmlProducer) {
+
str.write(Template.computePartialProducerClasses((HtmlProducer)
prod).getBytes("UTF-8"));
+ }
str.write("\">".getBytes("UTF-8"));
- }
- producer.produceWithoutCompound(str);
- if (producer instanceof HtmlProducer) {
+ prod.produceWithoutCompound(str);
str.write("</div>".getBytes("UTF-8"));
str.write("</div>".getBytes("UTF-8"));
- }
+ }
+ */
} catch (Exception e) {
throw new MagmaException(e, "Error sending ajaxbuint
response");
}
Added:
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxDispatchUtils.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxDispatchUtils.java?rev=1032615&view=auto
==============================================================================
---
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxDispatchUtils.java
(added)
+++
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxDispatchUtils.java
Mon Nov 8 16:09:27 2010
@@ -0,0 +1,138 @@
+package org.apache.magma.website.autoajax;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.magma.basics.MagmaException;
+import org.apache.magma.website.Head;
+import org.apache.magma.website.autoajax.data.Change;
+import org.apache.magma.website.autoajax.data.ChangeAdd;
+import org.apache.magma.website.autoajax.data.ChangeMove;
+import org.apache.magma.website.autoajax.data.ChangeRemove;
+import org.apache.magma.website.autoajax.data.ChangeRenew;
+import org.apache.magma.website.autoajax.data.LocalElement;
+import org.apache.magma.website.autoajax.webdata.CollectedAjaxInfo;
+import org.apache.magma.website.autoajax.webdata.InternalHtmlProducerAjaxInfo;
+import org.apache.magma.website.autoajax.webdata.OrphanHtmlProducerAjaxInfo;
+import org.apache.magma.website.autoajax.webdata.TemplateAjaxInfo;
+import org.apache.magma.website.utils.URLRewritingStream;
+
+public class AjaxDispatchUtils {
+
+ public static void renderListOfChanges(List<Change> computed,
URLRewritingStream rewrite) {
+ Head head = new Head(rewrite);
+ try {
+ rewrite.write("<div class='buroot'>");
+ rewrite.write("<div class='ajaxhead'>");
+ for (Change change : computed) {
+ renderHead(change, head);
+ }
+ head.finished();
+ rewrite.write("</div>");
+ rewrite.flush();
+
+ for (Change change : computed) {
+ renderChange(change, rewrite);
+ }
+ rewrite.write("</div>");
+ } catch (Exception e) {
+ throw new MagmaException(e, "Error writing");
+ }
+ }
+
+ public static List<Change> normalize(List<Change> change) {
+ List<Change> ret = new ArrayList<Change>();
+ for (Change acc : change) {
+ if (acc instanceof ChangeAdd) {
+ LocalElement element =
((ChangeAdd)acc).getElement();
+ if (element instanceof
InternalHtmlProducerAjaxInfo || element instanceof OrphanHtmlProducerAjaxInfo) {
+ ChangeRenew ren = new ChangeRenew();
+
ren.setElement(((CollectedAjaxInfo)element).getParent());
+ ret.add(ren);
+ continue;
+ }
+ }
+ ret.add(acc);
+ }
+ return ret;
+ }
+
+ public static void renderHead(Change c, Head h) {
+ if (c instanceof ChangeAdd) {
+ ((ChangeAdd)c).getElement().renderHead(h);
+ } else if (c instanceof ChangeRenew) {
+ ((ChangeRenew)c).getElement().renderHead(h);
+ }
+ }
+
+ public static void renderChange(Change c, URLRewritingStream rewrite)
throws IOException {
+ rewrite.write("<div id=\"" + c.hashCode() + "\" ");
+ rewrite.write("class=\"" + renderJs(c) + "\" ");
+ if (c instanceof ChangeAdd || c instanceof ChangeRenew) {
+ LocalElement element = null;
+ if (c instanceof ChangeAdd) {
+ element = ((ChangeAdd)c).getElement();
+ } else {
+ element = ((ChangeRenew)c).getElement();
+ }
+ if (element instanceof CollectedAjaxInfo) {
+ CollectedAjaxInfo cai = (CollectedAjaxInfo)
element;
+ rewrite.write(" state=\"");
+ recursePrintingState(cai, rewrite);
+ rewrite.write("\"");
+ }
+ rewrite.write(">");
+ element.renderBody(rewrite);
+ } else {
+ rewrite.write(">");
+ }
+
+ rewrite.write("</div>");
+ rewrite.flush();
+ }
+
+ public static void recursePrintingState(CollectedAjaxInfo cai,
URLRewritingStream rewrite) throws IOException {
+
rewrite.write(StringEscapeUtils.escapeXml(cai.produceJsonRow()));
+ List<LocalElement> children = cai.getChildren();
+ for (LocalElement subele : children) {
+ if (subele instanceof CollectedAjaxInfo) {
+ rewrite.write(",");
+ recursePrintingState((CollectedAjaxInfo)
subele, rewrite);
+ }
+ }
+ }
+
+ public static String renderJs(Change c) {
+ if (c instanceof ChangeAdd) {
+ ChangeAdd ca = (ChangeAdd) c;
+ if (ca.getReference() == null) {
+ if (ca.getElement() instanceof
TemplateAjaxInfo) {
+ return "newpage";
+ }
+ } else {
+ String ref = ca.getReference().getId();
+ if (ca.isAfter() == null) {
+ return "add inside " + ref;
+ } else if (ca.isAfter()) {
+ return "add after " + ref;
+ } else {
+ return "add before " + ref;
+ }
+ }
+ } else if (c instanceof ChangeMove) {
+ ChangeMove cm = (ChangeMove) c;
+ return "move " + cm.getElement().getId() +
(cm.isAfter() ? " after " : " before ") + cm.getReference().getId();
+ } else if (c instanceof ChangeRemove) {
+ return "remove " +
((ChangeRemove)c).getElement().getId();
+ } else if (c instanceof ChangeRenew) {
+ return "renew " + ((ChangeRenew)c).getElement().getId();
+ } else {
+ throw new MagmaException("{0} is an unknow change
type", c.getClass());
+ }
+ return "unknown";
+ }
+
+
+}
Propchange:
labs/magma/trunk/website-autoajax/src/main/java/org/apache/magma/website/autoajax/AjaxDispatchUtils.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
labs/magma/trunk/website-autoajax/src/main/resources/org/apache/magma/website/autoajax/autoajax.js
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-autoajax/src/main/resources/org/apache/magma/website/autoajax/autoajax.js?rev=1032615&r1=1032614&r2=1032615&view=diff
==============================================================================
---
labs/magma/trunk/website-autoajax/src/main/resources/org/apache/magma/website/autoajax/autoajax.js
(original)
+++
labs/magma/trunk/website-autoajax/src/main/resources/org/apache/magma/website/autoajax/autoajax.js
Mon Nov 8 16:09:27 2010
@@ -3,6 +3,7 @@ if (window.magma == undefined) {
}
magma.autoajax = new function() {
+ var me = this;
/**
* Current state
@@ -198,18 +199,51 @@ magma.autoajax = new function() {
delete me.torenew;
return;
}
- // TODO better batching using the server multiple parts
var stateId = me.torenew[0];
me.torenew.splice(0,1);
- setTimeout('magma.autoajax._intrenew()', 200);
+ setTimeout('magma.autoajax._intrenew()', 200);
+
var stategrp = this.state.elements[stateId];
+ if (stategrp.type == 'int') {
+ var mainurl = stategrp.localurl;
+ var jqele = jQuery(stategrp.domElement);
+ var event = jQuery.Event("renewing");
+ event.state = stategrp;
+ jqele.trigger(event);
+ /* Check if there are others and if they are internal */
+ var urls = new Array();
+ for (var i = 0; i < me.torenew.length; i++) {
+ stategrp = this.state.elements[me.torenew[i]];
+ if (stategrp.type == 'int') {
+ jqele = jQuery(stategrp.domElement);
+ event = jQuery.Event("renewing");
+ event.state = stategrp;
+ jqele.trigger(event);
+
+ urls.push(stategrp.localurl);
+ me.torenew.splice(i,1);
+ i--;
+ }
+ }
+
+ /* Since they are internals, we can use the batched
version */
+ jQuery.ajax({
+ url: me._buildUrl(mainurl,".ajaxbuint"),
+ type: "POST",
+ dataType: "html",
+ data: {"others" : urls.join(';')},
+ complete: me.parseResponse
+ });
+ return;
+ }
+
+ /* Non-internals go with the old .ajax way */
var jqele = jQuery(stategrp.domElement);
var event = jQuery.Event("renewing");
event.state = stategrp;
jqele.trigger(event);
var url = stategrp.localurl;
- var internal = (stategrp.type == 'int');
- var real = me._buildUrl(url,".ajax" + (internal ? 'buint' :
''));
+ var real = me._buildUrl(url,".ajax");
jQuery.ajax({
url: real,
type: "GET",
@@ -217,8 +251,8 @@ magma.autoajax = new function() {
complete: function(res, status){
if ( status == "success" || status ==
"notmodified" ) {
var payload = $(res.responseText);
- var wrapperclass = internal ?
'ajaxbuint' : 'AjaxWrapper';
- var headclass = internal ? '.ajaxhead'
: '.AjaxHead';
+ var wrapperclass = 'AjaxWrapper';
+ var headclass = '.AjaxHead';
// TODO use replaceWith?
jqele.empty();
jqele.append($('.' +
wrapperclass,payload).children());
@@ -264,6 +298,9 @@ magma.autoajax = new function() {
var stategrp = this.state.elements[relative];
var jqele = jQuery(stategrp.domElement);
var payload = $(what).children();
+ var event = jQuery.Event("adding");
+ event.state = stategrp;
+ payload.trigger(event);
var addtarget = null;
if (position == 'inside') {
jqele.append(payload);
@@ -273,7 +310,8 @@ magma.autoajax = new function() {
} else if (position == 'before') {
jqele.before(payload);
}
- var event = jQuery.Event("added");
+ event = jQuery.Event("added");
+ event.state = stategrp;
payload.trigger(event);
}
@@ -281,11 +319,15 @@ magma.autoajax = new function() {
var stategrp = this.state.elements[which];
var jqele = jQuery(stategrp.domElement);
var payload = $(what).children();
+ jqele.empty();
+ jqele.append(payload);
+ /*
jqele.after(payload);
jqele.remove();
+ */
var event = jQuery.Event("renewed");
event.state = stategrp;
- payload.trigger(event);
+ jqele.trigger(event);
}
@@ -334,8 +376,6 @@ magma.autoajax = new function() {
var me = this;
var event = jQuery.Event("ajaxloading");
$(document).trigger(event);
- // TODO send the request, parse the resulting
- // head and directives.
var real = me._buildUrl(rel,".ajaxbu");
var state = this.getState();
if (otherparams) {
@@ -348,64 +388,66 @@ magma.autoajax = new function() {
type: "POST",
dataType: "html",
data: otherparams,
- complete: function(res, status){
- var event = jQuery.Event("ajaxloaded");
- $(document).trigger(event);
- if ( status == "success" || status ==
"notmodified" ) {
- var payload = $(res.responseText);
- var actions = payload.children();
- var newpages =
actions.filter(".newpage");
- if (newpages.length > 0) {
- newpages.each(function() {
- me.performNewPage(this);
+ complete: me.parseResponse
+ });
+ }
+
+ this.parseResponse = function(res, status){
+ var event = jQuery.Event("ajaxloaded");
+ $(document).trigger(event);
+ if ( status == "success" || status == "notmodified" ) {
+ var payload = $(res.responseText);
+ var actions = payload.children();
+ var newpages = actions.filter(".newpage");
+ if (newpages.length > 0) {
+ newpages.each(function() {
+ me.performNewPage(this);
+ var statemod = $(this).attr('state');
+ if (statemod != '' && typeof statemod
!= 'undefined') {
+ statemod = jQuery.parseJSON('{'
+ statemod + '}');
+ me.updateState(statemod);
+ }
+ me.recalcState();
+ });
+ } else {
+
me.parseMagmaHead(payload.find('.ajaxhead'),payload, function() {
+ actions.each(function() {
+ try {
+ var classes =
this.className;
+ var acts =
classes.split(' ');
+ if (acts[0] == 'add') {
+
me.performAdd(acts[1], acts[2], this);
+ } else if (acts[0] ==
'move') {
+
me.performMove(acts[1], acts[2], acts[3]);
+ } else if (acts[0] ==
'renew') {
+
me.performRenew(acts[1], this);
+ }
var statemod =
$(this).attr('state');
if (statemod != '' &&
typeof statemod != 'undefined') {
statemod =
jQuery.parseJSON('{' + statemod + '}');
me.updateState(statemod);
}
- me.recalcState();
- });
- } else {
-
me.parseMagmaHead(payload.find('.ajaxhead'),payload, function() {
- actions.each(function()
{
- try {
- var
classes = this.className;
- var
acts = classes.split(' ');
- if
(acts[0] == 'add') {
-
me.performAdd(acts[1], acts[2], this);
- } else
if (acts[0] == 'move') {
-
me.performMove(acts[1], acts[2], acts[3]);
- } else
if (acts[0] == 'renew') {
-
me.performRenew(acts[1], this);
- }
- var
statemod = $(this).attr('state');
- if
(statemod != '' && typeof statemod != 'undefined') {
-
statemod = jQuery.parseJSON('{' + statemod + '}');
-
me.updateState(statemod);
- }
- } catch (e) {
-
console.log(e);
- }
- });
-
actions.filter(".remove").each(function() {
- try {
- var
classes = this.className;
- var
acts = classes.split(' ');
-
me.performRemove(acts[1]);
- } catch (e) {
-
console.log(e);
- }
- });
- me.recalcState();
- });
- }
- //alert("Success");
- } else {
- var event = jQuery.Event("ajaxerror");
- $(document).trigger(event);
- }
+ } catch (e) {
+ console.log(e);
+ }
+ });
+
actions.filter(".remove").each(function() {
+ try {
+ var classes =
this.className;
+ var acts =
classes.split(' ');
+
me.performRemove(acts[1]);
+ } catch (e) {
+ console.log(e);
+ }
+ });
+ me.recalcState();
+ });
}
- });
+ //alert("Success");
+ } else {
+ var event = jQuery.Event("ajaxerror");
+ $(document).trigger(event);
+ }
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]