JCs.java revision 56ed4167b942ec265f9cee70ac4d71d10b3835ce
1/*
2 * Copyright (C) 2010 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.clearsilver.jsilver.adaptor;
18
19import com.google.clearsilver.jsilver.JSilver;
20import com.google.clearsilver.jsilver.autoescape.EscapeMode;
21import com.google.clearsilver.jsilver.data.Data;
22import com.google.clearsilver.jsilver.data.LocalAndGlobalData;
23import com.google.clearsilver.jsilver.exceptions.JSilverIOException;
24import com.google.clearsilver.jsilver.template.HtmlWhiteSpaceStripper;
25import com.google.clearsilver.jsilver.template.Template;
26
27import org.clearsilver.CS;
28import org.clearsilver.CSFileLoader;
29import org.clearsilver.HDF;
30
31import java.io.IOException;
32
33/**
34 * Adaptor that wraps a JSilver object so it can be used as an CS object.
35 */
36class JCs implements CS {
37
38  private final JHdf localHdf;
39  private JHdf globalHdf;
40  private final JSilver jSilver;
41  private final LoadPathToFileCache loadPathCache;
42  private Template template = null;
43  private CSFileLoader csFileLoader;
44  private ResourceLoaderAdaptor resourceLoaderAdaptor;
45
46  JCs(JHdf hdf, JSilver jSilver, LoadPathToFileCache loadPathCache) {
47    this.localHdf = hdf;
48    this.jSilver = jSilver;
49    this.loadPathCache = loadPathCache;
50
51    resourceLoaderAdaptor = localHdf.getResourceLoaderAdaptor();
52    csFileLoader = resourceLoaderAdaptor.getCSFileLoader();
53  }
54
55  /**
56   * Want to delay creating the JSilver object so we can specify necessary parameters.
57   */
58  private JSilver getJSilver() {
59    return jSilver;
60  }
61
62  @Override
63  public void setGlobalHDF(HDF global) {
64    globalHdf = JHdf.cast(global);
65  }
66
67  @Override
68  public HDF getGlobalHDF() {
69    return globalHdf;
70  }
71
72  @Override
73  public void close() {
74    // Removing unneeded reference, although this is not expected to have the
75    // performance impact seen in JHdf as in production configurations users
76    // should be using cached templates so they are long-lived.
77    template = null;
78  }
79
80  @Override
81  public void parseFile(String filename) throws IOException {
82    try {
83      if (getEscapeMode().isAutoEscapingMode()) {
84        if (localHdf.getData().getValue("Config.PropagateEscapeStatus") != null) {
85          throw new IllegalArgumentException(
86              "Config.PropagateEscapeStatus does not work with JSilver."
87                  + "Use JSilverOptions.setPropagateEscapeStatus instead");
88        }
89      }
90      template =
91          getJSilver().getTemplateLoader().load(filename, resourceLoaderAdaptor, getEscapeMode());
92    } catch (RuntimeException e) {
93      Throwable th = e;
94      if (th instanceof JSilverIOException) {
95        // JSilverIOException always has an IOException as its cause.
96        throw ((IOException) th.getCause());
97      }
98      throw e;
99    }
100  }
101
102  @Override
103  public void parseStr(String content) {
104    if (getEscapeMode().isAutoEscapingMode()) {
105      if (localHdf.getData().getValue("Config.PropagateEscapeStatus") != null) {
106        throw new IllegalArgumentException(
107            "Config.PropagateEscapeStatus does not work with JSilver."
108                + "Use JSilverOptions.setPropagateEscapeStatus instead");
109      }
110    }
111    template = getJSilver().getTemplateLoader().createTemp("parseStr", content, getEscapeMode());
112  }
113
114  private EscapeMode getEscapeMode() {
115    Data data = localHdf.getData();
116    return getJSilver().getEscapeMode(data);
117  }
118
119  @Override
120  public String render() {
121    if (template == null) {
122      throw new IllegalStateException("Call parseFile() or parseStr() before " + "render()");
123    }
124
125    Data data;
126    if (globalHdf != null) {
127      // For legacy support we allow users to pass in this option to disable
128      // the new modification protection for global HDF.
129      data =
130          new LocalAndGlobalData(localHdf.getData(), globalHdf.getData(), jSilver.getOptions()
131              .getAllowGlobalDataModification());
132    } else {
133      data = localHdf.getData();
134    }
135    Appendable buffer = jSilver.createAppendableBuffer();
136    try {
137      Appendable output = buffer;
138      // For Clearsilver compatibility we check this HDF variable to see if we
139      // need to turn on whitespace stripping. The preferred approach would be
140      // to turn it on in the JSilverOptions passed to JSilverFactory
141      int wsStripLevel = localHdf.getIntValue("ClearSilver.WhiteSpaceStrip", 0);
142      if (wsStripLevel > 0) {
143        output = new HtmlWhiteSpaceStripper(output, wsStripLevel);
144      }
145      jSilver.render(template, data, output, resourceLoaderAdaptor);
146      return output.toString();
147    } catch (IOException ioe) {
148      throw new RuntimeException(ioe);
149    } finally {
150      jSilver.releaseAppendableBuffer(buffer);
151    }
152  }
153
154  @Override
155  public CSFileLoader getFileLoader() {
156    return csFileLoader;
157  }
158
159  @Override
160  public void setFileLoader(CSFileLoader fileLoader) {
161    if (fileLoader == null && csFileLoader == null) {
162      return;
163    }
164    if (fileLoader != null && fileLoader.equals(csFileLoader)) {
165      return;
166    }
167    csFileLoader = fileLoader;
168    resourceLoaderAdaptor = new ResourceLoaderAdaptor(localHdf, loadPathCache, csFileLoader);
169  }
170}
171