Search in sources :

Example 1 with WebBundleContext

use of com.sun.enterprise.deployment.annotation.context.WebBundleContext in project Payara by payara.

the class WebServletHandler method processAnnotation.

@Override
public HandlerProcessingResult processAnnotation(AnnotationInfo ainfo) throws AnnotationProcessorException {
    ProcessingContext context = ainfo.getProcessingContext();
    AnnotatedElementHandler aeHandler = context.getHandler();
    if (aeHandler instanceof WebBundleContext) {
        WebBundleContext webBundleContext = (WebBundleContext) aeHandler;
        WebBundleDescriptor descriptor = webBundleContext.getDescriptor();
        WebServlet webServletAn = (WebServlet) ainfo.getAnnotation();
        Class servletClass = (Class) ainfo.getAnnotatedElement();
        String servletName = getServletName(webServletAn, servletClass);
        // create a WebComponentDescriptor if there is none
        WebComponentDescriptor webCompDesc = findWebComponentDescriptor(servletName, servletClass, descriptor, context);
        if (webCompDesc == null) {
            createWebComponentDescriptor(servletName, servletClass, descriptor);
        }
    }
    return super.processAnnotation(ainfo);
}
Also used : WebComponentDescriptor(com.sun.enterprise.deployment.WebComponentDescriptor) WebBundleContext(com.sun.enterprise.deployment.annotation.context.WebBundleContext) WebServlet(javax.servlet.annotation.WebServlet) WebBundleDescriptor(com.sun.enterprise.deployment.WebBundleDescriptor)

Example 2 with WebBundleContext

use of com.sun.enterprise.deployment.annotation.context.WebBundleContext in project Payara by payara.

the class WebServiceHandler method processAnnotation.

