Refactor of template and script services to allow easy addition of further template and script processors.

Hightlights of check-in include:
- Introduction of script processor 
- Neutralisation of script and template models
- The notion of a processor extension introduced
- Extensions applied to processor implementation rather than the services
- Auto selection of processor based on file extension of template or script

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5519 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Roy Wetherall
2007-04-20 17:13:34 +00:00
parent 9f0e52e205
commit c8cf88179a
7 changed files with 14 additions and 28 deletions

View File

@@ -39,7 +39,6 @@ import javax.transaction.UserTransaction;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.template.AbsoluteUrlMethod; import org.alfresco.repo.template.AbsoluteUrlMethod;
import org.alfresco.repo.template.TemplateNode;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
@@ -224,7 +223,7 @@ public abstract class BaseTemplateContentServlet extends BaseServlet
} }
// create the model - put the supplied noderef in as space/document as appropriate // create the model - put the supplied noderef in as space/document as appropriate
Object model = getModel(serviceRegistry, req, templateRef, nodeRef); Map<String, Object> model = getModel(serviceRegistry, req, templateRef, nodeRef);
// process the template against the node content directly to the response output stream // process the template against the node content directly to the response output stream
// assuming the repo is capable of streaming in chunks, this should allow large files // assuming the repo is capable of streaming in chunks, this should allow large files
@@ -232,7 +231,6 @@ public abstract class BaseTemplateContentServlet extends BaseServlet
try try
{ {
templateService.processTemplate( templateService.processTemplate(
null,
templateRef.toString(), templateRef.toString(),
model, model,
res.getWriter()); res.getWriter());
@@ -280,15 +278,14 @@ public abstract class BaseTemplateContentServlet extends BaseServlet
* @return an object model ready for executing template against * @return an object model ready for executing template against
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Object getModel(ServiceRegistry services, HttpServletRequest req, NodeRef templateRef, NodeRef nodeRef) private Map<String, Object> getModel(ServiceRegistry services, HttpServletRequest req, NodeRef templateRef, NodeRef nodeRef)
{ {
// build FreeMarker default model and merge // build FreeMarker default model and merge
Map<String, Object> root = buildModel(services, req, templateRef); Map<String, Object> root = buildModel(services, req, templateRef);
// put the current NodeRef in as "space" and "document" // put the current NodeRef in as "space" and "document"
TemplateNode node = new TemplateNode(nodeRef, services, this.imageResolver); root.put("space", nodeRef);
root.put("space", node); root.put("document", nodeRef);
root.put("document", node);
// add URL arguments as a map called 'args' to the root of the model // add URL arguments as a map called 'args' to the root of the model
Map<String, String> args = new HashMap<String, String>(8, 1.0f); Map<String, String> args = new HashMap<String, String>(8, 1.0f);

View File

@@ -27,7 +27,6 @@ package org.alfresco.web.app.servlet.command;
import java.util.Map; import java.util.Map;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.jscript.RhinoScriptService;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
@@ -89,8 +88,7 @@ public final class ExecuteScriptCommand implements Command
} }
// build the model needed to execute the script // build the model needed to execute the script
Map<String, Object> model = RhinoScriptService.buildDefaultModel( Map<String, Object> model = serviceRegistry.getScriptService().buildDefaultModel(
serviceRegistry,
personRef, personRef,
new NodeRef(Repository.getStoreRef(), Application.getCompanyRootId()), new NodeRef(Repository.getStoreRef(), Application.getCompanyRootId()),
(NodeRef)nodeService.getProperty(personRef, ContentModel.PROP_HOMEFOLDER), (NodeRef)nodeService.getProperty(personRef, ContentModel.PROP_HOMEFOLDER),

View File

@@ -77,7 +77,7 @@ public class NodeInfoBean
if (this.nodeService.exists(nodeRef)) if (this.nodeService.exists(nodeRef))
{ {
Repository.getServiceRegistry(context).getTemplateService().processTemplate( Repository.getServiceRegistry(context).getTemplateService().processTemplate(
null, "/alfresco/templates/client/summary_panel.ftl", getModel(nodeRef), out); "/alfresco/templates/client/summary_panel.ftl", getModel(nodeRef), out);
} }
else else
{ {

View File

@@ -168,7 +168,7 @@ public class FormImpl
" in webapp " + webappName + " in webapp " + webappName +
" and xml data " + XMLUtil.toString(formInstanceData)); " and xml data " + XMLUtil.toString(formInstanceData));
} }
result = templateService.processTemplateString(null, result = templateService.processTemplateString("freemarker",
outputPathPattern, outputPathPattern,
new SimpleHash(root)); new SimpleHash(root));
} }

