in container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java [2203:2467]
public WebModule deploy(final WebModule webModule) throws OpenEJBException {
final WebApp webApp = webModule.getWebApp();
if (webApp != null && webApp.isMetadataComplete()) {
return webModule;
}
/*
* Classes added to this set will be scanned for annotations
*/
final Set<Class> classes = new HashSet<>();
final ClassLoader classLoader = webModule.getClassLoader();
final String webXmlApplication = webApp.contextParamsAsMap().get("jakarta.ws.rs.Application");
if (webXmlApplication != null) {
webModule.getRestApplications().clear();
webModule.getRestApplications().add(webXmlApplication);
}
final Collection<String> restApp = webModule.getRestApplications();
if (restApp.isEmpty()) {
addRestClassesToScannedClasses(webModule, classes, classLoader);
} else {
for (final String rawClassName : restApp) {
final String application = realClassName(rawClassName);
if (application != null) {
final Class<?> clazz;
try {
clazz = classLoader.loadClass(application);
classes.add(clazz);
} catch (final ClassNotFoundException | NoClassDefFoundError e) {
logger.debug("Could not load rest Application class {1} for module {2} / {3}",
application, webModule.getJarLocation(), webModule.getFile().getName());
throw new OpenEJBException("Unable to load Application class: " + application, e);
}
if (Modifier.isAbstract(clazz.getModifiers())) {
continue;
}
try {
final Application app = Application.class.cast(clazz.newInstance());
try {
final Set<Class<?>> appClasses = app.getClasses();
if (!appClasses.isEmpty()) {
classes.addAll(appClasses);
} else {
addRestClassesToScannedClasses(webModule, classes, classLoader);
}
} catch (final RuntimeException npe) {
if (app == null) {
throw npe;
}
// if app depends on cdi no need to do it
}
} catch (final InstantiationException e) {
throw new OpenEJBException("Unable to instantiate Application class: " + application, e);
} catch (final IllegalAccessException e) {
throw new OpenEJBException("Unable to access Application class: " + application, e);
}
}
}
}
/*
* Servlet classes are scanned
*/
for (final Servlet servlet : webApp.getServlet()) {
final String servletName = servlet.getServletName();
if ("jakarta.ws.rs.core.Application".equals(servletName) || "jakarta.ws.rs.Application".equals(servletName)) {
// check first if there is a real application as init param
boolean done = false;
for (final ParamValue pv : servlet.getInitParam()) {
if ("jakarta.ws.rs.core.Application".equals(pv.getParamName()) || "jakarta.ws.rs.Application".equals(pv.getParamName())) {
webModule.getRestApplications().add(pv.getParamValue());
done = true;
break;
}
}
if (!done) {
servlet.setServletName(ProvidedJAXRSApplication.class.getName());
webModule.getRestApplications().add(ProvidedJAXRSApplication.class.getName());
for (final ServletMapping mapping : webApp.getServletMapping()) {
if (servletName.equals(mapping.getServletName())) {
mapping.setServletName(ProvidedJAXRSApplication.class.getName());
}
}
}
continue;
}
String servletClass = realClassName(servlet.getServletClass());
if (servletClass == null) { // try with servlet name, @see org.apache.openejb.arquillian.tests.jaxrs.basicapp.BasicApplication
servletClass = realClassName(servletName);
}
if (servletClass != null && servlet.getJspFile() == null) { // jaxrs application doesn't have a jsp file
if (!"org.apache.openejb.server.rest.OpenEJBRestServlet".equals(servletClass)) {
try {
final Class clazz = classLoader.loadClass(servletClass);
classes.add(clazz);
if (servlet.getServletClass() == null) {
servlet.setServletClass(servletClass);
}
} catch (final ClassNotFoundException | NoClassDefFoundError e) {
logger.debug("Could not load Servlet class {1} for web module {2} / {3}",
servletClass, webModule.getJarLocation(), webModule.getFile().getName());
if (servlet.getServletClass() != null) {
throw new OpenEJBException("Unable to load servlet class: " + servletClass, e);
} else {
logger.error("servlet " + servletName + " has no servlet-class defined and is not a subclass of Application");
}
}
}
// if the servlet is a rest init servlet don't deploy rest classes automatically
for (final ParamValue param : servlet.getInitParam()) {
if (param.getParamName().equals(Application.class.getName()) || param.getParamName().equals("jakarta.ws.rs.Application")) {
webModule.getRestApplications().clear();
webModule.getRestApplications().add(param.getParamValue());
break;
}
}
}
}
/*
* Filter classes are scanned
*/
for (final Filter filter : webApp.getFilter()) {
final String filterClass = realClassName(filter.getFilterClass());
if (filterClass != null) {
try {
final Class clazz = classLoader.loadClass(filterClass);
classes.add(clazz);
} catch (final ClassNotFoundException | NoClassDefFoundError e) {
logger.debug("Could not load Servlet Filter class {1} for web module {2} / {3}",
filterClass, webModule.getJarLocation(), webModule.getFile().getName());
throw new OpenEJBException("Unable to load servlet filter class: " + filterClass, e);
}
}
}
/*
* Listener classes are scanned
*/
for (final Listener listener : webApp.getListener()) {
final String listenerClass = realClassName(listener.getListenerClass());
if (listenerClass != null) {
try {
final Class clazz = classLoader.loadClass(listenerClass);
classes.add(clazz);
} catch (final ClassNotFoundException | NoClassDefFoundError e) {
logger.debug("Could not load Servlet listener class {1} for web module {2} / {3}",
listenerClass, webModule.getJarLocation(), webModule.getFile().getName());
throw new OpenEJBException("Unable to load servlet listener class: " + listenerClass, e);
}
}
}
for (final TldTaglib taglib : webModule.getTaglibs()) {
/*
* TagLib Listener classes are scanned
*/
for (final Listener listener : taglib.getListener()) {
final String listenerClass = realClassName(listener.getListenerClass());
if (listenerClass != null) {
try {
final Class clazz = classLoader.loadClass(listenerClass);
classes.add(clazz);
} catch (final ClassNotFoundException | NoClassDefFoundError e) {
logger.debug("Could not load TagLib listener class {1} for web module {2} / {3}",
listenerClass, webModule.getJarLocation(), webModule.getFile().getName());
logger.error("Unable to load tag library servlet listener class: " + listenerClass);
}
}
}
/*
* TagLib Tag classes are scanned
*/
for (final Tag tag : taglib.getTag()) {
final String tagClass = realClassName(tag.getTagClass());
if (tagClass != null) {
try {
final Class clazz = classLoader.loadClass(tagClass);
classes.add(clazz);
} catch (final ClassNotFoundException | NoClassDefFoundError e) {
logger.debug("Could not load tag class {1} for web module {2} / {3}",
tagClass, webModule.getJarLocation(), webModule.getFile().getName());
logger.error("Unable to load tag library tag class: " + tagClass);
}
}
}
}
/*
* WebService HandlerChain classes are scanned
*/
if (webModule.getWebservices() != null) {
for (final WebserviceDescription webservice : webModule.getWebservices().getWebserviceDescription()) {
for (final PortComponent port : webservice.getPortComponent()) {
// skip ejb port defs
if (port.getServiceImplBean().getEjbLink() != null) {
continue;
}
if (port.getHandlerChains() == null) {
continue;
}
for (final org.apache.openejb.jee.HandlerChain handlerChain : port.getHandlerChains().getHandlerChain()) {
for (final Handler handler : handlerChain.getHandler()) {
final String handlerClass = realClassName(handler.getHandlerClass());
if (handlerClass != null) {
try {
final Class clazz = classLoader.loadClass(handlerClass);
classes.add(clazz);
} catch (final ClassNotFoundException | NoClassDefFoundError e) {
logger.debug("Could not load web service handler class {1} for web module {2} / {3}",
handlerClass, webModule.getJarLocation(), webModule.getFile().getName());
throw new OpenEJBException("Unable to load webservice handler class: " + handlerClass, e);
}
}
}
}
}
}
}
final IAnnotationFinder finder = webModule.getFinder();
if (finder != null) {
for (final String apiClassName : API_CLASSES) {
final Class<? extends Annotation> clazz;
try {
clazz = (Class<? extends Annotation>) classLoader.loadClass(apiClassName);
} catch (final ClassNotFoundException e) {
continue;
}
if (clazz.isAnnotation()) {
classes.addAll(metaToClass(finder.findMetaAnnotatedClasses(clazz)));
} else if (Modifier.isAbstract(clazz.getModifiers())) {
classes.addAll(finder.findSubclasses(clazz));
} else {
classes.addAll(finder.findImplementations(clazz));
}
}
}
final AnnotationFinder annotationFinder = createFinder(classes.toArray(new Class<?>[classes.size()]));
/*
* @EJB
* @Resource
* @WebServiceRef
* @PersistenceUnit
* @PersistenceContext
*/
buildAnnotatedRefs(webApp, annotationFinder, classLoader);
processWebServiceClientHandlers(webApp, annotationFinder, classLoader);
return webModule;
}