View Javadoc

1   /*
2    * $Id: TagModel.java 451544 2006-09-30 05:38:02Z mrdon $
3    *
4    * Copyright 2006 The Apache Software Foundation.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *      http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  package org.apache.struts2.views.freemarker.tags;
19  
20  import java.io.IOException;
21  import java.io.Writer;
22  import java.util.HashMap;
23  import java.util.Iterator;
24  import java.util.Map;
25  
26  import javax.servlet.http.HttpServletRequest;
27  import javax.servlet.http.HttpServletResponse;
28  
29  import org.apache.commons.logging.Log;
30  import org.apache.commons.logging.LogFactory;
31  import org.apache.struts2.components.Component;
32  
33  import com.opensymphony.xwork2.util.ValueStack;
34  
35  import freemarker.template.SimpleNumber;
36  import freemarker.template.SimpleSequence;
37  import freemarker.template.TemplateModelException;
38  import freemarker.template.TemplateTransformModel;
39  
40  public abstract class TagModel implements TemplateTransformModel {
41      private static final Log LOG = LogFactory.getLog(TagModel.class);
42  
43      protected ValueStack stack;
44      protected HttpServletRequest req;
45      protected HttpServletResponse res;
46  
47      public TagModel(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
48          this.stack = stack;
49          this.req = req;
50          this.res = res;
51      }
52  
53      public Writer getWriter(Writer writer, Map params) throws TemplateModelException, IOException {
54          Component bean = getBean();
55          Map basicParams = convertParams(params);
56          bean.copyParams(basicParams);
57          bean.addAllParameters(getComplexParams(params));
58          return new CallbackWriter(bean, writer);
59      }
60  
61      protected abstract Component getBean();
62  
63      private Map convertParams(Map params) {
64          HashMap map = new HashMap(params.size());
65          for (Iterator iterator = params.entrySet().iterator(); iterator.hasNext();) {
66              Map.Entry entry = (Map.Entry) iterator.next();
67              Object value = entry.getValue();
68              if (value != null && !complexType(value)) {
69                  map.put(entry.getKey(), value.toString());
70              }
71          }
72          return map;
73      }
74  
75      private Map getComplexParams(Map params) {
76          HashMap map = new HashMap(params.size());
77          for (Iterator iterator = params.entrySet().iterator(); iterator.hasNext();) {
78              Map.Entry entry = (Map.Entry) iterator.next();
79              Object value = entry.getValue();
80              if (value != null && complexType(value)) {
81                  if (value instanceof freemarker.ext.beans.BeanModel) {
82                      map.put(entry.getKey(), ((freemarker.ext.beans.BeanModel) value).getWrappedObject());
83                  } else if (value instanceof SimpleNumber) {
84                      map.put(entry.getKey(), ((SimpleNumber) value).getAsNumber());
85                  } else if (value instanceof SimpleSequence) {
86                      try {
87                          map.put(entry.getKey(), ((SimpleSequence) value).toList());
88                      } catch (TemplateModelException e) {
89                          LOG.error("There was a problem converting a SimpleSequence to a list", e);
90                      }
91                  }
92              }
93          }
94          return map;
95      }
96  
97      private boolean complexType(Object value) {
98          return value instanceof freemarker.ext.beans.BeanModel
99                  || value instanceof SimpleNumber
100                 || value instanceof SimpleSequence;
101     }
102 }