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