Repository: cxf Updated Branches: refs/heads/master f941e5b6e -> 2cb99eed1
CXF-6132: Provide JAX-RS ServletContextInitializer. Adding more @HandlesTypes classes. Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/2cb99eed Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/2cb99eed Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/2cb99eed Branch: refs/heads/master Commit: 2cb99eed19d1a8f097c4ae54967c6e45a7c03d67 Parents: f941e5b Author: reta <drr...@gmail.com> Authored: Tue Jan 27 19:58:52 2015 -0500 Committer: reta <drr...@gmail.com> Committed: Tue Jan 27 19:58:52 2015 -0500 ---------------------------------------------------------------------- .../JaxrsServletContainerInitializer.java | 59 ++++++++++++++------ 1 file changed, 43 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/2cb99eed/rt/rs/http-sci/src/main/java/org/apache/cxf/jaxrs/servlet/JaxrsServletContainerInitializer.java ---------------------------------------------------------------------- diff --git a/rt/rs/http-sci/src/main/java/org/apache/cxf/jaxrs/servlet/JaxrsServletContainerInitializer.java b/rt/rs/http-sci/src/main/java/org/apache/cxf/jaxrs/servlet/JaxrsServletContainerInitializer.java index 7be0198..4eb3575 100644 --- a/rt/rs/http-sci/src/main/java/org/apache/cxf/jaxrs/servlet/JaxrsServletContainerInitializer.java +++ b/rt/rs/http-sci/src/main/java/org/apache/cxf/jaxrs/servlet/JaxrsServletContainerInitializer.java @@ -18,10 +18,10 @@ */ package org.apache.cxf.jaxrs.servlet; -import java.io.IOException; import java.lang.annotation.Annotation; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.logging.Logger; @@ -36,11 +36,16 @@ import javax.ws.rs.core.Application; import javax.ws.rs.ext.Provider; import org.apache.cxf.common.logging.LogUtils; -import org.apache.cxf.common.util.ClasspathScanner; -@HandlesTypes(Application.class) -public class JaxrsServletContainerInitializer implements ServletContainerInitializer { +@HandlesTypes({ Application.class, Provider.class, Path.class }) +public class JaxrsServletContainerInitializer implements ServletContainerInitializer { private static final Logger LOG = LogUtils.getL7dLogger(JaxrsServletContainerInitializer.class); + private static final String IGNORE_PACKAGE = "org.apache.cxf"; + + private static final String IGNORE_APP_PATH_PARAM = "jaxrs.application.address.ignore"; + private static final String SERVICE_CLASSES_PARAM = "jaxrs.serviceClasses"; + private static final String PROVIDERS_PARAM = "jaxrs.providers"; + private static final String JAXRS_APPLICATION_PARAM = "javax.ws.rs.Application"; @Override public void onStartup(final Set< Class< ? > > classes, final ServletContext ctx) throws ServletException { @@ -49,19 +54,41 @@ public class JaxrsServletContainerInitializer implements ServletContainerInitial final Class< ? > application = findCandidate(classes); if (application != null) { - servlet.setInitParameter("javax.ws.rs.Application", application.getName()); + servlet.setInitParameter(JAXRS_APPLICATION_PARAM, application.getName()); + servlet.setInitParameter(IGNORE_APP_PATH_PARAM, "false"); } else { - try { - final Map< Class< ? extends Annotation >, Collection< Class< ? > > > providersAndResources = - ClasspathScanner.findClasses(Arrays.asList(ClasspathScanner.WILDCARD), - Arrays.asList(Provider.class, Path.class)); - - servlet.setInitParameter("jaxrs.providers", getClassNames(providersAndResources.get(Provider.class))); - servlet.setInitParameter("jaxrs.serviceClasses", getClassNames(providersAndResources.get(Path.class))); - } catch (final ClassNotFoundException | IOException ex) { - throw new ServletException("Unabled to perform classpath scan", ex); + final Map< Class< ? extends Annotation >, Collection< Class< ? > > > providersAndResources = + groupByAnnotations(classes); + + servlet.setInitParameter(PROVIDERS_PARAM, getClassNames(providersAndResources.get(Provider.class))); + servlet.setInitParameter(SERVICE_CLASSES_PARAM, getClassNames(providersAndResources.get(Path.class))); + } + } + + private Map< Class< ? extends Annotation >, Collection< Class< ? > > > groupByAnnotations( + final Set< Class< ? > > classes) { + + final Map< Class< ? extends Annotation >, Collection< Class< ? > > > grouped = + new HashMap< Class< ? extends Annotation >, Collection< Class< ? > > >(); + + grouped.put(Provider.class, new ArrayList< Class< ? > >()); + grouped.put(Path.class, new ArrayList< Class< ? > >()); + + for (final Class< ? > clazz: classes) { + if (!classShouldBeIgnored(clazz)) { + for (final Class< ? extends Annotation > annotation: grouped.keySet()) { + if (clazz.isAnnotationPresent(annotation)) { + grouped.get(annotation).add(clazz); + } + } } } + + return grouped; + } + + private static boolean classShouldBeIgnored(final Class<?> clazz) { + return clazz.getPackage().getName().startsWith(IGNORE_PACKAGE); } private static String getClassNames(final Collection< Class< ? > > classes) { @@ -78,7 +105,7 @@ public class JaxrsServletContainerInitializer implements ServletContainerInitial private static Class< ? > findCandidate(final Set< Class< ? > > classes) { for (final Class< ? > clazz: classes) { - if (!clazz.getPackage().equals(JaxrsServletContainerInitializer.class.getPackage())) { + if (Application.class.isAssignableFrom(clazz) && !classShouldBeIgnored(clazz)) { LOG.fine("Found JAX-RS application to initialize: " + clazz.getName()); return clazz; }