[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())) {