فهرست منبع

new: ClassUtils#loader(path)
new: PackageScanner: scan URLClassLoader

Mariusz Sieroń 6 سال پیش
والد
کامیت
b2bb07de2d

+ 14 - 0
assira/src/main/java/net/ranides/assira/reflection/util/ClassUtils.java

@@ -12,6 +12,9 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
 import net.ranides.assira.reflection.IAttribute;
 import net.ranides.assira.reflection.IClass;
 import net.ranides.assira.system.RuntimeUtils;
@@ -158,6 +161,17 @@ public final class ClassUtils {
 		}
         return false;
     }
+
+    public static ClassLoader loader(ClassLoader parent, Path... jars) throws IOException {
+        URL[] urls = new URL[jars.length];
+        for(int i=0; i<urls.length; i++) {
+            if( !Files.exists(jars[i]) ) {
+                throw new FileNotFoundException(jars[i].toString());
+            }
+            urls[i] = jars[i].toUri().toURL();
+        }
+        return RuntimeUtils.doPrivileged(()->new URLClassLoader(urls, parent));
+    }
     
     public static ClassLoader loader(ClassLoader parent, File... jars) throws IOException {
         URL[] urls = new URL[jars.length];

+ 14 - 5
assira/src/main/java/net/ranides/assira/reflection/util/PackageScanner.java

@@ -8,6 +8,7 @@ package net.ranides.assira.reflection.util;
 
 import net.ranides.assira.collection.iterators.EnumerationUtils;
 import net.ranides.assira.collection.iterators.ForwardSpliterator;
+import net.ranides.assira.collection.iterators.IteratorUtils;
 import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.collection.query.CQueryBuilder;
 import net.ranides.assira.generic.ValueUtils;
@@ -20,6 +21,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -28,8 +30,6 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
 
 
 public final class PackageScanner {
@@ -70,11 +70,13 @@ public final class PackageScanner {
     }
 
     public CQuery<String> files() throws IOException {
-        if(root == null) {
+        if(root == null && loader instanceof URLClassLoader) {
+            return CQueryBuilder.fromSpliterator(() -> new PackageSpliterator(root, ((URLClassLoader) this.loader).getURLs()));
+        }
+        if(root == null && loader == null) {
             return CQueryBuilder.fromSpliterator(() -> new PackageSpliterator());
-        } else {
-            return CQueryBuilder.fromSpliterator(() -> new PackageSpliterator(root, cloader()));
         }
+        return CQueryBuilder.fromSpliterator(() -> new PackageSpliterator(root, cloader()));
     }
 
     private ClassLoader cloader() {
@@ -103,6 +105,13 @@ public final class PackageScanner {
             this.current = Collections.<String>emptyList().spliterator();
         }
 
+        public PackageSpliterator(String root, URL[] urls) {
+            this.nroot = (root==null)? ":" : (root + "/");
+            this.croot = root;
+            this.resources =  IteratorUtils.map(Arrays.asList(urls).iterator(), URL::getPath);
+            this.current = Collections.<String>emptyList().spliterator();
+        }
+
         @Override
         public boolean tryAdvance(Consumer<? super String> action) {
             return current.tryAdvance(action) || tryAdvanceResource(action);