package com.anjlab.tapestry5; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import org.apache.tapestry5.services.AssetPathConverter; import org.apache.tapestry5.services.RequestGlobals; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class StaticAssetPathConverter implements AssetPathConverter { private final Logger logger = LoggerFactory.getLogger(StaticAssetPathConverter.class); private final RequestGlobals requestGlobals; private final Properties staticProperties; public static final String ASSETS_PRECOMPILATION = "Assets-Precompilation"; public StaticAssetPathConverter(RequestGlobals requestGlobals) { this.requestGlobals = requestGlobals; this.staticProperties = new Properties(); String staticPropertiesPath = StaticAssetResourceStreamer.ASSETS_STATIC_PROPERTIES; try { staticPropertiesPath = getRealPath(staticPropertiesPath); staticProperties.load(new FileInputStream(staticPropertiesPath)); } catch (IOException e) { logger.error("Failed to load properties from {}: {}", staticPropertiesPath, e); } catch (Exception e) { logger.error("Error initializing " + StaticAssetResourceStreamer.class.getName(), e); } } @Override public boolean isInvariant() { return true; } @Override public String convertAssetPath(String assetPath) { String header = requestGlobals.getRequest().getHeader(StaticAssetPathConverter.ASSETS_PRECOMPILATION); if (header != null) { // Don't use static assets during assets precompilation return assetPath; } String assetHash = staticProperties.getProperty(assetPath); return assetHash == null ? assetPath : assetPath + "?" + assetHash; } private String getRealPath(String path) { String realPath = requestGlobals.getHTTPServletRequest() .getSession().getServletContext().getRealPath(path); return realPath; } }