1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.log4j;
19  
20  import org.apache.log4j.util.Filter;
21  
22  /**
23   * This class switches MDC values into the order
24   * (unreasonably) expected by the witness files.
25   */
26  public class MDCOrderFilter implements Filter {
27  
28      /**
29       * Unexpected orders of keys.
30       * Note expected values are "va-one-one" and "va-one-two".
31       */
32    private static final String[] patterns =
33            new String[] {
34                    "{key2,va12}{key1,va11}",
35                    "{key2,value2}{key1,value1}"
36            };
37  
38      /**
39       * Replacement values.
40       */
41    private static final String[] replacements =
42              new String[] {
43                      "{key1,va11}{key2,va12}",
44                      "{key1,value1}{key2,value2}"
45              };
46  
47    /**
48     *  Switch order of MDC keys when not in expected order.
49     */
50    public String filter(final String in) {
51      if (in == null) {
52        return null;
53      }
54  
55      for(int i = 0; i < patterns.length; i++) {
56          int ipos = in.indexOf(patterns[i]);
57          if (ipos >= 1) {
58              return in.substring(0, ipos)
59                      + replacements[i]
60                      + in.substring(ipos + patterns[i].length());
61          }
62      }
63      return in;
64    }
65  }