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 org.apache.camel.Expression;
020    import org.apache.camel.Processor;
021    import org.apache.camel.processor.DeadLetterChannel;
022    import org.apache.camel.processor.ErrorHandlerSupport;
023    import org.apache.camel.processor.Logger;
024    import org.apache.camel.processor.LoggingLevel;
025    import org.apache.camel.processor.RecipientList;
026    import org.apache.camel.processor.RedeliveryPolicy;
027    import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;
028    import org.apache.commons.logging.Log;
029    import org.apache.commons.logging.LogFactory;
030    
031    /**
032     * A builder of a <a
033     * href="http://activemq.apache.org/camel/dead-letter-channel.html">Dead Letter
034     * Channel</a>
035     *
036     * @version $Revision: 37863 $
037     */
038    public class DeadLetterChannelBuilder extends ErrorHandlerBuilderSupport {
039        private RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
040        private ExceptionPolicyStrategy exceptionPolicyStrategy = ErrorHandlerSupport.createDefaultExceptionPolicyStrategy();
041        private ProcessorFactory deadLetterFactory;
042        private Processor defaultDeadLetterEndpoint;
043        private Expression defaultDeadLetterEndpointExpression;
044        private String defaultDeadLetterEndpointUri = "log:org.apache.camel.DeadLetterChannel?level=error";
045        private Logger logger = DeadLetterChannel.createDefaultLogger();
046    
047        public DeadLetterChannelBuilder() {
048        }
049    
050        public DeadLetterChannelBuilder(Processor processor) {
051            this(new ConstantProcessorBuilder(processor));
052        }
053    
054        public DeadLetterChannelBuilder(ProcessorFactory deadLetterFactory) {
055            this.deadLetterFactory = deadLetterFactory;
056        }
057    
058        public ErrorHandlerBuilder copy() {
059            DeadLetterChannelBuilder answer = new DeadLetterChannelBuilder(deadLetterFactory);
060            answer.setRedeliveryPolicy(getRedeliveryPolicy().copy());
061            return answer;
062        }
063    
064        public Processor createErrorHandler(Processor processor) throws Exception {
065            Processor deadLetter = getDeadLetterFactory().createProcessor();
066            DeadLetterChannel answer = new DeadLetterChannel(processor, deadLetter, getRedeliveryPolicy(), getLogger(), getExceptionPolicyStrategy());
067            configure(answer);
068            return answer;
069        }
070    
071        // Builder methods
072        // -------------------------------------------------------------------------
073        public DeadLetterChannelBuilder backOffMultiplier(double backOffMultiplier) {
074            getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
075            return this;
076        }
077    
078        public DeadLetterChannelBuilder collisionAvoidancePercent(short collisionAvoidancePercent) {
079            getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
080            return this;
081        }
082    
083        public DeadLetterChannelBuilder initialRedeliveryDelay(long initialRedeliveryDelay) {
084            getRedeliveryPolicy().initialRedeliveryDelay(initialRedeliveryDelay);
085            return this;
086        }
087    
088        public DeadLetterChannelBuilder maximumRedeliveries(int maximumRedeliveries) {
089            getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
090            return this;
091        }
092    
093        public DeadLetterChannelBuilder useCollisionAvoidance() {
094            getRedeliveryPolicy().useCollisionAvoidance();
095            return this;
096        }
097    
098        public DeadLetterChannelBuilder useExponentialBackOff() {
099            getRedeliveryPolicy().useExponentialBackOff();
100            return this;
101        }
102    
103        /**
104         * Sets the logger used for caught exceptions
105         */
106        public DeadLetterChannelBuilder logger(Logger logger) {
107            setLogger(logger);
108            return this;
109        }
110    
111        /**
112         * Sets the logging level of exceptions caught
113         */
114        public DeadLetterChannelBuilder loggingLevel(LoggingLevel level) {
115            getLogger().setLevel(level);
116            return this;
117        }
118    
119        /**
120         * Sets the log used for caught exceptions
121         */
122        public DeadLetterChannelBuilder log(Log log) {
123            getLogger().setLog(log);
124            return this;
125        }
126    
127        /**
128         * Sets the log used for caught exceptions
129         */
130        public DeadLetterChannelBuilder log(String log) {
131            return log(LogFactory.getLog(log));
132        }
133    
134        /**
135         * Sets the log used for caught exceptions
136         */
137        public DeadLetterChannelBuilder log(Class log) {
138            return log(LogFactory.getLog(log));
139        }
140    
141        /**
142         * Sets the exception policy to use
143         */
144        public ErrorHandlerBuilderSupport exceptionPolicyStrategy(ExceptionPolicyStrategy exceptionPolicyStrategy) {
145            setExceptionPolicyStrategy(exceptionPolicyStrategy);
146            return this;
147        }
148    
149        // Properties
150        // -------------------------------------------------------------------------
151        public RedeliveryPolicy getRedeliveryPolicy() {
152            return redeliveryPolicy;
153        }
154    
155        /**
156         * Sets the redelivery policy
157         */
158        public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) {
159            this.redeliveryPolicy = redeliveryPolicy;
160        }
161    
162        public ProcessorFactory getDeadLetterFactory() {
163            if (deadLetterFactory == null) {
164                deadLetterFactory = new ProcessorFactory() {
165                    public Processor createProcessor() {
166                        return getDefaultDeadLetterEndpoint();
167                    }
168                };
169            }
170            return deadLetterFactory;
171        }
172    
173        /**
174         * Sets the default dead letter queue factory
175         */
176        public void setDeadLetterFactory(ProcessorFactory deadLetterFactory) {
177            this.deadLetterFactory = deadLetterFactory;
178        }
179    
180        public Processor getDefaultDeadLetterEndpoint() {
181            if (defaultDeadLetterEndpoint == null) {
182                defaultDeadLetterEndpoint = new RecipientList(getDefaultDeadLetterEndpointExpression());
183            }
184            return defaultDeadLetterEndpoint;
185        }
186    
187        /**
188         * Sets the default dead letter endpoint used
189         */
190        public void setDefaultDeadLetterEndpoint(Processor defaultDeadLetterEndpoint) {
191            this.defaultDeadLetterEndpoint = defaultDeadLetterEndpoint;
192        }
193    
194        public Expression getDefaultDeadLetterEndpointExpression() {
195            if (defaultDeadLetterEndpointExpression == null) {
196                defaultDeadLetterEndpointExpression = ExpressionBuilder
197                    .constantExpression(getDefaultDeadLetterEndpointUri());
198            }
199            return defaultDeadLetterEndpointExpression;
200        }
201    
202        /**
203         * Sets the expression used to decide the dead letter channel endpoint for
204         * an exchange if no factory is provided via
205         * {@link #setDeadLetterFactory(ProcessorFactory)}
206         */
207        public void setDefaultDeadLetterEndpointExpression(Expression defaultDeadLetterEndpointExpression) {
208            this.defaultDeadLetterEndpointExpression = defaultDeadLetterEndpointExpression;
209        }
210    
211        public String getDefaultDeadLetterEndpointUri() {
212            return defaultDeadLetterEndpointUri;
213        }
214    
215        /**
216         * Sets the default dead letter endpoint URI used if no factory is provided
217         * via {@link #setDeadLetterFactory(ProcessorFactory)} and no expression is
218         * provided via {@link #setDefaultDeadLetterEndpointExpression(Expression)}
219         *
220         * @param defaultDeadLetterEndpointUri the default URI if no deadletter
221         *                factory or expression is provided
222         */
223        public void setDefaultDeadLetterEndpointUri(String defaultDeadLetterEndpointUri) {
224            this.defaultDeadLetterEndpointUri = defaultDeadLetterEndpointUri;
225        }
226    
227        public Logger getLogger() {
228            return logger;
229        }
230    
231        public void setLogger(Logger logger) {
232            this.logger = logger;
233        }
234    
235        /**
236         * Sets the exception policy strategy to use for resolving the {@link org.apache.camel.model.ExceptionType}
237         * to use for a given thrown exception
238         */
239        public ExceptionPolicyStrategy getExceptionPolicyStrategy() {
240            return exceptionPolicyStrategy;
241        }
242    
243        public void setExceptionPolicyStrategy(ExceptionPolicyStrategy exceptionPolicyStrategy) {
244            this.exceptionPolicyStrategy = exceptionPolicyStrategy;
245        }
246    
247    }