| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| ObjectRPCProvider |
|
| 0.0;0 |
| 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 | 0 | this(target, target.getClass()); |
| 65 | 0 | } |
| 66 | ||
| 67 | /** | |
| 68 | * @param target | |
| 69 | * @param cls class used to find methods etc. | |
| 70 | */ | |
| 71 | public ObjectRPCProvider( Object target, Class<?> cls ) | |
| 72 | 0 | { |
| 73 | 0 | if (target == null) throw new NullPointerException("target"); |
| 74 | 0 | if (cls == null) throw new NullPointerException("class"); |
| 75 | 0 | _target = target; |
| 76 | 0 | _class = cls; |
| 77 | 0 | } |
| 78 | ||
| 79 | /** | |
| 80 | * @return service class | |
| 81 | */ | |
| 82 | private Class<?> getServiceClass() | |
| 83 | { | |
| 84 | 0 | 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 | 0 | 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 | 0 | 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 | 0 | 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 | 0 | scopeHolder.value = Scope.APPLICATION.getValue(); |
| 139 | 0 | 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 | 0 | ((JavaServiceDesc)service.getServiceDescription()).loadServiceDescByIntrospection(_target.getClass()); |
| 160 | 0 | } |
| 161 | ||
| 162 | ||
| 163 | } | |
| 164 |