Search in sources :

Example 41 with AnnotatedElement

use of java.lang.reflect.AnnotatedElement in project reflections by ronmamo.

the class NameHelperTest method testToForNames.

@Test
public void testToForNames() throws NoSuchFieldException, NoSuchMethodException {
    Class<String> CLASS = String.class;
    Constructor<String> CONST = CLASS.getDeclaredConstructor();
    Method METHOD = CLASS.getDeclaredMethod("length");
    Field FIELD = CLASS.getDeclaredField("value");
    Set<AnnotatedElement> elements = set(CLASS, CONST, METHOD, FIELD);
    Collection<String> names = toNames(elements);
    assertEquals(set(CLASS), forNames(names));
    assertEquals(set(CLASS), forNames(names, Class.class));
    assertEquals(set(CONST), forNames(names, Constructor.class));
    assertEquals(set(METHOD), forNames(names, Method.class));
    assertEquals(set(FIELD), forNames(names, Field.class));
    assertEquals(set(CONST, METHOD, FIELD), forNames(names, Member.class));
}
Also used : Field(java.lang.reflect.Field) Constructor(java.lang.reflect.Constructor) AnnotatedElement(java.lang.reflect.AnnotatedElement) Method(java.lang.reflect.Method) Member(java.lang.reflect.Member) Test(org.junit.jupiter.api.Test)

Example 42 with AnnotatedElement

use of java.lang.reflect.AnnotatedElement in project spring-framework by spring-projects.

the class AnnotationAwareOrderComparator method findOrderFromAnnotation.

@Nullable
private Integer findOrderFromAnnotation(Object obj) {
    AnnotatedElement element = (obj instanceof AnnotatedElement ? (AnnotatedElement) obj : obj.getClass());
    MergedAnnotations annotations = MergedAnnotations.from(element, SearchStrategy.TYPE_HIERARCHY);
    Integer order = OrderUtils.getOrderFromAnnotations(element, annotations);
    if (order == null && obj instanceof DecoratingProxy) {
        return findOrderFromAnnotation(((DecoratingProxy) obj).getDecoratedClass());
    }
    return order;
}
Also used : DecoratingProxy(org.springframework.core.DecoratingProxy) AnnotatedElement(java.lang.reflect.AnnotatedElement) Nullable(org.springframework.lang.Nullable)

Example 43 with AnnotatedElement

use of java.lang.reflect.AnnotatedElement in project spring-framework by spring-projects.

the class MultipleComposedAnnotationsOnSingleAnnotatedElementTests method getComposedPlusLocalAnnotationsOnMethod.

@Test
void getComposedPlusLocalAnnotationsOnMethod() throws Exception {
    AnnotatedElement element = getClass().getDeclaredMethod("composedPlusLocalCachesMethod");
    assertGetAllMergedAnnotationsBehavior(element);
}
Also used : AnnotatedElement(java.lang.reflect.AnnotatedElement) Test(org.junit.jupiter.api.Test)

Example 44 with AnnotatedElement

use of java.lang.reflect.AnnotatedElement in project spring-framework by spring-projects.

the class MultipleComposedAnnotationsOnSingleAnnotatedElementTests method getMultipleComposedAnnotationsOnMethod.

@Test
void getMultipleComposedAnnotationsOnMethod() throws Exception {
    AnnotatedElement element = getClass().getDeclaredMethod("multipleComposedCachesMethod");
    assertGetAllMergedAnnotationsBehavior(element);
}
Also used : AnnotatedElement(java.lang.reflect.AnnotatedElement) Test(org.junit.jupiter.api.Test)

Example 45 with AnnotatedElement

use of java.lang.reflect.AnnotatedElement 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)

Aggregations

AnnotatedElement (java.lang.reflect.AnnotatedElement)106 Method (java.lang.reflect.Method)23 Annotation (java.lang.annotation.Annotation)17 Field (java.lang.reflect.Field)17 ArrayList (java.util.ArrayList)12 Test (org.junit.Test)11 HashMap (java.util.HashMap)9 Test (org.junit.jupiter.api.Test)8 Member (java.lang.reflect.Member)7 LinkedHashSet (java.util.LinkedHashSet)7 List (java.util.List)7 Constructor (java.lang.reflect.Constructor)6 Type (java.lang.reflect.Type)6 Map (java.util.Map)6 HashSet (java.util.HashSet)5 By (org.openqa.selenium.By)5 Statement (org.junit.runners.model.Statement)4 FindBy (org.openqa.selenium.support.FindBy)4 EntityType (com.querydsl.codegen.EntityType)3 Collection (java.util.Collection)3