@Override
public HandlerProcessingResult processAnnotation(AnnotationInfo annInfo) throws AnnotationProcessorException {
    AnnotatedElementHandler annCtx = annInfo.getProcessingContext().getHandler();
    AnnotatedElement annElem = annInfo.getAnnotatedElement();
    AnnotatedElement origAnnElem = annElem;
    boolean ejbInWar = ignoreWebserviceAnnotations(annElem, annCtx);
    // and add webservices to that BundleDescriptor
    if (ejbInWar) {
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.PROCESSED);
    }
    // sanity check
    if (!(annElem instanceof Class)) {
        AnnotationProcessorException ape = new AnnotationProcessorException(wsLocalStrings.getLocalString("enterprise.deployment.annotation.handlers.wrongannotationlocation", "WS00022: symbol annotation can only be specified on TYPE"), annInfo);
        annInfo.getProcessingContext().getErrorHandler().error(ape);
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.FAILED);
    }
    // Ignore @WebService annotation on an interface; process only those in an actual service impl class
    if (((Class) annElem).isInterface()) {
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.PROCESSED);
    }
    if (isJaxwsRIDeployment(annInfo)) {
        // Looks like JAX-WS RI specific deployment, do not process Web Service annotations otherwise would end up as two web service endpoints
        conLogger.log(Level.INFO, LogUtils.DEPLOYMENT_DISABLED, new Object[] { annInfo.getProcessingContext().getArchive().getName(), "WEB-INF/sun-jaxws.xml" });
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.PROCESSED);
    }
    // let's get the main annotation of interest.
    javax.jws.WebService ann = (javax.jws.WebService) annInfo.getAnnotation();
    BundleDescriptor bundleDesc = null;
    // Ensure that an EJB endpoint is packaged in EJBJAR and a servlet endpoint is packaged in a WAR
    try {
        // let's see the type of web service we are dealing with...
        if (ejbProvider != null && ejbProvider.getType("javax.ejb.Stateless") != null) {
            // this is an ejb !
            if (annCtx instanceof EjbContext) {
                EjbContext ctx = (EjbContext) annCtx;
                bundleDesc = ctx.getDescriptor().getEjbBundleDescriptor();
                bundleDesc.setSpecVersion("3.0");
            } else if (annCtx instanceof EjbsContext) {
                String name = getEjbName(annElem);
                for (EjbContext ejbCtx : ((EjbsContext) annCtx).getEjbContexts()) {
                    EjbDescriptor descriptor = ejbCtx.getDescriptor();
                    if (name.equals(descriptor.getName())) {
                        bundleDesc = descriptor.getEjbBundleDescriptor();
                        bundleDesc.setSpecVersion("3.0");
                        break;
                    }
                }
            }
        }
        if (bundleDesc == null) {
            // this has to be a servlet since there is no @Servlet annotation yet
            if (annCtx instanceof WebComponentContext) {
                bundleDesc = ((WebComponentContext) annCtx).getDescriptor().getWebBundleDescriptor();
            } else if (!(annCtx instanceof WebBundleContext)) {
                return getInvalidAnnotatedElementHandlerResult(annInfo.getProcessingContext().getHandler(), annInfo);
            }
            bundleDesc = ((WebBundleContext) annCtx).getDescriptor();
            bundleDesc.setSpecVersion("2.5");
        }
    } catch (Exception e) {
        throw new AnnotationProcessorException(wsLocalStrings.getLocalString("webservice.annotation.exception", "WS00023: Exception in processing @Webservice : {0}", e.getMessage()));
    }
    // WebService.name in the impl class identifies port-component-name
    // If this is specified in impl class, then that takes precedence
    String portComponentName = ann.name();
    // As per JSR181, the serviceName is either specified in the deployment descriptor
    // or in @WebSErvice annotation in impl class; if neither service name implclass+Service
    String svcNameFromImplClass = ann.serviceName();
    String implClassName = ((Class) annElem).getSimpleName();
    String implClassFullName = ((Class) annElem).getName();
    // In case user gives targetNameSpace in the Impl class, that has to be used as
    // the namespace for service, port; typically user will do this in cases where
    // port_types reside in a different namespace than that of server/port.
    // Store the targetNameSpace, if any, in the impl class for later use
    String targetNameSpace = ann.targetNamespace();
    // As per JSR181, the portName is either specified in deployment desc or in @WebService
    // in impl class; if neither, it will @WebService.name+Port; if @WebService.name is not there,
    // then port name is implClass+Port
    String portNameFromImplClass = ann.portName();
    if ((portNameFromImplClass == null) || (portNameFromImplClass.length() == 0)) {
        if ((portComponentName != null) && (portComponentName.length() != 0)) {
            portNameFromImplClass = portComponentName + "Port";
        } else {
            portNameFromImplClass = implClassName + "Port";
        }
    }
    // Store binding type specified in Impl class
    String userSpecifiedBinding = null;
    javax.xml.ws.BindingType bindingAnn = (javax.xml.ws.BindingType) ((Class) annElem).getAnnotation(javax.xml.ws.BindingType.class);
    if (bindingAnn != null) {
        userSpecifiedBinding = bindingAnn.value();
    }
    // Store wsdlLocation in the impl class (if any)
    String wsdlLocation = null;
    if (ann.wsdlLocation() != null && ann.wsdlLocation().length() != 0) {
        wsdlLocation = ann.wsdlLocation();
    }
    // remaining attributes should be extracted from the SEI instead of SIB.
    if (ann.endpointInterface() != null && ann.endpointInterface().length() > 0) {
        Class endpointIntf;
        try {
            endpointIntf = ((Class) annElem).getClassLoader().loadClass(ann.endpointInterface());
        } catch (java.lang.ClassNotFoundException cfne) {
            throw new AnnotationProcessorException(localStrings.getLocalString("enterprise.deployment.annotation.handlers.classnotfound", "class {0} referenced from annotation symbol cannot be loaded", new Object[] { ann.endpointInterface() }), annInfo);
        }
        annElem = endpointIntf;
        ann = annElem.getAnnotation(javax.jws.WebService.class);
        if (ann == null) {
            throw new AnnotationProcessorException(wsLocalStrings.getLocalString("no.webservice.annotation", "WS00025: SEI {0} referenced from the @WebService annotation on {1}  does not contain a @WebService annotation", ((javax.jws.WebService) annInfo.getAnnotation()).endpointInterface(), ((Class) annElem).getName()));
        }
        // SEI cannot have @BindingType
        if (annElem.getAnnotation(javax.xml.ws.BindingType.class) != null) {
            throw new AnnotationProcessorException(wsLocalStrings.getLocalString("cannot.have.bindingtype", "WS00026: SEI {0} cannot have @BindingType", ((javax.jws.WebService) annInfo.getAnnotation()).endpointInterface()));
        }
    }
    WebServicesDescriptor wsDesc = bundleDesc.getWebServices();
    // unique port-component-name for this module
    if (portComponentName == null || portComponentName.length() == 0) {
        portComponentName = implClassName;
    }
    // Check if this port-component-name is unique for this module
    WebServiceEndpoint wep = wsDesc.getEndpointByName(portComponentName);
    if (wep != null) {
        // use fully qualified class name as port-component-name for the current endpoint
        if ((wep.getServiceEndpointInterface() != null) && (wep.getServiceEndpointInterface().length() != 0) && (!((Class) annElem).getName().equals(wep.getServiceEndpointInterface()))) {
            portComponentName = implClassFullName;
        }
    }
    // Check if the same endpoint is already defined in webservices.xml
    // This has to be done again after applying the 109 rules as above
    // for port-component-name
    WebServiceEndpoint endpoint = wsDesc.getEndpointByName(portComponentName);
    WebService newWS;
    if (endpoint == null) {
        if (DOLUtils.warType().equals(bundleDesc.getModuleType())) {
            // http://java.net/jira/browse/GLASSFISH-17204
            WebComponentDescriptor[] wcByImplName = ((WebBundleDescriptor) bundleDesc).getWebComponentByImplName(implClassFullName);
            for (WebComponentDescriptor wc : wcByImplName) {
                if (!wsDesc.getEndpointsImplementedBy(wc).isEmpty()) {
                    // URL mapping for annotated service exists - it can be JAX-RPC service
                    // as well as some servlet or maybe only invalid port-component-name,
                    // so let user know about possible error
                    logger.log(Level.SEVERE, LogUtils.WS_URLMAPPING_EXISTS, new Object[] { implClassFullName });
                    break;
                }
            }
        }
        // If so, add this endpoint to the existing service
        if (svcNameFromImplClass != null && svcNameFromImplClass.length() != 0) {
            newWS = wsDesc.getWebServiceByName(svcNameFromImplClass);
        } else {
            newWS = wsDesc.getWebServiceByName(implClassName + "Service");
        }
        if (newWS == null) {
            newWS = new WebService();
            // service name from annotation
            if (svcNameFromImplClass != null && svcNameFromImplClass.length() != 0) {
                newWS.setName(svcNameFromImplClass);
            } else {
                newWS.setName(implClassName + "Service");
            }
            wsDesc.addWebService(newWS);
        }
        endpoint = new WebServiceEndpoint();
        if (portComponentName != null && portComponentName.length() != 0) {
            endpoint.setEndpointName(portComponentName);
        } else {
            endpoint.setEndpointName(((Class) annElem).getName());
        }
        newWS.addEndpoint(endpoint);
        wsDesc.setSpecVersion(WebServicesDescriptorNode.SPEC_VERSION);
    } else {
        newWS = endpoint.getWebService();
    }
    // present overrides everything else
    if (endpoint.getWsdlService() != null) {
        if ((targetNameSpace != null) && (targetNameSpace.length() != 0) && (!endpoint.getWsdlService().getNamespaceURI().equals(targetNameSpace))) {
            AnnotationProcessorException ape = new AnnotationProcessorException(wsLocalStrings.getLocalString("mismatch.targetnamespace", "WS00027: Target Namespace in wsdl-service element does not match @WebService.targetNamespace"), annInfo);
            annInfo.getProcessingContext().getErrorHandler().error(ape);
            return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.FAILED);
        }
        targetNameSpace = endpoint.getWsdlService().getNamespaceURI();
    }
    // Service and port should reside in the same namespace - assert that
    if ((endpoint.getWsdlService() != null) && (endpoint.getWsdlPort() != null)) {
        if (!endpoint.getWsdlService().getNamespaceURI().equals(endpoint.getWsdlPort().getNamespaceURI())) {
            AnnotationProcessorException ape = new AnnotationProcessorException(wsLocalStrings.getLocalString("mismatch.port.targetnamespace", "WS00028: Target Namespace for wsdl-service and wsdl-port should be the same"), annInfo);
            annInfo.getProcessingContext().getErrorHandler().error(ape);
            return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.FAILED);
        }
    }
    // Precedence given for wsdlLocation in impl class
    if (newWS.getWsdlFileUri() == null) {
        if (wsdlLocation != null) {
            newWS.setWsdlFileUri(wsdlLocation);
        } else {
            if (ann.wsdlLocation() != null && ann.wsdlLocation().length() != 0) {
                newWS.setWsdlFileUri(ann.wsdlLocation());
            }
        }
    }
    // Set binding id id @BindingType is specified by the user in the impl class
    if ((!endpoint.hasUserSpecifiedProtocolBinding()) && (userSpecifiedBinding != null) && (userSpecifiedBinding.length() != 0)) {
        endpoint.setProtocolBinding(userSpecifiedBinding);
    }
    if (endpoint.getServiceEndpointInterface() == null) {
        // take SEI from annotation
        if (ann.endpointInterface() != null && ann.endpointInterface().length() != 0) {
            endpoint.setServiceEndpointInterface(ann.endpointInterface());
        } else {
            endpoint.setServiceEndpointInterface(((Class) annElem).getName());
        }
    }
    // at this point the SIB has to be used no matter what @WebService was used.
    annElem = annInfo.getAnnotatedElement();
    if (DOLUtils.warType().equals(bundleDesc.getModuleType())) {
        if (endpoint.getServletImplClass() == null) {
            // Set servlet impl class here
            endpoint.setServletImplClass(((Class) annElem).getName());
        }
        // Servlet link name
        WebBundleDescriptor webBundle = (WebBundleDescriptor) bundleDesc;
        if (endpoint.getWebComponentLink() == null) {
            // <servlet-link> = fully qualified name of the implementation class
            endpoint.setWebComponentLink(implClassFullName);
        }
        if (endpoint.getWebComponentImpl() == null) {
            WebComponentDescriptor webComponent = (WebComponentDescriptor) webBundle.getWebComponentByCanonicalName(endpoint.getWebComponentLink());
            if (webComponent == null) {
                // GLASSFISH-3297
                WebComponentDescriptor[] wcs = webBundle.getWebComponentByImplName(implClassFullName);
                if (wcs.length > 0) {
                    webComponent = wcs[0];
                }
            }
            // if servlet is not known, we should add it now
            if (webComponent == null) {
                webComponent = new WebComponentDescriptorImpl();
                webComponent.setServlet(true);
                webComponent.setWebComponentImplementation(((Class) annElem).getCanonicalName());
                webComponent.setName(endpoint.getEndpointName());
                webComponent.addUrlPattern("/" + newWS.getName());
                webBundle.addWebComponentDescriptor(webComponent);
            }
            endpoint.setWebComponentImpl(webComponent);
        }
    } else {
        // TODO BM handle stateless
        String name = getEjbName(annElem);
        EjbDescriptor ejb = ((EjbBundleDescriptor) bundleDesc).getEjbByName(name);
        endpoint.setEjbComponentImpl(ejb);
        ejb.setWebServiceEndpointInterfaceName(endpoint.getServiceEndpointInterface());
        if (endpoint.getEjbLink() == null) {
            endpoint.setEjbLink(ejb.getName());
        }
    }
    if (endpoint.getWsdlPort() == null) {
        // during wsgen phase
        if (targetNameSpace == null || targetNameSpace.length() == 0) {
            // the reverse order prepended with http://
            if (((Class) annElem).getPackage() != null) {
                StringTokenizer tokens = new StringTokenizer(((Class) annElem).getPackage().getName(), ".", false);
                if (tokens.hasMoreElements()) {
                    while (tokens.hasMoreElements()) {
                        if (targetNameSpace == null || targetNameSpace.length() == 0) {
                            targetNameSpace = tokens.nextElement().toString();
                        } else {
                            targetNameSpace = tokens.nextElement().toString() + "." + targetNameSpace;
                        }
                    }
                } else {
                    targetNameSpace = ((Class) annElem).getPackage().getName();
                }
            } else {
                throw new AnnotationProcessorException(wsLocalStrings.getLocalString("missing.targetnamespace", "WS00029: The javax.jws.WebService annotation targetNamespace must be used for classes or interfaces that are in no package"));
            }
            targetNameSpace = "http://" + (targetNameSpace == null ? "" : targetNameSpace + "/");
        }
        // WebService.portName = wsdl-port
        endpoint.setWsdlPort(new QName(targetNameSpace, portNameFromImplClass, "ns1"));
    }
    if (endpoint.getWsdlService() == null) {
        // Set wsdl-service properly; namespace is the same as that of wsdl port;
        // service name derived from deployment desc / annotation / default
        String serviceNameSpace = endpoint.getWsdlPort().getNamespaceURI();
        String serviceName;
        if ((svcNameFromImplClass != null) && (svcNameFromImplClass.length() != 0)) {
            // Use the serviceName annotation if available
            serviceName = svcNameFromImplClass;
        } else {
            serviceName = newWS.getName();
        }
        endpoint.setWsdlService(new QName(serviceNameSpace, serviceName, "ns1"));
    }
    // have @HandlerChain but the SEI has one specified through JAXWS customization
    if ((((Class) origAnnElem).getAnnotation(javax.jws.HandlerChain.class)) == null) {
        return (new HandlerChainHandler()).processHandlerChainAnnotation(annInfo, annCtx, origAnnElem, (Class) origAnnElem, true);
    }
    return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.PROCESSED);
}
Also used : AnnotatedElement(java.lang.reflect.AnnotatedElement) WebBundleContext(com.sun.enterprise.deployment.annotation.context.WebBundleContext) WebComponentDescriptorImpl(org.glassfish.web.deployment.descriptor.WebComponentDescriptorImpl) QName(javax.xml.namespace.QName) EjbsContext(com.sun.enterprise.deployment.annotation.context.EjbsContext) StringTokenizer(java.util.StringTokenizer) WebComponentContext(com.sun.enterprise.deployment.annotation.context.WebComponentContext) EjbContext(com.sun.enterprise.deployment.annotation.context.EjbContext)

