package config; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import com.ibm.xsp.context.RequestCustomizerFactory; import com.ibm.xsp.context.RequestParameters; public class ConfigRequestCustomizerFactory extends RequestCustomizerFactory { @Override public void initializeParameters(final FacesContext facesContext, final RequestParameters parameters) { parameters.setUrlProcessor(ConfigUrlProcessor.INSTANCE); } public static final class ConfigUrlProcessor implements RequestParameters.UrlProcessor { public static final ConfigUrlProcessor INSTANCE = new ConfigUrlProcessor(); private List<Map<String, Object>> aliases_; private ConfigUrlProcessor() { } public String processActionUrl(final String url) { List<Map<String, Object>> aliases = getAliases(); String serverName = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getServerName(); for(Map<String, Object> alias : aliases) { Pattern serverPattern = (Pattern)alias.get("serverPattern"); if(serverPattern.matcher(serverName).matches()) { Pattern pattern = (Pattern)alias.get("pattern"); Matcher matcher = pattern.matcher(url); if(matcher.matches()) { return matcher.replaceAll((String)alias.get("replacement")); } } } return url; } public String processGlobalUrl(final String url) { return url; } public String processResourceUrl(final String url) { List<Map<String, Object>> aliases = getAliases(); String serverName = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getServerName(); for(Map<String, Object> alias : aliases) { Pattern serverPattern = (Pattern)alias.get("serverPattern"); if(serverPattern.matcher(serverName).matches()) { Pattern pattern = (Pattern)alias.get("pattern"); Matcher matcher = pattern.matcher(url); if(matcher.matches()) { return matcher.replaceAll((String)alias.get("replacement")); } } } return url; } @SuppressWarnings("unchecked") private List<Map<String, Object>> getAliases() { if(aliases_ == null) { AppConfig appConfig = AppConfig.get(); Object aliases = appConfig.getValue("aliases"); if(aliases == null || aliases instanceof String) { aliases_ = Collections.emptyList(); } else { aliases_ = new ArrayList<Map<String, Object>>(); for(Map<String, Object> alias : (List<Map<String, Object>>)aliases) { aliases_.add(new HashMap<String, Object>(alias)); } } // Compile the patterns String contextPath = Pattern.quote(FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()); for(Map<String, Object> alias : aliases_) { String serverPattern = (String)alias.get("serverPattern"); alias.put("serverPattern", Pattern.compile(serverPattern)); String pattern = ((String)alias.get("pattern")).replace("DBPATH", contextPath); alias.put("pattern", Pattern.compile(pattern)); } } return aliases_; } } }