KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > ubermq > jms > common > routing > impl > SimpleSelector


1 package com.ubermq.jms.common.routing.impl;
2
3
4 import com.ubermq.jms.common.datagram.*;
5 import com.ubermq.jms.common.routing.*;
6 import java.util.regex.*;
7 import javax.jms.*;
8
9 /**
10  * A VERY trivial implementation of message selectors.
11  * we only support "property = scalar" or "property != scalar".
12  * <P>
13  *
14  * This should really be replaced with something that is more complete.
15  */

16 public class SimpleSelector
17     implements Selector
18 {
19     private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(SimpleSelector.class);
20     
21     private String JavaDoc property, scalar;
22     private int operator;
23     private boolean valid;
24
25     private static final int EQUALS = 0, GREATER = 1, LESS = 2, NOTEQUAL = 3, GREATER_EQUAL = 4, LESS_EQUAL = 5;
26     public static final String JavaDoc WHERE_REGEX = "\\s*(\\S*)\\s*(=|>|<|!=|<>|>=|<=)\\s*'??([^']*)'??";
27     private static final String JavaDoc WHERE_PREFIX = "WHERE";
28
29     public SimpleSelector(String JavaDoc sz)
30         throws InvalidSelectorException
31     {
32         sz = sz.trim();
33         
34         // HACK: eliminate leading WHERE...
35
if (sz.toUpperCase().startsWith(WHERE_PREFIX))
36             sz = sz.substring(WHERE_PREFIX.length());
37         
38         // parse the string.
39
Pattern p = Pattern.compile(WHERE_REGEX, Pattern.CASE_INSENSITIVE);
40         Matcher m = p.matcher(sz);
41
42         if (m.matches()) {
43             property = m.group(1);
44             scalar = m.group(3);
45
46             String JavaDoc op = m.group(2);
47             if (op.equals("=")) operator = EQUALS;
48             else if (op.equals("<>") || op.equals("!=")) operator = NOTEQUAL;
49             else
50                 throw new InvalidSelectorException("Unsupported operator: " + op);
51
52             if (scalar.equalsIgnoreCase("NULL"))
53                 scalar = null;
54
55             valid = true;
56         }
57         else
58         {
59             throw new InvalidSelectorException("Unparseable selector: " + sz);
60         }
61     }
62
63     public boolean accept(IMessageDatagram msg)
64     {
65         Object JavaDoc value = null;
66
67         // if we are not valid, return false for everything.
68
if (!valid) return false;
69
70         if (property.equals("JMSDeliveryMode")) {
71             value = msg.getStandardProperty(IMessageDatagram.STDPROP_DELIVERYMODE);
72         } else if (property.equals("JMSPriority")) {
73             value = msg.getStandardProperty(IMessageDatagram.STDPROP_PRIORITY);
74         } else if (property.equals("JMSMessageID")) {
75             value = msg.getMessageId();
76         } else if (property.equals("JMSTimestamp")) {
77             value = msg.getStandardProperty(IMessageDatagram.STDPROP_TIMESTAMP);
78         } else if (property.equals("JMSCorrelationID")) {
79             value = msg.getStandardProperty(IMessageDatagram.STDPROP_CORRELATIONID);
80         } else {
81             value = msg.getCustomProperty(property);
82         }
83
84         log.debug("selector condition: " + this + ", incoming value is " + value);
85
86         if (value == null || scalar == null) {
87             return (value == null && scalar == null && operator == EQUALS);
88         } else {
89             switch(operator) {
90                 case EQUALS:
91                     return (value.toString().equals(scalar));
92                 case NOTEQUAL:
93                     return !(value.toString().equals(scalar));
94                 default:
95                     return false;
96             }
97         }
98     }
99
100     public String JavaDoc toString()
101     {
102         return property + " " + (operator == EQUALS ? "=" : "!=") + " " + scalar;
103     }
104 }
105
Popular Tags