diff --git a/environments/common/src/main/java/org/jboss/weld/environment/util/URLUtils.java b/environments/common/src/main/java/org/jboss/weld/environment/util/URLUtils.java index dfada8c..31e8449 100644 --- a/environments/common/src/main/java/org/jboss/weld/environment/util/URLUtils.java +++ b/environments/common/src/main/java/org/jboss/weld/environment/util/URLUtils.java @@ -26,6 +26,7 @@ public class URLUtils { public static final String PROCOTOL_FILE = "file"; public static final String PROCOTOL_JAR = "jar"; + public static final String PROCOTOL_WAR = "war"; public static final String PROCOTOL_HTTP = "http"; public static final String PROCOTOL_HTTPS = "https"; public static final String PROTOCOL_FILE_PART = PROCOTOL_FILE + ":"; diff --git a/environments/servlet/core/src/main/java/org/jboss/weld/environment/servlet/deployment/ServletContextBeanArchiveHandler.java b/environments/servlet/core/src/main/java/org/jboss/weld/environment/servlet/deployment/ServletContextBeanArchiveHandler.java index 180859a..098f84f 100644 --- a/environments/servlet/core/src/main/java/org/jboss/weld/environment/servlet/deployment/ServletContextBeanArchiveHandler.java +++ b/environments/servlet/core/src/main/java/org/jboss/weld/environment/servlet/deployment/ServletContextBeanArchiveHandler.java @@ -16,7 +16,12 @@ */ package org.jboss.weld.environment.servlet.deployment; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import javax.servlet.ServletContext; @@ -24,6 +29,7 @@ import org.jboss.weld.environment.deployment.discovery.BeanArchiveBuilder; import org.jboss.weld.environment.deployment.discovery.BeanArchiveHandler; import org.jboss.weld.environment.servlet.logging.WeldServletLogger; import org.jboss.weld.environment.util.Files; +import org.jboss.weld.environment.util.URLUtils; /** * Handles the paths to resources within a web application. It's used if a WAR archive is not extracted to the file system. @@ -47,13 +53,39 @@ public class ServletContextBeanArchiveHandler implements BeanArchiveHandler { @Override public BeanArchiveBuilder handle(String path) { - if (!path.equals(WebAppBeanArchiveScanner.WEB_INF_CLASSES)) { - return null; + if (path.equals(WebAppBeanArchiveScanner.WEB_INF_CLASSES)) { + BeanArchiveBuilder builder = new BeanArchiveBuilder(); + handleResourcePath(path, path, builder); + return builder; + } else if(path.startsWith(URLUtils.PROCOTOL_JAR + ':' + URLUtils.PROCOTOL_WAR) && path.lastIndexOf(URLUtils.JAR_URL_SEPARATOR) > 0) { + try { + path = path.substring((URLUtils.PROCOTOL_JAR + ':').length(), path.lastIndexOf(URLUtils.JAR_URL_SEPARATOR)); + URL url = new URL(path); + InputStream in = url.openStream(); + if(in != null) { + BeanArchiveBuilder builder = new BeanArchiveBuilder(); + handleJar(url, in, builder); + return builder; + } + } catch(IOException e) { + System.out.println(e); + } } + return null; + } - BeanArchiveBuilder builder = new BeanArchiveBuilder(); - handleResourcePath(path, path, builder); - return builder; + private void handleJar(URL url, InputStream in, BeanArchiveBuilder builder) { + WeldServletLogger.LOG.debugv("Handle archive: {0}", in); + try(ZipInputStream zip = new ZipInputStream(in)) { + ZipEntry ze = null; + while((ze = zip.getNextEntry()) != null) { + if (Files.isClass(ze.getName())) { + builder.addClass(Files.filenameToClassname(ze.getName())); + } + } + } catch (IOException e) { +// throw CommonLogger.LOG.cannotHandleFile(file, e); + } } protected void add(String rootPath, String subpath, BeanArchiveBuilder builder) {