Example 3 with WebBundleContext

use of com.sun.enterprise.deployment.annotation.context.WebBundleContext in project Payara by payara.

the class AnnotatedElementHandlerFactory method createAnnotatedElementHandler.

public static AnnotatedElementHandler createAnnotatedElementHandler(RootDeploymentDescriptor bundleDesc) {
    AnnotatedElementHandler aeHandler = null;
    if (bundleDesc instanceof EjbBundleDescriptor) {
        EjbBundleDescriptor ejbBundleDesc = (EjbBundleDescriptor) bundleDesc;
        aeHandler = new EjbBundleContext(ejbBundleDesc);
    } else if (bundleDesc instanceof ApplicationClientDescriptor) {
        ApplicationClientDescriptor appClientDesc = (ApplicationClientDescriptor) bundleDesc;
        aeHandler = new AppClientContext(appClientDesc);
    } else if (bundleDesc instanceof WebBundleDescriptor) {
        WebBundleDescriptor webBundleDesc = (WebBundleDescriptor) bundleDesc;
        aeHandler = new WebBundleContext(webBundleDesc);
    } else if (bundleDesc instanceof ConnectorDescriptor) {
        ConnectorDescriptor connectorDesc = (ConnectorDescriptor) bundleDesc;
        aeHandler = new RarBundleContext(connectorDesc);
    }
    return aeHandler;
}
Also used : AppClientContext(com.sun.enterprise.deployment.annotation.context.AppClientContext) EjbBundleContext(com.sun.enterprise.deployment.annotation.context.EjbBundleContext) WebBundleContext(com.sun.enterprise.deployment.annotation.context.WebBundleContext) RarBundleContext(com.sun.enterprise.deployment.annotation.context.RarBundleContext) AnnotatedElementHandler(org.glassfish.apf.AnnotatedElementHandler)

