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    
024    import org.apache.camel.Exchange;
025    import org.apache.camel.Processor;
026    import org.apache.camel.impl.ExpressionAdapter;
027    import org.apache.camel.spi.RouteContext;
028    
029    /**
030     * Represents an XML <interceptFrom/> element
031     *
032     * @version $Revision: 896185 $
033     */
034    @XmlRootElement(name = "interceptFrom")
035    @XmlAccessorType(XmlAccessType.FIELD)
036    public class InterceptFromDefinition extends InterceptDefinition {
037    
038        // TODO: Support lookup endpoint by ref (requires a bit more work)
039    
040        @XmlAttribute(required = false)
041        protected String uri;
042    
043        public InterceptFromDefinition() {
044        }
045    
046        public InterceptFromDefinition(String uri) {
047            this.uri = uri;
048        }
049    
050        @Override
051        public String toString() {
052            return "InterceptFrom[" + getOutputs() + "]";
053        }
054    
055        @Override
056        public String getShortName() {
057            return "interceptFrom";
058        }
059    
060        @Override
061        public String getLabel() {
062            return "interceptFrom";
063        }
064    
065        @Override
066        public boolean isAbstract() {
067            return true;
068        }
069    
070        @Override
071        @SuppressWarnings("unchecked")
072        public Processor createProcessor(RouteContext routeContext) throws Exception {
073            // insert a set header definition so we can set the intercepted endpoint uri as a header
074            // this allows us to use the same header for both the interceptFrom and interceptSendToEndpoint
075            SetHeaderDefinition headerDefinition = new SetHeaderDefinition(Exchange.INTERCEPTED_ENDPOINT, new ExpressionAdapter() {
076                public Object evaluate(Exchange exchange, Class type) {
077                    return exchange.getFromEndpoint().getEndpointUri();
078                }
079    
080                public String toString() {
081                    return "";
082                }
083            });
084            getOutputs().add(0, headerDefinition);
085    
086            return createOutputsProcessor(routeContext);
087        }
088    
089        public String getUri() {
090            return uri;
091        }
092    
093        public void setUri(String uri) {
094            this.uri = uri;
095        }
096    }