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.Arrays;
021    import java.util.List;
022    
023    import org.apache.camel.CamelContext;
024    import org.apache.camel.Endpoint;
025    import org.apache.camel.Expression;
026    import org.apache.camel.LoggingLevel;
027    import org.apache.camel.NoSuchEndpointException;
028    import org.apache.camel.builder.xml.XPathBuilder;
029    import org.apache.camel.model.ModelCamelContext;
030    import org.apache.camel.model.language.HeaderExpression;
031    import org.apache.camel.model.language.MethodCallExpression;
032    import org.apache.camel.model.language.PropertyExpression;
033    import org.apache.camel.util.ObjectHelper;
034    import org.slf4j.Logger;
035    import org.slf4j.LoggerFactory;
036    
037    /**
038     * Base class for implementation inheritance for different clauses in the <a
039     * href="http://camel.apache.org/dsl.html">Java DSL</a>
040     *
041     * @version 
042     */
043    public abstract class BuilderSupport {
044        private ModelCamelContext context;
045        private ErrorHandlerBuilder errorHandlerBuilder;
046    
047        protected BuilderSupport() {
048        }
049    
050        protected BuilderSupport(CamelContext context) {
051            this.context = (ModelCamelContext)context;
052        }
053    
054        // Builder methods
055        // -------------------------------------------------------------------------
056    
057        /**
058         * Returns a value builder for the given header
059         */
060        public ValueBuilder header(String name) {
061            HeaderExpression expression = new HeaderExpression(name);
062            return new ValueBuilder(expression);
063        }
064    
065        /**
066         * Returns a value builder for the given property
067         */
068        public ValueBuilder property(String name) {
069            PropertyExpression expression = new PropertyExpression(name);
070            return new ValueBuilder(expression);
071        }
072        
073        /**
074         * Returns a predicate and value builder for the inbound body on an exchange
075         */
076        public ValueBuilder body() {
077            return Builder.body();
078        }
079    
080        /**
081         * Returns a predicate and value builder for the inbound message body as a
082         * specific type
083         */
084        public <T> ValueBuilder body(Class<T> type) {
085            return Builder.bodyAs(type);
086        }
087    
088        /**
089         * Returns a predicate and value builder for the outbound body on an
090         * exchange
091         */
092        public ValueBuilder outBody() {
093            return Builder.outBody();
094        }
095    
096        /**
097         * Returns a predicate and value builder for the outbound message body as a
098         * specific type
099         */
100        public <T> ValueBuilder outBody(Class<T> type) {
101            return Builder.outBodyAs(type);
102        }
103    
104        /**
105         * Returns a predicate and value builder for the fault body on an
106         * exchange
107         */
108        public ValueBuilder faultBody() {
109            return Builder.faultBody();
110        }
111    
112        /**
113         * Returns a predicate and value builder for the fault message body as a
114         * specific type
115         */
116        public <T> ValueBuilder faultBodyAs(Class<T> type) {
117            return Builder.faultBodyAs(type);
118        }
119                                 
120        /**
121         * Returns a value builder for the given system property
122         */
123        public ValueBuilder systemProperty(String name) {
124            return Builder.systemProperty(name);
125        }
126    
127        /**
128         * Returns a value builder for the given system property
129         */
130        public ValueBuilder systemProperty(String name, String defaultValue) {
131            return Builder.systemProperty(name, defaultValue);
132        }
133    
134        /**
135         * Returns a constant expression value builder
136         */
137        public ValueBuilder constant(Object value) {
138            return Builder.constant(value);
139        }
140    
141        /**
142         * Returns a language expression value builder
143         */
144        public ValueBuilder language(String language, String expression) {
145            return Builder.language(language, expression);
146        }
147    
148        /**
149         * Returns a simple expression value builder
150         */
151        public SimpleBuilder simple(String value) {
152            return SimpleBuilder.simple(value);
153        }
154        
155        /**
156         * Returns a simple expression value builder
157         */
158        public SimpleBuilder simple(String value, Class<?> resultType) {
159            return SimpleBuilder.simple(value, resultType);
160        }
161    
162        /**
163         * Returns a xpath expression value builder
164         * @param value The XPath expression
165         * @return A new XPathBuilder object
166         */
167        public XPathBuilder xpath(String value) {
168            return XPathBuilder.xpath(value);
169        }
170        
171        /**
172         * Returns a xpath expression value builder
173         * @param value The XPath expression
174         * @param resultType The result type that the XPath expression will return.
175         * @return A new XPathBuilder object
176         */
177        public static XPathBuilder xpath(String value, Class<?> resultType) {
178            return XPathBuilder.xpath(value, resultType);
179        }
180    
181        /**
182         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
183         * value builder
184         * <p/>
185         * This method accepts dual parameters. Either an bean instance or a reference to a bean (String).
186         *
187         * @param beanOrBeanRef  either an instanceof a bean or a reference to bean to lookup in the Registry
188         * @return the builder
189         * @deprecated use {@link #method(Object)} instead
190         */
191        @Deprecated
192        public ValueBuilder bean(Object beanOrBeanRef) {
193            return bean(beanOrBeanRef, null);
194        }
195        
196        /**
197         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
198         * value builder
199         * <p/>
200         * This method accepts dual parameters. Either an bean instance or a reference to a bean (String).
201         *
202         * @param beanOrBeanRef  either an instanceof a bean or a reference to bean to lookup in the Registry
203         * @param method   name of method to invoke
204         * @return the builder
205         * @deprecated use {@link #method(Object, String)} instead
206         */
207        @Deprecated
208        public ValueBuilder bean(Object beanOrBeanRef, String method) {
209            MethodCallExpression expression;
210            if (beanOrBeanRef instanceof String) {
211                expression = new MethodCallExpression((String) beanOrBeanRef, method);
212            } else {
213                expression = new MethodCallExpression(beanOrBeanRef, method);
214            }
215            return new ValueBuilder(expression);
216        }
217    
218        /**
219         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
220         * value builder
221         *
222         * @param beanType the Class of the bean which we want to invoke
223         * @return the builder
224         * @deprecated use {@link #method(Class)} instead
225         */
226        @Deprecated
227        public ValueBuilder bean(Class<?> beanType) {
228            MethodCallExpression expression = new MethodCallExpression(beanType);
229            return new ValueBuilder(expression);
230        }
231        
232        /**
233         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
234         * value builder
235         *
236         * @param beanType the Class of the bean which we want to invoke
237         * @param method   name of method to invoke
238         * @return the builder
239         * @deprecated use {@link #method(Class, String)} instead
240         */
241        @Deprecated
242        public ValueBuilder bean(Class<?> beanType, String method) {
243            MethodCallExpression expression = new MethodCallExpression(beanType, method);
244            return new ValueBuilder(expression);
245        }
246    
247        /**
248         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
249         * value builder
250         * <p/>
251         * This method accepts dual parameters. Either an bean instance or a reference to a bean (String).
252         *
253         * @param beanOrBeanRef  either an instanceof a bean or a reference to bean to lookup in the Registry
254         * @return the builder
255         */
256        public ValueBuilder method(Object beanOrBeanRef) {
257            return method(beanOrBeanRef, null);
258        }
259    
260        /**
261         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
262         * value builder
263         * <p/>
264         * This method accepts dual parameters. Either an bean instance or a reference to a bean (String).
265         *
266         * @param beanOrBeanRef  either an instanceof a bean or a reference to bean to lookup in the Registry
267         * @param method   name of method to invoke
268         * @return the builder
269         */
270        public ValueBuilder method(Object beanOrBeanRef, String method) {
271            MethodCallExpression expression;
272            if (beanOrBeanRef instanceof String) {
273                expression = new MethodCallExpression((String) beanOrBeanRef, method);
274            } else {
275                expression = new MethodCallExpression(beanOrBeanRef, method);
276            }
277            return new ValueBuilder(expression);
278        }
279    
280        /**
281         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
282         * value builder
283         *
284         * @param beanType the Class of the bean which we want to invoke
285         * @return the builder
286         */
287        public ValueBuilder method(Class<?> beanType) {
288            MethodCallExpression expression = new MethodCallExpression(beanType);
289            return new ValueBuilder(expression);
290        }
291    
292        /**
293         * Returns a <a href="http://camel.apache.org/bean-language.html">method call expression</a>
294         * value builder
295         *
296         * @param beanType the Class of the bean which we want to invoke
297         * @param method   name of method to invoke
298         * @return the builder
299         */
300        public ValueBuilder method(Class<?> beanType, String method) {
301            MethodCallExpression expression = new MethodCallExpression(beanType, method);
302            return new ValueBuilder(expression);
303        }
304    
305        /**
306         * Returns an expression processing the exchange to the given endpoint uri
307         *
308         * @param uri endpoint uri to send the exchange to
309         * @return the builder
310         */
311        public ValueBuilder sendTo(String uri) {
312            return Builder.sendTo(uri);
313        }
314    
315        /**
316         * Returns an expression value builder that replaces all occurrences of the 
317         * regular expression with the given replacement
318         */
319        public ValueBuilder regexReplaceAll(Expression content, String regex, String replacement) {
320            return Builder.regexReplaceAll(content, regex, replacement);
321        }
322    
323        /**
324         * Returns an expression value builder that replaces all occurrences of the 
325         * regular expression with the given replacement
326         */
327        public ValueBuilder regexReplaceAll(Expression content, String regex, Expression replacement) {
328            return Builder.regexReplaceAll(content, regex, replacement);
329        }    
330        
331        /**
332         * Returns a exception expression value builder
333         */
334        public ValueBuilder exceptionMessage() {
335            return Builder.exceptionMessage();
336        }
337    
338        /**
339         * Resolves the given URI to an endpoint
340         *
341         * @param uri  the uri to resolve
342         * @throws NoSuchEndpointException if the endpoint URI could not be resolved
343         * @return the endpoint
344         */
345        public Endpoint endpoint(String uri) throws NoSuchEndpointException {
346            ObjectHelper.notNull(uri, "uri");
347            Endpoint endpoint = getContext().getEndpoint(uri);
348            if (endpoint == null) {
349                throw new NoSuchEndpointException(uri);
350            }
351            return endpoint;
352        }
353    
354        /**
355         * Resolves the given URI to an endpoint of the specified type
356         *
357         * @param uri  the uri to resolve
358         * @param type the excepted type of the endpoint
359         * @throws NoSuchEndpointException if the endpoint URI could not be resolved
360         * @return the endpoint
361         */
362        public <T extends Endpoint> T endpoint(String uri, Class<T> type) throws NoSuchEndpointException {
363            ObjectHelper.notNull(uri, "uri");
364            T endpoint = getContext().getEndpoint(uri, type);
365            if (endpoint == null) {
366                throw new NoSuchEndpointException(uri);
367            }
368            return endpoint;
369        }
370    
371        /**
372         * Resolves the list of URIs into a list of {@link Endpoint} instances
373         *
374         * @param uris  list of endpoints to resolve
375         * @throws NoSuchEndpointException if an endpoint URI could not be resolved
376         * @return list of endpoints
377         */
378        public List<Endpoint> endpoints(String... uris) throws NoSuchEndpointException {
379            List<Endpoint> endpoints = new ArrayList<Endpoint>();
380            for (String uri : uris) {
381                endpoints.add(endpoint(uri));
382            }
383            return endpoints;
384        }
385    
386        /**
387         * Helper method to create a list of {@link Endpoint} instances
388         *
389         * @param endpoints  endpoints
390         * @return list of the given endpoints
391         */
392        public List<Endpoint> endpoints(Endpoint... endpoints) {
393            List<Endpoint> answer = new ArrayList<Endpoint>();
394            answer.addAll(Arrays.asList(endpoints));
395            return answer;
396        }
397    
398        /**
399         * Creates a default <a href="http://camel.apache.org/error-handler.html">error handler</a>.
400         *
401         * @return the builder
402         */
403        public DefaultErrorHandlerBuilder defaultErrorHandler() {
404            return new DefaultErrorHandlerBuilder();
405        }
406    
407        /**
408         * Creates a disabled <a href="http://camel.apache.org/error-handler.html">error handler</a>
409         * for removing the default error handler
410         *
411         * @return the builder
412         */
413        public NoErrorHandlerBuilder noErrorHandler() {
414            return new NoErrorHandlerBuilder();
415        }
416    
417        /**
418         * Creates an <a href="http://camel.apache.org/error-handler.html">error handler</a>
419         * which just logs errors
420         *
421         * @return the builder
422         */
423        public LoggingErrorHandlerBuilder loggingErrorHandler() {
424            return new LoggingErrorHandlerBuilder();
425        }
426    
427        /**
428         * Creates an <a href="http://camel.apache.org/error-handler.html">error handler</a>
429         * which just logs errors
430         *
431         * @return the builder
432         */
433        public LoggingErrorHandlerBuilder loggingErrorHandler(String log) {
434            return loggingErrorHandler(LoggerFactory.getLogger(log));
435        }
436    
437        /**
438         * Creates an <a href="http://camel.apache.org/error-handler.html">error handler</a>
439         * which just logs errors
440         *
441         * @return the builder
442         */
443        public LoggingErrorHandlerBuilder loggingErrorHandler(Logger log) {
444            return new LoggingErrorHandlerBuilder(log);
445        }
446    
447        /**
448         * Creates an <a href="http://camel.apache.org/error-handler.html">error handler</a>
449         * which just logs errors
450         *
451         * @return the builder
452         */
453        public LoggingErrorHandlerBuilder loggingErrorHandler(Logger log, LoggingLevel level) {
454            return new LoggingErrorHandlerBuilder(log, level);
455        }
456    
457        /**
458         * <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel EIP:</a>
459         * is a error handler for handling messages that could not be delivered to it's intended destination.
460         *
461         * @param deadLetterUri  uri to the dead letter endpoint storing dead messages
462         * @return the builder
463         */
464        public DeadLetterChannelBuilder deadLetterChannel(String deadLetterUri) {
465            return deadLetterChannel(endpoint(deadLetterUri));
466        }
467    
468        /**
469         * <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel EIP:</a>
470         * is a error handler for handling messages that could not be delivered to it's intended destination.
471         *
472         * @param deadLetterEndpoint  dead letter endpoint storing dead messages
473         * @return the builder
474         */
475        public DeadLetterChannelBuilder deadLetterChannel(Endpoint deadLetterEndpoint) {
476            return new DeadLetterChannelBuilder(deadLetterEndpoint);
477        }
478    
479        // Properties
480        // -------------------------------------------------------------------------
481    
482        public ModelCamelContext getContext() {
483            return context;
484        }
485        
486        @Deprecated
487        public void setContext(CamelContext context) {
488            this.context = (ModelCamelContext)context;
489        }
490    
491        public void setContext(ModelCamelContext context) {
492            this.context = context;
493        }
494    
495        public ErrorHandlerBuilder getErrorHandlerBuilder() {
496            if (errorHandlerBuilder == null) {
497                errorHandlerBuilder = createErrorHandlerBuilder();
498            }
499            return errorHandlerBuilder;
500        }
501    
502        protected ErrorHandlerBuilder createErrorHandlerBuilder() {
503            return new DefaultErrorHandlerBuilder();
504        }
505    
506        /**
507         * Sets the error handler to use with processors created by this builder
508         */
509        public void setErrorHandlerBuilder(ErrorHandlerBuilder errorHandlerBuilder) {
510            this.errorHandlerBuilder = errorHandlerBuilder;
511        }
512    
513    }