content: 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();
    }
  }
  