|
|
@@ -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);
|