001    /**
002     *
003     * Licensed to the Apache Software Foundation (ASF) under one or more
004     * contributor license agreements.  See the NOTICE file distributed with
005     * this work for additional information regarding copyright ownership.
006     * The ASF licenses this file to You under the Apache License, Version 2.0
007     * (the "License"); you may not use this file except in compliance with
008     * the License.  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    package org.apache.camel.builder;
019    
020    import org.apache.camel.Exchange;
021    import org.apache.camel.Expression;
022    import org.apache.camel.Processor;
023    import org.apache.camel.processor.DeadLetterChannel;
024    import org.apache.camel.processor.RecipientList;
025    import org.apache.camel.processor.RedeliveryPolicy;
026    import org.apache.camel.processor.Logger;
027    import org.apache.camel.processor.LoggingLevel;
028    import org.apache.commons.logging.Log;
029    import org.apache.commons.logging.LogFactory;
030    
031    /**
032     * A builder of a <a href="http://activemq.apache.org/camel/dead-letter-channel.html">Dead Letter Channel</a>
033     *
034     * @version $Revision: 534145 $
035     */
036    public class DeadLetterChannelBuilder implements ErrorHandlerBuilder {
037        private RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
038        private ProcessorFactory deadLetterFactory;
039        private Processor defaultDeadLetterEndpoint;
040        private Expression defaultDeadLetterEndpointExpression;
041        private String defaultDeadLetterEndpointUri = "log:org.apache.camel.DeadLetterChannel:error";
042        private Logger logger = DeadLetterChannel.createDefaultLogger();
043    
044        public DeadLetterChannelBuilder() {
045        }
046    
047        public DeadLetterChannelBuilder(Processor processor) {
048            this(new ConstantProcessorBuilder(processor));
049        }
050    
051        public DeadLetterChannelBuilder(ProcessorFactory deadLetterFactory) {
052            this.deadLetterFactory = deadLetterFactory;
053        }
054    
055        public ErrorHandlerBuilder copy() {
056            DeadLetterChannelBuilder answer = new DeadLetterChannelBuilder(deadLetterFactory);
057            answer.setRedeliveryPolicy(getRedeliveryPolicy().copy());
058            return answer;
059        }
060    
061        public Processor createErrorHandler(Processor processor) throws Exception {
062            Processor deadLetter = getDeadLetterFactory().createProcessor();
063            return new DeadLetterChannel(processor, deadLetter, getRedeliveryPolicy(), getLogger());
064        }
065    
066        // Builder methods
067        //-------------------------------------------------------------------------
068        public DeadLetterChannelBuilder backOffMultiplier(double backOffMultiplier) {
069            getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
070            return this;
071        }
072    
073        public DeadLetterChannelBuilder collisionAvoidancePercent(short collisionAvoidancePercent) {
074            getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
075            return this;
076        }
077    
078        public DeadLetterChannelBuilder initialRedeliveryDelay(long initialRedeliveryDelay) {
079            getRedeliveryPolicy().initialRedeliveryDelay(initialRedeliveryDelay);
080            return this;
081        }
082    
083        public DeadLetterChannelBuilder maximumRedeliveries(int maximumRedeliveries) {
084            getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
085            return this;
086        }
087    
088        public DeadLetterChannelBuilder useCollisionAvoidance() {
089            getRedeliveryPolicy().useCollisionAvoidance();
090            return this;
091        }
092    
093        public DeadLetterChannelBuilder useExponentialBackOff() {
094            getRedeliveryPolicy().useExponentialBackOff();
095            return this;
096        }
097    
098        /**
099         * Sets the logger used for caught exceptions
100         */
101        public DeadLetterChannelBuilder logger(Logger logger) {
102            setLogger(logger);
103            return this;
104        }
105    
106        /**
107         * Sets the logging level of exceptions caught
108         */
109        public DeadLetterChannelBuilder loggingLevel(LoggingLevel level) {
110            getLogger().setLevel(level);
111            return this;
112        }
113    
114        /**
115         * Sets the log used for caught exceptions
116         */
117        public DeadLetterChannelBuilder log(Log log) {
118            getLogger().setLog(log);
119            return this;
120        }
121    
122        /**
123         * Sets the log used for caught exceptions
124         */
125        public DeadLetterChannelBuilder log(String log) {
126            return log(LogFactory.getLog(log));
127        }
128    
129        /**
130         * Sets the log used for caught exceptions
131         */
132        public DeadLetterChannelBuilder log(Class log) {
133            return log(LogFactory.getLog(log));
134        }
135    
136        // Properties
137        //-------------------------------------------------------------------------
138        public RedeliveryPolicy getRedeliveryPolicy() {
139            return redeliveryPolicy;
140        }
141    
142        /**
143         * Sets the redelivery policy
144         */
145        public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) {
146            this.redeliveryPolicy = redeliveryPolicy;
147        }
148    
149        public ProcessorFactory getDeadLetterFactory() {
150            if (deadLetterFactory == null) {
151                deadLetterFactory = new ProcessorFactory() {
152                    public Processor createProcessor() {
153                        return getDefaultDeadLetterEndpoint();
154                    }
155                };
156            }
157            return deadLetterFactory;
158        }
159    
160        /**
161         * Sets the default dead letter queue factory
162         */
163        public void setDeadLetterFactory(ProcessorFactory deadLetterFactory) {
164            this.deadLetterFactory = deadLetterFactory;
165        }
166    
167        public Processor getDefaultDeadLetterEndpoint() {
168            if (defaultDeadLetterEndpoint == null) {
169                defaultDeadLetterEndpoint = new RecipientList(getDefaultDeadLetterEndpointExpression());
170            }
171            return defaultDeadLetterEndpoint;
172        }
173    
174        /**
175         * Sets the default dead letter endpoint used
176         */
177        public void setDefaultDeadLetterEndpoint(Processor defaultDeadLetterEndpoint) {
178            this.defaultDeadLetterEndpoint = defaultDeadLetterEndpoint;
179        }
180    
181        public Expression getDefaultDeadLetterEndpointExpression() {
182            if (defaultDeadLetterEndpointExpression == null) {
183                defaultDeadLetterEndpointExpression = ExpressionBuilder.constantExpression(getDefaultDeadLetterEndpointUri());
184            }
185            return defaultDeadLetterEndpointExpression;
186        }
187    
188        /**
189         * Sets the expression used to decide the dead letter channel endpoint for an exchange
190         * if no factory is provided via {@link #setDeadLetterFactory(ProcessorFactory)}
191         */
192        public void setDefaultDeadLetterEndpointExpression(Expression defaultDeadLetterEndpointExpression) {
193            this.defaultDeadLetterEndpointExpression = defaultDeadLetterEndpointExpression;
194        }
195    
196        public String getDefaultDeadLetterEndpointUri() {
197            return defaultDeadLetterEndpointUri;
198        }
199    
200        /**
201         * Sets the default dead letter endpoint URI used if no factory is provided via {@link #setDeadLetterFactory(ProcessorFactory)}
202         * and no expression is provided via {@link #setDefaultDeadLetterEndpointExpression(Expression)}
203         *
204         * @param defaultDeadLetterEndpointUri the default URI if no deadletter factory or expression is provided
205         */
206        public void setDefaultDeadLetterEndpointUri(String defaultDeadLetterEndpointUri) {
207            this.defaultDeadLetterEndpointUri = defaultDeadLetterEndpointUri;
208        }
209    
210        public Logger getLogger() {
211            return logger;
212        }
213    
214        public void setLogger(Logger logger) {
215            this.logger = logger;
216        }
217    }