View Javadoc

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          //try to match screen template
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          //System.out.println("Layout: " + realName);
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                  //no template found. Sorry !
97                  return null;
98              }
99              // up one level
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 }