Package ro.isdc.wro.maven.plugin

Source Code of ro.isdc.wro.maven.plugin.AbstractSingleProcessorMojo

/**
* Copyright Alex Objelean
*/
package ro.isdc.wro.maven.plugin;

import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.Callable;

import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.mockito.Mockito;

import ro.isdc.wro.config.Context;
import ro.isdc.wro.config.jmx.WroConfiguration;
import ro.isdc.wro.http.support.DelegatingServletOutputStream;
import ro.isdc.wro.manager.WroManager.Builder;
import ro.isdc.wro.manager.factory.WroManagerFactory;
import ro.isdc.wro.manager.factory.WroManagerFactoryDecorator;
import ro.isdc.wro.model.resource.ResourceType;
import ro.isdc.wro.model.resource.processor.ResourcePreProcessor;
import ro.isdc.wro.model.resource.processor.factory.ProcessorsFactory;
import ro.isdc.wro.model.resource.processor.factory.SimpleProcessorsFactory;
import ro.isdc.wro.util.io.NullOutputStream;


/**
* Maven plugin which use a single processor.
*
* @author Alex Objelean
*/
public abstract class AbstractSingleProcessorMojo
    extends AbstractWro4jMojo {
  /**
   * Comma separated options. This field is optional. If no value is provided, no options will be used..
   *
   * @parameter property="options"
   * @optional
   */
  private String options;
  /**
   * When true, all the plugin won't stop its execution and will log all found errors.
   *
   * @parameter default-value="false" property="failNever"
   * @optional
   */
  private boolean failNever;

  /**
   * {@inheritDoc}
   */
  @Override
  public final void doExecute()
      throws Exception {
    getLog().info("options: " + options);

    final Collection<Callable<Void>> callables = new ArrayList<Callable<Void>>();

    final Collection<String> groupsAsList = getTargetGroupsAsList();
    for (final String group : groupsAsList) {
      for (final ResourceType resourceType : ResourceType.values()) {
        if (isParallelProcessing()) {
          callables.add(Context.decorate(new Callable<Void>() {
            public Void call()
                throws Exception {
              processGroup(group, resourceType);
              return null;
            }
          }));
        } else {
          processGroup(group, resourceType);
        }
      }
    }
    if (isParallelProcessing()) {
      getTaskExecutor().submit(callables);
    }
  }

  /**
   * @param group
   *          the name of the group to process.
   */
  private void processGroup(final String groupName, final ResourceType resourceType)
      throws Exception {
    if (wantProcessGroup(groupName, resourceType)) {
      // group With Extension
      final String group = groupName + "." + resourceType.name().toLowerCase();
      getLog().info("processing group: " + group);

      // mock request
      final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
      Mockito.when(request.getRequestURI()).thenReturn(group);
      // mock response
      final HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
      Mockito.when(response.getOutputStream()).thenReturn(new DelegatingServletOutputStream(new NullOutputStream()));

      // init context
      final WroConfiguration config = Context.get().getConfig();
      Context.set(Context.webContext(request, response, Mockito.mock(FilterConfig.class)), config);
      // perform processing
      getManagerFactory().create().process();

      getLog().debug("Processing group: " + group + " [OK]");
    }
  }

  /**
   * Allow subclasses to decide if a group needs to be processed. Useful for plugins which process only resources of a
   * certain type (ex: jshint).
   *
   * @return true if the resource of a certain type from a group should be processed.
   */
  protected boolean wantProcessGroup(final String groupName, final ResourceType resourceType) {
    return true;
  }

  /**
   * Initialize the manager factory with a processor factory using a single processor.
   */
  @Override
  protected WroManagerFactory decorateManagerFactory(final WroManagerFactory managerFactory) {
    return new WroManagerFactoryDecorator(managerFactory) {
      @Override
      protected void onBeforeBuild(final Builder builder) {
        builder.setProcessorsFactory(createSingleProcessorsFactory());
      }
    };
  }

  private ProcessorsFactory createSingleProcessorsFactory() {
    final SimpleProcessorsFactory factory = new SimpleProcessorsFactory();
    final ResourcePreProcessor processor = createResourceProcessor();
    factory.addPreProcessor(processor);
    return factory;
  }

  /**
   * Factory method responsible for creating the processor which will be applied for this build.
   */
  protected abstract ResourcePreProcessor createResourceProcessor();

  /**
   * @return raw representation of the option value.
   */
  protected String getOptions() {
    return options;
  }

  /**
   * Used for tests only.
   *
   * @param options
   *          the options to set
   */
  void setOptions(final String options) {
    this.options = options;
  }

  /**
   * @param failNever
   *          the failFast to set
   */
  public void setFailNever(final boolean failNever) {
    this.failNever = failNever;
  }

  /**
   * @return the failNever
   */
  public boolean isFailNever() {
    return failNever;
  }
}
TOP

Related Classes of ro.isdc.wro.maven.plugin.AbstractSingleProcessorMojo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.