/** @throws java.lang.Exception */
 @Before
 public void setUp() throws Exception {
   processor = new UglifyPostProcessor();
   when(config.getContext()).thenReturn(context);
   when(config.getConfigProperties()).thenReturn(new Properties());
   when(bundle.getId()).thenReturn("/myJsBundle.js");
 }
  @Test
  public void testBasicURLWithNonExistingImageRewriting() {

    // Set the properties
    Properties props = new Properties();
    config = new JawrConfig("css", props);
    ServletContext servletContext = new MockServletContext();
    config.setContext(servletContext);
    config.setServletMapping("/css");
    config.setCharsetName("UTF-8");
    addGeneratorRegistryToConfig(config, "css");
    status =
        new BundleProcessingStatus(
            BundleProcessingStatus.BUNDLE_PROCESSING_TYPE, bundle, rsHandler, config);

    // Set up the Image servlet Jawr config
    props = new Properties();
    JawrConfig imgServletJawrConfig = new JawrConfig(JawrConstant.BINARY_TYPE, props);
    addGeneratorRegistryToConfig(imgServletJawrConfig, JawrConstant.BINARY_TYPE);

    BinaryResourcesHandler imgRsHandler =
        new BinaryResourcesHandler(imgServletJawrConfig, rsHandler, null);
    servletContext.setAttribute(JawrConstant.BINARY_CONTEXT_ATTRIBUTE, imgRsHandler);
    // basic test
    StringBuffer data = new StringBuffer("background-image:url(../../../../images/someImage.gif);");
    // the image is at /images
    String filePath = "/css/folder/subfolder/subfolder/someCSS.css";
    // Expected: goes 1 back for servlet mapping, 1 back for prefix, 1 back for the id having a
    // subdir path.
    String expectedURL = "background-image:url(../../../images/someImage.gif);";
    status.setLastPathAdded(filePath);

    String result = processor.postProcessBundle(status, data).toString();
    assertEquals("URL was not rewritten properly", expectedURL, result);
  }
  /**
   * The constructor
   *
   * @param config the jawr config
   */
  public EhCacheManager(JawrConfig config) {

    super(config);
    String configPath = config.getProperty(JAWR_EHCACHE_CONFIG_PATH, DEFAULT_EHCACHE_CONFIG_PATH);
    String cacheName = config.getProperty(JAWR_EHCACHE_CACHE_NAME);
    try {
      CacheManager cacheMgr =
          CacheManager.create(ClassLoaderResourceUtils.getResourceAsStream(configPath, this));
      cache = cacheMgr.getCache(cacheName);

    } catch (Exception e) {
      LOGGER.error("Unable to load EHCACHE configuration file", e);
    }
  }
 @Test
 public void testSameUrlWithQuotes() {
   StringBuffer data = new StringBuffer("background-image:url(  'images/some\\'Image\\\".gif' );");
   // Remove the url mapping from config, one back reference less expected
   config.setServletMapping("");
   String expectedURL = "background-image:url('../../css/images/some\\'Image\\\".gif');";
   String result = processor.postProcessBundle(status, data).toString();
   assertEquals("URL was not rewritten properly:" + result, expectedURL, result);
 }
  @Test
  public void testURLImgClasspathCssRewriting() {

    // Set the properties
    Properties props = new Properties();
    props.setProperty(JawrConfig.JAWR_CSS_CLASSPATH_HANDLE_IMAGE, "true");
    config = new JawrConfig("css", props);
    ServletContext servletContext = new MockServletContext();
    config.setContext(servletContext);
    config.setServletMapping("/css");
    config.setCharsetName("UTF-8");
    addGeneratorRegistryToConfig(config, "css");

    // Set up the Image servlet Jawr config
    props = new Properties();
    JawrConfig imgServletJawrConfig = new JawrConfig(JawrConstant.BINARY_TYPE, props);
    GeneratorRegistry generatorRegistry =
        addGeneratorRegistryToConfig(imgServletJawrConfig, JawrConstant.BINARY_TYPE);
    generatorRegistry.setResourceReaderHandler(rsHandler);
    imgServletJawrConfig.setServletMapping("/cssImg/");
    BinaryResourcesHandler imgRsHandler =
        new BinaryResourcesHandler(imgServletJawrConfig, rsHandler, null);
    servletContext.setAttribute(JawrConstant.BINARY_CONTEXT_ATTRIBUTE, imgRsHandler);

    status =
        new BundleProcessingStatus(
            BundleProcessingStatus.BUNDLE_PROCESSING_TYPE, bundle, null, config);

    // Css data
    StringBuffer data = new StringBuffer("background-image:url(jar:style/images/logo.png);");

    // Css path
    String filePath = "style/default/assets/someCSS.css";

    // Expected: goes 3 back to the context path, then add the CSS image servlet mapping,
    // then go to the image path
    // the image is at classPath:/style/images/someImage.gif
    String expectedURL =
        "background-image:url(../../../cssImg/jar_cb3015770054/style/images/logo.png);";
    status.setLastPathAdded(filePath);

    String result = processor.postProcessBundle(status, data).toString();
    assertEquals("URL was not rewritten properly", expectedURL, result);
  }
  /**
   * Returns the resource input stream
   *
   * @param config the Jawr config
   * @param path the resource path
   * @return the resource input stream
   */
  private InputStream getResourceInputStream(JawrConfig config, String path) {
    InputStream is = config.getContext().getResourceAsStream(path);
    if (is == null) {
      try {
        is = ClassLoaderResourceUtils.getResourceAsStream(path, this);
      } catch (FileNotFoundException e) {
        throw new BundlingProcessException(e);
      }
    }

    return is;
  }
  /** Initialize the postprocessor */
  private void initialize(JawrConfig config) {

    StopWatch stopWatch = new StopWatch("Initializing JS engine for Autoprefixer");
    stopWatch.start();

    // Load JavaScript Script Engine
    String script =
        config.getProperty(AUTOPREFIXER_SCRIPT_LOCATION, AUTOPREFIXER_SCRIPT_DEFAULT_LOCATION);
    String jsEngineName = config.getJavascriptEngineName(AUTOPREFIXER_JS_ENGINE);
    jsEngine = new JavascriptEngine(jsEngineName, true);
    jsEngine.getBindings().put("logger", PERF_LOGGER);
    InputStream inputStream = getResourceInputStream(config, script);
    jsEngine.evaluate("autoprefixer.js", inputStream);
    String strOptions =
        config.getProperty(AUTOPREFIXER_SCRIPT_OPTIONS, AUTOPREFIXER_DEFAULT_OPTIONS);
    this.options = jsEngine.execEval(strOptions);

    jsEngine.evaluate(
        "initAutoPrefixer.js", String.format("processor = autoprefixer(%s);", strOptions));
    jsEngine.evaluate(
        "jawrAutoPrefixerProcess.js",
        String.format(
            "function process(cssSource, opts){"
                + "var result = processor.process(cssSource, opts);"
                + "if(result.warnings){"
                + "result.warnings().forEach(function(message){"
                + "if(logger.isWarnEnabled()){"
                + "logger.warn(message.toString());"
                + "}"
                + "});}"
                + "return result.css;"
                + "}"));

    stopWatch.stop();
    if (PERF_LOGGER.isDebugEnabled()) {
      PERF_LOGGER.debug(stopWatch.shortSummary());
    }
  }
  @SuppressWarnings("unchecked")
  @Before
  public void setUp() throws Exception {
    // Bundle path (full url would be: /servletMapping/prefix/css/bundle.css
    final String bundlePath = "/css/bundle.css";
    // Bundle url prefix
    final String urlPrefix = "/v00";

    when(rsHandler.getResourceAsStream(Matchers.anyString()))
        .thenAnswer(
            new Answer<InputStream>() {

              @Override
              public InputStream answer(InvocationOnMock invocation) throws Throwable {
                String resourceName = (String) invocation.getArguments()[0];
                if (resourceName.equals("jar:style/images/logo.png")) {
                  return new ByteArrayInputStream("Fake value".getBytes());
                }

                throw new ResourceNotFoundException(resourceName);
              }
            });

    when(bundle.getId()).thenReturn(bundlePath);
    when(bundle.getURLPrefix(Matchers.anyMap())).thenReturn(urlPrefix);

    config = new JawrConfig("css", new Properties());
    ServletContext servletContext = new MockServletContext();
    config.setContext(servletContext);
    config.setServletMapping("/js");
    config.setCharsetName("UTF-8");
    status =
        new BundleProcessingStatus(
            BundleProcessingStatus.BUNDLE_PROCESSING_TYPE, bundle, null, config);
    addGeneratorRegistryToConfig(config, "js");
    status.setLastPathAdded("/css/someCSS.css");
    processor = new CSSURLPathRewriterPostProcessor();
  }
 @Test
 public void testBasicURLWithAbsolutePathInContextPathRewriting() {
   // basic test
   StringBuffer data = new StringBuffer("background-image:url(/myApp/images/someImage.gif);");
   config.getConfigProperties().put("jawr.css.url.rewriter.context.path", "/myApp/");
   // StringBuffer data = new
   // StringBuffer("background-image:url(../../../../images/someImage.gif);");
   // the image is at /images
   String filePath = "/css/folder/subfolder/subfolder/someCSS.css";
   // Expected: goes 1 back for servlet mapping, 1 back for prefix, 1 back for the id having a
   // subdir path.
   String expectedURL = "background-image:url(../../../images/someImage.gif);";
   status.setLastPathAdded(filePath);
   String result = processor.postProcessBundle(status, data).toString();
   assertEquals("URL was not rewritten properly", expectedURL, result);
 }
  @Test
  public void testPostProcessWithOutputOptions() throws Exception {

    String src = FileUtils.readClassPathFile("postprocessor/js/uglify/simpleJS.js");
    StringBuffer sb = new StringBuffer(src);
    when(config.getProperty(JawrConstant.UGLIFY_POSTPROCESSOR_OPTIONS, "{}"))
        .thenReturn("{output : {comments : /@preserve/ }}");
    BundleProcessingStatus status =
        new BundleProcessingStatus(
            BundleProcessingStatus.BUNDLE_PROCESSING_TYPE, bundle, null, config);
    StringBuffer ret = processor.postProcessBundle(status, sb);

    String expected =
        FileUtils.readClassPathFile(
            "postprocessor/js/uglify/simpleJS_WithOutputOptions_expected.js");
    assertEquals(expected, ret.toString());
  }
  private GeneratorRegistry addGeneratorRegistryToConfig(JawrConfig config, String type) {
    GeneratorRegistry generatorRegistry =
        new GeneratorRegistry(type) {
          private static final long serialVersionUID = 1L;

          public boolean isHandlingCssImage(String cssResourcePath) {

            boolean result = false;
            if (cssResourcePath.startsWith("jar:")) {
              result = true;
            }
            return result;
          }
        };
    generatorRegistry.setConfig(config);
    config.setGeneratorRegistry(generatorRegistry);
    return generatorRegistry;
  }
 /* (non-Javadoc)
  * @see net.jawr.web.resource.handler.reader.ServletContextResourceReader#init(javax.servlet.ServletContext, net.jawr.web.config.JawrConfig)
  */
 public void init(ServletContext context, JawrConfig config) {
   this.context = context;
   this.charset = config.getResourceCharset();
 }