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 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 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 WHERE_REGEX = "\\s*(\\S*)\\s*(=|>|<|!=|<>|>=|<=)\\s*'??([^']*)'??"; 27 private static final String WHERE_PREFIX = "WHERE"; 28 29 public SimpleSelector(String sz) 30 throws InvalidSelectorException 31 { 32 sz = sz.trim(); 33 34 if (sz.toUpperCase().startsWith(WHERE_PREFIX)) 36 sz = sz.substring(WHERE_PREFIX.length()); 37 38 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 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 value = null; 66 67 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 toString() 101 { 102 return property + " " + (operator == EQUALS ? "=" : "!=") + " " + scalar; 103 } 104 } 105 | Popular Tags |