blob: e092a545a7af1465b3a947500473f71dd912da8d [file] [log] [blame]
/*
* 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);
}
}