View File

@@ -223,7 +223,7 @@ public class RenderingEngineTemplateImpl
String result = null; String result = null;
try try
{ {
result = templateService.processTemplateString(null, result = templateService.processTemplateString("freemarker",
outputPathPattern, outputPathPattern,
new SimpleHash(root)); new SimpleHash(root));
} }

View File

@@ -37,7 +37,7 @@ import org.alfresco.repo.template.TemplateNode;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.ScriptLocation; import org.alfresco.service.cmr.repository.ScriptLocation;
import org.alfresco.service.cmr.repository.TemplateExtensionImplementation; import org.alfresco.service.cmr.repository.TemplateProcessorExtension;
import org.alfresco.service.cmr.repository.TemplateImageResolver; import org.alfresco.service.cmr.repository.TemplateImageResolver;
import org.alfresco.service.descriptor.DescriptorService; import org.alfresco.service.descriptor.DescriptorService;
import org.alfresco.web.scripts.WebScriptDescription.RequiredAuthentication; import org.alfresco.web.scripts.WebScriptDescription.RequiredAuthentication;
@@ -255,13 +255,13 @@ public abstract class AbstractWebScript implements WebScript
NodeRef companyHome = scriptContext.getCompanyHome(); NodeRef companyHome = scriptContext.getCompanyHome();
if (companyHome != null) if (companyHome != null)
{ {
model.put("companyhome", new TemplateNode(scriptContext.getCompanyHome(), serviceRegistry, tr)); model.put("companyhome", scriptContext.getCompanyHome());
} }
NodeRef person = scriptContext.getPerson(); NodeRef person = scriptContext.getPerson();
if (person != null) if (person != null)
{ {
model.put("person", new TemplateNode(person, serviceRegistry, tr)); model.put("person", person);
model.put("userhome", new TemplateNode(scriptContext.getUserHome(person), serviceRegistry, tr)); model.put("userhome", scriptContext.getUserHome(person));
} }
} }
@@ -275,14 +275,6 @@ public abstract class AbstractWebScript implements WebScript
model.put("absurl", new AbsoluteUrlMethod(req.getServerPath())); model.put("absurl", new AbsoluteUrlMethod(req.getServerPath()));
model.put("date", new Date()); model.put("date", new Date());
// add the template extensions to the model
// the extensions include custom root helper objects and custom template method objects
for (TemplateExtensionImplementation ext : serviceRegistry.getTemplateService().getExtensions())
{
ext.setTemplateImageResolver(tr);
model.put(ext.getExtensionName(), ext);
}
// add custom model // add custom model
if (customModel != null) if (customModel != null)
{ {

View File

@@ -26,7 +26,6 @@ package org.alfresco.web.ui.repo.component.template;
import java.util.Map; import java.util.Map;
import org.alfresco.repo.template.FreeMarkerProcessor;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.TemplateImageResolver; import org.alfresco.service.cmr.repository.TemplateImageResolver;
@@ -95,8 +94,8 @@ public class DefaultModelHelper
NodeRef companyRootRef = new NodeRef(Repository.getStoreRef(), Application.getCompanyRootId()); NodeRef companyRootRef = new NodeRef(Repository.getStoreRef(), Application.getCompanyRootId());
NodeRef userRootRef = new NodeRef(Repository.getStoreRef(), user.getHomeSpaceId()); NodeRef userRootRef = new NodeRef(Repository.getStoreRef(), user.getHomeSpaceId());
return FreeMarkerProcessor.buildDefaultModel( return services.getTemplateService().buildDefaultModel(
services, user.getPerson(), companyRootRef, userRootRef, template, resolver); user.getPerson(), companyRootRef, userRootRef, template, resolver);
} }
/** Template Image resolver helper */ /** Template Image resolver helper */