[OPENJPA-2684] Adding support for JAR files via ZipStreamMetaDataIterator
git-svn-id: https://svn.apache.org/repos/asf/openjpa/branches/2.4.x@1774471 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java b/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java
index 16e3027..00e5026 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java
@@ -713,25 +713,52 @@
log.trace(_loc.get("scanning-vfs-url", url));
}
- final URLConnection conn = url.openConnection();
- final Object vfsContent = conn.getContent();
final URL finalUrl = url;
- File file = AccessController.doPrivileged(new PrivilegedAction<File>() {
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public File run() {
- try {
- Class virtualFileClass = Class.forName("org.jboss.vfs.VirtualFile");
- Method getPhysicalFile = virtualFileClass.getDeclaredMethod("getPhysicalFile");
- return (File) getPhysicalFile.invoke(vfsContent);
- } catch (Exception e) {
- log.error(_loc.get("while-scanning-vfs-url", finalUrl), e);
- }
- return null;
- }
- });
- if (file != null)
- scan(new FileMetaDataIterator(file, newMetaDataFilter()), cparser, names, true, file);
+ if (url.toString().endsWith(".jar")) {
+ ZipInputStream zis = AccessController.doPrivileged(new PrivilegedAction<ZipInputStream>() {
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public ZipInputStream run() {
+ try {
+ Class vfs = Class.forName("org.jboss.vfs.VFS");
+ Method getChild = vfs.getDeclaredMethod("getChild", URL.class);
+ Object jarFile = getChild.invoke(null, finalUrl);
+
+ Class virtualFileClass = Class.forName("org.jboss.vfs.VirtualFile");
+ Method openStream = virtualFileClass.getDeclaredMethod("openStream");
+ return (ZipInputStream) openStream.invoke(jarFile);
+ } catch (Exception e) {
+ log.error(_loc.get("while-scanning-vfs-url", finalUrl), e);
+ }
+ return null;
+ }
+ });
+ if (zis != null) {
+ scan(new ZipStreamMetaDataIterator(zis, newMetaDataFilter()), cparser, names, true, url);
+ }
+ } else {
+ final URLConnection conn = url.openConnection();
+ final Object vfsContent = conn.getContent();
+ File file = AccessController.doPrivileged(new PrivilegedAction<File>() {
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public File run() {
+ try {
+ Class virtualFileClass = Class.forName("org.jboss.vfs.VirtualFile");
+ Method getPhysicalFile = virtualFileClass.getDeclaredMethod("getPhysicalFile");
+ return (File) getPhysicalFile.invoke(vfsContent);
+ } catch (Exception e) {
+ log.error(_loc.get("while-scanning-vfs-url", finalUrl), e);
+ }
+ return null;
+ }
+ });
+ if (file != null) {
+ scan(new FileMetaDataIterator(file, newMetaDataFilter()), cparser, names, true, file);
+ }
+ }
continue;
}
if ("jar".equals(url.getProtocol())) {