1 /*
2 * The Seasar Software License, Version 1.1 Copyright (c) 2003-2004 The Seasar
3 * Project. All rights reserved. Redistribution and use in source and binary
4 * forms, with or without modification, are permitted provided that the
5 * following conditions are met: 1. Redistributions of source code must retain
6 * the above copyright notice, this list of conditions and the following
7 * disclaimer. 2. Redistributions in binary form must reproduce the above
8 * copyright notice, this list of conditions and the following disclaimer in the
9 * documentation and/or other materials provided with the distribution. 3. The
10 * end-user documentation included with the redistribution, if any, must include
11 * the following acknowledgement: "This product includes software developed by
12 * the Seasar Project (http://www.seasar.org/)." Alternately, this
13 * acknowledgement may appear in the software itself, if and wherever such
14 * third-party acknowledgements normally appear. 4. Neither the name "The Seasar
15 * Project" nor the names of its contributors may be used to endorse or promote
16 * products derived from this software without specific prior written permission
17 * of the Seasar Project. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20 * EVENT SHALL THE SEASAR PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
21 * INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 package org.seasar.axis.client;
29
30 import java.lang.reflect.Method;
31 import java.net.URL;
32
33 import javax.xml.namespace.QName;
34 import javax.xml.rpc.Call;
35
36 import org.aopalliance.intercept.MethodInvocation;
37 import org.apache.axis.client.Service;
38 import org.apache.axis.encoding.TypeMappingRegistry;
39 import org.apache.axis.enum.Use;
40 import org.seasar.axis.S2AxisConstants;
41 import org.seasar.axis.encoding.AutoRegisterTypeMappingImpl;
42 import org.seasar.framework.aop.interceptors.AbstractInterceptor;
43 import org.seasar.framework.util.MethodUtil;
44
45 /***
46 * Javaインタフェースを通じてWebサービスを呼び出すためのインターセプタです。
47 *
48 * @author koichik
49 */
50 public class DynamicInvocationInterceptor extends AbstractInterceptor {
51 //instance fields
52 protected final Service service;
53 protected final String endPointAddress;
54
55 /***
56 * インスタンスを構築します。 <br>
57 * ビーンのタイプマッピングを自動化するようにサービスのタイプマッピングレジストリを設定します。
58 *
59 * @param service
60 * サービス
61 * @param endPointAddress
62 * エンドポイントアドレス
63 */
64 public DynamicInvocationInterceptor(final Service service, final String endPointAddress) {
65 this.service = service;
66 this.endPointAddress = endPointAddress;
67
68 final TypeMappingRegistry tmr = service.getEngine().getTypeMappingRegistry();
69 final AutoRegisterTypeMappingImpl autoTM = new AutoRegisterTypeMappingImpl(null);
70 tmr.register(Use.DEFAULT.getEncoding(), autoTM);
71 }
72
73 /***
74 * インスタンスを構築します。
75 *
76 * @param service
77 * サービス
78 * @param url
79 * エンドポイントアドレスのURL
80 */
81 public DynamicInvocationInterceptor(final Service service, final URL url) {
82 this(service, url.toString());
83 }
84
85 /***
86 * ターゲットまたはサービスのメソッドを起動します。 <br>
87 * 呼び出されたメソッドがターゲットで実装されている場合はターゲットのメソッドを呼び出します。
88 * ターゲットで実装されていなければサービスのメソッドを呼び出します。
89 *
90 * @param invocation
91 * メソッド起動情報
92 */
93 public Object invoke(final MethodInvocation invocation) throws Throwable {
94 final Method method = invocation.getMethod();
95 if (!MethodUtil.isAbstract(method)) {
96 return invocation.proceed();
97 }
98
99 final Call call = service.createCall();
100 call.setTargetEndpointAddress(endPointAddress);
101 call.setOperationName(new QName(S2AxisConstants.OPERATION_NAMESPACE_URI, method.getName()));
102 return call.invoke(invocation.getArguments());
103 }
104 }