| /* |
| * Copyright (C) 2010 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.google.clearsilver.jsilver.adaptor; |
| |
| import com.google.clearsilver.jsilver.JSilver; |
| import com.google.clearsilver.jsilver.autoescape.EscapeMode; |
| import com.google.clearsilver.jsilver.data.Data; |
| import com.google.clearsilver.jsilver.data.LocalAndGlobalData; |
| import com.google.clearsilver.jsilver.exceptions.JSilverIOException; |
| import com.google.clearsilver.jsilver.template.HtmlWhiteSpaceStripper; |
| import com.google.clearsilver.jsilver.template.Template; |
| |
| import org.clearsilver.CS; |
| import org.clearsilver.CSFileLoader; |
| import org.clearsilver.HDF; |
| |
| import java.io.IOException; |
| |
| /** |
| * Adaptor that wraps a JSilver object so it can be used as an CS object. |
| */ |
| class JCs implements CS { |
| |
| private final JHdf localHdf; |
| private JHdf globalHdf; |
| private final JSilver jSilver; |
| private final LoadPathToFileCache loadPathCache; |
| private Template template = null; |
| private CSFileLoader csFileLoader; |
| private ResourceLoaderAdaptor resourceLoaderAdaptor; |
| |
| JCs(JHdf hdf, JSilver jSilver, LoadPathToFileCache loadPathCache) { |
| this.localHdf = hdf; |
| this.jSilver = jSilver; |
| this.loadPathCache = loadPathCache; |
| |
| resourceLoaderAdaptor = localHdf.getResourceLoaderAdaptor(); |
| csFileLoader = resourceLoaderAdaptor.getCSFileLoader(); |
| } |
| |
| /** |
| * Want to delay creating the JSilver object so we can specify necessary parameters. |
| */ |
| private JSilver getJSilver() { |
| return jSilver; |
| } |
| |
| @Override |
| public void setGlobalHDF(HDF global) { |
| globalHdf = JHdf.cast(global); |
| } |
| |
| @Override |
| public HDF getGlobalHDF() { |
| return globalHdf; |
| } |
| |
| @Override |
| public void close() { |
| // Removing unneeded reference, although this is not expected to have the |
| // performance impact seen in JHdf as in production configurations users |
| // should be using cached templates so they are long-lived. |
| template = null; |
| } |
| |
| @Override |
| public void parseFile(String filename) throws IOException { |
| try { |
| if (getEscapeMode().isAutoEscapingMode()) { |
| if (localHdf.getData().getValue("Config.PropagateEscapeStatus") != null) { |
| throw new IllegalArgumentException( |
| "Config.PropagateEscapeStatus does not work with JSilver." |
| + "Use JSilverOptions.setPropagateEscapeStatus instead"); |
| } |
| } |
| template = |
| getJSilver().getTemplateLoader().load(filename, resourceLoaderAdaptor, getEscapeMode()); |
| } catch (RuntimeException e) { |
| Throwable th = e; |
| if (th instanceof JSilverIOException) { |
| // JSilverIOException always has an IOException as its cause. |
| throw ((IOException) th.getCause()); |
| } |
| throw e; |
| } |
| } |
| |
| @Override |
| public void parseStr(String content) { |
| if (getEscapeMode().isAutoEscapingMode()) { |
| if (localHdf.getData().getValue("Config.PropagateEscapeStatus") != null) { |
| throw new IllegalArgumentException( |
| "Config.PropagateEscapeStatus does not work with JSilver." |
| + "Use JSilverOptions.setPropagateEscapeStatus instead"); |
| } |
| } |
| template = getJSilver().getTemplateLoader().createTemp("parseStr", content, getEscapeMode()); |
| } |
| |
| private EscapeMode getEscapeMode() { |
| Data data = localHdf.getData(); |
| return getJSilver().getEscapeMode(data); |
| } |
| |
| @Override |
| public String render() { |
| if (template == null) { |
| throw new IllegalStateException("Call parseFile() or parseStr() before " + "render()"); |
| } |
| |
| Data data; |
| if (globalHdf != null) { |
| // For legacy support we allow users to pass in this option to disable |
| // the new modification protection for global HDF. |
| data = |
| new LocalAndGlobalData(localHdf.getData(), globalHdf.getData(), jSilver.getOptions() |
| .getAllowGlobalDataModification()); |
| } else { |
| data = localHdf.getData(); |
| } |
| Appendable buffer = jSilver.createAppendableBuffer(); |
| try { |
| Appendable output = buffer; |
| // For Clearsilver compatibility we check this HDF variable to see if we |
| // need to turn on whitespace stripping. The preferred approach would be |
| // to turn it on in the JSilverOptions passed to JSilverFactory |
| int wsStripLevel = localHdf.getIntValue("ClearSilver.WhiteSpaceStrip", 0); |
| if (wsStripLevel > 0) { |
| output = new HtmlWhiteSpaceStripper(output, wsStripLevel); |
| } |
| jSilver.render(template, data, output, resourceLoaderAdaptor); |
| return output.toString(); |
| } catch (IOException ioe) { |
| throw new RuntimeException(ioe); |
| } finally { |
| jSilver.releaseAppendableBuffer(buffer); |
| } |
| } |
| |
| @Override |
| public CSFileLoader getFileLoader() { |
| return csFileLoader; |
| } |
| |
| @Override |
| public void setFileLoader(CSFileLoader fileLoader) { |
| if (fileLoader == null && csFileLoader == null) { |
| return; |
| } |
| if (fileLoader != null && fileLoader.equals(csFileLoader)) { |
| return; |
| } |
| csFileLoader = fileLoader; |
| resourceLoaderAdaptor = new ResourceLoaderAdaptor(localHdf, loadPathCache, csFileLoader); |
| } |
| } |