1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.uruma.binding.method;
17
18 import java.lang.reflect.Method;
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.seasar.framework.util.MethodUtil;
23 import org.seasar.uruma.core.UrumaConstants;
24 import org.seasar.uruma.core.UrumaMessageCodes;
25 import org.seasar.uruma.log.UrumaLogger;
26 import org.seasar.uruma.util.AssertionUtil;
27
28
29
30
31
32
33 public class MethodBinding {
34 private static final UrumaLogger logger = UrumaLogger
35 .getLogger(MethodBinding.class);
36
37 protected Object target;
38
39 protected Method method;
40
41 protected List<ArgumentsFilter> argumentsFilterList = new ArrayList<ArgumentsFilter>();
42
43 protected MethodCallback callback;
44
45 private String description;
46
47
48
49
50
51
52
53
54
55 MethodBinding(final Object target, final Method method,
56 final MethodCallback callback) {
57 AssertionUtil.assertNotNull("target", target);
58 AssertionUtil.assertNotNull("method", method);
59
60 this.target = target;
61 this.method = method;
62 this.description = UrumaLogger.getObjectDescription(target)
63 + UrumaConstants.HASH_MARK + method.getName();
64 this.callback = callback;
65 }
66
67
68
69
70
71
72
73
74
75 public Object invoke() {
76 return invoke(null);
77 }
78
79
80
81
82
83
84
85
86
87
88
89 public Object invoke(final Object[] args) {
90 if (logger.isInfoEnabled()) {
91 logger.log(UrumaMessageCodes.START_METHOD_CALL, UrumaLogger
92 .getObjectDescription(target), method.getName(), args);
93 }
94
95 Object[] filteredArgs = args;
96 for (ArgumentsFilter filter : argumentsFilterList) {
97 filteredArgs = filter.filter(filteredArgs);
98 }
99 Object result = MethodUtil.invoke(method, target, filteredArgs);
100
101 if (logger.isInfoEnabled()) {
102 logger.log(UrumaMessageCodes.END_METHOD_CALL, UrumaLogger
103 .getObjectDescription(target), method.getName(), result);
104 }
105
106 return callback(args, result);
107 }
108
109
110
111
112
113
114
115
116
117 public void addArgumentsFilter(final ArgumentsFilter argumentsFilter) {
118 this.argumentsFilterList.add(argumentsFilter);
119 }
120
121
122
123
124
125
126 public Method getMethod() {
127 return this.method;
128 }
129
130
131
132
133
134
135 public Object getTarget() {
136 return this.target;
137 }
138
139
140
141
142
143
144
145 public void setCallback(final MethodCallback callback) {
146 this.callback = callback;
147 }
148
149 protected Object callback(final Object[] args, final Object returnValue) {
150 if (callback != null) {
151 return callback.callback(this, args, returnValue);
152 } else {
153 return returnValue;
154 }
155 }
156
157
158
159
160 @Override
161 public String toString() {
162 return this.description;
163 }
164 }