Coverage Report - axis.dynamic.SoapReceiver
 
Classes in this File Line Coverage Branch Coverage Complexity
SoapReceiver
0%
0/40
0%
0/16
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 java.util.Arrays;
 34  
 import java.util.Map.Entry;
 35  
 
 36  
 import org.apache.axis.AxisFault;
 37  
 import org.apache.axis.constants.Style;
 38  
 import org.apache.axis.constants.Use;
 39  
 import org.apache.axis.deployment.wsdd.WSDDService;
 40  
 import org.apache.axis.description.JavaServiceDesc;
 41  
 import org.apache.axis.description.ServiceDesc;
 42  
 import org.apache.axis.handlers.soap.SOAPService;
 43  
 import org.apache.axis.providers.BasicProvider;
 44  
 
 45  
 
 46  
 /**
 47  
  * Publishes a bean as a web service.
 48  
  */
 49  0
 public class SoapReceiver
 50  
 extends SoapInterface {
 51  
   /** the bean that actually implements the service. */
 52  
   private Object _target;
 53  
   
 54  
   /** the service description (name, style, etc.) */
 55  0
   private final ServiceDesc _service = new JavaServiceDesc();
 56  
   
 57  
   /** the axis engine configuration. */
 58  
   private SoapServerConfiguration _configuration;
 59  
 
 60  
   /**
 61  
    * @param target bean that actually implements the web service.
 62  
    */
 63  
   public void setTarget( Object target )
 64  
   {
 65  0
     _target = target;
 66  0
   }
 67  
 
 68  
   /**
 69  
    * used as default service name. may be overridden by setting the serviceName property.
 70  
    * @param name
 71  
    * @see BeanNameAware#setBeanName(String)
 72  
    */
 73  
   public void setBeanName( String name )
 74  
   {
 75  0
     if (_service.getName() == null) _service.setName(name);
 76  0
   }
 77  
 
 78  
   /**
 79  
    * service name. if not set, bean name is used. if that is also not set, {@link #deploy()}
 80  
    * will throw an {@link IllegalArgumentException}.
 81  
    * @param name
 82  
    * @see BeanNameAware#setBeanName(String)
 83  
    */
 84  
   public void setServiceName( String name )
 85  
   {
 86  0
     _service.setName(name);
 87  0
   }
 88  
 
 89  
   /**
 90  
    * Java methods to be published as web service operations. If not set, all methods will be used.
 91  
    * I'm not sure if that includes {@link #toString()} etc. See Axis documentation.
 92  
    * @param methods Java methods to be published as web service operations.
 93  
    */
 94  
   public void setAllowedMethods( String[] methods )
 95  
   {
 96  0
     _service.setAllowedMethods(Arrays.asList(methods));
 97  0
   }
 98  
   
 99  
   /**
 100  
    * if not set, defaults to {@link Style#RPC}.
 101  
    * @param style
 102  
    * @see SoapInterface#setStyle(Style)
 103  
    * @see JavaServiceDesc#setStyle(Style)
 104  
    */
 105  
   @Override
 106  
   public void setStyle( Style style )
 107  
   {
 108  0
     _service.setStyle(style);
 109  0
   }
 110  
 
 111  
   /**
 112  
    * if not set, defaults to {@link Use#ENCODED}.
 113  
    * @param use
 114  
    * @see SoapInterface#setUse(Use)
 115  
    * @see JavaServiceDesc#setUse(Use)
 116  
    */
 117  
   @Override
 118  
   public void setUse( Use use )
 119  
   {
 120  0
     _service.setUse(use);
 121  0
   }
 122  
 
 123  
   /**
 124  
    * @param configuration
 125  
    */
 126  
   public void setServerConfiguration( SoapServerConfiguration configuration )
 127  
   {
 128  0
     _configuration = configuration;
 129  0
   }
 130  
 
 131  
   /**
 132  
    * calls {@link #deploy()}
 133  
    * should only be called once for each configured SoapReceiver.
 134  
    * @throws AxisFault if service cannot be created
 135  
    * @see InitializingBean#afterPropertiesSet()
 136  
    */
 137  
   public void afterPropertiesSet() throws AxisFault
 138  
   {
 139  0
     deploy();
 140  0
   }
 141  
 
 142  
   /**
 143  
    * should only be called once for each configured SoapReceiver.
 144  
    * @throws AxisFault if service cannot be created
 145  
    */
 146  
   public void deploy() throws AxisFault
 147  
   {
 148  0
     if (_service.getName() == null) throw new IllegalStateException("name not set");
 149  0
     if (_configuration == null) throw new IllegalStateException("configuration not set");
 150  0
     _configuration.deployService(_service.getName(), createService());
 151  0
   }
 152  
 
 153  
   /**
 154  
    * calls {@link #undeploy()}
 155  
    * @see DisposableBean#destroy()
 156  
    */
 157  
   public void destroy()
 158  
   {
 159  0
     undeploy();
 160  0
   }
 161  
 
 162  
   /**
 163  
    * 
 164  
    */
 165  
   public void undeploy()
 166  
   {
 167  0
     if (_service.getName() == null) throw new IllegalStateException("name not set");
 168  0
     if (_configuration == null) throw new IllegalStateException("registry not set");
 169  0
     _configuration.undeployService(_service.getName());
 170  0
   }
 171  
   
 172  
   /**
 173  
    * @return a new soap service. 
 174  
    * @throws AxisFault if service description cannot be initialized
 175  
    * @see WSDDService#makeNewInstance
 176  
    */
 177  
   public SOAPService createService() throws AxisFault
 178  
   {
 179  0
     if (_service.getName() == null) throw new IllegalStateException("name not set");
 180  0
     if (_target == null) throw new IllegalStateException("target not set");
 181  
     
 182  
     // note: request and/or response chain may be null
 183  0
     SOAPService service = new SOAPService(getRequestChain(), new ObjectRPCProvider(_target), getResponseChain());
 184  0
     service.setName(_service.getName());
 185  
     
 186  
     // set the wsdl port type to the service name. otherwise, generated wsdl uses the class name for the port type, 
 187  
     // which is ugly for Cglib classes. I'm not sure though that this is the correct solution...
 188  
     // see org.apache.axis.providers.BasicProvider.generateWSDL() and org.apache.axis.wsdl.fromJava.Emitter.init()
 189  0
     service.setOption(BasicProvider.OPTION_WSDL_PORTTYPE, _service.getName());
 190  
     
 191  0
     service.setServiceDescription(_service);
 192  0
     setProperties(service);
 193  
     
 194  
     // If we don't do this now, something weird will happen: if the service's ?wsdl is generated *before*
 195  
     // one of it's operations is invoked, the service won't have *any* operation at all. As long as it lives.
 196  
     // But doing this now also may help to catch errors early and speed up the first invocation.
 197  
     // Note: the MessageContext parameter can be null - this calls our ObjectRPCProvider in the end, 
 198  
     // which ignores the parameter. The usual JavaProvider could handle null as well.
 199  0
     service.getInitializedServiceDesc(null);
 200  
     
 201  0
     return service;
 202  
   }
 203  
 
 204  
   /**
 205  
    * sets our properties into the given service.
 206  
    * @param service
 207  
    */
 208  
   private void setProperties( SOAPService service )
 209  
   {
 210  0
     for (Entry<String, Object> entry : _properties.entrySet())
 211  
     {
 212  0
       service.setOption(entry.getKey(), entry.getValue());
 213  
     }
 214  0
   }
 215  
 
 216  
 }
 217