1 package br.com.ibnetwork.guara.pipeline.valve.view;
2
3 import org.apache.avalon.framework.configuration.Configurable;
4 import org.apache.avalon.framework.configuration.Configuration;
5 import org.apache.avalon.framework.configuration.ConfigurationException;
6 import org.apache.avalon.framework.service.ServiceException;
7 import org.apache.avalon.framework.service.ServiceManager;
8 import org.apache.avalon.framework.service.Serviceable;
9 import org.apache.commons.lang.StringUtils;
10 import org.apache.commons.logging.Log;
11 import org.apache.commons.logging.LogFactory;
12
13 import br.com.ibnetwork.guara.pipeline.PipelineException;
14 import br.com.ibnetwork.guara.pipeline.valve.ValveSupport;
15 import br.com.ibnetwork.guara.rundata.RunData;
16 import br.com.ibnetwork.guara.view.Context;
17 import br.com.ibnetwork.guara.view.TemplateEngine;
18 import br.com.ibnetwork.guara.view.TemplateUtils;
19
20 /***
21 * @author leandro
22 */
23 public class RenderLayout
24 extends ValveSupport
25 implements Serviceable, Configurable
26 {
27 private Log logger;
28
29 private TemplateEngine engine;
30
31 private String onTemplateNotFound;
32
33 private String defaultLayout;
34
35 public void service(ServiceManager manager)
36 throws ServiceException
37 {
38 logger = LogFactory.getLog(RenderLayout.class);
39 engine = (TemplateEngine) manager.lookup(TemplateEngine.ROLE);
40 }
41
42 public void configure(Configuration conf)
43 throws ConfigurationException
44 {
45 onTemplateNotFound = "layouts." + conf.getChild("onLayoutNotFound").getAttribute("template");
46 defaultLayout = conf.getChild("defaultLayout").getAttribute("template");
47 }
48
49 public boolean execute(RunData runData)
50 throws PipelineException
51 {
52 String layoutTemplateName = runData.getPageInfo().getLayoutTemplate();
53 String templateName = runData.getPageInfo().getTemplate();
54
55
56 if(layoutTemplateName == null && templateName != null)
57 {
58 layoutTemplateName = searchLayoutForTemplate(templateName);
59 }
60 else if(layoutTemplateName == null)
61 {
62 layoutTemplateName = defaultLayout;
63 }
64 layoutTemplateName = "layouts." + layoutTemplateName;
65
66 Context ctx = runData.getContext();
67 if(!engine.templateExists(layoutTemplateName))
68 {
69 if(logger.isDebugEnabled())
70 {
71 logger.debug("Layout ["+layoutTemplateName+"] not found. Will render ["
72 +onTemplateNotFound+"]");
73 }
74 ctx.put("layoutTemplateName",layoutTemplateName);
75 layoutTemplateName = onTemplateNotFound;
76 }
77 TemplateUtils.renderOutput(engine,runData,layoutTemplateName);
78 return true;
79 }
80
81 private String searchLayoutForTemplate(String templateName)
82 {
83 String realName = "layouts." + templateName;
84
85 if(engine.templateExists(realName))
86 {
87 return templateName;
88 }
89 String[] parts = StringUtils.split(templateName,".");
90 int last = parts.length - 1;
91 String lastName = parts[last];
92 if(defaultLayout.equals(lastName))
93 {
94 if(last == 0)
95 {
96
97 return null;
98 }
99
100 String[] array = new String[last];
101 System.arraycopy(parts,0,array,0,last--);
102 parts = array;
103 }
104 parts[last] = defaultLayout;
105 templateName = StringUtils.join(parts,".");
106 return searchLayoutForTemplate(templateName);
107 }
108
109 }