001: /* JFox, the OpenSource J2EE Application Server
002: *
003: * Copyright (C) 2002 huihoo.com
004: * Distributable under GNU LGPL license
005: * See the GNU Lesser General Public License for more details.
006: */
007:
008: package org.huihoo.jfox.jmx.queries;
009:
010: import javax.management.QueryEval;
011: import javax.management.QueryExp;
012: import javax.management.AttributeValueExp;
013: import javax.management.StringValueExp;
014: import javax.management.ObjectName;
015: import javax.management.BadStringOperationException;
016: import javax.management.BadBinaryOpValueExpException;
017: import javax.management.BadAttributeValueExpException;
018: import javax.management.InvalidApplicationException;
019: import javax.management.ValueExp;
020:
021: /**
022: *
023: * @author <a href="mailto:young_yy@hotmail.com">Young Yang</a>
024: */
025:
026: public class MatchQueryExp extends QueryEval implements QueryExp {
027:
028: private AttributeValueExp exp;
029: private String pattern;
030:
031: public MatchQueryExp() {
032: }
033:
034: public MatchQueryExp(AttributeValueExp attributevalueexp,
035: StringValueExp stringvalueexp) {
036: exp = attributevalueexp;
037: pattern = stringvalueexp.getValue();
038: }
039:
040: public AttributeValueExp getAttribute() {
041: return exp;
042: }
043:
044: public String getPattern() {
045: return pattern;
046: }
047:
048: public boolean apply(ObjectName objectname)
049: throws BadStringOperationException,
050: BadBinaryOpValueExpException,
051: BadAttributeValueExpException, InvalidApplicationException {
052: ValueExp valueexp = exp.apply(objectname);
053: if (!(valueexp instanceof StringValueExp))
054: return false;
055: else
056: return wildmatch(((StringValueExp) valueexp).getValue(),
057: pattern);
058: }
059:
060: public String toString() {
061: return exp + " like "
062: + new StringValueExp(likeTranslate(pattern));
063: }
064:
065: private static String likeTranslate(String s) {
066: return s.replace('?', '_').replace('*', '%');
067: }
068:
069: private static boolean wildmatch(String s, String s1) {
070: int i = 0;
071: int j = 0;
072: int k = s.length();
073: for (int l = s1.length(); j < l;) {
074: char c = s1.charAt(j++);
075: if (c == '?') {
076: if (++i > k)
077: return false;
078: } else if (c == '[') {
079: boolean flag = true;
080: boolean flag1 = false;
081: if (s1.charAt(j) == '!') {
082: flag = false;
083: j++;
084: }
085: while (++j < l && (c = s1.charAt(j)) != ']')
086: if (s1.charAt(j) == '-' && j + 1 < l) {
087: if (s.charAt(i) >= c
088: && s.charAt(i) <= s1.charAt(j + 1))
089: flag1 = true;
090: j++;
091: } else if (c == s.charAt(i))
092: flag1 = true;
093: if (j >= l || flag != flag1)
094: return false;
095: j++;
096: i++;
097: } else {
098: if (c == '*') {
099: if (j >= l)
100: return true;
101: do
102: if (wildmatch(s.substring(i), s1.substring(j)))
103: return true;
104: while (++i < k);
105: return false;
106: }
107: if (c == '\\') {
108: if (j >= l || s1.charAt(j++) != s.charAt(i++))
109: return false;
110: } else if (i >= k || c != s.charAt(i++))
111: return false;
112: }
113: }
114:
115: return i == k;
116: }
117: }
|