Example 4 with WebBundleContext

use of com.sun.enterprise.deployment.annotation.context.WebBundleContext in project Payara by payara.

the class AbstractWebHandler method processAnnotation.

/**
 * Process a particular annotation which type is the same as the
 * one returned by @see getAnnotationType(). All information
 * pertinent to the annotation and its context is encapsulated
 * in the passed AnnotationInfo instance.
 * This is a method in interface AnnotationHandler.
 *
 * @param ainfo the annotation information
 */
@Override
public HandlerProcessingResult processAnnotation(AnnotationInfo ainfo) throws AnnotationProcessorException {
    AnnotatedElementHandler aeHandler = ainfo.getProcessingContext().getHandler();
    if (aeHandler instanceof WebBundleContext) {
        WebBundleContext webBundleContext = (WebBundleContext) aeHandler;
        AnnotatedElementHandler aeh = webBundleContext.createContextForWeb();
        if (aeh != null) {
            aeHandler = aeh;
        }
    }
    // no inheritance
    HandlerProcessingResult procResult = null;
    if (aeHandler instanceof WebComponentContext) {
        procResult = processAnnotation(ainfo, new WebComponentContext[] { (WebComponentContext) aeHandler });
    } else if (aeHandler instanceof WebComponentsContext) {
        WebComponentsContext webCompsContext = (WebComponentsContext) aeHandler;
        procResult = processAnnotation(ainfo, webCompsContext.getWebComponentContexts());
    } else if (aeHandler instanceof WebBundleContext) {
        WebBundleContext webBundleContext = (WebBundleContext) aeHandler;
        procResult = processAnnotation(ainfo, webBundleContext);
    } else {
        return getInvalidAnnotatedElementHandlerResult(aeHandler, ainfo);
    }
    return procResult;
}
Also used : WebBundleContext(com.sun.enterprise.deployment.annotation.context.WebBundleContext) WebComponentsContext(com.sun.enterprise.deployment.annotation.context.WebComponentsContext) WebComponentContext(com.sun.enterprise.deployment.annotation.context.WebComponentContext) HandlerProcessingResult(org.glassfish.apf.HandlerProcessingResult) AnnotatedElementHandler(org.glassfish.apf.AnnotatedElementHandler)

