From 7fb63214d7bbd5b999218c92a90a66f55bb84a75 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Thu, 10 Mar 2011 15:35:48 -0800 Subject: [PATCH] Used the JavaScript proxy support to lazy load configuration fragments in --- core/pom.xml | 2 +- core/src/main/java/hudson/Functions.java | 4 ++ .../widgets/HeteroListConfigPageRenderer.java | 61 +++++++++++++++++++ .../HeteroListConfigPageRenderer/render.jelly | 34 +++++++++++ .../main/resources/lib/form/hetero-list.jelly | 21 ++++--- .../main/webapp/scripts/hudson-behavior.js | 19 ++++-- 6 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 core/src/main/java/hudson/widgets/HeteroListConfigPageRenderer.java create mode 100644 core/src/main/resources/hudson/widgets/HeteroListConfigPageRenderer/render.jelly diff --git a/core/pom.xml b/core/pom.xml index e8cf323005..53d7d8e914 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -382,7 +382,7 @@ THE SOFTWARE. org.kohsuke.stapler stapler-jelly - 1.157 + 1.159-SNAPSHOT commons-jelly diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index cf41132b3f..5726dcdeb3 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -70,6 +70,7 @@ import hudson.scm.SCMDescriptor; import hudson.util.Secret; import hudson.views.MyViewsTabBar; import hudson.views.ViewsTabBar; +import hudson.widgets.HeteroListConfigPageRenderer; import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken; import org.apache.commons.jelly.JellyContext; import org.apache.commons.jelly.JellyTagException; @@ -1314,4 +1315,7 @@ public class Functions { return Boolean.getBoolean("hudson.security.ArtifactsPermission"); } + public static String createHeteroListConfigPageRendererProxy(Object it) { + return Stapler.getCurrentRequest().createJavaScriptProxy(new HeteroListConfigPageRenderer(it)); + } } diff --git a/core/src/main/java/hudson/widgets/HeteroListConfigPageRenderer.java b/core/src/main/java/hudson/widgets/HeteroListConfigPageRenderer.java new file mode 100644 index 0000000000..f17ce5b579 --- /dev/null +++ b/core/src/main/java/hudson/widgets/HeteroListConfigPageRenderer.java @@ -0,0 +1,61 @@ +/* + * The MIT License + * + * Copyright (c) 2011, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.widgets; + +import hudson.model.AbstractProject; +import hudson.model.Descriptor; +import hudson.model.Hudson; +import org.kohsuke.stapler.ForwardToView; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.HttpResponses; +import org.kohsuke.stapler.bind.JavaScriptMethod; + +/** + * Assists the lazy rendering of the configuration fragments from descriptor, + * by remembering the "it" object that points to the overall configured target + * (like {@link AbstractProject}). + * + *

+ * See hetero-list.jelly + * + * @author Kohsuke Kawaguchi + * @since 1.402 + */ +public class HeteroListConfigPageRenderer { + public final Object it; + + public HeteroListConfigPageRenderer(Object it) { + this.it = it; + } + + /** + * Renders a configuration fragment. + */ + @JavaScriptMethod + public HttpResponse renderConfigPage(String id) { + Descriptor d = Hudson.getInstance().getDescriptor(id); + if (d==null) return HttpResponses.notFound(); + return new ForwardToView(this,"render.jelly").with("target",it).with("descriptor",d); + } +} diff --git a/core/src/main/resources/hudson/widgets/HeteroListConfigPageRenderer/render.jelly b/core/src/main/resources/hudson/widgets/HeteroListConfigPageRenderer/render.jelly new file mode 100644 index 0000000000..f0575fbe2f --- /dev/null +++ b/core/src/main/resources/hudson/widgets/HeteroListConfigPageRenderer/render.jelly @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/core/src/main/resources/lib/form/hetero-list.jelly b/core/src/main/resources/lib/form/hetero-list.jelly index bb2f554b37..4792765ac3 100644 --- a/core/src/main/resources/lib/form/hetero-list.jelly +++ b/core/src/main/resources/lib/form/hetero-list.jelly @@ -74,10 +74,9 @@ THE SOFTWARE. - - + + +

@@ -96,17 +95,23 @@ THE SOFTWARE.
- + + +
-
+ +
-
- +
+ + + +
diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index 0148321b2d..8d14b1fd7b 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -443,13 +443,16 @@ var hudsonRules = { prototypes = prototypes.previousSibling; var insertionPoint = prototypes.previousSibling; // this is where the new item is inserted. + var proxy = eval(prototypes.getAttribute("proxy")); // JavaScript proxy to HeteroListConfigPageRenderer + // extract templates var templates = []; var i=0; for(var n=prototypes.firstChild;n!=null;n=n.nextSibling,i++) { var name = n.getAttribute("name"); var tooltip = n.getAttribute("tooltip"); + var descriptorId = n.getAttribute("descriptorId"); menu.options[i] = new Option(n.getAttribute("title"),""+i); - templates.push({html:n.innerHTML, name:name, tooltip:tooltip}); + templates.push({html:n.innerHTML, name:name, tooltip:tooltip,descriptorId:descriptorId}); } Element.remove(prototypes); @@ -463,11 +466,16 @@ var hudsonRules = { nc.className = "repeated-chunk"; nc.setAttribute("name",t.name); nc.innerHTML = t.html; - insertionPoint.parentNode.insertBefore(nc, insertionPoint); - if(withDragDrop) prepareDD(nc); - hudsonRules['DIV.repeated-chunk'](nc); // applySubtree doesn't get nc itself - Behaviour.applySubtree(nc); + proxy.renderConfigPage(t.descriptorId, function (t) { + Element.replace(findElementsBySelector(nc,"TR.config-page")[0],t.responseText); + + insertionPoint.parentNode.insertBefore(nc, insertionPoint); + if(withDragDrop) prepareDD(nc); + + hudsonRules['DIV.repeated-chunk'](nc); // applySubtree doesn't get nc itself + Behaviour.applySubtree(nc); + }); }); menuButton.getMenu().renderEvent.subscribe(function(type,args,value) { @@ -2124,3 +2132,4 @@ function createComboBox(idOrField,valueFunction) { Ajax.Request.prototype.dispatchException = function(e) { throw e; } +