package ro.isdc.wro.extensions.processor.js;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import ro.isdc.wro.extensions.processor.support.ObjectPoolHelper;
import ro.isdc.wro.extensions.processor.support.template.AbstractJsTemplateCompiler;
import ro.isdc.wro.model.resource.Resource;
import ro.isdc.wro.model.resource.processor.Destroyable;
import ro.isdc.wro.model.resource.processor.ResourcePreProcessor;
import ro.isdc.wro.util.ObjectFactory;
/**
* A base class for template processors like: dustJS or hoganJS.
*
* @author Eivind Barstad Waaler
* @since 1.4.7
* @created 11 May 2012
*/
public abstract class JsTemplateCompilerProcessor implements ResourcePreProcessor, Destroyable {
private final ObjectPoolHelper<AbstractJsTemplateCompiler> enginePool;
public JsTemplateCompilerProcessor() {
enginePool = new ObjectPoolHelper<AbstractJsTemplateCompiler>(new ObjectFactory<AbstractJsTemplateCompiler>() {
@Override
public AbstractJsTemplateCompiler create() {
return createCompiler();
}
});
}
/**
* {@inheritDoc}
*/
@Override
public void process(final Resource resource, final Reader reader, final Writer writer) throws IOException {
final String content = IOUtils.toString(reader);
final AbstractJsTemplateCompiler jsCompiler = enginePool.getObject();
try {
writer.write(jsCompiler.compile(content, getArgument(resource)));
} finally {
enginePool.returnObject(jsCompiler);
reader.close();
writer.close();
}
}
/**
* @param resource
* {@link Resource} being processed by compiler.
* @return arguments consumed by the js compile script.
*/
protected String getArgument(final Resource resource) {
final String name = resource == null ? "" : FilenameUtils.getBaseName(resource.getUri());
return name;
}
/**
* @return the {@link AbstractJsTemplateCompiler} responsible for compiling the template.
*/
protected abstract AbstractJsTemplateCompiler createCompiler();
@Override
public void destroy() throws Exception {
enginePool.destroy();
}
}