Package org.jboss.ws.core.jaxws.spi

Source Code of org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl

/*     */ package org.jboss.ws.core.jaxws.spi;
/*     */
/*     */ import java.io.IOException;
/*     */ import java.io.InputStream;
/*     */ import java.lang.reflect.Proxy;
/*     */ import java.net.URL;
/*     */ import java.security.CodeSource;
/*     */ import java.security.ProtectionDomain;
/*     */ import java.util.ArrayList;
/*     */ import java.util.Iterator;
/*     */ import java.util.List;
/*     */ import java.util.Map;
/*     */ import java.util.concurrent.Executor;
/*     */ import java.util.concurrent.ExecutorService;
/*     */ import java.util.concurrent.Executors;
/*     */ import javax.jws.WebService;
/*     */ import javax.xml.bind.JAXBContext;
/*     */ import javax.xml.namespace.QName;
/*     */ import javax.xml.ws.BindingProvider;
/*     */ import javax.xml.ws.Dispatch;
/*     */ import javax.xml.ws.EndpointReference;
/*     */ import javax.xml.ws.Service;
/*     */ import javax.xml.ws.Service.Mode;
/*     */ import javax.xml.ws.WebServiceException;
/*     */ import javax.xml.ws.WebServiceFeature;
/*     */ import javax.xml.ws.handler.HandlerResolver;
/*     */ import javax.xml.ws.spi.ServiceDelegate21;
/*     */ import org.jboss.logging.Logger;
/*     */ import org.jboss.util.NotImplementedException;
/*     */ import org.jboss.ws.core.StubExt;
/*     */ import org.jboss.ws.core.jaxws.client.ClientImpl;
/*     */ import org.jboss.ws.core.jaxws.client.ClientProxy;
/*     */ import org.jboss.ws.core.jaxws.client.DispatchImpl;
/*     */ import org.jboss.ws.core.jaxws.client.ServiceObjectFactoryJAXWS;
/*     */ import org.jboss.ws.core.jaxws.handler.HandlerResolverImpl;
/*     */ import org.jboss.ws.metadata.builder.jaxws.JAXWSClientMetaDataBuilder;
/*     */ import org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder;
/*     */ import org.jboss.ws.metadata.umdm.ClientEndpointMetaData;
/*     */ import org.jboss.ws.metadata.umdm.EndpointMetaData;
/*     */ import org.jboss.ws.metadata.umdm.EndpointMetaData.Type;
/*     */ import org.jboss.ws.metadata.umdm.HandlerMetaDataJAXWS;
/*     */ import org.jboss.ws.metadata.umdm.ServiceMetaData;
/*     */ import org.jboss.ws.metadata.umdm.UnifiedMetaData;
/*     */ import org.jboss.ws.metadata.wsdl.WSDLUtils;
/*     */ import org.jboss.wsf.common.ResourceLoaderAdapter;
/*     */ import org.jboss.wsf.spi.deployment.UnifiedVirtualFile;
/*     */ import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainMetaData;
/*     */ import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainsMetaData;
/*     */ import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerMetaData;
/*     */ import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerMetaData.HandlerType;
/*     */ import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedPortComponentRefMetaData;
/*     */ import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedServiceRefMetaData;
/*     */ import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedStubPropertyMetaData;
/*     */
/*     */ public class ServiceDelegateImpl extends ServiceDelegate21
/*     */ {
/*  91 */   private final Logger log = Logger.getLogger(ServiceDelegateImpl.class);
/*     */
/*  94 */   private static ExecutorService defaultExecutor = Executors.newCachedThreadPool();
/*     */   private ServiceMetaData serviceMetaData;
/* 111 */   private UnifiedServiceRefMetaData usRef = ServiceObjectFactoryJAXWS.getServiceRefAssociation();
/*     */   private HandlerResolver handlerResolver;
/*     */   private ExecutorService executor;
/* 105 */   private List<QName> annotatedPorts = new ArrayList();
/*     */
/*     */   public ServiceDelegateImpl(URL wsdlURL, QName serviceName, Class serviceClass)
/*     */   {
/*     */     UnifiedVirtualFile vfsRoot;
/* 112 */     UnifiedVirtualFile vfsRoot = this.usRef != null ? (vfsRoot = this.usRef.getVfsRoot()) : new ResourceLoaderAdapter();
/*     */
/* 115 */     if ((wsdlURL != null) && (serviceClass != Service.class))
/*     */     {
/*     */       try
/*     */       {
/* 119 */         InputStream is = wsdlURL.openStream();
/* 120 */         is.close();
/*     */       }
/*     */       catch (IOException e)
/*     */       {
/* 124 */         this.log.warn("Cannot access wsdlURL: " + wsdlURL);
/* 125 */         wsdlURL = null;
/*     */       }
/*     */     }
/*     */
/* 129 */     if (wsdlURL != null)
/*     */     {
/* 131 */       JAXWSClientMetaDataBuilder builder = new JAXWSClientMetaDataBuilder();
/* 132 */       this.serviceMetaData = builder.buildMetaData(serviceName, wsdlURL, vfsRoot);
/*     */     }
/*     */     else
/*     */     {
/* 136 */       UnifiedMetaData wsMetaData = new UnifiedMetaData(vfsRoot);
/* 137 */       this.serviceMetaData = new ServiceMetaData(wsMetaData, serviceName);
/* 138 */       wsMetaData.addService(this.serviceMetaData);
/*     */     }
/*     */
/* 141 */     this.handlerResolver = new HandlerResolverImpl();
/*     */
/* 143 */     if (this.usRef != null)
/*     */     {
/* 145 */       this.serviceMetaData.setServiceRefName(this.usRef.getServiceRefName());
/*     */
/* 148 */       if (this.usRef.getHandlerChain() != null)
/*     */       {
/* 150 */         String filename = this.usRef.getHandlerChain();
/* 151 */         UnifiedHandlerChainsMetaData handlerChainsMetaData = JAXWSMetaDataBuilder.getHandlerChainsMetaData(serviceClass, filename);
/* 152 */         for (UnifiedHandlerChainMetaData UnifiedHandlerChainMetaData : handlerChainsMetaData.getHandlerChains())
/*     */         {
/* 154 */           for (UnifiedHandlerMetaData uhmd : UnifiedHandlerChainMetaData.getHandlers())
/*     */           {
/* 156 */             HandlerMetaDataJAXWS hmd = HandlerMetaDataJAXWS.newInstance(uhmd, UnifiedHandlerMetaData.HandlerType.ENDPOINT);
/* 157 */             this.serviceMetaData.addHandler(hmd);
/*     */           }
/*     */         }
/* 160 */         ((HandlerResolverImpl)this.handlerResolver).initServiceHandlerChain(this.serviceMetaData);
/*     */       }
/*     */     }
/*     */   }
/*     */
/*     */   public <T> T getPort(QName portName, Class<T> seiClass)
/*     */   {
/* 172 */     assertSEIConstraints(seiClass);
/*     */
/* 174 */     if (this.serviceMetaData == null) {
/* 175 */       throw new WebServiceException("Service meta data not available");
/*     */     }
/*     */
/* 178 */     EndpointMetaData epMetaData = this.serviceMetaData.getEndpoint(portName);
/* 179 */     if ((this.serviceMetaData.getEndpoints().size() > 0) && (epMetaData == null)) {
/* 180 */       throw new WebServiceException("Cannot get port meta data for: " + portName);
/*     */     }
/*     */
/* 183 */     if (this.serviceMetaData.getEndpoints().size() == 0)
/*     */     {
/* 185 */       this.log.warn("Cannot get port meta data for: " + portName);
/*     */
/* 187 */       QName portType = getPortTypeName(seiClass);
/* 188 */       epMetaData = new ClientEndpointMetaData(this.serviceMetaData, portName, portType, EndpointMetaData.Type.JAXWS);
/*     */     }
/*     */
/* 191 */     String seiClassName = seiClass.getName();
/* 192 */     epMetaData.setServiceEndpointInterfaceName(seiClassName);
/*     */
/* 194 */     return getPortInternal(epMetaData, seiClass);
/*     */   }
/*     */
/*     */   public <T> T getPort(Class<T> seiClass)
/*     */   {
/* 204 */     assertSEIConstraints(seiClass);
/*     */
/* 206 */     if (this.serviceMetaData == null) {
/* 207 */       throw new WebServiceException("Service meta data not available");
/*     */     }
/* 209 */     String seiClassName = seiClass.getName();
/* 210 */     EndpointMetaData epMetaData = this.serviceMetaData.getEndpointByServiceEndpointInterface(seiClassName);
/*     */     QName portTypeName;
/* 212 */     if ((epMetaData == null) && (this.serviceMetaData.getEndpoints().size() == 1))
/*     */     {
/* 214 */       epMetaData = (EndpointMetaData)this.serviceMetaData.getEndpoints().get(0);
/* 215 */       epMetaData.setServiceEndpointInterfaceName(seiClassName);
/*     */     }
/*     */     else
/*     */     {
/* 219 */       portTypeName = getPortTypeName(seiClass);
/* 220 */       for (EndpointMetaData epmd : this.serviceMetaData.getEndpoints())
/*     */       {
/* 222 */         if (portTypeName.equals(epmd.getPortTypeName()))
/*     */         {
/* 224 */           epmd.setServiceEndpointInterfaceName(seiClass.getName());
/* 225 */           epMetaData = epmd;
/* 226 */           break;
/*     */         }
/*     */       }
/*     */     }
/*     */
/* 231 */     if (epMetaData == null) {
/* 232 */       throw new WebServiceException("Cannot get port meta data for: " + seiClassName);
/*     */     }
/* 234 */     return getPortInternal(epMetaData, seiClass);
/*     */   }
/*     */
/*     */   private <T> QName getPortTypeName(Class<T> seiClass)
/*     */   {
/* 239 */     if (!seiClass.isAnnotationPresent(WebService.class)) {
/* 240 */       throw new IllegalArgumentException("Cannot find @WebService on: " + seiClass.getName());
/*     */     }
/* 242 */     WebService anWebService = (WebService)seiClass.getAnnotation(WebService.class);
/* 243 */     String localPart = anWebService.name();
/* 244 */     if (localPart.length() == 0) {
/* 245 */       localPart = WSDLUtils.getJustClassName(seiClass);
/*     */     }
/* 247 */     String nsURI = anWebService.targetNamespace();
/* 248 */     if (nsURI.length() == 0) {
/* 249 */       nsURI = WSDLUtils.getTypeNamespace(seiClass);
/*     */     }
/* 251 */     QName portType = new QName(nsURI, localPart);
/* 252 */     return portType;
/*     */   }
/*     */
/*     */   private <T> T getPortInternal(EndpointMetaData epMetaData, Class<T> seiClass)
/*     */   {
/* 257 */     QName portName = epMetaData.getPortName();
/*     */
/* 260 */     if (!this.annotatedPorts.contains(portName))
/*     */     {
/* 262 */       JAXWSClientMetaDataBuilder metaDataBuilder = new JAXWSClientMetaDataBuilder();
/* 263 */       metaDataBuilder.rebuildEndpointMetaData(epMetaData, seiClass);
/* 264 */       this.annotatedPorts.add(portName);
/*     */     }
/*     */
/* 267 */     return createProxy(seiClass, epMetaData);
/*     */   }
/*     */
/*     */   private void assertSEIConstraints(Class seiClass)
/*     */   {
/* 272 */     if (seiClass == null) {
/* 273 */       throw new IllegalArgumentException("Service endpoint interface cannot be null");
/*     */     }
/* 275 */     if (!seiClass.isAnnotationPresent(WebService.class))
/* 276 */       throw new WebServiceException("SEI is missing @WebService annotation: " + seiClass);
/*     */   }
/*     */
/*     */   public void addPort(QName portName, String bindingId, String epAddress)
/*     */   {
/* 287 */     EndpointMetaData epMetaData = this.serviceMetaData.getEndpoint(portName);
/* 288 */     if (epMetaData == null)
/*     */     {
/* 290 */       epMetaData = new ClientEndpointMetaData(this.serviceMetaData, portName, null, EndpointMetaData.Type.JAXWS);
/* 291 */       this.serviceMetaData.addEndpoint(epMetaData);
/*     */     }
/* 293 */     epMetaData.setBindingId(bindingId);
/* 294 */     epMetaData.setEndpointAddress(epAddress);
/*     */   }
/*     */
/*     */   public <T> Dispatch<T> createDispatch(QName portName, Class<T> type, Service.Mode mode)
/*     */   {
/* 300 */     ExecutorService executor = (ExecutorService)getExecutor();
/* 301 */     EndpointMetaData epMetaData = getEndpointMetaData(portName);
/* 302 */     DispatchImpl dispatch = new DispatchImpl(executor, epMetaData, type, mode);
/* 303 */     return dispatch;
/*     */   }
/*     */
/*     */   public Dispatch<Object> createDispatch(QName portName, JAXBContext jbc, Service.Mode mode)
/*     */   {
/* 309 */     ExecutorService executor = (ExecutorService)getExecutor();
/* 310 */     EndpointMetaData epMetaData = getEndpointMetaData(portName);
/* 311 */     DispatchImpl dispatch = new DispatchImpl(executor, epMetaData, jbc, mode);
/* 312 */     return dispatch;
/*     */   }
/*     */
/*     */   private EndpointMetaData getEndpointMetaData(QName portName)
/*     */   {
/* 317 */     EndpointMetaData epMetaData = this.serviceMetaData.getEndpoint(portName);
/* 318 */     if (epMetaData == null) {
/* 319 */       throw new WebServiceException("Cannot find port: " + portName);
/*     */     }
/* 321 */     return epMetaData;
/*     */   }
/*     */
/*     */   public QName getServiceName()
/*     */   {
/* 328 */     return this.serviceMetaData.getServiceName();
/*     */   }
/*     */
/*     */   public Iterator<QName> getPorts()
/*     */   {
/* 335 */     ArrayList portNames = new ArrayList();
/* 336 */     for (EndpointMetaData epMetaData : this.serviceMetaData.getEndpoints())
/*     */     {
/* 338 */       portNames.add(epMetaData.getPortName());
/*     */     }
/* 340 */     return portNames.iterator();
/*     */   }
/*     */
/*     */   public URL getWSDLDocumentLocation()
/*     */   {
/* 346 */     return this.serviceMetaData.getWsdlLocation();
/*     */   }
/*     */
/*     */   public HandlerResolver getHandlerResolver()
/*     */   {
/* 352 */     return this.handlerResolver;
/*     */   }
/*     */
/*     */   public void setHandlerResolver(HandlerResolver handlerResolver)
/*     */   {
/* 358 */     this.handlerResolver = handlerResolver;
/*     */   }
/*     */
/*     */   public Executor getExecutor()
/*     */   {
/* 364 */     if (this.executor == null)
/*     */     {
/* 366 */       this.executor = defaultExecutor;
/*     */     }
/* 368 */     return this.executor;
/*     */   }
/*     */
/*     */   public void setExecutor(Executor executor)
/*     */   {
/* 374 */     if (!(executor instanceof ExecutorService)) {
/* 375 */       throw new IllegalArgumentException("Supported executors must implement " + ExecutorService.class.getName());
/*     */     }
/* 377 */     this.executor = ((ExecutorService)executor);
/*     */   }
/*     */
/*     */   private <T> T createProxy(Class<T> seiClass, EndpointMetaData epMetaData) throws WebServiceException
/*     */   {
/* 382 */     if (seiClass == null) {
/* 383 */       throw new IllegalArgumentException("SEI class cannot be null");
/*     */     }try {
/* 387 */       ExecutorService executor = (ExecutorService)getExecutor();
/* 388 */       ClientProxy handler = new ClientProxy(executor, new ClientImpl(epMetaData, this.handlerResolver));
/* 389 */       ClassLoader cl = epMetaData.getClassLoader();
/*     */       Object proxy;
/*     */       try {
/* 394 */         proxy = Proxy.newProxyInstance(cl, new Class[] { seiClass, BindingProvider.class, StubExt.class }, handler);
/*     */       }
/*     */       catch (RuntimeException rte)
/*     */       {
/* 398 */         URL codeLocation = seiClass.getProtectionDomain().getCodeSource().getLocation();
/* 399 */         this.log.error("Cannot create proxy for SEI " + seiClass.getName() + " from: " + codeLocation);
/* 400 */         throw rte;
/*     */       }
/*     */
/* 404 */       configureStub((StubExt)proxy);
/*     */
/* 406 */       return proxy;
/*     */     }
/*     */     catch (WebServiceException ex)
/*     */     {
/* 410 */       throw ex;
/*     */     }
/*     */     catch (Exception ex) {
/*     */     }
/* 414 */     throw new WebServiceException("Cannot create proxy", ex);
/*     */   }
/*     */
/*     */   private void configureStub(StubExt stub)
/*     */   {
/* 420 */     EndpointMetaData epMetaData = stub.getEndpointMetaData();
/* 421 */     String seiName = epMetaData.getServiceEndpointInterfaceName();
/* 422 */     QName portName = epMetaData.getPortName();
/*     */
/* 424 */     if (this.usRef == null)
/*     */     {
/* 426 */       this.log.debug("No port configuration for: " + portName);
/* 427 */       return;
/*     */     }
/*     */
/* 430 */     String configFile = this.usRef.getConfigFile();
/* 431 */     String configName = this.usRef.getConfigName();
/*     */
/* 433 */     UnifiedPortComponentRefMetaData pcref = this.usRef.getPortComponentRef(seiName, portName);
/*     */     Map reqCtx;
/* 434 */     if (pcref != null)
/*     */     {
/* 436 */       if (pcref.getConfigFile() != null)
/* 437 */         configFile = pcref.getConfigFile();
/* 438 */       if (pcref.getConfigName() != null) {
/* 439 */         configName = pcref.getConfigName();
/*     */       }
/* 441 */       BindingProvider bp = (BindingProvider)stub;
/* 442 */       reqCtx = bp.getRequestContext();
/* 443 */       for (UnifiedStubPropertyMetaData prop : pcref.getStubProperties())
/*     */       {
/* 445 */         this.log.debug("Set stub property: " + prop);
/* 446 */         reqCtx.put(prop.getPropName(), prop.getPropValue());
/*     */       }
/*     */     }
/*     */
/* 450 */     if ((configName != null) || (configFile != null))
/*     */     {
/* 452 */       this.log.debug("Configure Stub: [configName=" + configName + ",configFile=" + configFile + "]");
/* 453 */       stub.setConfigName(configName, configFile);
/*     */     }
/*     */   }
/*     */
/*     */   public <T> Dispatch<T> createDispatch(QName portName, Class<T> type, Service.Mode mode, WebServiceFeature[] features)
/*     */   {
/* 460 */     throw new NotImplementedException();
/*     */   }
/*     */
/*     */   public <T> Dispatch<T> createDispatch(EndpointReference endpointReference, Class<T> type, Service.Mode mode, WebServiceFeature[] features)
/*     */   {
/* 466 */     throw new NotImplementedException();
/*     */   }
/*     */
/*     */   public Dispatch<Object> createDispatch(QName portName, JAXBContext context, Service.Mode mode, WebServiceFeature[] features)
/*     */   {
/* 472 */     throw new NotImplementedException();
/*     */   }
/*     */
/*     */   public Dispatch<Object> createDispatch(EndpointReference endpointReference, JAXBContext context, Service.Mode mode, WebServiceFeature[] features)
/*     */   {
/* 478 */     throw new NotImplementedException();
/*     */   }
/*     */
/*     */   public <T> T getPort(QName portName, Class<T> serviceEndpointInterface, WebServiceFeature[] features)
/*     */   {
/* 484 */     throw new NotImplementedException();
/*     */   }
/*     */
/*     */   public <T> T getPort(EndpointReference endpointReference, Class<T> serviceEndpointInterface, WebServiceFeature[] features)
/*     */   {
/* 490 */     throw new NotImplementedException();
/*     */   }
/*     */
/*     */   public <T> T getPort(Class<T> serviceEndpointInterface, WebServiceFeature[] features)
/*     */   {
/* 496 */     throw new NotImplementedException();
/*     */   }
/*     */ }

/* Location:           /home/mnovotny/projects/EMBEDDED_JBOSS_BETA3_COMMUNITY/embedded/output/lib/embedded-jboss/lib/jboss-embedded-all.jar
* Qualified Name:     org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl
* JD-Core Version:    0.6.0
*/
TOP

Related Classes of org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.