View Javadoc

1   /**
2    * Copyright (C) 2005-2009 Alfresco Software Limited.
3    *
4    * This file is part of the Spring Surf Extension project.
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  
19  package org.springframework.extensions.webscripts;
20  
21  import java.util.List;
22  
23  import freemarker.core.Environment;
24  import freemarker.ext.beans.BeanModel;
25  import freemarker.template.TemplateMethodModelEx;
26  import freemarker.template.TemplateModelException;
27  
28  
29  /**
30   * Custom FreeMarker Template language method.
31   * <p>
32   * Render object to mimetype of web script template.  If object cannot be serialized to
33   * mimetype then no output is written.
34   * <p>
35   * Usage: formatwrite(object)
36   * 
37   * Where:
38   *        object => object to write
39   * 
40   * @author davidc
41   */
42  public final class FormatWriterMethod implements TemplateMethodModelEx
43  {
44      private FormatRegistry formatRegistry;
45      private String mimetype;
46  
47      /**
48       * Construct
49       * 
50       * @param abdera
51       */
52      public FormatWriterMethod(FormatRegistry formatRegistry, String format)
53      {
54          this.formatRegistry = formatRegistry;
55          this.mimetype = formatRegistry.getMimeType(null, format);
56      }
57  
58      /* (non-Javadoc)
59       * @see freemarker.template.TemplateMethodModel#exec(java.util.List)
60       */
61      public Object exec(List args) throws TemplateModelException
62      {
63          String result = "";
64          if (args.size() != 0)
65          {
66              // retrieve object to serialize
67              Object object = null;
68              Object arg0 = args.get(0);
69              if (arg0 instanceof BeanModel)
70              {
71                  object = ((BeanModel)arg0).getWrappedObject();
72              }
73              
74              if (object != null)
75              {
76                  FormatWriter<Object> writer = formatRegistry.getWriter(object, mimetype);
77                  if (writer != null)
78                  {
79                      // NOTE: For now, streaming directly to freemarker writer i.e. not relying on
80                      //       result to return serialized form
81                      writer.write(object, Environment.getCurrentEnvironment().getOut());
82                  }
83              }
84          }
85          return result;
86      }
87      
88  }