MatchesFunction.java
01 /**
02  * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03  */
04 package net.sourceforge.pmd.lang.xpath;
05 
06 import java.util.List;
07 import java.util.regex.Matcher;
08 import java.util.regex.Pattern;
09 
10 import net.sourceforge.pmd.lang.ast.xpath.Attribute;
11 
12 import org.jaxen.Context;
13 import org.jaxen.Function;
14 import org.jaxen.FunctionCallException;
15 import org.jaxen.SimpleFunctionContext;
16 import org.jaxen.XPathFunctionContext;
17 
18 // FIXME Can this function be extended to work on non-AST attributes?
19 public class MatchesFunction implements Function {
20 
21     public static void registerSelfInSimpleContext() {
22         // see http://jaxen.org/extensions.html
23         ((SimpleFunctionContextXPathFunctionContext.getInstance()).registerFunction(null, "matches"new MatchesFunction());
24     }
25 
26     public Object call(Context context, List argsthrows FunctionCallException {
27         if (args.isEmpty()) {
28             return Boolean.FALSE;
29         }
30         List attributes = (Listargs.get(0);
31         Attribute attr = (Attributeattributes.get(0);
32 
33         for(int i = 1; i < args.size(); i++) {
34             Pattern check = Pattern.compile((Stringargs.get(i));
35             Matcher matcher = check.matcher(attr.getStringValue());
36             if (matcher.find()) {
37                 return context.getNodeSet();
38             }
39         }
40         return Boolean.FALSE;
41     }
42 
43     public static boolean matches(String s, String... patterns) {
44   for (String pattern: patterns) {
45             Pattern check = Pattern.compile(pattern);
46             Matcher matcher = check.matcher(s);
47             if (matcher.find()) {
48           return true;
49             }
50         }
51         return false;
52     }
53 }