From e13b3f64146ffcc3017f6a8ce811c75ac26b636e Mon Sep 17 00:00:00 2001 From: Gavin Cornwell Date: Wed, 14 Oct 2009 10:26:07 +0000 Subject: [PATCH] Merged V3.2 to HEAD 15292: Solution for MOB-536 (Remove form-include virtualization server dependencies from Web Forms) 15299: Fix for ETHREEOH-896 and partial fix for ETHREEOH-1923: XForms layout issues 15501: MOB-947: Remove virtualisation server dependency from the TinyMCE control used in web forms. Preview URL has been replaced with a call to the 'avm' webscript. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16904 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../forms/RenderingEngineTemplateImpl.java | 63 +++++++++++++ .../web/forms/xforms/XFormsProcessor.java | 3 +- .../tests/rendering-engine/include-test.xsd | 3 + .../include-webscript-test.ftl | 10 ++ .../include-webscript-test.xsl | 29 ++++++ source/web/css/xforms.css | 93 ++++++++++--------- 6 files changed, 155 insertions(+), 46 deletions(-) create mode 100644 source/test-resources/xforms/tests/rendering-engine/include-webscript-test.ftl create mode 100644 source/test-resources/xforms/tests/rendering-engine/include-webscript-test.xsl diff --git a/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java b/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java index c5c88b5c54..62e67fc043 100644 --- a/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java +++ b/source/java/org/alfresco/web/forms/RenderingEngineTemplateImpl.java @@ -38,7 +38,9 @@ import java.util.List; import java.util.Map; import java.util.ResourceBundle; +import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; +import javax.servlet.http.HttpServletRequest; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; @@ -56,9 +58,11 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.TemplateException; import org.alfresco.service.cmr.repository.TemplateService; +import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.namespace.DynamicNamespacePrefixResolver; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.util.URLDecoder; import org.alfresco.util.URLEncoder; import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.FacesHelper; @@ -100,6 +104,7 @@ public class RenderingEngineTemplateImpl static final QName PROP_RESOURCE_RESOLVER = QName.createQName(NamespaceService.ALFRESCO_PREFIX, "resource_resolver", namespacePrefixResolver); + private static final String WEBSCRIPT_PREFIX = "webscript://"; private final NodeRef nodeRef; private final NodeRef renditionPropertiesNodeRef; @@ -436,6 +441,64 @@ public class RenderingEngineTemplateImpl LOGGER.debug(e); } } + + if (name.startsWith(WEBSCRIPT_PREFIX)) + { + try + { + final FacesContext facesContext = FacesContext.getCurrentInstance(); + final ExternalContext externalContext = facesContext.getExternalContext(); + final HttpServletRequest request = (HttpServletRequest)externalContext.getRequest(); + + String decodedName = URLDecoder.decode(name.substring(WEBSCRIPT_PREFIX.length())); + String rewrittenName = decodedName; + + if (decodedName.contains("${storeid}")) + { + rewrittenName = rewrittenName.replace("${storeid}", AVMUtil.getStoreName(formInstanceDataAvmPath)); + } + else + { + if (decodedName.contains("{storeid}")) + { + rewrittenName = rewrittenName.replace("{storeid}", AVMUtil.getStoreName(formInstanceDataAvmPath)); + } + } + + if (decodedName.contains("${ticket}")) + { + AuthenticationService authenticationService = Repository.getServiceRegistry(facesContext).getAuthenticationService(); + final String ticket = authenticationService.getCurrentTicket(); + rewrittenName = rewrittenName.replace("${ticket}", ticket); + } + else + { + if (decodedName.contains("{ticket}")) + { + AuthenticationService authenticationService = Repository.getServiceRegistry(facesContext).getAuthenticationService(); + final String ticket = authenticationService.getCurrentTicket(); + rewrittenName = rewrittenName.replace("{ticket}", ticket); + } + } + + final String webscriptURI = (request.getScheme() + "://" + + request.getServerName() + ':' + + request.getServerPort() + + request.getContextPath() + "/wcservice/" + + rewrittenName); + + if (LOGGER.isDebugEnabled()) + LOGGER.debug("loading webscript: " + webscriptURI); + + final URI uri = new URI(webscriptURI); + return uri.toURL().openStream(); + } + catch (Exception e) + { + if (LOGGER.isDebugEnabled()) + LOGGER.debug(e); + } + } try { diff --git a/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java b/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java index f159009cae..3980926b24 100644 --- a/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java +++ b/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java @@ -215,7 +215,8 @@ public class XFormsProcessor implements FormProcessor String storeName = avmBrowseBean.getSandbox(); if (storeName != null) { - js.append(JavaScriptUtils.javaScriptEscape(AVMUtil.buildWebappUrl(AVMUtil.getCorrespondingPreviewStoreName(storeName), avmBrowseBean.getWebapp()))); + js.append(JavaScriptUtils.javaScriptEscape(fc.getExternalContext().getRequestContextPath() + "/wcs/api/path/content/avm/" + + AVMUtil.buildStoreWebappPath(storeName, avmWebApp).replace(":",""))); } } diff --git a/source/test-resources/xforms/tests/rendering-engine/include-test.xsd b/source/test-resources/xforms/tests/rendering-engine/include-test.xsd index 7af58d033d..3196e7d5cb 100644 --- a/source/test-resources/xforms/tests/rendering-engine/include-test.xsd +++ b/source/test-resources/xforms/tests/rendering-engine/include-test.xsd @@ -7,6 +7,9 @@ configure include-test.xsl and include-test.ftl as the rendering engine templates for the form. upload include-test-data-dictionary.* into the data dictionary folder created for the form (e.g. Data Dictionary/Web Forms/include-test upload include-test-webapp.* into the root of your webapp directory within the web project. + + An example of including the output of a webscript can also be shown by creating a separate form using this schema + and the include-webscript-test.xsl and include-webscript-test.ftl files as the rendering engine templates. When the rendering template gets executed, it should be able to include all auxilliary xsls and ftls. diff --git a/source/test-resources/xforms/tests/rendering-engine/include-webscript-test.ftl b/source/test-resources/xforms/tests/rendering-engine/include-webscript-test.ftl new file mode 100644 index 0000000000..1c6e96d578 --- /dev/null +++ b/source/test-resources/xforms/tests/rendering-engine/include-webscript-test.ftl @@ -0,0 +1,10 @@ + + + Include Test + + +
Generated by include-webscript-test.ftl
+
Value from template is ${.vars["include-test"]["in-template"]}
+ <#include "webscript://api/path/content/avm/{storeid}/www/avm_webapps/ROOT/include-test-webapp.ftl?ticket={ticket}"> + + diff --git a/source/test-resources/xforms/tests/rendering-engine/include-webscript-test.xsl b/source/test-resources/xforms/tests/rendering-engine/include-webscript-test.xsl new file mode 100644 index 0000000000..8bfb61a517 --- /dev/null +++ b/source/test-resources/xforms/tests/rendering-engine/include-webscript-test.xsl @@ -0,0 +1,29 @@ + + + + + + + + +
Value from template is
+
+ + + + + Include Test + + +
Generated by include-webscript-test.xsl
+ + + + +
+
diff --git a/source/web/css/xforms.css b/source/web/css/xforms.css index 21e5abf525..c5ca4fb6a0 100644 --- a/source/web/css/xforms.css +++ b/source/web/css/xforms.css @@ -2,56 +2,56 @@ { /* border: 1px dashed blue; */ /* margin-right: 2px; */ - clear: both; + clear: both; } .xformsItemRequiredImage { - vertical-align: middle; - margin: 0px 5px; - width: 9px; - height: 9px; + vertical-align: middle; + margin: 0px 5px; + width: 9px; + height: 9px; } .xformsItemLabelContainer { - height: 100%; - line-height: 100%; - white-space: nowrap; - overflow: hidden; - vertical-align: middle; + height: 100%; + line-height: 100%; + white-space: nowrap; + overflow: hidden; + vertical-align: middle; } .xformsItemLabelSubmitError { - color: red; + color: red; } .xformsItemDOMContainer { position: relative; - top: 0px; + top: 1px; left: 0px; padding: 0px; - margin: 0px; + margin: 5px 0px; } .xformsGroup { position: relative; - top: 0px; + top: 5px; left: 0px; width: 100%; border: 1px solid #d2d2d9; - clear: both; + clear: both; } .xformsGroupItem { position: relative; - margin: 5px 0px; + margin: 0px 0px; max-width: 100%; - clear: both; + clear: both; } .xformsGroupHeader @@ -69,14 +69,14 @@ .xformsGroupDivider { - border-bottom: 1px dotted #d9d9de; - margin: 5px 3px; + border-bottom: 1px dotted #d9d9de; + margin: 5px 3px; } .xformsViewRoot { - padding-bottom: 5px; - border-bottom: 1px dotted #d9d9de; + padding-bottom: 5px; + border-bottom: 1px dotted #d9d9de; } .xformsViewRootHeader @@ -89,11 +89,11 @@ width: 100%; font-weight: bold; font-size: 12px; - font-weight: bold; - text-align: center; - padding-bottom: 5px; - border-bottom: 1px dotted #d9d9de; - margin-bottom: 5px; + font-weight: bold; + text-align: center; + padding-bottom: 5px; + border-bottom: 1px dotted #d9d9de; + margin-bottom: 5px; } .xformsTextArea @@ -103,19 +103,19 @@ .xformsRichTextEditorHoverLayer { - position: absolute; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - background-color: #d9d9de; - border: 2px inset black; - color: black; - z-index: 100; - font-weight: bolder; - font-size: 16px; - text-align: center; - overflow: hidden; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + background-color: #d9d9de; + border: 2px inset black; + color: black; + z-index: 100; + font-weight: bolder; + font-size: 16px; + text-align: center; + overflow: hidden; } .xformsRepeat @@ -124,7 +124,7 @@ .xformsRepeatFocusedHeader { - background-color: #d4e4f4; + background-color: #d4e4f4; } .xformsRepeatItem @@ -137,7 +137,7 @@ .xformsRepeatItemSelected { - background-color: #ecf4fc; + background-color: #ecf4fc; } .xformsRepeatControls @@ -147,7 +147,7 @@ border: 1px solid #67a4e6; height: 20px; line-height: 20px; - margin: 0px auto; + margin: 0px auto; } .xformsRowEven @@ -183,7 +183,7 @@ .xformsFilePicker { width: 100%; - max-width: 400px; + max-width: 100%; } .xformsFilePickerStatus @@ -204,6 +204,7 @@ padding-left: 2px; background-color: #e3effa; border: 1px solid #67a4e6; + margin-right: 1px; } .xformsFilePickerHeaderMenuTrigger @@ -221,15 +222,17 @@ line-height: 30px; background-color: #e3effa; border: 1px solid #67a4e6; + margin-right: 1px; } .xformsFilePickerFileList { - position: relative; + position: relative; overflow-y: auto; background-color: white; border-left: 1px solid #67a4e6; border-right: 1px solid #67a4e6; + margin-right: 1px; } .xformsFilePickerRow @@ -259,6 +262,6 @@ .xformsGhostText { - color: grey; + color: grey; }