From a3c59244d1d962622cbb63c774ab420810f26a44 Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Sat, 9 Jun 2007 17:03:11 +0000 Subject: [PATCH] WebScript Runtime response/url model extended to support output of client-side webscript url generation function. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5902 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/portlets/myspaces.get.html.ftl | 2 +- .../portlets/myspacespanel.get.html.ftl | 5 +- .../web/scripts/AbstractWebScript.java | 7 +-- .../web/scripts/DeclarativeWebScript.java | 2 +- .../org/alfresco/web/scripts/URLModel.java | 18 ++++++- .../web/scripts/WebScriptRequest.java | 1 - .../web/scripts/WebScriptRequestImpl.java | 2 - .../web/scripts/WebScriptResponse.java | 14 ++++-- .../web/scripts/WebScriptRuntime.java | 2 +- .../web/scripts/WebScriptServletResponse.java | 11 +++++ .../web/scripts/WebScriptURLRequest.java | 3 -- .../web/scripts/jsf/WebScriptJSFRequest.java | 2 - .../web/scripts/jsf/WebScriptJSFResponse.java | 35 ++++++++++++-- .../portlet/WebScriptPortletResponse.java | 31 ++++++++++++ .../org/alfresco/web/ui/common/Utils.java | 47 ++++++++++++------- source/web/WEB-INF/portlet.xml | 8 ++-- source/web/scripts/ajax/myspaces.js | 20 ++++++++ source/web/scripts/ajax/mytasks.js | 6 +++ 18 files changed, 172 insertions(+), 44 deletions(-) diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl index fae5c63be8..5466ef68ec 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl @@ -90,7 +90,7 @@
<#-- populated via an AJAX call to 'myspacespanel' webscript --> <#-- resolved path, filter and home.noderef required as arguments --> - +
<#-- the count value is retrieved and set dynamically from the AJAX webscript output above --> diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/myspacespanel.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/myspacespanel.get.html.ftl index 9f44639491..c356677363 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/portlets/myspacespanel.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/myspacespanel.get.html.ftl @@ -14,7 +14,10 @@ <#if d.isDocument> <#else> - + <#-- the component parts need to build up an encoded url to the outer webscript --> + <#-- the client-side url encoder method of the outer webscript runtime will be used --> + ${url.serviceContext}/myspaces?f=${args.f}&p=${args.p}/${d.name} +
diff --git a/source/java/org/alfresco/web/scripts/AbstractWebScript.java b/source/java/org/alfresco/web/scripts/AbstractWebScript.java index b776a03ba1..e1279dd51e 100644 --- a/source/java/org/alfresco/web/scripts/AbstractWebScript.java +++ b/source/java/org/alfresco/web/scripts/AbstractWebScript.java @@ -206,11 +206,12 @@ public abstract class AbstractWebScript implements WebScript * Create a model for script usage * * @param req web script request + * @param res web script response * @param customModel custom model entries * * @return script model */ - final protected Map createScriptModel(WebScriptRequest req, Map customModel) + final protected Map createScriptModel(WebScriptRequest req, WebScriptResponse res, Map customModel) { // create script model Map model = new HashMap(7, 1.0f); @@ -235,7 +236,7 @@ public abstract class AbstractWebScript implements WebScript // add web script context model.put("args", createArgModel(req)); model.put("guest", req.isGuest()); - model.put("url", new URLModel(req)); + model.put("url", new URLModel(req, res)); model.put("server", new ServerModel(descriptorService.getServerDescriptor())); // add custom model @@ -282,7 +283,7 @@ public abstract class AbstractWebScript implements WebScript // add web script context model.put("args", createArgModel(req)); model.put("guest", req.isGuest()); - model.put("url", new URLModel(req)); + model.put("url", new URLModel(req, res)); model.put("server", new ServerModel(descriptorService.getServerDescriptor())); // add template support diff --git a/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java b/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java index 8a327a4a9e..b8e7aa4b90 100644 --- a/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java +++ b/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java @@ -109,7 +109,7 @@ public class DeclarativeWebScript extends AbstractWebScript if (logger.isDebugEnabled()) logger.debug("Executing script " + executeScript); - Map scriptModel = createScriptModel(req, model); + Map scriptModel = createScriptModel(req, res, model); // add return model allowing script to add items to template model Map returnModel = new ScriptableHashMap(); scriptModel.put("model", returnModel); diff --git a/source/java/org/alfresco/web/scripts/URLModel.java b/source/java/org/alfresco/web/scripts/URLModel.java index 5f7a2ef540..0b7198424f 100644 --- a/source/java/org/alfresco/web/scripts/URLModel.java +++ b/source/java/org/alfresco/web/scripts/URLModel.java @@ -33,15 +33,18 @@ package org.alfresco.web.scripts; public class URLModel { private WebScriptRequest req; + private WebScriptResponse res; /** * Construct * * @param req + * @param res */ - URLModel(WebScriptRequest req) + URLModel(WebScriptRequest req, WebScriptResponse res) { this.req = req; + this.res = res; } /** @@ -153,5 +156,16 @@ public class URLModel { return getExtension(); } - + + /** + * Gets the client url encoding function script + * + * @param name name of the function object to return + * + * @return script to encode urls on the client + */ + public String getClientUrlFunction(String name) + { + return res.getEncodeScriptUrlFunction(name); + } } diff --git a/source/java/org/alfresco/web/scripts/WebScriptRequest.java b/source/java/org/alfresco/web/scripts/WebScriptRequest.java index 342a4ff262..b68ff21253 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptRequest.java +++ b/source/java/org/alfresco/web/scripts/WebScriptRequest.java @@ -166,5 +166,4 @@ public interface WebScriptRequest * @return true => force return of 200, otherwise return status explicitly set */ public boolean forceSuccessStatus(); - } diff --git a/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java b/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java index 29fa6cf824..637fe371b5 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java +++ b/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java @@ -34,7 +34,6 @@ import org.alfresco.web.scripts.WebScriptDescription.FormatStyle; */ public abstract class WebScriptRequestImpl implements WebScriptRequest { - /* (non-Javadoc) * @see org.alfresco.web.scripts.WebScriptRequest#getExtensionPath() */ @@ -154,5 +153,4 @@ public abstract class WebScriptRequestImpl implements WebScriptRequest { return false; } - } diff --git a/source/java/org/alfresco/web/scripts/WebScriptResponse.java b/source/java/org/alfresco/web/scripts/WebScriptResponse.java index 7b6aef5017..dffe39aea0 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptResponse.java +++ b/source/java/org/alfresco/web/scripts/WebScriptResponse.java @@ -82,11 +82,19 @@ public interface WebScriptResponse /** * Encode a script URL * - * Note: Some Web Script Runtime environments (e.g. portal) require urls to be re-written. + * Note: Some Web Script Runtime environments (e.g. JSR-168, JSF) require urls to be re-written. * - * @param url url to encode - * @return encoded url + * @param url to encode + * @return encoded url */ public String encodeScriptUrl(String url); + /** + * Return a client side javascript function to build urls to this service + * + * @param name Generated function name + * + * @return javascript function definition + */ + public String getEncodeScriptUrlFunction(String name); } diff --git a/source/java/org/alfresco/web/scripts/WebScriptRuntime.java b/source/java/org/alfresco/web/scripts/WebScriptRuntime.java index 623b9b6019..72f73006aa 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptRuntime.java +++ b/source/java/org/alfresco/web/scripts/WebScriptRuntime.java @@ -204,7 +204,7 @@ public abstract class WebScriptRuntime WebScriptResponse res = createResponse(); Map model = new HashMap(); model.put("status", status); - model.put("url", new URLModel(req)); + model.put("url", new URLModel(req, res)); // locate status template // NOTE: search order... diff --git a/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java b/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java index dc622abfac..70067a257e 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java +++ b/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java @@ -30,6 +30,8 @@ import java.io.Writer; import javax.servlet.http.HttpServletResponse; +import org.alfresco.web.ui.common.Utils; + /** * HTTP Servlet Web Script Response * @@ -113,4 +115,13 @@ public class WebScriptServletResponse implements WebScriptResponse return url; } + /* (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String) + */ + public String getEncodeScriptUrlFunction(String name) + { + return Utils.encodeJavascript(ENCODE_FUNCTION.replace("$name$", name)); + } + + private static final String ENCODE_FUNCTION = "{ $name$: function(url) { return url; } }"; } diff --git a/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java b/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java index 2996466590..46ee24699a 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java +++ b/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java @@ -87,7 +87,6 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl return urlParts; } - /** * Construct * @@ -199,6 +198,4 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl { return queryArgs.get(name); } - - } diff --git a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java index e8d29f0521..98b5493c40 100644 --- a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java +++ b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java @@ -38,7 +38,6 @@ import org.alfresco.web.scripts.WebScriptURLRequest; */ public class WebScriptJSFRequest extends WebScriptURLRequest { - /** * Constructor * @@ -85,5 +84,4 @@ public class WebScriptJSFRequest extends WebScriptURLRequest // NOTE: unknown in the JSF environment return null; } - } diff --git a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java index 129ff7d206..dd52a1b998 100644 --- a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java +++ b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java @@ -105,11 +105,12 @@ public class WebScriptJSFResponse implements WebScriptResponse return buf.toString(); } - /* (non-Javadoc) + /** * @see org.alfresco.web.scripts.WebScriptResponse#reset() */ public void reset() { + // nothing to do } /** @@ -128,11 +129,12 @@ public class WebScriptJSFResponse implements WebScriptResponse return fc.getResponseWriter(); } - /* (non-Javadoc) + /** * @see org.alfresco.web.scripts.WebScriptResponse#setStatus(int) */ public void setStatus(int status) { + // makes no sense in the JSF env } /** @@ -142,5 +144,32 @@ public class WebScriptJSFResponse implements WebScriptResponse { // Alfresco JSF framework only supports the default of text-html } - + + /* (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String) + */ + public String getEncodeScriptUrlFunction(String name) + { + UIForm form = Utils.getParentForm(fc, component); + if (form == null) + { + throw new IllegalStateException("Must nest components inside UIForm to generate form submit!"); + } + String fieldId = component.getClientId(fc); + String formClientId = form.getClientId(fc); + HtmlFormRendererBase.addHiddenCommandParameter(fc, form, fieldId); + + String func = ENCODE_FUNCTION.replace("$name$", name); + func = func.replace("$formClientId$", formClientId); + func = func.replace("$fieldId$", fieldId); + return Utils.encodeJavascript(func); + } + + private static final String ENCODE_FUNCTION = + "{ $name$: function(url) {" + + " var out = '';" + + " out += \"#\\\" onclick=\\\"document.forms['$formClientId$']['$fieldId$'].value='\";" + + " out += escape(url);" + + " out += \"';document.forms['$formClientId$'].submit();return false;\";" + + " return out; } }"; } diff --git a/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java b/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java index b01a88c173..da00f1d147 100644 --- a/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java +++ b/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java @@ -33,6 +33,7 @@ import javax.portlet.RenderResponse; import org.alfresco.web.scripts.WebScriptRequest; import org.alfresco.web.scripts.WebScriptResponse; +import org.alfresco.web.ui.common.Utils; /** @@ -127,4 +128,34 @@ public class WebScriptPortletResponse implements WebScriptResponse return portletUrl.toString(); } + /* (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String) + */ + public String getEncodeScriptUrlFunction(String name) + { + PortletURL portletUrl = res.createActionURL(); + + String func = ENCODE_FUNCTION.replace("$name$", name); + func = func.replace("$actionUrl$", portletUrl.toString()); + return Utils.encodeJavascript(func); + } + + private static final String ENCODE_FUNCTION = + "{ $name$: function(url) {" + + " var out = \"$actionUrl$\";" + + " var argsIndex = url.indexOf(\"?\");" + + " if (argsIndex == -1)" + + " {" + + " out += \"&scriptUrl=\" + escape(url);" + + " }" + + " else" + + " {" + + " out += \"&scriptUrl=\" + escape(url.substring(0, argsIndex));" + + " var args = url.substring(argsIndex + 1).split(\"&\");" + + " for (var i=0; i scriptUrl - /alfresco/service/mytasks + /alfresco/wcservice/mytasks @@ -50,7 +50,7 @@ scriptUrl - /alfresco/service/doclist + /alfresco/wcservice/doclist @@ -71,7 +71,7 @@ scriptUrl - /alfresco/service/myspaces + /alfresco/wcservice/myspaces @@ -92,7 +92,7 @@ scriptUrl - /alfresco/service/mywebforms + /alfresco/wcservice/mywebforms diff --git a/source/web/scripts/ajax/myspaces.js b/source/web/scripts/ajax/myspaces.js index 710a566deb..cc702c1246 100644 --- a/source/web/scripts/ajax/myspaces.js +++ b/source/web/scripts/ajax/myspaces.js @@ -11,6 +11,7 @@ var MySpaces = { Home: null, ServiceContext: null, popupPanel: null, + ScriptUrlEncoder: null, start: function() { @@ -26,14 +27,32 @@ var MySpaces = { { // push the response into the space panel div $('spacePanel').setHTML(response.responseText); + + // Construct the links to the outer webscript - we use the client script url encoder + // method provided by the outer webscript runtime to generate urls to call it from the + // inner webscript we called via a servlet - this means we can gen urls to call JSF or + // portlet webscript from the inner. + var navLinks = $$('#spacePanel .spaceNavLinkUrl'); + var navImgs = $$('#spacePanel .spaceNavLinkImg'); + navLinks.each(function(navLink, i) + { + navLink.setHTML('' + navImgs[i].innerHTML + ''); + navImgs[i].innerHTML = ""; // remove the html so the class is not selected during init() + }); // extract the count value from a hidden div and display it $('spaceCount').setHTML($('spaceCountValue').innerHTML); + // wire up all the events and animations MySpaces.init(); }, failure: function(response) { + // display the error $('spacePanel').setHTML("Sorry, data currently unavailable."); + + // hide the ajax wait panel and show the main spaces panel + $('spacePanelOverlay').setStyle('visibility', 'hidden'); + $('spacePanel').setStyle('visibility', 'visible'); } } ); @@ -43,6 +62,7 @@ var MySpaces = { init: function() { MySpaces.parseSpacePanels(); + // hide the ajax wait panel and show the main spaces panel $('spacePanelOverlay').setStyle('visibility', 'hidden'); $('spacePanel').setStyle('visibility', 'visible'); diff --git a/source/web/scripts/ajax/mytasks.js b/source/web/scripts/ajax/mytasks.js index d6eec82aa8..b8f1f1a78e 100644 --- a/source/web/scripts/ajax/mytasks.js +++ b/source/web/scripts/ajax/mytasks.js @@ -25,7 +25,12 @@ var MyTasks = { }, failure: function(response) { + // display the error $('taskPanel').setHTML("Sorry, data currently unavailable."); + + // hide the ajax wait panel and show the main task panel + $('taskPanelOverlay').setStyle('visibility', 'hidden'); + $('taskPanel').setStyle('visibility', 'visible'); } } ); @@ -35,6 +40,7 @@ var MyTasks = { init: function() { MyTasks.parseTaskPanels(); + // hide the ajax wait panel and show the main task panel $('taskPanelOverlay').setStyle('visibility', 'hidden'); $('taskPanel').setStyle('visibility', 'visible');