Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * Copyright 2012 Red Hat, Inc., and individual contributors
   * as indicated by the @author tags.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 package org.jboss.web.rewrite;
 
 import java.util.Map;

Author(s):
Remy Maucherat
 
 public class Substitution {
 
     public abstract class SubstitutionElement {
         public abstract String evaluate(Matcher ruleMatcher condResolver resolver);
     }
     
     public class StaticElement extends SubstitutionElement {
         public String value;
 
         public String evaluate
             (Matcher ruleMatcher condResolver resolver) {
             return ;
         }
     
     }
     
     public class RewriteRuleBackReferenceElement extends SubstitutionElement {
         public int n;
         public String evaluate(Matcher ruleMatcher condResolver resolver) {
             return rule.group();
         }
     }
     
     public class RewriteCondBackReferenceElement extends SubstitutionElement {
         public int n;
         public String evaluate(Matcher ruleMatcher condResolver resolver) {
             return cond.group();
         }
     }
     
     public class ServerVariableElement extends SubstitutionElement {
         public String key;
         public String evaluate(Matcher ruleMatcher condResolver resolver) {
             return resolver.resolve();
         }
     }
     
     public class ServerVariableEnvElement extends SubstitutionElement {
         public String key;
         public String evaluate(Matcher ruleMatcher condResolver resolver) {
             return resolver.resolveEnv();
         }
     }
     
     public class ServerVariableSslElement extends SubstitutionElement {
         public String key;
         public String evaluate(Matcher ruleMatcher condResolver resolver) {
             return resolver.resolveSsl();
         }
     }
     
     public class ServerVariableHttpElement extends SubstitutionElement {
         public String key;
         public String evaluate(Matcher ruleMatcher condResolver resolver) {
             return resolver.resolveHttp();
         }
     }
     
     public class MapElement extends SubstitutionElement {
         public RewriteMap map = null;
         public String key;
         public String defaultValue = null;
         public String evaluate(Matcher ruleMatcher condResolver resolver) {
             String result = .lookup();
             if (result == null) {
                 result = ;
             }
             return result;
         }
     }
     
    protected SubstitutionElement[] elements = null;
    protected String sub = null;
    public String getSub() { return ; }
    public void setSub(String sub) { this. = sub; }
    public void parse(Map<StringRewriteMapmaps) {
        ArrayList<SubstitutionElementelements = new ArrayList<SubstitutionElement>();
        int pos = 0;
        int percentPos = 0;
        int dollarPos = 0;
        
        while (pos < .length()) {
            percentPos = .indexOf('%'pos);
            dollarPos = .indexOf('$'pos);
            if (percentPos == -1 && dollarPos == -1) {
                // Static text
                StaticElement newElement = new StaticElement();
                newElement.value = .substring(pos.length());
                pos = .length();
                elements.add(newElement);
            } else if (percentPos == -1 || ((dollarPos != -1) && (dollarPos < percentPos))) {
                // $: back reference to rule or map lookup
                if (dollarPos + 1 == .length()) {
                    throw new IllegalArgumentException();
                }
                if (pos < dollarPos) {
                    // Static text
                    StaticElement newElement = new StaticElement();
                    newElement.value = .substring(posdollarPos);
                    pos = dollarPos;
                    elements.add(newElement);
                }
                if (Character.isDigit(.charAt(dollarPos + 1))) {
                    // $: back reference to rule
                    RewriteRuleBackReferenceElement newElement = new RewriteRuleBackReferenceElement();
                    newElement.n = Character.digit(.charAt(dollarPos + 1), 10);
                    pos = dollarPos + 2;
                    elements.add(newElement);
                } else {
                    // $: map lookup as ${mapname:key|default}
                    MapElement newElement = new MapElement();
                    int open = .indexOf('{'dollarPos);
                    int colon = .indexOf(':'dollarPos);
                    int def = .indexOf('|'dollarPos);
                    int close = .indexOf('}'dollarPos);
                    if (!(-1 < open && open < colon && colon < close)) {
                        throw new IllegalArgumentException();
                    }
                    newElement.map = maps.get(.substring(open + 1, colon));
                    if (newElement.map == null) {
                        throw new IllegalArgumentException( + ": No map: " + .substring(open + 1, colon));
                    }
                    if (def > -1) {
                        if (!(colon < def && def < close)) {
                            throw new IllegalArgumentException();
                        }
                        newElement.key = .substring(colon + 1, def);
                        newElement.defaultValue = .substring(def + 1, close);
                    } else {
                        newElement.key = .substring(colon + 1, close);
                    }
                    pos = close + 1;
                    elements.add(newElement);
                }
            } else {
                // %: back reference to condition or server variable
                if (percentPos + 1 == .length()) {
                    throw new IllegalArgumentException();
                }
                if (pos < percentPos) {
                    // Static text
                    StaticElement newElement = new StaticElement();
                    newElement.value = .substring(pospercentPos);
                    pos = percentPos;
                    elements.add(newElement);
                }
                if (Character.isDigit(.charAt(percentPos + 1))) {
                    // %: back reference to condition
                    RewriteCondBackReferenceElement newElement = new RewriteCondBackReferenceElement();
                    newElement.n = Character.digit(.charAt(percentPos + 1), 10);
                    pos = percentPos + 2;
                    elements.add(newElement);
                } else {
                    // %: server variable as %{variable}
                    SubstitutionElement newElement = null;
                    int open = .indexOf('{'percentPos);
                    int colon = .indexOf(':'percentPos);
                    int close = .indexOf('}'percentPos);
                    if (!(-1 < open && open < close)) {
                        throw new IllegalArgumentException();
                    }
                    if (colon > -1) {
                        if (!(open < colon && colon < close)) {
                            throw new IllegalArgumentException();
                        }
                        String type = .substring(open + 1, colon);
                        if (type.equals("ENV")) {
                            newElement = new ServerVariableEnvElement();
                            ((ServerVariableEnvElementnewElement). = .substring(colon + 1, close);
                        } else if (type.equals("SSL")) {
                            newElement = new ServerVariableSslElement();
                            ((ServerVariableSslElementnewElement). = .substring(colon + 1, close);
                        } else if (type.equals("HTTP")) {
                            newElement = new ServerVariableHttpElement();
                            ((ServerVariableHttpElementnewElement). = .substring(colon + 1, close);
                        } else {
                            throw new IllegalArgumentException( + ": Bad type: " + type);
                        }
                    } else {
                        newElement = new ServerVariableElement();
                        ((ServerVariableElementnewElement). = .substring(open + 1, close);
                    }
                    pos = close + 1;
                    elements.add(newElement);
                }
            }
        }
        
        this. = (SubstitutionElement[]) elements.toArray(new SubstitutionElement[0]);
        
    }
    
    
Evaluate the substitution based on the context

Parameters:
rule corresponding matched rule
cond last matched condition
Returns:
    public String evaluate(Matcher ruleMatcher condResolver resolver) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < .i++) {
            buf.append([i].evaluate(rulecondresolver));
        }
        return buf.toString();
    }
New to GrepCode? Check out our FAQ X