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.model;
018    
019    import javax.xml.bind.annotation.XmlAccessType;
020    import javax.xml.bind.annotation.XmlAccessorType;
021    import javax.xml.bind.annotation.XmlAttribute;
022    import javax.xml.bind.annotation.XmlRootElement;
023    import javax.xml.bind.annotation.XmlTransient;
024    
025    import org.apache.camel.Expression;
026    import org.apache.camel.Processor;
027    import org.apache.camel.impl.RouteContext;
028    import org.apache.camel.processor.idempotent.IdempotentConsumer;
029    import org.apache.camel.processor.idempotent.MessageIdRepository;
030    
031    /**
032     * @version $Revision: 35332 $
033     */
034    @XmlRootElement(name = "idempotentConsumer")
035    @XmlAccessorType(XmlAccessType.FIELD)
036    public class IdempotentConsumerType extends ExpressionNode {
037        @XmlAttribute
038        private String messageIdRepositoryRef;
039        @XmlTransient
040        private MessageIdRepository messageIdRepository;
041    
042        public IdempotentConsumerType() {
043        }
044    
045        public IdempotentConsumerType(Expression messageIdExpression, MessageIdRepository messageIdRepository) {
046            super(messageIdExpression);
047            this.messageIdRepository = messageIdRepository;
048        }
049    
050        @Override
051        public String toString() {
052            return "IdempotentConsumer[ " + getExpression() + " -> " + getOutputs() + "]";
053        }
054    
055        public String getMessageIdRepositoryRef() {
056            return messageIdRepositoryRef;
057        }
058    
059        public void setMessageIdRepositoryRef(String messageIdRepositoryRef) {
060            this.messageIdRepositoryRef = messageIdRepositoryRef;
061        }
062    
063        public MessageIdRepository getMessageIdRepository() {
064            return messageIdRepository;
065        }
066    
067        public void setMessageIdRepository(MessageIdRepository messageIdRepository) {
068            this.messageIdRepository = messageIdRepository;
069        }
070    
071        @Override
072        public Processor createProcessor(RouteContext routeContext) throws Exception {
073            Processor childProcessor = routeContext.createProcessor(this);
074            MessageIdRepository messageIdRepository = resolveMessageIdRepository(routeContext);
075            return new IdempotentConsumer(getExpression().createExpression(routeContext), messageIdRepository,
076                                          childProcessor);
077        }
078    
079        public MessageIdRepository resolveMessageIdRepository(RouteContext routeContext) {
080            if (messageIdRepository == null) {
081                messageIdRepository = routeContext.lookup(messageIdRepositoryRef, MessageIdRepository.class);
082            }
083            return messageIdRepository;
084        }
085    }