/*
   * (non-Javadoc)
   *
   * @see
   * net.jawr.web.resource.bundle.ResourceBundlesHandler#writeBundleTo(java
   * .lang.String, java.io.Writer)
   */
  @Override
  public void writeBundleTo(String bundlePath, Writer writer) throws ResourceNotFoundException {
    // String text = (String) textCache.get(bundlePath);
    String text = (String) cacheMgr.get(TEXT_CACHE_PREFIX + bundlePath);
    try {
      // If it's not cached yet
      if (null == text) {
        String charsetName = rsHandler.getConfig().getResourceCharset().name();
        ByteArrayOutputStream baOs = new ByteArrayOutputStream();
        WritableByteChannel wrChannel = Channels.newChannel(baOs);
        Writer tempWriter = Channels.newWriter(wrChannel, charsetName);
        rsHandler.writeBundleTo(bundlePath, tempWriter);
        text = baOs.toString(charsetName);
        cacheMgr.put(TEXT_CACHE_PREFIX + bundlePath, text);
      }

      // Write the text to the outputstream
      writer.write(text);
      writer.flush();

    } catch (IOException e) {
      throw new BundlingProcessException(
          "Unexpected IOException writing bundle[" + bundlePath + "]", e);
    }
  }
 /*
  * (non-Javadoc)
  *
  * @see
  * net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#getBundlePaths
  * (java.lang.String,
  * net.jawr.web.resource.bundle.iterator.ConditionalCommentCallbackHandler,
  * java.util.Map)
  */
 @Override
 public ResourceBundlePathsIterator getBundlePaths(
     String bundleId,
     ConditionalCommentCallbackHandler commentCallbackHandler,
     Map<String, String> variants) {
   return rsHandler.getBundlePaths(bundleId, commentCallbackHandler, variants);
 }
  /*
   * (non-Javadoc)
   *
   * @see
   * net.jawr.web.resource.bundle.ResourceBundlesHandler#streamBundleTo(java
   * .lang.String, java.io.OutputStream)
   */
  @Override
  public void streamBundleTo(String bundlePath, OutputStream out) throws ResourceNotFoundException {

    try {
      // byte[] gzip = gzipCache.get(bundlePath);
      byte[] gzip = (byte[]) cacheMgr.get(ZIP_CACHE_PREFIX + bundlePath);
      // If it's not cached yet
      if (null == gzip) {
        // Stream the stored data
        ByteArrayOutputStream baOs = new ByteArrayOutputStream();
        BufferedOutputStream bfOs = new BufferedOutputStream(baOs);
        rsHandler.streamBundleTo(bundlePath, bfOs);

        // Copy the data into the ByteBuffer
        bfOs.close();
        gzip = baOs.toByteArray();

        // Cache the byte array
        cacheMgr.put(ZIP_CACHE_PREFIX + bundlePath, gzip);
      }

      // Write bytes to the outputstream
      IOUtils.write(gzip, out);

    } catch (IOException e) {
      throw new BundlingProcessException(
          "Unexpected IOException writing bundle[" + bundlePath + "]", e);
    }
  }
  /*
   * (non-Javadoc)
   *
   * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#
   * getGlobalResourceBundlePaths(boolean,
   * net.jawr.web.resource.bundle.iterator.ConditionalCommentCallbackHandler,
   * java.util.Map)
   */
  @Override
  public ResourceBundlePathsIterator getGlobalResourceBundlePaths(
      DebugMode debugMode,
      ConditionalCommentCallbackHandler commentCallbackHandler,
      Map<String, String> variants) {

    return rsHandler.getGlobalResourceBundlePaths(debugMode, commentCallbackHandler, variants);
  }
 /* (non-Javadoc)
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#getDirtyBundleNames()
  */
 @Override
 public List<String> getDirtyBundleNames() {
   return rsHandler.getDirtyBundleNames();
 }
 /* (non-Javadoc)
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#bundlesNeedToBeRebuild()
  */
 @Override
 public boolean bundlesNeedToBeRebuild() {
   return rsHandler.bundlesNeedToBeRebuild();
 }
 /* (non-Javadoc)
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#rebuildModifiedBundles()
  */
 @Override
 public void rebuildModifiedBundles() {
   rsHandler.rebuildModifiedBundles();
 }
 /* (non-Javadoc)
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#notifyModification(java.util.List)
  */
 @Override
 public void notifyModification(List<JoinableResourceBundle> bundles) {
   rsHandler.notifyModification(bundles);
 }
 /* (non-Javadoc)
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#getBundleZipDirPath()
  */
 @Override
 public String getBundleZipDirPath() {
   return rsHandler.getBundleZipDirPath();
 }
  /* (non-Javadoc)
   * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#getResourceType()
   */
  @Override
  public String getResourceType() {

    return rsHandler.getResourceType();
  }
 /*
  * (non-Javadoc)
  *
  * @seenet.jawr.web.resource.bundle.handler.ResourceBundlesHandler#
  * getClientSideHandler()
  */
 @Override
 public ClientSideHandlerGenerator getClientSideHandler() {
   return rsHandler.getClientSideHandler();
 }
 /*
  * (non-Javadoc)
  *
  * @see
  * net.jawr.web.resource.bundle.ResourceBundlesHandler#resolveBundleForPath
  * (java.lang.String)
  */
 @Override
 public JoinableResourceBundle resolveBundleForPath(String path) {
   return rsHandler.resolveBundleForPath(path);
 }
 /*
  * (non-Javadoc)
  *
  * @see net.jawr.web.resource.bundle.ResourceBundlesHandler#initAllBundles()
  */
 @Override
 public void initAllBundles() {
   rsHandler.initAllBundles();
 }
 /*
  * (non-Javadoc)
  *
  * @see net.jawr.web.resource.bundle.ResourceBundlesHandler#getConfig()
  */
 @Override
 public JawrConfig getConfig() {
   return rsHandler.getConfig();
 }
 /* (non-Javadoc)
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#setResourceWatcher(net.jawr.web.resource.watcher.ResourceWatcher)
  */
 @Override
 public void setResourceWatcher(ResourceWatcher watcher) {
   rsHandler.setResourceWatcher(watcher);
 }
 /*
  * (non-Javadoc)
  *
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#
  * isGlobalResourceBundle(java.lang.String)
  */
 @Override
 public boolean isGlobalResourceBundle(String resourceBundleId) {
   return rsHandler.isGlobalResourceBundle(resourceBundleId);
 }
 /**
  * Build a cached wrapper around the supplied ResourceBundlesHandler.
  *
  * @param rsHandler
  */
 public CachedResourceBundlesHandler(ResourceBundlesHandler rsHandler) {
   super();
   this.rsHandler = rsHandler;
   cacheMgr =
       CacheManagerFactory.getCacheManager(rsHandler.getConfig(), rsHandler.getResourceType());
 }
 /*
  * (non-Javadoc)
  *
  * @see net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#
  * getTypeBundleHashcode(java.lang.String)
  */
 @Override
 public BundleHashcodeType getBundleHashcodeType(String requestedPath) {
   return rsHandler.getBundleHashcodeType(requestedPath);
 }
 /*
  * (non-Javadoc)
  *
  * @see
  * net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#getGlobalBundles
  * ()
  */
 @Override
 public List<JoinableResourceBundle> getGlobalBundles() {
   return rsHandler.getGlobalBundles();
 }
 /*
  * (non-Javadoc)
  *
  * @see
  * net.jawr.web.resource.bundle.handler.ResourceBundlesHandler#getContextBundles
  * ()
  */
 @Override
 public List<JoinableResourceBundle> getContextBundles() {
   return rsHandler.getContextBundles();
 }