001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 * Copyright 2004 Hiram Chirino
005 *
006 * Licensed under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 *
018 **/
019 package org.activemq.filter;
020
021 import java.math.BigDecimal;
022
023 import javax.jms.JMSException;
024 import javax.jms.Message;
025
026 /**
027 * Represents a constant expression
028 *
029 * @version $Revision: 1.1.1.1 $
030 */
031 public class ConstantExpression implements Expression {
032
033 static class BooleanConstantExpression extends ConstantExpression implements BooleanExpression {
034 public BooleanConstantExpression(Object value) {
035 super(value);
036 }
037 }
038
039 public static final BooleanConstantExpression NULL = new BooleanConstantExpression(null);
040 public static final BooleanConstantExpression TRUE = new BooleanConstantExpression(Boolean.TRUE);
041 public static final BooleanConstantExpression FALSE = new BooleanConstantExpression(Boolean.FALSE);
042
043 private Object value;
044
045 public static ConstantExpression createFromDecimal(String text) {
046
047 // Strip off the 'l' or 'L' if needed.
048 if( text.endsWith("l") || text.endsWith("L") )
049 text = text.substring(0, text.length()-1);
050
051 Number value;
052 try {
053 value = new Long(text);
054 } catch ( NumberFormatException e) {
055 // The number may be too big to fit in a long.
056 value = new BigDecimal(text);
057 }
058
059 long l = value.longValue();
060 if (Integer.MIN_VALUE <= l && l <= Integer.MAX_VALUE) {
061 value = new Integer(value.intValue());
062 }
063 return new ConstantExpression(value);
064 }
065
066 public static ConstantExpression createFromHex(String text) {
067 Number value = new Long(Long.parseLong(text.substring(2), 16));
068 long l = value.longValue();
069 if (Integer.MIN_VALUE <= l && l <= Integer.MAX_VALUE) {
070 value = new Integer(value.intValue());
071 }
072 return new ConstantExpression(value);
073 }
074
075 public static ConstantExpression createFromOctal(String text) {
076 Number value = new Long(Long.parseLong(text, 8));
077 long l = value.longValue();
078 if (Integer.MIN_VALUE <= l && l <= Integer.MAX_VALUE) {
079 value = new Integer(value.intValue());
080 }
081 return new ConstantExpression(value);
082 }
083
084 public static ConstantExpression createFloat(String text) {
085 Number value = new Double(text);
086 return new ConstantExpression(value);
087 }
088
089 public ConstantExpression(Object value) {
090 this.value = value;
091 }
092
093 public Object evaluate(Message message) throws JMSException {
094 return value;
095 }
096
097 public Object getValue() {
098 return value;
099 }
100
101 /**
102 * @see java.lang.Object#toString()
103 */
104 public String toString() {
105 if (value == null) {
106 return "NULL";
107 }
108 if (value instanceof Boolean) {
109 return ((Boolean) value).booleanValue() ? "TRUE" : "FALSE";
110 }
111 if (value instanceof String) {
112 return encodeString((String) value);
113 }
114 return value.toString();
115 }
116
117 /**
118 * TODO: more efficient hashCode()
119 *
120 * @see java.lang.Object#hashCode()
121 */
122 public int hashCode() {
123 return toString().hashCode();
124 }
125
126 /**
127 * TODO: more efficient hashCode()
128 *
129 * @see java.lang.Object#equals(java.lang.Object)
130 */
131 public boolean equals(Object o) {
132
133 if (o == null || !this.getClass().equals(o.getClass())) {
134 return false;
135 }
136 return toString().equals(o.toString());
137
138 }
139
140
141 /**
142 * Encodes the value of string so that it looks like it would look like
143 * when it was provided in a selector.
144 *
145 * @param string
146 * @return
147 */
148 public static String encodeString(String s) {
149 StringBuffer b = new StringBuffer();
150 b.append('\'');
151 for (int i = 0; i < s.length(); i++) {
152 char c = s.charAt(i);
153 if (c == '\'') {
154 b.append(c);
155 }
156 b.append(c);
157 }
158 b.append('\'');
159 return b.toString();
160 }
161 }