View Javadoc
1   package org.melati.template;
2   
3   import org.melati.Melati;
4   import org.melati.poem.Persistent;
5   import org.melati.poem.PoemLocale;
6   import org.melati.util.MelatiWriter;
7   
8   import java.io.IOException;
9   import java.util.Enumeration;
10  import java.util.List;
11  
12  /**
13   * A representation of Java such that POEM constituents can be round tripped.
14   *
15   * Intended for creating Hibernate classes from POEM.
16   *  
17   * @author timp
18   * @since 2017-01-21
19   *
20   */
21  public class JavaMarkupLanguage extends AbstractMarkupLanguage implements MarkupLanguage {
22  
23    public JavaMarkupLanguage() {
24      super("java", new Melati(), ClassNameTempletLoader.getInstance(), PoemLocale.HERE);
25    }
26  
27    public JavaMarkupLanguage(Melati melati) {
28      super("java", melati, ClassNameTempletLoader.getInstance(), PoemLocale.HERE);
29    }
30  
31    public JavaMarkupLanguage(Melati melati, TempletLoader templetLoader, PoemLocale locale) {
32      super("java", melati, templetLoader, locale);
33    }
34  
35    @Override
36    public AttributeMarkupLanguage getAttr() {
37      throw new RuntimeException("Not expected to be called in Java");
38    }
39  
40    @Override
41    public String escaped(String s) {
42      return escape(s);
43    }
44    public static String escape(String s) {
45      return s
46          .replace("\"", "\\\"")
47          .replace("\\", "\\\\")
48          .replace("/", "\\/");
49    }
50    @Override
51    public String escaped(Persistent o) {
52      throw new RuntimeException("Not implemented yet");
53    }
54  
55    @Override
56    public String encoded(String s) {
57      throw new RuntimeException("Not expected to be called in Java");
58    }
59  
60    @Override
61    public String decoded(String s) {
62      throw new RuntimeException("Not expected to be called in Java");
63    }
64  
65    /**
66     * Where all content Strings are actually escaped and written out.
67     * @see AbstractMarkupLanguage#render(String, MelatiWriter)
68     */
69    @Override
70    public void render(String s, MelatiWriter writer) {
71      try {
72        writer.write(escaped(s));
73      } catch (IOException e) {
74        throw new TemplateIOException("Problem writing " + s, e);
75      }      
76    }
77    @Override
78    protected void renderMarkup(String s, MelatiWriter writer) {
79      throw new RuntimeException("Not expected to be called in Java");
80    }
81  
82    /**
83     * Render an Object in a MarkupLanguage specific way, rendering to
84     * a supplied Writer.
85     *
86     * NOTE The context always contains objects with the names melati, object and  ml  
87     *
88     * @param o - the Object to be rendered
89     * @param writer - the MelatiWriter to render this Object to
90     */
91    protected void render(Object o, MelatiWriter writer) {
92      if (o == null)
93        writer.output("null");
94      else if (o instanceof String) { 
95          writer.output("\"" + o + "\"");
96      } else if (o instanceof Boolean) { 
97        if (((Boolean)o).booleanValue())
98          writer.output("true");
99        else
100         writer.output("false");
101     } else if (o instanceof List) { 
102         List<?> l = (List<?>)o;
103         writer.output("[");
104         boolean seenOne = false;
105         for (int i = 0; i < l.size(); i++) { 
106           if (seenOne)
107             writer.output(",");            
108           render(l.get(i), writer);
109           seenOne = true;
110         }
111         writer.output("]\n");
112     } else if (o instanceof Enumeration) { 
113       Enumeration<?> e = (Enumeration<?>) o;
114       writer.output("[");
115       boolean seenOne = false;
116       while (e.hasMoreElements()) { 
117         if (seenOne)
118           writer.output(",");            
119         render(e.nextElement(), writer);
120         seenOne = true;        
121       }
122       writer.output("]\n");
123     } else {
124         Template templet =
125           templetLoader.templet(melati.getTemplateEngine(), this, o.getClass());
126         TemplateContext vars =
127             melati.getTemplateEngine().getTemplateContext();
128         vars.put("object", o);
129         vars.put("melati", melati);
130         vars.put("ml", melati.getMarkupLanguage());
131         expandTemplet(templet, vars, writer);
132     }
133   }
134 
135   
136 }