content: /**
   * Copyright wro4j@2011
   */
  package ro.isdc.wro.model.resource.processor.decorator;
  
  import java.io.IOException;
  import java.io.Reader;
  import java.io.StringReader;
  import java.io.StringWriter;
  import java.io.Writer;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  import org.apache.commons.io.IOUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import ro.isdc.wro.model.resource.Resource;
  import ro.isdc.wro.model.resource.processor.ResourcePostProcessor;
  import ro.isdc.wro.model.resource.processor.ResourcePreProcessor;
  import ro.isdc.wro.util.WroUtil;
  
  
  /**
   * Inspects the resource for copyright (licence) header and inserts them back if the decorated processor removes them.
   * The decorated processor does the compression logic and probably removes copyright comments. If copyright comments are
     * removed, our processor will put them back.
     *
   * @author Alex Objelean
   * @created 14 May 2011
   * @since 1.3.7
   */
  public class CopyrightKeeperProcessorDecorator
    extends ProcessorDecorator {
    private static final Logger LOG = LoggerFactory.getLogger(CopyrightKeeperProcessorDecorator.class);
    private static final Pattern PATTERN_COPYRIGHT = Pattern.compile(WroUtil.loadRegexpWithKey("comment.copyright"));
  
    private CopyrightKeeperProcessorDecorator(final ResourcePreProcessor preProcessor) {
      super(preProcessor);
    }
  
    private CopyrightKeeperProcessorDecorator(final ResourcePostProcessor postProcessor) {
      super(postProcessor);
    }
  
    public static CopyrightKeeperProcessorDecorator decorate(final ResourcePreProcessor preProcessor) {
      return new CopyrightKeeperProcessorDecorator(preProcessor);
    }
  
  
    /**
     * {@inheritDoc}
     */
    @Override
    public void process(final Resource resource, final Reader reader, final Writer writer)
      throws IOException {
      try {
        final String content = IOUtils.toString(reader);
        final Matcher originalMatcher = PATTERN_COPYRIGHT.matcher(content);
        final StringBuffer copyrightBuffer = new StringBuffer();
        while (originalMatcher.find()) {
          LOG.debug("found copyright comment");
          // add copyright header to the buffer.
          copyrightBuffer.append(originalMatcher.group());
        }
  
        LOG.debug("buffer: {}", copyrightBuffer);
        final Writer processedWriter = new StringWriter();
        getDecoratedObject().process(resource, new StringReader(content), processedWriter);
  
        final Matcher processedMatcher = PATTERN_COPYRIGHT.matcher(processedWriter.toString());
  
        if (!processedMatcher.find()) {
          writer.write(copyrightBuffer.toString());
        }
        writer.write(processedWriter.toString());
      } finally {
        reader.close();
        writer.close();
      }
    }
  }
  