View Javadoc

1   // ========================================================================
2   // Copyright 2007 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // Licensed under the Apache License, Version 2.0 (the "License");
5   // you may not use this file except in compliance with the License.
6   // You may obtain a copy of the License at 
7   // http://www.apache.org/licenses/LICENSE-2.0
8   // Unless required by applicable law or agreed to in writing, software
9   // distributed under the License is distributed on an "AS IS" BASIS,
10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  // See the License for the specific language governing permissions and
12  // limitations under the License.
13  //========================================================================
14  
15  package org.mortbay.cometd.filter;
16  
17  import java.lang.reflect.Array;
18  import java.util.regex.Pattern;
19  
20  
21  /**
22   * @author gregw
23   *
24   */
25  public class RegexFilter extends JSONDataFilter
26  {
27      String[] _templates;
28      String[] _replaces;
29      
30      transient Pattern[] _patterns;
31      
32      /**
33       * Assumes the init object is an Array of 2 element Arrays:  [regex,replacement].
34       * if the regex replacement string is null, then an IllegalStateException is thrown if
35       * the pattern matches.
36       */
37      @Override
38  	public void init(Object init)
39      {
40          super.init(init);
41          
42          _templates=new String[Array.getLength(init)];
43          _replaces=new String[_templates.length];
44  
45          for (int i=0;i<_templates.length;i++)
46          {
47              Object entry = Array.get(init,i);
48              _templates[i]=(String)Array.get(entry,0);
49              _replaces[i]=(String)Array.get(entry,1);
50          }
51          
52          checkPatterns();
53      }
54      
55      private void checkPatterns()
56      {
57          // TODO replace this check with a terracotta transient init clause
58          synchronized(this)
59          {
60              if (_patterns==null)
61              {
62                  _patterns=new Pattern[_templates.length];
63                  for (int i=0;i<_patterns.length;i++)
64                  {
65                      _patterns[i]=Pattern.compile(_templates[i]);
66                  }
67              }
68          }
69      }
70  
71      @Override
72  	protected Object filterString(String string)
73      {
74          checkPatterns();
75          
76          for (int i=0;i<_patterns.length;i++)
77          {
78              if (_replaces[i]!=null)
79                  string=_patterns[i].matcher(string).replaceAll(_replaces[i]);
80              else if (_patterns[i].matcher(string).matches())
81                  throw new IllegalStateException("matched "+_patterns[i]+" in "+string);
82          }
83          return string;
84      }
85  }