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 onPrepareFailureRef;
058    @XmlAttribute
059    private String retryWhileRef;
060    @XmlAttribute
061    private String executorServiceRef;
062    @XmlAttribute
063    private String redeliveryPolicyRef;
064    @XmlElement
065    private RedeliveryPolicyDefinition redeliveryPolicy;
066    @XmlTransient
067    private BlueprintContainer blueprintContainer;
068
069    @Override
070    public ErrorHandlerBuilder getObject() throws Exception {
071        ErrorHandlerBuilder errorHandler = getObjectType().newInstance();
072        if (errorHandler instanceof DefaultErrorHandlerBuilder) {
073            DefaultErrorHandlerBuilder handler = (DefaultErrorHandlerBuilder) errorHandler;
074            if (deadLetterUri != null) {
075                handler.setDeadLetterUri(deadLetterUri);
076            }
077            if (deadLetterHandleNewException != null) {
078                handler.setDeadLetterHandleNewException(deadLetterHandleNewException);
079            }
080            if (useOriginalMessage != null) {
081                handler.setUseOriginalMessage(useOriginalMessage);
082            }
083            if (redeliveryPolicy != null) {
084                handler.setRedeliveryPolicy(redeliveryPolicy.createRedeliveryPolicy(getCamelContext(), null));
085            }
086            if (redeliveryPolicyRef != null) {
087                handler.setRedeliveryPolicy(lookup(redeliveryPolicyRef, RedeliveryPolicy.class));
088            }
089            if (onRedeliveryRef != null) {
090                handler.setOnRedelivery(lookup(onRedeliveryRef, Processor.class));
091            }
092            if (onPrepareFailureRef != null) {
093                handler.setOnPrepareFailure(lookup(onPrepareFailureRef, Processor.class));
094            }
095            if (retryWhileRef != null) {
096                handler.setRetryWhileRef(retryWhileRef);
097            }
098            if (executorServiceRef != null) {
099                handler.setExecutorServiceRef(executorServiceRef);
100            }
101        } else if (errorHandler instanceof LoggingErrorHandlerBuilder) {
102            LoggingErrorHandlerBuilder handler = (LoggingErrorHandlerBuilder) errorHandler;
103            if (level != null) {
104                handler.setLevel(level);
105            }
106            if (logName != null) {
107                handler.setLogName(logName);
108            }
109        }
110        return errorHandler;
111    }
112
113    @Override
114    public Class<? extends ErrorHandlerBuilder> getObjectType() {
115        return type.getTypeAsClass();
116    }
117
118    public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
119        this.blueprintContainer = blueprintContainer;
120    }
121
122    protected CamelContext getCamelContextWithId(String camelContextId) {
123        if (blueprintContainer != null) {
124            return (CamelContext) blueprintContainer.getComponentInstance(camelContextId);
125        }
126        return null;
127    }
128
129    @Override
130    protected CamelContext discoverDefaultCamelContext() {
131        if (blueprintContainer != null) {
132            Set<String> ids = BlueprintCamelContextLookupHelper.lookupBlueprintCamelContext(blueprintContainer);
133            if (ids.size() == 1) {
134                // there is only 1 id for a BlueprintCamelContext so fallback and use this
135                return getCamelContextWithId(ids.iterator().next());
136            }
137        }
138        return null;
139    }
140
141    protected <T> T lookup(String name, Class<T> type) {
142        return type.cast(blueprintContainer.getComponentInstance(name));
143    }
144
145}