Example 5 with WebBundleContext

use of com.sun.enterprise.deployment.annotation.context.WebBundleContext in project Payara by payara.

the class WebServiceProviderHandler method processAnnotation.

@Override
public HandlerProcessingResult processAnnotation(AnnotationInfo annInfo) throws AnnotationProcessorException {
    AnnotatedElementHandler annCtx = annInfo.getProcessingContext().getHandler();
    AnnotatedElement annElem = annInfo.getAnnotatedElement();
    boolean ejbInWar = ignoreWebserviceAnnotations(annElem, annCtx);
    // and add webservices to that BundleDescriptor
    if (ejbInWar) {
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.PROCESSED);
    }
    // sanity check
    if (!(annElem instanceof Class)) {
        AnnotationProcessorException ape = new AnnotationProcessorException("@WebServiceProvider can only be specified on TYPE", annInfo);
        annInfo.getProcessingContext().getErrorHandler().error(ape);
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.FAILED);
    }
    if (isJaxwsRIDeployment(annInfo)) {
        // Looks like JAX-WS RI specific deployment, do not process Web Service annotations otherwise would end up as two web service endpoints
        conLogger.log(Level.INFO, LogUtils.DEPLOYMENT_DISABLED, new Object[] { annInfo.getProcessingContext().getArchive().getName(), "WEB-INF/sun-jaxws.xml" });
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.PROCESSED);
    }
    // WebServiceProvider MUST implement the provider interface, let's check this
    if (!javax.xml.ws.Provider.class.isAssignableFrom((Class) annElem)) {
        AnnotationProcessorException ape = new AnnotationProcessorException(annElem.toString() + "does not implement the javax.xml.ws.Provider interface", annInfo);
        annInfo.getProcessingContext().getErrorHandler().error(ape);
        return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.FAILED);
    }
    // let's get the main annotation of interest.
    javax.xml.ws.WebServiceProvider ann = (javax.xml.ws.WebServiceProvider) annInfo.getAnnotation();
    BundleDescriptor bundleDesc = null;
    try {
        // let's see the type of web service we are dealing with...
        if (ejbProvider != null && ejbProvider.getType("javax.ejb.Stateless") != null) {
            // this is an ejb !
            if (annCtx instanceof EjbContext) {
                EjbContext ctx = (EjbContext) annCtx;
                bundleDesc = ctx.getDescriptor().getEjbBundleDescriptor();
                bundleDesc.setSpecVersion("3.0");
            } else if (annCtx instanceof EjbsContext) {
                String name = getEjbName(annElem);
                for (EjbContext ejbCtx : ((EjbsContext) annCtx).getEjbContexts()) {
                    EjbDescriptor descriptor = ejbCtx.getDescriptor();
                    if (name.equals(descriptor.getName())) {
                        bundleDesc = descriptor.getEjbBundleDescriptor();
                        bundleDesc.setSpecVersion("3.0");
                        break;
                    }
                }
            }
        }
        if (bundleDesc == null) {
            // this has to be a servlet
            if (annCtx instanceof WebComponentContext) {
                bundleDesc = ((WebComponentContext) annCtx).getDescriptor().getWebBundleDescriptor();
            } else if (!(annCtx instanceof WebBundleContext)) {
                return getInvalidAnnotatedElementHandlerResult(annInfo.getProcessingContext().getHandler(), annInfo);
            }
            bundleDesc = ((WebBundleContext) annCtx).getDescriptor();
            bundleDesc.setSpecVersion("2.5");
        }
    } catch (Exception e) {
        throw new AnnotationProcessorException(wsLocalStrings.getLocalString("webservice.annotation.exception", "WS00023: Exception in processing @Webservice : {0}", e.getMessage()));
    }
    // For WSProvider, portComponentName is the fully qualified class name
    String portComponentName = ((Class) annElem).getName();
    // As per JSR181, the serviceName is either specified in the deployment descriptor
    // or in @WebSErvice annotation in impl class; if neither service name implclass+Service
    String svcName = ann.serviceName();
    if (svcName == null) {
        svcName = "";
    }
    // Store binding type specified in Impl class
    String userSpecifiedBinding = null;
    javax.xml.ws.BindingType bindingAnn = (javax.xml.ws.BindingType) ((Class) annElem).getAnnotation(javax.xml.ws.BindingType.class);
    if (bindingAnn != null) {
        userSpecifiedBinding = bindingAnn.value();
    }
    // In case user gives targetNameSpace in the Impl class, that has to be used as
    // the namespace for service, port; typically user will do this in cases where
    // port_types reside in a different namespace than that of server/port.
    // Store the targetNameSpace, if any, in the impl class for later use
    String targetNameSpace = ann.targetNamespace();
    if (targetNameSpace == null) {
        targetNameSpace = "";
    }
    String portName = ann.portName();
    if (portName == null) {
        portName = "";
    }
    // Check if the same endpoint is already defined in webservices.xml
    WebServicesDescriptor wsDesc = bundleDesc.getWebServices();
    WebServiceEndpoint endpoint = wsDesc.getEndpointByName(portComponentName);
    WebService newWS;
    if (endpoint == null) {
        // If so, add this endpoint to the existing service
        if (svcName.length() != 0) {
            newWS = wsDesc.getWebServiceByName(svcName);
        } else {
            newWS = wsDesc.getWebServiceByName(((Class) annElem).getSimpleName());
        }
        if (newWS == null) {
            newWS = new WebService();
            // service name from annotation
            if (svcName.length() != 0) {
                newWS.setName(svcName);
            } else {
                newWS.setName(((Class) annElem).getSimpleName());
            }
            wsDesc.addWebService(newWS);
        }
        endpoint = new WebServiceEndpoint();
        // port-component-name is fully qualified class name
        endpoint.setEndpointName(portComponentName);
        newWS.addEndpoint(endpoint);
        wsDesc.setSpecVersion(WebServicesDescriptorNode.SPEC_VERSION);
    } else {
        newWS = endpoint.getWebService();
    }
    // present overrides everything else
    if (endpoint.getWsdlService() != null) {
        if ((targetNameSpace.length() > 0) && (!endpoint.getWsdlService().getNamespaceURI().equals(targetNameSpace))) {
            throw new AnnotationProcessorException("Target Namespace inwsdl-service element does not match @WebService.targetNamespace", annInfo);
        }
        targetNameSpace = endpoint.getWsdlService().getNamespaceURI();
    }
    // Set binding id id @BindingType is specified by the user in the impl class
    if ((!endpoint.hasUserSpecifiedProtocolBinding()) && (userSpecifiedBinding != null) && (userSpecifiedBinding.length() != 0)) {
        endpoint.setProtocolBinding(userSpecifiedBinding);
    }
    // Use annotated values only if the deployment descriptor equivalent has not been specified
    if (newWS.getWsdlFileUri() == null) {
        // take wsdl location from annotation
        if (ann.wsdlLocation() != null && ann.wsdlLocation().length() != 0) {
            newWS.setWsdlFileUri(ann.wsdlLocation());
        }
    }
    annElem = annInfo.getAnnotatedElement();
    // we checked that the endpoint implements the provider interface above
    Class clz = (Class) annElem;
    Class serviceEndpointIntf = null;
    for (Class intf : clz.getInterfaces()) {
        if (javax.xml.ws.Provider.class.isAssignableFrom(intf)) {
            serviceEndpointIntf = intf;
            break;
        }
    }
    if (serviceEndpointIntf == null) {
        endpoint.setServiceEndpointInterface("javax.xml.ws.Provider");
    } else {
        endpoint.setServiceEndpointInterface(serviceEndpointIntf.getName());
    }
    if (DOLUtils.warType().equals(bundleDesc.getModuleType())) {
        if (endpoint.getServletImplClass() == null) {
            // Set servlet impl class here
            endpoint.setServletImplClass(((Class) annElem).getName());
        }
        // Servlet link name
        WebBundleDescriptor webBundle = (WebBundleDescriptor) bundleDesc;
        if (endpoint.getWebComponentLink() == null) {
            endpoint.setWebComponentLink(portComponentName);
        }
        if (endpoint.getWebComponentImpl() == null) {
            WebComponentDescriptor webComponent = (WebComponentDescriptor) webBundle.getWebComponentByCanonicalName(endpoint.getWebComponentLink());
            if (webComponent == null) {
                // GLASSFISH-3297
                WebComponentDescriptor[] wcs = webBundle.getWebComponentByImplName(((Class) annElem).getCanonicalName());
                if (wcs.length > 0) {
                    webComponent = wcs[0];
                }
            }
            // if servlet is not known, we should add it now
            if (webComponent == null) {
                webComponent = new WebComponentDescriptorImpl();
                webComponent.setServlet(true);
                webComponent.setWebComponentImplementation(((Class) annElem).getCanonicalName());
                webComponent.setName(endpoint.getEndpointName());
                webComponent.addUrlPattern("/" + newWS.getName());
                webBundle.addWebComponentDescriptor(webComponent);
            }
            endpoint.setWebComponentImpl(webComponent);
        }
    } else {
        String name = getEjbName(annElem);
        EjbDescriptor ejb = ((EjbBundleDescriptor) bundleDesc).getEjbByName(name);
        endpoint.setEjbComponentImpl(ejb);
        ejb.setWebServiceEndpointInterfaceName(endpoint.getServiceEndpointInterface());
        if (endpoint.getEjbLink() == null) {
            endpoint.setEjbLink(ejb.getName());
        }
    }
    if (endpoint.getWsdlPort() == null) {
        endpoint.setWsdlPort(new QName(targetNameSpace, portName, "ns1"));
    }
    if (endpoint.getWsdlService() == null) {
        endpoint.setWsdlService(new QName(targetNameSpace, svcName, "ns1"));
    }
    return HandlerProcessingResultImpl.getDefaultResult(getAnnotationType(), ResultType.PROCESSED);
}
Also used : WebService(com.sun.enterprise.deployment.WebService) AnnotatedElement(java.lang.reflect.AnnotatedElement) WebBundleDescriptor(com.sun.enterprise.deployment.WebBundleDescriptor) WebServicesDescriptor(com.sun.enterprise.deployment.WebServicesDescriptor) WebBundleContext(com.sun.enterprise.deployment.annotation.context.WebBundleContext) WebComponentDescriptorImpl(org.glassfish.web.deployment.descriptor.WebComponentDescriptorImpl) QName(javax.xml.namespace.QName) EjbDescriptor(com.sun.enterprise.deployment.EjbDescriptor) EjbsContext(com.sun.enterprise.deployment.annotation.context.EjbsContext) BundleDescriptor(com.sun.enterprise.deployment.BundleDescriptor) WebBundleDescriptor(com.sun.enterprise.deployment.WebBundleDescriptor) EjbBundleDescriptor(com.sun.enterprise.deployment.EjbBundleDescriptor) WebComponentDescriptor(com.sun.enterprise.deployment.WebComponentDescriptor) WebComponentContext(com.sun.enterprise.deployment.annotation.context.WebComponentContext) WebServiceEndpoint(com.sun.enterprise.deployment.WebServiceEndpoint) EjbBundleDescriptor(com.sun.enterprise.deployment.EjbBundleDescriptor) EjbContext(com.sun.enterprise.deployment.annotation.context.EjbContext)

