001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.builder;
018    
019    import java.util.ArrayList;
020    import java.util.Comparator;
021    import java.util.List;
022    
023    import org.apache.camel.Exchange;
024    import org.apache.camel.Expression;
025    import org.apache.camel.Predicate;
026    import org.apache.camel.util.ExpressionToPredicateAdapter;
027    
028    /**
029     * A builder of expressions or predicates based on values.
030     * 
031     * @version 
032     */
033    public class ValueBuilder implements Expression, Predicate {
034        private Expression expression;
035        private boolean not;
036    
037        public ValueBuilder(Expression expression) {
038            this.expression = expression;
039        }
040    
041        @Override
042        public <T> T evaluate(Exchange exchange, Class<T> type) {
043            return expression.evaluate(exchange, type);
044        }
045    
046        @Override
047        public boolean matches(Exchange exchange) {
048            return PredicateBuilder.toPredicate(getExpression()).matches(exchange);
049        }
050    
051        public Expression getExpression() {
052            return expression;
053        }
054    
055        @Override
056        public String toString() {
057            return expression.toString();
058        }
059    
060        // Predicate builders
061        // -------------------------------------------------------------------------
062    
063        public Predicate matches(Expression expression) {
064            return onNewPredicate(ExpressionToPredicateAdapter.toPredicate(expression));
065        }
066    
067        public ExpressionClause<Predicate> matches() {
068            return new ExpressionClause<Predicate>(onNewPredicate(ExpressionToPredicateAdapter.toPredicate(expression))); 
069        }
070    
071        public Predicate isNotEqualTo(Object value) {
072            Expression right = asExpression(value);
073            return onNewPredicate(PredicateBuilder.isNotEqualTo(expression, right));
074        }
075    
076        public Predicate isEqualTo(Object value) {
077            Expression right = asExpression(value);
078            return onNewPredicate(PredicateBuilder.isEqualTo(expression, right));
079        }
080    
081        public Predicate isLessThan(Object value) {
082            Expression right = asExpression(value);
083            return onNewPredicate(PredicateBuilder.isLessThan(expression, right));
084        }
085    
086        public Predicate isLessThanOrEqualTo(Object value) {
087            Expression right = asExpression(value);
088            return onNewPredicate(PredicateBuilder.isLessThanOrEqualTo(expression, right));
089        }
090    
091        public Predicate isGreaterThan(Object value) {
092            Expression right = asExpression(value);
093            return onNewPredicate(PredicateBuilder.isGreaterThan(expression, right));
094        }
095    
096        public Predicate isGreaterThanOrEqualTo(Object value) {
097            Expression right = asExpression(value);
098            return onNewPredicate(PredicateBuilder.isGreaterThanOrEqualTo(expression, right));
099        }
100    
101        public Predicate isInstanceOf(Class<?> type) {
102            return onNewPredicate(PredicateBuilder.isInstanceOf(expression, type));
103        }
104    
105        public Predicate isNull() {
106            return onNewPredicate(PredicateBuilder.isNull(expression));
107        }
108    
109        public Predicate isNotNull() {
110            return onNewPredicate(PredicateBuilder.isNotNull(expression));
111        }
112       
113        public Predicate not(Predicate predicate) {
114            return onNewPredicate(PredicateBuilder.not(predicate));
115        }
116    
117        public Predicate in(Object... values) {
118            List<Predicate> predicates = new ArrayList<Predicate>();
119            for (Object value : values) {
120                Expression right = asExpression(value);
121                right = ExpressionBuilder.convertToExpression(right, expression);
122                Predicate predicate = onNewPredicate(PredicateBuilder.isEqualTo(expression, right));
123                predicates.add(predicate);
124            }
125            return in(predicates.toArray(new Predicate[predicates.size()]));
126        }
127    
128        public Predicate in(Predicate... predicates) {
129            return onNewPredicate(PredicateBuilder.in(predicates));
130        }
131    
132        public Predicate startsWith(Object value) {
133            Expression right = asExpression(value);
134            return onNewPredicate(PredicateBuilder.startsWith(expression, right));
135        }
136    
137        public Predicate endsWith(Object value) {
138            Expression right = asExpression(value);
139            return onNewPredicate(PredicateBuilder.endsWith(expression, right));
140        }
141    
142        /**
143         * Create a predicate that the left hand expression contains the value of
144         * the right hand expression
145         * 
146         * @param value the element which is compared to be contained within this
147         *                expression
148         * @return a predicate which evaluates to true if the given value expression
149         *         is contained within this expression value
150         */
151        public Predicate contains(Object value) {
152            Expression right = asExpression(value);
153            return onNewPredicate(PredicateBuilder.contains(expression, right));
154        }
155    
156        /**
157         * Creates a predicate which is true if this expression matches the given
158         * regular expression
159         * 
160         * @param regex the regular expression to match
161         * @return a predicate which evaluates to true if the expression matches the
162         *         regex
163         */
164        public Predicate regex(String regex) {
165            return onNewPredicate(PredicateBuilder.regex(expression, regex));
166        }
167    
168        // Expression builders
169        // -------------------------------------------------------------------------
170    
171        public ValueBuilder tokenize() {
172            return tokenize("\n");
173        }
174    
175        public ValueBuilder tokenize(String token) {
176            Expression newExp = ExpressionBuilder.tokenizeExpression(expression, token);
177            return new ValueBuilder(newExp);
178        }
179    
180        public ValueBuilder tokenizeXML(String tagName, String inheritNamespaceTagName) {
181            Expression newExp = ExpressionBuilder.tokenizeXMLExpression(tagName, inheritNamespaceTagName);
182            return new ValueBuilder(newExp);
183        }
184    
185        public ValueBuilder tokenizePair(String startToken, String endToken, boolean includeTokens) {
186            Expression newExp = ExpressionBuilder.tokenizePairExpression(startToken, endToken, includeTokens);
187            return new ValueBuilder(newExp);
188        }
189    
190        /**
191         * Tokenizes the string conversion of this expression using the given
192         * regular expression
193         */
194        public ValueBuilder regexTokenize(String regex) {
195            Expression newExp = ExpressionBuilder.regexTokenizeExpression(expression, regex);
196            return new ValueBuilder(newExp);
197        }
198    
199        /**
200         * Replaces all occurrences of the regular expression with the given
201         * replacement
202         */
203        public ValueBuilder regexReplaceAll(String regex, String replacement) {
204            Expression newExp = ExpressionBuilder.regexReplaceAll(expression, regex, replacement);
205            return new ValueBuilder(newExp);
206        }
207    
208        /**
209         * Replaces all occurrences of the regular expression with the given
210         * replacement
211         */
212        public ValueBuilder regexReplaceAll(String regex, Expression replacement) {
213            Expression newExp = ExpressionBuilder.regexReplaceAll(expression, regex, replacement);
214            return new ValueBuilder(newExp);
215        }
216    
217        /**
218         * Converts the current value to the given type using the registered type
219         * converters
220         * 
221         * @param type the type to convert the value to
222         * @return the current builder
223         */
224        public ValueBuilder convertTo(Class<?> type) {
225            Expression newExp = ExpressionBuilder.convertToExpression(expression, type);
226            return new ValueBuilder(newExp);
227        }
228    
229        /**
230         * Converts the current value to a String using the registered type converters
231         * 
232         * @return the current builder
233         */
234        public ValueBuilder convertToString() {
235            return convertTo(String.class);
236        }
237    
238        /**
239         * Appends the string evaluation of this expression with the given value
240         *
241         * @param value the value or expression to append
242         * @return the current builder
243         */
244        public ValueBuilder append(Object value) {
245            return new ValueBuilder(ExpressionBuilder.append(expression, asExpression(value)));
246        }
247    
248        /**
249         * Prepends the string evaluation of this expression with the given value
250         *
251         * @param value the value or expression to prepend
252         * @return the current builder
253         */
254        public ValueBuilder prepend(Object value) {
255            return new ValueBuilder(ExpressionBuilder.prepend(expression, asExpression(value)));
256        }
257    
258        /**
259         * Sorts the current value using the given comparator. The current value must be convertable
260         * to a {@link List} to allow sorting using the comparator.
261         *
262         * @param comparator  the comparator used by sorting
263         * @return the current builder
264         */
265        public ValueBuilder sort(Comparator<?> comparator) {
266            Expression newExp = ExpressionBuilder.sortExpression(expression, comparator);
267            return new ValueBuilder(newExp);
268        }
269    
270        /**
271         * Negates the built expression.
272         *
273         * @return the current builder
274         */
275        public ValueBuilder not() {
276            not = true;
277            return this;
278        }
279    
280        // Implementation methods
281        // -------------------------------------------------------------------------
282    
283        /**
284         * A strategy method to allow derived classes to deal with the newly created
285         * predicate in different ways
286         */
287        protected Predicate onNewPredicate(Predicate predicate) {
288            if (not) {
289                return PredicateBuilder.not(predicate);
290            } else {
291                return predicate;
292            }
293        }
294    
295        protected Expression asExpression(Object value) {
296            if (value instanceof Expression) {
297                return (Expression)value;
298            } else {
299                return ExpressionBuilder.constantExpression(value);
300            }
301        }
302    }