156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/* 256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Copyright (C) 2010 Google Inc. 356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * you may not use this file except in compliance with the License. 656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * You may obtain a copy of the License at 756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * http://www.apache.org/licenses/LICENSE-2.0 956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 1056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Unless required by applicable law or agreed to in writing, software 1156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * distributed under the License is distributed on an "AS IS" BASIS, 1256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * See the License for the specific language governing permissions and 1456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * limitations under the License. 1556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 1656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpackage com.google.clearsilver.jsilver.compatibility; 1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.TemplateRenderer; 2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.template.Template; 2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.data.Data; 2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.exceptions.JSilverException; 2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.resourceloader.ResourceLoader; 2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.CS; 2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.CSFileLoader; 2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.ClearsilverFactory; 2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.HDF; 2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport org.clearsilver.jni.JniClearsilverFactory; 3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.FileNotFoundException; 3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.IOException; 3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.Reader; 3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/** 3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * A {@link TemplateRenderer} implemented using ClearSilver itself. 3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic class ClearsilverRenderer implements TemplateRenderer { 3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private final ClearsilverFactory factory; 4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private final ResourceLoader defaultResourceLoader; 4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Creates an implementation using the provided ClearSilver factory and JSilver resource loader. 4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public ClearsilverRenderer(ClearsilverFactory factory, ResourceLoader resourceLoader) { 4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.factory = factory; 4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.defaultResourceLoader = resourceLoader; 4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Creates a JSilver implementation using the JNI ClearSilver factory and provided JSilver 5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * resource loader. 5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public ClearsilverRenderer(ResourceLoader resourceLoader) { 5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this(new JniClearsilverFactory(), resourceLoader); 5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void render(String templateName, Data data, Appendable output, 6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson final ResourceLoader resourceLoader) throws IOException, JSilverException { 6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson CSFileLoader fileLoader = new CSFileLoader() { 6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 6356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String load(HDF hdf, String filename) throws IOException { 6456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return loadResource(filename, resourceLoader); 6556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 6656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson }; 6756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson HDF hdf = factory.newHdf(); 6956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson try { 7056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Copy the Data into the HDF. 7156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson hdf.readString(data.toString()); 7256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson CS cs = factory.newCs(hdf); 7456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson try { 7556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson cs.setFileLoader(fileLoader); 7656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson cs.parseFile(templateName); 7756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson output.append(cs.render()); 7856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } finally { 7956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson cs.close(); 8056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } finally { 8256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson hdf.close(); 8356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 8656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 8756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void render(String templateName, Data data, Appendable output) throws IOException, 8856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JSilverException { 8956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson render(templateName, data, output, defaultResourceLoader); 9056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 9256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 9356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String render(String templateName, Data data) throws IOException, JSilverException { 9456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson Appendable output = new StringBuilder(8192); 9556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson render(templateName, data, output); 9656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return output.toString(); 9756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 9956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 10056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void render(Template template, Data data, Appendable output, ResourceLoader resourceLoader) 10156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throws IOException, JSilverException { 10256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new UnsupportedOperationException("ClearsilverRenderer only expects " 10356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson + "template names, not Templates"); 10456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 10556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 10756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void render(Template template, Data data, Appendable output) throws IOException, 10856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JSilverException { 10956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson render(template, data, output, defaultResourceLoader); 11056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 11156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 11256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 11356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String render(Template template, Data data) throws IOException, JSilverException { 11456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson Appendable output = new StringBuilder(8192); 11556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson render(template, data, output); 11656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return output.toString(); 11756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 11856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 11956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 12056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void renderFromContent(String content, Data data, Appendable output) throws IOException, 12156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson JSilverException { 12256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new UnsupportedOperationException(); 12356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 12656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String renderFromContent(String content, Data data) throws IOException, JSilverException { 12756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson Appendable output = new StringBuilder(8192); 12856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson renderFromContent(content, data, output); 12956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return output.toString(); 13056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 13156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 13256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 13356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @return the contents of a resource, or null if the resource was not found. 13456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 13556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private String loadResource(String filename, ResourceLoader resourceLoader) throws IOException { 13656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson Reader reader = resourceLoader.open(filename); 13756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (reader == null) { 13856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new FileNotFoundException(filename); 13956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson StringBuilder sb = new StringBuilder(); 14156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson char buf[] = new char[4096]; 14256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson int count; 14356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson while ((count = reader.read(buf)) != -1) { 14456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson sb.append(buf, 0, count); 14556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return sb.toString(); 14756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson} 149