001    /**
002     *   GRANITE DATA SERVICES
003     *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004     *
005     *   This file is part of the Granite Data Services Platform.
006     *
007     *   Granite Data Services is free software; you can redistribute it and/or
008     *   modify it under the terms of the GNU Lesser General Public
009     *   License as published by the Free Software Foundation; either
010     *   version 2.1 of the License, or (at your option) any later version.
011     *
012     *   Granite Data Services is distributed in the hope that it will be useful,
013     *   but WITHOUT ANY WARRANTY; without even the implied warranty of
014     *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015     *   General Public License for more details.
016     *
017     *   You should have received a copy of the GNU Lesser General Public
018     *   License along with this library; if not, write to the Free Software
019     *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020     *   USA, or see <http://www.gnu.org/licenses/>.
021     */
022    package org.granite.gravity.selector;
023    
024    import java.math.BigDecimal;
025    
026    import javax.jms.JMSException;
027    
028    /**
029     * Represents a constant expression
030     *
031     * @version $Revision: 1.2 $
032     */
033    public class ConstantExpression implements Expression {
034    
035        static class BooleanConstantExpression extends ConstantExpression implements BooleanExpression {
036            public BooleanConstantExpression(Object value) {
037                super(value);
038            }
039            public boolean matches(MessageEvaluationContext message) throws JMSException {
040                Object object = evaluate(message);
041                return object!=null && object==Boolean.TRUE;
042            }
043        }
044    
045        public static final BooleanConstantExpression NULL = new BooleanConstantExpression(null);
046        public static final BooleanConstantExpression TRUE = new BooleanConstantExpression(Boolean.TRUE);
047        public static final BooleanConstantExpression FALSE = new BooleanConstantExpression(Boolean.FALSE);
048    
049        private Object value;
050    
051        public static ConstantExpression createFromDecimal(String text) {
052    
053            // Strip off the 'l' or 'L' if needed.
054            if( text.endsWith("l") || text.endsWith("L") )
055                text = text.substring(0, text.length()-1);
056    
057            Number value;
058            try {
059                value = new Long(text);
060            } catch ( NumberFormatException e) {
061                // The number may be too big to fit in a long.
062                value = new BigDecimal(text);
063            }
064    
065            long l = value.longValue();
066            if (Integer.MIN_VALUE <= l && l <= Integer.MAX_VALUE) {
067                value = new Integer(value.intValue());
068            }
069            return new ConstantExpression(value);
070        }
071    
072        public static ConstantExpression createFromHex(String text) {
073            Number value = new Long(Long.parseLong(text.substring(2), 16));
074            long l = value.longValue();
075            if (Integer.MIN_VALUE <= l && l <= Integer.MAX_VALUE) {
076                value = new Integer(value.intValue());
077            }
078            return new ConstantExpression(value);
079        }
080    
081        public static ConstantExpression createFromOctal(String text) {
082            Number value = new Long(Long.parseLong(text, 8));
083            long l = value.longValue();
084            if (Integer.MIN_VALUE <= l && l <= Integer.MAX_VALUE) {
085                value = new Integer(value.intValue());
086            }
087            return new ConstantExpression(value);
088        }
089    
090        public static ConstantExpression createFloat(String text) {
091            Number value = new Double(text);
092            return new ConstantExpression(value);
093        }
094    
095        public ConstantExpression(Object value) {
096            this.value = value;
097        }
098    
099        public Object evaluate(MessageEvaluationContext message) throws JMSException {
100            return value;
101        }
102    
103        public Object getValue() {
104            return value;
105        }
106    
107        /**
108         * @see java.lang.Object#toString()
109         */
110        @Override
111        public String toString() {
112            if (value == null) {
113                return "NULL";
114            }
115            if (value instanceof Boolean) {
116                return ((Boolean) value).booleanValue() ? "TRUE" : "FALSE";
117            }
118            if (value instanceof String) {
119                return encodeString((String) value);
120            }
121            return value.toString();
122        }
123    
124        /**
125         * TODO: more efficient hashCode()
126         *
127         * @see java.lang.Object#hashCode()
128         */
129        @Override
130        public int hashCode() {
131            return toString().hashCode();
132        }
133    
134        /**
135         * TODO: more efficient hashCode()
136         *
137         * @see java.lang.Object#equals(java.lang.Object)
138         */
139        @Override
140        public boolean equals(Object o) {
141    
142            if (o == null || !this.getClass().equals(o.getClass())) {
143                return false;
144            }
145            return toString().equals(o.toString());
146    
147        }
148    
149    
150        /**
151         * Encodes the value of string so that it looks like it would look like
152         * when it was provided in a selector.
153         *
154         * @param s the string to encode
155         * @return the encoded string
156         */
157        public static String encodeString(String s) {
158            StringBuffer b = new StringBuffer();
159            b.append('\'');
160            for (int i = 0; i < s.length(); i++) {
161                char c = s.charAt(i);
162                if (c == '\'') {
163                    b.append(c);
164                }
165                b.append(c);
166            }
167            b.append('\'');
168            return b.toString();
169        }
170    
171    }