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.component.bean;
018    
019    import java.lang.reflect.Method;
020    
021    import org.apache.camel.CamelContext;
022    import org.apache.camel.Exchange;
023    import org.apache.camel.Message;
024    import org.apache.camel.Processor;
025    import org.apache.camel.spi.Registry;
026    import org.apache.camel.util.ObjectHelper;
027    import org.apache.commons.logging.Log;
028    import org.apache.commons.logging.LogFactory;
029    
030    import static org.apache.camel.util.ObjectHelper.isNullOrBlank;
031    
032    /**
033     * A {@link Processor} which converts the inbound exchange to a method
034     * invocation on a POJO
035     * 
036     * @version $Revision: $
037     */
038    public class BeanProcessor implements Processor {
039        public static final String METHOD_NAME = "org.apache.camel.MethodName";
040        private static final Log LOG = LogFactory.getLog(BeanProcessor.class);
041    
042        private final Object pojo;
043        private final BeanInfo beanInfo;
044        private Method method;
045        private String methodName;
046    
047        public BeanProcessor(Object pojo, BeanInfo beanInfo) {
048            this.pojo = pojo;
049            this.beanInfo = beanInfo;
050        }
051    
052        public BeanProcessor(Object pojo, ParameterMappingStrategy parameterMappingStrategy) {
053            this(pojo, new BeanInfo(pojo.getClass(), parameterMappingStrategy));
054        }
055    
056        public BeanProcessor(Object pojo, CamelContext camelContext) {
057            this(pojo, createParameterMappingStrategy(camelContext));
058        }
059    
060        public static ParameterMappingStrategy createParameterMappingStrategy(CamelContext camelContext) {
061            Registry registry = camelContext.getRegistry();
062            ParameterMappingStrategy answer = registry.lookup(ParameterMappingStrategy.class.getName(),
063                                                              ParameterMappingStrategy.class);
064            if (answer == null) {
065                answer = new DefaultParameterMappingStrategy();
066            }
067            return answer;
068        }
069        @Override
070        public String toString() {
071            String description = method != null ? " " + method : "";
072            return "BeanProcessor[" + pojo + description + "]";
073        }
074    
075        public void process(Exchange exchange) throws Exception {
076            if (LOG.isDebugEnabled()) {
077                LOG.debug(">>>> invoking method for: " + exchange);
078            }
079            Message in = exchange.getIn();
080            BeanInvocation beanInvoke = in.getBody(BeanInvocation.class);
081            if (beanInvoke != null) {
082                beanInvoke.invoke(pojo, exchange);
083                return;
084            }
085    
086            MethodInvocation invocation;
087            if (method != null) {
088                invocation = beanInfo.createInvocation(method, pojo, exchange);
089            } else {
090                // lets pass in the method name to use if its specified
091                if (ObjectHelper.isNotNullAndNonEmpty(methodName)) {
092                    if (isNullOrBlank(in.getHeader(METHOD_NAME, String.class))) {
093                        in.setHeader(METHOD_NAME, methodName);
094                    }
095                }
096                invocation = beanInfo.createInvocation(pojo, exchange);
097            }
098            if (invocation == null) {
099                throw new IllegalStateException("No method invocation could be created");
100            }
101            try {
102                Object value = invocation.proceed();
103                if (value != null) {
104                    exchange.getIn().setBody(value);
105                }
106            } catch (Exception e) {
107                throw e;
108            } catch (Throwable throwable) {
109                throw new Exception(throwable);
110            }
111        }
112    
113        // Properties
114        // -----------------------------------------------------------------------
115    
116        public Method getMethod() {
117            return method;
118        }
119    
120        public void setMethod(Method method) {
121            this.method = method;
122        }
123    
124        public String getMethodName() {
125            return methodName;
126        }
127    
128        public void setMethodName(String methodName) {
129            this.methodName = methodName;
130        }
131    }