1 /*
2 Copyright (c) 2006, University of Tromsø
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7
8 * Redistributions of source code must retain the above copyright notice, this list
9 of conditions and the following disclaimer.
10
11 * Redistributions in binary form must reproduce the above copyright notice, this
12 list of conditions and the following disclaimer in the documentation and/or other
13 materials provided with the distribution.
14
15 * Neither the name of the University of Tromsø nor the names of its contributors may
16 be used to endorse or promote products derived from this software without specific
17 prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
22 SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24 TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
28 DAMAGE.
29 */
30
31 package axis.dynamic;
32
33 import javax.xml.rpc.holders.IntHolder;
34
35 import org.apache.axis.Handler;
36 import org.apache.axis.MessageContext;
37 import org.apache.axis.constants.Scope;
38 import org.apache.axis.description.JavaServiceDesc;
39 import org.apache.axis.handlers.soap.SOAPService;
40 import org.apache.axis.providers.java.JavaProvider;
41 import org.apache.axis.providers.java.RPCProvider;
42
43 /**
44 * Variant of the {@link JavaProvider}s, that does not create the service object but always uses the same instance.
45 *
46 * All the methods overridden here are defined in {@link JavaProvider} and are only used in that class.
47 * {@link JavaProvider} calls {@link #getServiceObject} and passes the object to {@link RPCProvider#processMessage}.
48 */
49 @SuppressWarnings("serial") // we don't want to serialize this thing
50 public class ObjectRPCProvider extends RPCProvider
51 {
52 /** */
53 private final Object _target;
54
55 /** */
56 private final Class<?> _class;
57
58 /**
59 * uses target.getClass as class.
60 * @param target
61 */
62 public ObjectRPCProvider( Object target )
63 {
64 this(target, target.getClass());
65 }
66
67 /**
68 * @param target
69 * @param cls class used to find methods etc.
70 */
71 public ObjectRPCProvider( Object target, Class<?> cls )
72 {
73 if (target == null) throw new NullPointerException("target");
74 if (cls == null) throw new NullPointerException("class");
75 _target = target;
76 _class = cls;
77 }
78
79 /**
80 * @return service class
81 */
82 private Class<?> getServiceClass()
83 {
84 return _class;
85 }
86
87 /**
88 * called only from {@link JavaProvider#initServiceDesc}, but we override that, so it's never called.
89 * @param clsName
90 * @param service
91 * @param msgContext
92 * @return class set in {@link #ObjectRPCProvider(Object, Class) constructor}.
93 * @see JavaProvider#getServiceClass(String, SOAPService, MessageContext)
94 */
95 @Override
96 protected Class<?> getServiceClass( String clsName, SOAPService service, MessageContext msgContext )
97 {
98 return getServiceClass();
99 }
100
101 /**
102 * called from {@link JavaProvider#invoke}, and from {@link JavaProvider#initServiceDesc} (but we override that here).
103 * @param service
104 * @return name of class set in {@link #ObjectRPCProvider(Object, Class) constructor}.
105 * @see JavaProvider#getServiceClassName(Handler)
106 */
107 @Override
108 protected String getServiceClassName( Handler service )
109 {
110 return getServiceClass().getName();
111 }
112
113 /**
114 * called from {@link JavaProvider#getServiceClassName} (but we override that here), and from
115 * {@link JavaProvider#invoke} if {@link #getServiceClassName} returns null or "" (and that can't happen).
116 * @return null
117 * @see JavaProvider#getServiceClassNameOptionName()
118 */
119 @Override
120 protected String getServiceClassNameOptionName()
121 {
122 return null;
123 }
124
125 /**
126 * called from {@link JavaProvider#invoke}
127 * @param msgContext ignored
128 * @param service ignored
129 * @param clsName ignored
130 * @param scopeHolder we set the scope to {@link Scope#APPLICATION}
131 * @return target object set in {@link #ObjectRPCProvider(Object, Class) constructor}.
132 * @see JavaProvider#invoke
133 */
134 @Override
135 public Object getServiceObject( MessageContext msgContext, Handler service, String clsName, IntHolder scopeHolder )
136 {
137 // tell java provider that there's never any need to destroy this object
138 scopeHolder.value = Scope.APPLICATION.getValue();
139 return _target;
140 }
141
142 /**
143 * Called from {@link SOAPService#getInitializedServiceDesc}, which in turn is called from many places.
144 * We do not strictly have to override the implementation in JavaProvider, but it's safer this way, because
145 * we <b>must</b> make sure that this method can be invoked with a <tt>null</tt> {@link MessageContext}.
146 * It is (indirectly) called with a <tt>null</tt> parameter in {@link SoapReceiver#createService}.
147 * The current implementation of {@link JavaProvider#initServiceDesc} only passes on the parameter to
148 * {@link JavaProvider#getServiceClass}, which in our cases ignores it as well. The current implementation of
149 * {@link JavaProvider#getServiceClass} explicitly tolerates a null value.
150 * @param service
151 * @param msgContext ignored
152 * @see JavaProvider#initServiceDesc
153 * @see JavaProvider#getServiceClass
154 * @see SoapReceiver#createService
155 */
156 @Override
157 public void initServiceDesc( SOAPService service, MessageContext msgContext )
158 {
159 ((JavaServiceDesc)service.getServiceDescription()).loadServiceDescByIntrospection(_target.getClass());
160 }
161
162
163 }
164