All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.resteasy.util.PickConstructor Maven / Gradle / Ivy

There is a newer version: 1.1.1
Show newest version
package org.jboss.resteasy.util;

import org.jboss.resteasy.logging.Logger;

import javax.ws.rs.core.Context;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

/**
 * Pick
 *
 * @author Bill Burke
 * @version $Revision: 1 $
 */
public class PickConstructor
{
    private final static Logger logger = Logger.getLogger(PickConstructor.class);

   /**
    * Pick best constructor for a provider or resource class
    * 

* Picks constructor with most parameters. Will ignore constructors that have parameters with no @Context annotation * * @param clazz * @return */ public static Constructor pickSingletonConstructor(Class clazz) { Constructor[] constructors = clazz.getConstructors(); Constructor constructor = null; // prefer a no-arg constructor int numParameters = 0; Constructor pick = null; boolean potentialConflict = false; // https://issues.jboss.org/browse/RESTEASY-645 for (Constructor con : constructors) { if (Modifier.isPublic(con.getModifiers()) == false) { continue; } if (con.getParameterTypes().length >= numParameters) { if (con.getParameterTypes().length > numParameters) { potentialConflict = false; } boolean noContextAnnotation = false; if (con.getParameterAnnotations() != null) { for (Annotation[] ann : con.getParameterAnnotations()) { if (FindAnnotation.findAnnotation(ann, Context.class) == null) { noContextAnnotation = true; } } } if (noContextAnnotation) continue; if (con.getParameterTypes().length == numParameters && numParameters != 0) { potentialConflict = true; } numParameters = con.getParameterTypes().length; pick = con; } } if (potentialConflict) { logger.warn("Ambiguity constructors are found in " + clazz + ". More details please refer to http://jsr311.java.net/nonav/releases/1.1/spec/spec.html"); } return pick; } /** * Pick best constructor for a provider or resource class *

* Picks constructor with most parameters. Will ignore constructors that have parameters with no @Context annotation * * @param clazz * @return */ public static Constructor pickPerRequestConstructor(Class clazz) { Constructor[] constructors = clazz.getConstructors(); Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); Constructor constructor = null; // prefer a no-arg constructor int numParameters = 0; Constructor pick = null; boolean potentialConflict = false; // https://issues.jboss.org/browse/RESTEASY-645 for (Constructor con : constructors) { if (Modifier.isPublic(con.getModifiers()) == false) { continue; } if (con.getParameterTypes().length >= numParameters) { if (con.getParameterTypes().length > numParameters) { potentialConflict = false; } boolean noContextAnnotation = false; if (con.getParameterAnnotations() != null) { for (Annotation[] ann : con.getParameterAnnotations()) { if (FindAnnotation.findJaxRSAnnotations(ann).length == 0) { noContextAnnotation = true; } } } if (noContextAnnotation) continue; if (con.getParameterTypes().length == numParameters && numParameters != 0) { potentialConflict = true; } numParameters = con.getParameterTypes().length; pick = con; } } if (potentialConflict) { logger.warn("Ambiguity constructors are found in " + clazz + ". More details please refer to http://jsr311.java.net/nonav/releases/1.1/spec/spec.html"); } return pick; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy