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 @@ + +
+