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.AccessibleObject; 020 import java.lang.reflect.InvocationTargetException; 021 import java.lang.reflect.Method; 022 import java.util.Arrays; 023 import java.util.List; 024 025 import org.apache.camel.Exchange; 026 import org.apache.camel.Expression; 027 import org.apache.camel.util.ObjectHelper; 028 029 /** 030 * @version $Revision: $ 031 */ 032 public class MethodInfo { 033 private Class type; 034 private Method method; 035 private final List<ParameterInfo> parameters; 036 private final List<ParameterInfo> bodyParameters; 037 private Expression parametersExpression; 038 039 public MethodInfo(Class type, Method method, List<ParameterInfo> parameters, List<ParameterInfo> bodyParameters) { 040 this.type = type; 041 this.method = method; 042 this.parameters = parameters; 043 this.bodyParameters = bodyParameters; 044 this.parametersExpression = createParametersExpression(); 045 } 046 047 public String toString() { 048 return method.toString(); 049 } 050 051 public MethodInvocation createMethodInvocation(final Object pojo, final Exchange messageExchange) { 052 final Object[] arguments = (Object[]) parametersExpression.evaluate(messageExchange); 053 return new MethodInvocation() { 054 public Method getMethod() { 055 return method; 056 } 057 058 public Object[] getArguments() { 059 return arguments; 060 } 061 062 public Object proceed() throws Throwable { 063 return invoke(method, pojo, arguments, messageExchange); 064 } 065 066 public Object getThis() { 067 return pojo; 068 } 069 070 public AccessibleObject getStaticPart() { 071 return method; 072 } 073 }; 074 } 075 076 public Class getType() { 077 return type; 078 } 079 080 public Method getMethod() { 081 return method; 082 } 083 084 public Expression getParametersExpression() { 085 return parametersExpression; 086 } 087 088 public List<ParameterInfo> getBodyParameters() { 089 return bodyParameters; 090 } 091 092 public Class getBodyParameterType() { 093 ParameterInfo parameterInfo = bodyParameters.get(0); 094 return parameterInfo.getType(); 095 } 096 097 098 public boolean bodyParameterMatches(Class bodyType) { 099 Class actualType = getBodyParameterType(); 100 return actualType != null && ObjectHelper.isAssignableFrom(bodyType, actualType); 101 } 102 103 public List<ParameterInfo> getParameters() { 104 return parameters; 105 } 106 107 public boolean hasBodyParameter() { 108 return !bodyParameters.isEmpty(); 109 } 110 111 protected Object invoke(Method mth, Object pojo, Object[] arguments, Exchange exchange) throws IllegalAccessException, InvocationTargetException { 112 return mth.invoke(pojo, arguments); 113 } 114 115 protected Expression createParametersExpression() { 116 final int size = parameters.size(); 117 final Expression[] expressions = new Expression[size]; 118 for (int i = 0; i < size; i++) { 119 Expression parameterExpression = parameters.get(i).getExpression(); 120 expressions[i] = parameterExpression; 121 } 122 return new Expression<Exchange>() { 123 public Object evaluate(Exchange exchange) { 124 Object[] answer = new Object[size]; 125 for (int i = 0; i < size; i++) { 126 answer[i] = expressions[i].evaluate(exchange); 127 } 128 return answer; 129 } 130 131 @Override 132 public String toString() { 133 return "ParametersExpression: " + Arrays.asList(expressions); 134 } 135 }; 136 } 137 }