content: package ro.isdc.wro.model.resource.processor.decorator;
  
  import static org.apache.commons.lang3.Validate.notNull;
  
  import java.io.IOException;
  import java.io.Reader;
  import java.io.Writer;
  
  import org.apache.commons.io.IOUtils;
  
  import ro.isdc.wro.model.resource.Resource;
  import ro.isdc.wro.model.resource.processor.support.ProcessingCriteria;
  
  
  /**
   * Decorates the processor with a set of common useful decorators during each processing.
   *
   * @author Alex Objelean
   * @created 7 Oct 2012
   * @since 1.6.0
   */
  public class DefaultProcessorDecorator
      extends ProcessorDecorator {
    private final ProcessingCriteria criteria;
  
    public DefaultProcessorDecorator(final Object processor, final boolean minimize) {
      this(processor, ProcessingCriteria.createDefault(minimize));
    }
  
    public DefaultProcessorDecorator(final Object processor, final ProcessingCriteria criteria) {
      super(decorate(processor, criteria));
      this.criteria = criteria;
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    public void process(final Resource resource, final Reader reader, final Writer writer)
        throws IOException {
      try {
        super.process(resource, reader, writer);
      } finally {
        IOUtils.closeQuietly(reader);
        IOUtils.closeQuietly(writer);
      }
    }
  
    private static ProcessorDecorator decorate(final Object processor, final ProcessingCriteria criteria) {
      notNull(criteria);
      return new BenchmarkProcessorDecorator(new ExceptionHandlingProcessorDecorator(
          new SupportAwareProcessorDecorator(new MinimizeAwareProcessorDecorator(new ImportAwareProcessorDecorator(
              processor, criteria.getProcessingType())))));
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    protected boolean isEnabled(final Resource resource) {
      final boolean isApplicable = resource != null ? isEligible(criteria.isMinimize(), resource.getType()) : true;
      return super.isEnabled(resource) && isApplicable;
    }
  }
  