package org.archive.wayback.replay.html.rewrite; import java.util.List; import java.util.StringTokenizer; import org.archive.wayback.archivalurl.FastArchivalUrlReplayParseEventHandler; import org.archive.wayback.replay.html.ReplayParseContext; import org.archive.wayback.replay.html.StringTransformer; /** * {@link StringTransformer} that manages a collection of named * {@link RewriteRule}s, and applies one or more of them whose name matching * {@link ReplayParseContext#getOraclePolicy()} value. * <p> * Typically set up for * {@link FastArchivalUrlReplayParseEventHandler#setJsBlockTrans(StringTransformer)} * for rewriting embedded JavaScript based on external rewrite rule database. * </p> * <p>Caveat: While this may be useful for rewriting other kinds of text, current * implementation works only for embedded JavaScript block (it has explicit context * check.) * </p> */ public class RewritingStringTransformer implements StringTransformer { private List<RewriteRule> policyRules; public List<RewriteRule> getPolicyRules() { return policyRules; } /** * Configure a collection of pre-defined {@link RewriteRule}s. * @param policyRules */ public void setPolicyRules(List<RewriteRule> policyRules) { this.policyRules = policyRules; } public String transform(ReplayParseContext rpContext, String input) { if (policyRules == null) { return input; } if (!rpContext.isInScriptText() && !rpContext.isInJS()) { return input; } String allPolicies = rpContext.getOraclePolicy(); if (allPolicies == null) { return input; } StringTokenizer tokens = new StringTokenizer(allPolicies, ","); while (tokens.hasMoreElements()) { String policy = tokens.nextToken(); for (RewriteRule rule : policyRules) { if (policy.startsWith(rule.getName())) { input = rule.rewrite(rpContext, policy, input); } } } return input; } }