Coverage Report - axis.dynamic.ObjectRPCProvider
 
Classes in this File Line Coverage Branch Coverage Complexity
ObjectRPCProvider
0%
0/16
0%
0/4
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