Aggregations

WebBundleContext (com.sun.enterprise.deployment.annotation.context.WebBundleContext)6 WebComponentContext (com.sun.enterprise.deployment.annotation.context.WebComponentContext)4 AnnotatedElementHandler (org.glassfish.apf.AnnotatedElementHandler)3 WebBundleDescriptor (com.sun.enterprise.deployment.WebBundleDescriptor)2 WebComponentDescriptor (com.sun.enterprise.deployment.WebComponentDescriptor)2 EjbContext (com.sun.enterprise.deployment.annotation.context.EjbContext)2 EjbsContext (com.sun.enterprise.deployment.annotation.context.EjbsContext)2 AnnotatedElement (java.lang.reflect.AnnotatedElement)2 QName (javax.xml.namespace.QName)2 WebComponentDescriptorImpl (org.glassfish.web.deployment.descriptor.WebComponentDescriptorImpl)2 BundleDescriptor (com.sun.enterprise.deployment.BundleDescriptor)1 EjbBundleDescriptor (com.sun.enterprise.deployment.EjbBundleDescriptor)1 EjbDescriptor (com.sun.enterprise.deployment.EjbDescriptor)1 WebService (com.sun.enterprise.deployment.WebService)1 WebServiceEndpoint (com.sun.enterprise.deployment.WebServiceEndpoint)1 WebServicesDescriptor (com.sun.enterprise.deployment.WebServicesDescriptor)1 AppClientContext (com.sun.enterprise.deployment.annotation.context.AppClientContext)1 EjbBundleContext (com.sun.enterprise.deployment.annotation.context.EjbBundleContext)1 RarBundleContext (com.sun.enterprise.deployment.annotation.context.RarBundleContext)1 WebComponentsContext (com.sun.enterprise.deployment.annotation.context.WebComponentsContext)1