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 * @author gregw
22 *
23 */
24 public class RegexFilter extends JSONDataFilter
25 {
26 String[] _templates;
27 String[] _replaces;
28
29 transient Pattern[] _patterns;
30
31 /**
32 * Assumes the init object is an Array of 2 element Arrays:
33 * [regex,replacement]. if the regex replacement string is null, then an
34 * IllegalStateException is thrown if the pattern matches.
35 */
36 @Override
37 public void init(Object init)
38 {
39 super.init(init);
40
41 _templates=new String[Array.getLength(init)];
42 _replaces=new String[_templates.length];
43
44 for (int i=0; i < _templates.length; i++)
45 {
46 Object entry=Array.get(init,i);
47 _templates[i]=(String)Array.get(entry,0);
48 _replaces[i]=(String)Array.get(entry,1);
49 }
50
51 checkPatterns();
52 }
53
54 private void checkPatterns()
55 {
56 // TODO replace this check with a terracotta transient init clause
57 synchronized(this)
58 {
59 if (_patterns == null)
60 {
61 _patterns=new Pattern[_templates.length];
62 for (int i=0; i < _patterns.length; i++)
63 {
64 _patterns[i]=Pattern.compile(_templates[i]);
65 }
66 }
67 }
68 }
69
70 @Override
71 protected Object filterString(String string)
72 {
73 checkPatterns();
74
75 for (int i=0; i < _patterns.length; i++)
76 {
77 if (_replaces[i] != null)
78 string=_patterns[i].matcher(string).replaceAll(_replaces[i]);
79 else if (_patterns[i].matcher(string).matches())
80 throw new IllegalStateException("matched " + _patterns[i] + " in " + string);
81 }
82 return string;
83 }
84 }