/*
* Carrot2 project.
*
* Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński.
* All rights reserved.
*
* Refer to the full license file "carrot2.LICENSE"
* in the root folder of the repository checkout or at:
* http://www.carrot2.org/carrot2.LICENSE
*/
package org.carrot2.webapp.jawr;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.carrot2.util.StreamUtils;
import net.jawr.web.resource.bundle.handler.ResourceBundlesHandler;
import net.jawr.web.resource.bundle.renderer.AbstractBundleLinkRenderer;
import net.jawr.web.servlet.RendererRequestUtils;
/**
* An interface to the Jawr library, the CSS/JS compressor.
*/
public class JawrUrlGenerator
{
private static final Logger logger = org.slf4j.LoggerFactory.getLogger(JawrUrlGenerator.class);
private final ResourceBundlesHandler cssJawrHandler;
private final ResourceBundlesHandler jsJawrHandler;
public JawrUrlGenerator(ServletContext servletContext)
{
cssJawrHandler = (ResourceBundlesHandler) servletContext
.getAttribute(ResourceBundlesHandler.CSS_CONTEXT_ATTRIBUTE);
jsJawrHandler = (ResourceBundlesHandler) servletContext
.getAttribute(ResourceBundlesHandler.JS_CONTEXT_ATTRIBUTE);
if (cssJawrHandler == null || jsJawrHandler == null)
{
throw new IllegalStateException(
"ResourceBundlesHandler not present in servlet context. "
+ "Initialization of Jawr either failed or never occurred.");
}
}
public List<String> getCssUrls(HttpServletRequest request, String bundleId)
{
return getUrls(request, bundleId, cssJawrHandler);
}
public List<String> getJsUrls(HttpServletRequest request, String bundleId)
{
return getUrls(request, bundleId, jsJawrHandler);
}
private List<String> getUrls(HttpServletRequest request, String bundleId,
ResourceBundlesHandler handler)
{
final boolean isGzippable = RendererRequestUtils.isRequestGzippable(request,
handler.getConfig());
final ArrayList<String> links = new ArrayList<String>();
final CollectingLinkRenderer renderer = new CollectingLinkRenderer(handler,
false, links);
final String localeKey = renderer.getBundler().getConfig().getLocaleResolver()
.resolveLocaleCode(request);
try
{
renderer.renderBundleLinks(bundleId, request.getContextPath(), localeKey,
RendererRequestUtils.getAddedBundlesLog(request), isGzippable,
StreamUtils.NULL_WRITER);
}
catch (IOException e)
{
// Cannot happen really
logger.error(e.getMessage());
}
return links;
}
static class CollectingLinkRenderer extends AbstractBundleLinkRenderer
{
private final List<String> links;
protected CollectingLinkRenderer(ResourceBundlesHandler bundler,
boolean useRandomParam, List<String> links)
{
super(bundler, useRandomParam);
this.links = links;
}
@Override
protected String renderLink(String link)
{
links.add(link);
return link;
}
}
}