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 */
017package org.apache.camel.blueprint;
018
019import java.util.Set;
020import javax.xml.bind.annotation.XmlAccessType;
021import javax.xml.bind.annotation.XmlAccessorType;
022import javax.xml.bind.annotation.XmlAttribute;
023import javax.xml.bind.annotation.XmlElement;
024import javax.xml.bind.annotation.XmlRootElement;
025import javax.xml.bind.annotation.XmlTransient;
026
027import org.apache.camel.CamelContext;
028import org.apache.camel.LoggingLevel;
029import org.apache.camel.Processor;
030import org.apache.camel.builder.DefaultErrorHandlerBuilder;
031import org.apache.camel.builder.ErrorHandlerBuilder;
032import org.apache.camel.builder.LoggingErrorHandlerBuilder;
033import org.apache.camel.core.xml.AbstractCamelFactoryBean;
034import org.apache.camel.model.RedeliveryPolicyDefinition;
035import org.apache.camel.processor.RedeliveryPolicy;
036import org.osgi.service.blueprint.container.BlueprintContainer;
037
038@XmlRootElement(name = "errorHandler")
039@XmlAccessorType(XmlAccessType.FIELD)
040public class CamelErrorHandlerFactoryBean extends AbstractCamelFactoryBean<ErrorHandlerBuilder> {
041
042    @XmlAttribute
043    private ErrorHandlerType type = ErrorHandlerType.DefaultErrorHandler;
044    @XmlAttribute
045    private String deadLetterUri;
046    @XmlAttribute
047    private Boolean deadLetterHandleNewException;
048    @XmlAttribute
049    private LoggingLevel level;
050    @XmlAttribute
051    private String logName;
052    @XmlAttribute
053    private Boolean useOriginalMessage;
054    @XmlAttribute
055    private String onRedeliveryRef;
056    @XmlAttribute
057    private String retryWhileRef;
058    @XmlAttribute
059    private String executorServiceRef;
060    @XmlAttribute
061    private String redeliveryPolicyRef;
062    @XmlElement
063    private RedeliveryPolicyDefinition redeliveryPolicy;
064    @XmlTransient
065    private BlueprintContainer blueprintContainer;
066
067    @Override
068    public ErrorHandlerBuilder getObject() throws Exception {
069        ErrorHandlerBuilder errorHandler = getObjectType().newInstance();
070        if (errorHandler instanceof DefaultErrorHandlerBuilder) {
071            DefaultErrorHandlerBuilder handler = (DefaultErrorHandlerBuilder) errorHandler;
072            if (deadLetterUri != null) {
073                handler.setDeadLetterUri(deadLetterUri);
074            }
075            if (deadLetterHandleNewException != null) {
076                handler.setDeadLetterHandleNewException(deadLetterHandleNewException);
077            }
078            if (useOriginalMessage != null) {
079                handler.setUseOriginalMessage(useOriginalMessage);
080            }
081            if (redeliveryPolicy != null) {
082                handler.setRedeliveryPolicy(redeliveryPolicy.createRedeliveryPolicy(getCamelContext(), null));
083            }
084            if (redeliveryPolicyRef != null) {
085                handler.setRedeliveryPolicy(lookup(redeliveryPolicyRef, RedeliveryPolicy.class));
086            }
087            if (onRedeliveryRef != null) {
088                handler.setOnRedelivery(lookup(onRedeliveryRef, Processor.class));
089            }
090            if (retryWhileRef != null) {
091                handler.setRetryWhileRef(retryWhileRef);
092            }
093            if (executorServiceRef != null) {
094                handler.setExecutorServiceRef(executorServiceRef);
095            }
096        } else if (errorHandler instanceof LoggingErrorHandlerBuilder) {
097            LoggingErrorHandlerBuilder handler = (LoggingErrorHandlerBuilder) errorHandler;
098            if (level != null) {
099                handler.setLevel(level);
100            }
101            if (logName != null) {
102                handler.setLogName(logName);
103            }
104        }
105        return errorHandler;
106    }
107
108    @Override
109    public Class<? extends ErrorHandlerBuilder> getObjectType() {
110        return type.getTypeAsClass();
111    }
112
113    public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
114        this.blueprintContainer = blueprintContainer;
115    }
116
117    protected CamelContext getCamelContextWithId(String camelContextId) {
118        if (blueprintContainer != null) {
119            return (CamelContext) blueprintContainer.getComponentInstance(camelContextId);
120        }
121        return null;
122    }
123
124    @Override
125    protected CamelContext discoverDefaultCamelContext() {
126        if (blueprintContainer != null) {
127            Set<String> ids = BlueprintCamelContextLookupHelper.lookupBlueprintCamelContext(blueprintContainer);
128            if (ids.size() == 1) {
129                // there is only 1 id for a BlueprintCamelContext so fallback and use this
130                return getCamelContextWithId(ids.iterator().next());
131            }
132        }
133        return null;
134    }
135
136    protected <T> T lookup(String name, Class<T> type) {
137        return type.cast(blueprintContainer.getComponentInstance(name));
138    }
139
140}