Преглед на файлове

remove: ClassUtils: loader functions
new: ClassLoaderUtils
new: ClassLoaderUtils#getDefault
new: CQuery: discard
new: Predicates: and, or, negate
new: ClassPredicate
new: TraceUtils CALLEE/CALLER

new: NewAssert#assertThrows(error, cause,...)

Ranides Atterwim преди 4 години
родител
ревизия
c2669cbab9
променени са 21 файла, в които са добавени 352 реда и са изтрити 196 реда
  1. 1 2
      assira.core/src/main/java/net/ranides/assira/awt/ImageLoader.java
  2. 8 0
      assira.core/src/main/java/net/ranides/assira/collection/query/CQuery.java
  3. 20 0
      assira.core/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java
  4. 47 0
      assira.core/src/main/java/net/ranides/assira/functional/Predicates.java
  5. 7 6
      assira.core/src/main/java/net/ranides/assira/io/ResourceUtils.java
  6. 15 31
      assira.core/src/main/java/net/ranides/assira/io/uri/impl/CClassPathHandler.java
  7. 93 0
      assira.core/src/main/java/net/ranides/assira/reflection/util/ClassLoaderUtils.java
  8. 54 0
      assira.core/src/main/java/net/ranides/assira/reflection/util/ClassPredicate.java
  9. 11 84
      assira.core/src/main/java/net/ranides/assira/reflection/util/ClassUtils.java
  10. 4 4
      assira.core/src/main/java/net/ranides/assira/reflection/util/PackageScanner.java
  11. 2 2
      assira.core/src/main/java/net/ranides/assira/reflection/util/ReflectUtils.java
  12. 10 6
      assira.core/src/main/java/net/ranides/assira/trace/TraceUtils.java
  13. 4 4
      assira.core/src/test/java/net/ranides/assira/ContractTesters.java
  14. 11 8
      assira.core/src/test/java/net/ranides/assira/io/ResourceUtilsTest.java
  15. 5 4
      assira.core/src/test/java/net/ranides/assira/io/uri/impl/CClassPathHandlerTest.java
  16. 15 15
      assira.core/src/test/java/net/ranides/assira/reflection/impl/bean/ABeanPropertyTest.java
  17. 2 2
      assira.core/src/test/java/net/ranides/assira/reflection/impl/bean/RBeanModelTest.java
  18. 20 20
      assira.core/src/test/java/net/ranides/assira/reflection/util/ClassUtilsTest.java
  19. 1 1
      assira.core/src/test/java/net/ranides/assira/reflection/util/ReflectUtilsTest.java
  20. 7 7
      assira.debugger/pom.xml
  21. 15 0
      assira.junit/src/main/java/net/ranides/assira/junit/NewAssert.java

+ 1 - 2
assira.core/src/main/java/net/ranides/assira/awt/ImageLoader.java

@@ -23,8 +23,7 @@ public final class ImageLoader {
 
     /**
      * Loads image from resource in classpath.
-     * It uses default classloader, resolved by
-     * {@link net.ranides.assira.reflection.util.ClassUtils#loader()}
+     * It uses default classloader, resolved by {@link net.ranides.assira.reflection.util.ClassLoaderUtils#getDefault()} ()}
      *
      * @param path resource path
      * @return Image or null

+ 8 - 0
assira.core/src/main/java/net/ranides/assira/collection/query/CQuery.java

@@ -96,6 +96,14 @@ public interface CQuery<T> extends Iterable<T> {
 
     <R> CQuery<R> filter(IClass<R> p);
 
+    CQuery<T> discard(Predicate<? super T> p);
+
+    CQuery<T> discardEach(EachPredicate<? super T> p);
+
+    CQuery<T> discard(Class<?> p);
+
+    CQuery<T> discard(IClass<?> p);
+
     <R> CQuery<R> map(Function<? super T,? extends R> f);
 
     <R> CQuery<R> mapOptional(Function<? super T, Optional<R>> f);

+ 20 - 0
assira.core/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -148,6 +148,26 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         return filter(p::isInstance).map(p::cast);
     }
 
+    @Override
+    public CQuery<T> discard(Predicate<? super T> p) {
+        return filter(p.negate());
+    }
+
+    @Override
+    public CQuery<T> discardEach(EachPredicate<? super T> p) {
+        return filterEach(p.negate());
+    }
+
+    @Override
+    public CQuery<T> discard(Class<?> p) {
+        return discard(p::isInstance);
+    }
+
+    @Override
+    public CQuery<T> discard(IClass<?> p) {
+        return discard(p::isInstance);
+    }
+
     @Override
     public final <R> CQuery<R> map(Function<? super T, ? extends R> f) {
         return new CQIterable<>(() -> IteratorUtils.map(iterator(), f));

+ 47 - 0
assira.core/src/main/java/net/ranides/assira/functional/Predicates.java

@@ -16,6 +16,18 @@ public class Predicates {
         default boolean getAsBoolean() {
             return test();
         }
+
+        default Predicate0 and(Predicate0 other) {
+            return () -> test() && other.test();
+        }
+
+        default Predicate0 negate() {
+            return () -> !test();
+        }
+
+        default Predicate0 or(Predicate0 other) {
+            return () -> test() || other.test();
+        }
     }
 
     public interface Predicate1<A> extends Predicate<A>, Serializable {
@@ -28,10 +40,34 @@ public class Predicates {
 
     public interface Predicate3<A,B,C> extends Serializable {
         boolean test(A a, B b, C c);
+
+        default Predicate3<A, B, C> negate() {
+            return (a, b, c) -> !test(a, b, c);
+        }
+
+        default Predicate3<A, B, C> and(Predicate3<? super A, ? super B, ? super C> other) {
+            return (a, b, c) -> test(a, b, c) && other.test(a, b, c);
+        }
+
+        default Predicate3<A, B, C> or(Predicate3<? super A, ? super B, ? super C> other) {
+            return (a, b, c) -> test(a, b, c) || other.test(a, b, c);
+        }
     }
 
     public interface Predicate4<A,B,C,D> extends Serializable {
         boolean test(A a, B b, C c, D d);
+
+        default Predicate4<A, B, C, D> negate() {
+            return (a, b, c, d) -> !test(a, b, c, d);
+        }
+
+        default Predicate4<A, B, C, D> and(Predicate4<? super A, ? super B, ? super C, ? super D> other) {
+            return (a, b, c, d) -> test(a, b, c, d) && other.test(a, b, c, d);
+        }
+
+        default Predicate4<A, B, C, D> or(Predicate4<? super A, ? super B, ? super C, ? super D> other) {
+            return (a, b, c, d) -> test(a, b, c, d) || other.test(a, b, c, d);
+        }
     }
 
     /**
@@ -42,6 +78,17 @@ public class Predicates {
 
         boolean test(int index, T value);
 
+        default EachPredicate<T> negate() {
+            return (i, v) -> !test(i, v);
+        }
+
+        default EachPredicate<T> and(EachPredicate<? super T> other) {
+            return (i, v) -> test(i, v) && other.test(i, v);
+        }
+
+        default EachPredicate<T> or(EachPredicate<? super T> other) {
+            return (i, v) -> test(i, v) || other.test(i, v);
+        }
 
     }
 

+ 7 - 6
assira.core/src/main/java/net/ranides/assira/io/ResourceUtils.java

@@ -6,6 +6,9 @@
  */
 package net.ranides.assira.io;
 
+import net.ranides.assira.reflection.util.ClassLoaderUtils;
+import net.ranides.assira.text.IOStrings;
+
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -17,8 +20,6 @@ import java.io.Reader;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.util.MissingResourceException;
-import net.ranides.assira.reflection.util.ClassUtils;
-import net.ranides.assira.text.IOStrings;
 
 /**
  *
@@ -32,7 +33,7 @@ public final class ResourceUtils {
     
     
     public static void extract(String resource, File target) throws IOException, MissingResourceException {    
-        extract(ClassUtils.loader(), resource, target);
+        extract(ClassLoaderUtils.getDefault(), resource, target);
     }
     
     public static void extract(ClassLoader loader, String resource, File target) throws IOException, MissingResourceException {
@@ -44,7 +45,7 @@ public final class ResourceUtils {
     }
 
     public static URL url(String resource) throws IOException {
-        return url(ClassUtils.loader(), resource);
+        return url(ClassLoaderUtils.getDefault(), resource);
     }
 
     public static URL url(ClassLoader loader, String resource) throws IOException {
@@ -64,7 +65,7 @@ public final class ResourceUtils {
     }
     
     public static InputStream stream(String resource) throws IOException {
-        return stream(ClassUtils.loader(), resource);
+        return stream(ClassLoaderUtils.getDefault(), resource);
     }
     
     public static InputStream stream(ClassLoader loader, String resource) throws IOException {
@@ -84,7 +85,7 @@ public final class ResourceUtils {
     }
     
     public static Reader reader(String resource, Charset charset) throws IOException {
-        return reader(ClassUtils.loader(), resource, charset);
+        return reader(ClassLoaderUtils.getDefault(), resource, charset);
     }
     
     public static Reader reader(ClassLoader loader, String resource, Charset charset) throws IOException {

+ 15 - 31
assira.core/src/main/java/net/ranides/assira/io/uri/impl/CClassPathHandler.java

@@ -6,6 +6,14 @@
  */
 package net.ranides.assira.io.uri.impl;
 
+import net.ranides.assira.collection.iterators.EnumerationUtils;
+import net.ranides.assira.io.uri.URIHandle;
+import net.ranides.assira.io.uri.URIHandler;
+import net.ranides.assira.io.uri.URIResolver;
+import net.ranides.assira.io.uri.URIUtils;
+import net.ranides.assira.reflection.util.ClassLoaderUtils;
+import net.ranides.assira.text.StringUtils;
+
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -14,13 +22,11 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Optional;
 
-import net.ranides.assira.collection.iterators.EnumerationUtils;
-import net.ranides.assira.collection.iterators.IteratorUtils;
-import net.ranides.assira.io.uri.*;
-import net.ranides.assira.reflection.util.ClassUtils;
-import net.ranides.assira.text.StringUtils;
-import net.ranides.assira.trace.TraceUtils;
-
+/**
+ * Loads files from resources in classpath
+ *
+ * @author Ranides Atterwim {@literal <ranides@gmail.com>}
+ */
 public class CClassPathHandler implements URIHandler {
 
     private final URIResolver resolver;
@@ -36,7 +42,8 @@ public class CClassPathHandler implements URIHandler {
     @Override
     public URIHandle resolve(URI uri) throws IOException {
         String path = StringUtils.ltrim(URIUtils.getFile(uri), '/');
-        Optional<URL> file = IteratorUtils.last(EnumerationUtils.iterator(loader().getResources(path)));
+        ClassLoader loader = ClassLoaderUtils.getDefault();
+        Optional<URL> file = EnumerationUtils.last(loader.getResources(path));
 
         if(!file.isPresent()) {
             return new CInvalidHandle(resolver, uri);
@@ -53,27 +60,4 @@ public class CClassPathHandler implements URIHandler {
         return Arrays.asList("classpath", "cp");
     }
 
-    public static ClassLoader loader() {
-        ClassLoader caller  = caller().getClassLoader();
-        ClassLoader context = Thread.currentThread ().getContextClassLoader();
-        ClassLoader system  = ClassLoader.getSystemClassLoader();
-
-        // If 'caller' and 'context' are in a parent-child relationship, choose the child
-        ClassLoader result = ClassUtils.isParent(context, caller) ? caller : context;
-
-        // Precaution for when deployed as a bootstrap or extension class:
-        if (ClassUtils.isParent(result, system)) {
-            result = system;
-        }
-        return result;
-    }
-
-    private static Class<?> caller() {
-        return TraceUtils.getType(type ->
-                !type.getName().startsWith("net.ranides.assira.io.uri.impl.CClassPathHandler$") &&
-                !CClassPathHandler.class.equals(type) &&
-                !URIResolver.class.equals(type))
-                .orElse(URIResolver.class);
-    }
-
 }

+ 93 - 0
assira.core/src/main/java/net/ranides/assira/reflection/util/ClassLoaderUtils.java

@@ -0,0 +1,93 @@
+package net.ranides.assira.reflection.util;
+
+import lombok.experimental.UtilityClass;
+
+import net.ranides.assira.system.RuntimeUtils;
+import net.ranides.assira.trace.TraceUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+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 java.util.function.Predicate;
+
+@UtilityClass
+public class ClassLoaderUtils {
+
+
+    public static ClassLoader getDefault() {
+        return getContext(ClassLoaderUtils.class);
+    }
+
+    public static ClassLoader getCaller(Predicate<Class<?>> filter) {
+        Class<?> caller = TraceUtils.getType(filter).orElse(ClassLoaderUtils.class);
+        return getContext(caller);
+    }
+
+    public static ClassLoader getContext(Class<?> scope) {
+        return getContext(scope.getClassLoader());
+    }
+
+    private static ClassLoader getContext(ClassLoader caller) {
+        ClassLoader context = Thread.currentThread ().getContextClassLoader();
+        ClassLoader system  = ClassLoader.getSystemClassLoader();
+
+        // If 'caller' and 'context' are in a parent-child relationship, choose the child
+        ClassLoader result = isParent(context, caller) ? caller : context;
+
+        // Precaution for when deployed as a bootstrap or extension class:
+        if (isParent(result, system)) {
+            result = system;
+        }
+        return result;
+    }
+
+
+    @SuppressWarnings("PMD.CompareObjectsWithEquals")
+    public static boolean isParent(ClassLoader parent, ClassLoader child) {
+        if(parent == null) {
+            return false;
+        }
+        for (ClassLoader c = child; c != null; c = c.getParent()) {
+            if (c == parent) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static ClassLoader newLoader(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 newLoader(ClassLoader parent, File... jars) throws IOException {
+        URL[] urls = new URL[jars.length];
+        for(int i=0; i<urls.length; i++) {
+            if( !jars[i].exists() ) {
+                throw new FileNotFoundException(jars[i].toString());
+            }
+            urls[i] = jars[i].toURI().toURL();
+        }
+        return RuntimeUtils.doPrivileged(()->new URLClassLoader(urls, parent));
+    }
+
+    public static ClassLoader newLoader(ClassLoader parent, URI... jars) throws IOException {
+        URL[] urls = new URL[jars.length];
+        for(int i=0; i<urls.length; i++) {
+            urls[i] = jars[i].toURL();
+        }
+        return RuntimeUtils.doPrivileged(()->new URLClassLoader(urls, parent));
+    }
+
+}

+ 54 - 0
assira.core/src/main/java/net/ranides/assira/reflection/util/ClassPredicate.java

@@ -0,0 +1,54 @@
+package net.ranides.assira.reflection.util;
+
+import net.ranides.assira.text.Wildcard;
+
+import java.util.function.Predicate;
+
+public interface ClassPredicate extends Predicate<Class<?>> {
+
+    ClassPredicate ANY = c -> true;
+
+    ClassPredicate NONE = c -> false;
+
+    @Override
+    default ClassPredicate negate() {
+        return c -> !test(c);
+    }
+
+    @Override
+    default ClassPredicate and(Predicate<? super Class<?>> other) {
+        return c -> test(c) && other.test(c);
+    }
+
+    @Override
+    default ClassPredicate or(Predicate<? super Class<?>> other) {
+        return c -> test(c) || other.test(c);
+    }
+
+    default ClassPredicate accept(Predicate<String> predicate) {
+        return or(c -> predicate.test(c.getName()));
+    }
+
+    default ClassPredicate accept(Class<?> type) {
+        return or(c -> type.equals(c));
+    }
+
+    default ClassPredicate acceptInner(Class<?> type) {
+        String inner = type.getName() + "$";
+        return or(c -> c.getName().startsWith(inner));
+    }
+
+    default ClassPredicate reject(String wildcard) {
+        Wildcard w = Wildcard.compile(wildcard);
+        return or(c -> w.test(c.getName()));
+    }
+
+    default ClassPredicate reject(Class<?> type) {
+        return and(c -> !type.equals(c));
+    }
+
+    default ClassPredicate rejectInner(Class<?> type) {
+        String inner = type.getName() + "$";
+        return and(c -> !c.getName().startsWith(inner));
+    }
+}

+ 11 - 84
assira.core/src/main/java/net/ranides/assira/reflection/util/ClassUtils.java

@@ -8,23 +8,12 @@ package net.ranides.assira.reflection.util;
 
 import lombok.experimental.UtilityClass;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-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.*;
+import net.ranides.assira.trace.ExceptionUtils;
+
 import java.util.Optional;
 import java.util.function.Function;
 
-import net.ranides.assira.reflection.IAttribute;
-import net.ranides.assira.reflection.IClass;
-import net.ranides.assira.system.RuntimeUtils;
-import net.ranides.assira.trace.ExceptionUtils;
-import net.ranides.assira.trace.TraceUtils;
-
 /**
  *
  * @author Ranides Atterwim {@literal <ranides@gmail.com>}
@@ -148,90 +137,28 @@ public final class ClassUtils {
         }
         return true;
     }
-    
+
     public static boolean isLoaded(String name) {
-        for(ClassLoader c = loader(); c!=null; c=c.getParent()) {
+        for(ClassLoader c = ClassLoaderUtils.getDefault(); c!=null; c=c.getParent()) {
             if(null != MethodUtils.invoke(Li.FIND_LOADED_CLASS, c, name) ) {
                 return true;
             }
         }
         return false;
     }
-    
+
     public static Optional<Class<?>> forName(String type) {
         try {
-            return Optional.of(Class.forName(type, true, loader()));
+            return Optional.of(Class.forName(type, true, ClassLoaderUtils.getDefault()));
         } catch (ClassNotFoundException cause) {
             return Optional.empty();
         }
     }
-    
-    public static ClassLoader loader() {
-		// just in case
-//		ClassLoader caller = TraceUtils.getTypes().stream()
-//			.skip(1)
-//			.filter(c -> !c.isSynthetic())
-//			.findFirst().get()
-//			.getClassLoader();
-
-		ClassLoader caller  = TraceUtils.getCallerType().getClassLoader();		
-        ClassLoader context = Thread.currentThread ().getContextClassLoader();
-        ClassLoader system  = ClassLoader.getSystemClassLoader();
-        
-        // If 'caller' and 'context' are in a parent-child relationship, choose the child
-        ClassLoader result = isParent(context, caller) ? caller : context;
-		
-        // Precaution for when deployed as a bootstrap or extension class:
-        if (isParent(result, system)) {
-            result = system;
-        }
-        return result;
-    }
-    
-    @SuppressWarnings("PMD.CompareObjectsWithEquals")
-    public static boolean isParent(ClassLoader parent, ClassLoader child) {
-		for(ClassLoader c=child; c!=null; c=c.getParent()) {
-			if(c == parent) {
-				return true;
-			}
-		}
-        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];
-        for(int i=0; i<urls.length; i++) {
-            if( !jars[i].exists() ) {
-                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, URI... jars) throws IOException {
-        URL[] urls = new URL[jars.length];
-        for(int i=0; i<urls.length; i++) {
-            urls[i] = jars[i].toURL();
-        }
-        return RuntimeUtils.doPrivileged(()->new URLClassLoader(urls, parent));
-	}
-    
     private static final class Li { // NOPMD - lazy init idiom
-        
+
         public static final java.lang.reflect.Method FIND_LOADED_CLASS;
-        
+
         static {
             try {
                 FIND_LOADED_CLASS = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);
@@ -240,7 +167,7 @@ public final class ClassUtils {
                 throw ExceptionUtils.rethrow(ex);
             }
         }
-        
+
     }
-    
+
 }

+ 4 - 4
assira.core/src/main/java/net/ranides/assira/reflection/util/PackageScanner.java

@@ -80,7 +80,7 @@ public final class PackageScanner {
     }
 
     public CQuery<Class<?>> types() throws IOException {
-        return names().map(toClass(cloader())).filter(Objects::nonNull);
+        return names().map(toClass(getLoader())).filter(Objects::nonNull);
     }
 
     public CQuery<String> names() throws IOException {
@@ -94,11 +94,11 @@ public final class PackageScanner {
         if(root == null && loader == null) {
             return CQuery.from().spliterator(() -> new PackageSpliterator());
         }
-        return CQuery.from().spliterator(() -> new PackageSpliterator(root, cloader()));
+        return CQuery.from().spliterator(() -> new PackageSpliterator(root, getLoader()));
     }
 
-    private ClassLoader cloader() {
-        return ValueUtils.or(loader, ClassUtils.loader());
+    private ClassLoader getLoader() {
+        return ValueUtils.or(loader, ClassLoaderUtils.getDefault());
     }
 
     private static final class PackageSpliterator extends ForwardSpliterator<String> {

+ 2 - 2
assira.core/src/main/java/net/ranides/assira/reflection/util/ReflectUtils.java

@@ -73,7 +73,7 @@ public final class ReflectUtils {
     }
 
     public static byte[] getByteCode(String classname) {
-        return readByteCode(ClassUtils.loader(), classname);
+        return readByteCode(ClassLoaderUtils.getDefault(), classname);
     }
 
     public static byte[] getByteCode(Class<?> clazz) {
@@ -104,7 +104,7 @@ public final class ReflectUtils {
      * @return
      */
     public static String getSource(String classname) throws IOException {
-        return readSourceCode(ClassUtils.loader(), classname);
+        return readSourceCode(ClassLoaderUtils.getDefault(), classname);
     }
 
     /**

+ 10 - 6
assira.core/src/main/java/net/ranides/assira/trace/TraceUtils.java

@@ -18,6 +18,10 @@ import java.util.function.Predicate;
  */
 public final class TraceUtils {
 
+    public static final int CALLEE = 1;
+
+    public static final int CALLER = 2;
+
     interface IStackWalker {
 
         List<StackTraceElement> getFrames();
@@ -98,27 +102,27 @@ public final class TraceUtils {
     }
 
     public static StackTraceElement getCalleeFrame() {
-        return getFrame(1);
+        return getFrame(CALLEE);
     }
 
     public static Class<?> getCalleeType() {
-        return getType(1);
+        return getType(CALLEE);
     }
 
     public static String getCalleeName() {
-        return getName(1);
+        return getName(CALLEE);
     }
 
     public static StackTraceElement getCallerFrame() {
-        return getFrame(2);
+        return getFrame(CALLER);
     }
 
     public static Class<?> getCallerType() {
-        return getType(2);
+        return getType(CALLER);
     }
 
     public static String getCallerName() {
-        return getName(2);
+        return getName(CALLER);
     }
 
     /**

+ 4 - 4
assira.core/src/test/java/net/ranides/assira/ContractTesters.java

@@ -10,7 +10,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.function.Function;
 import net.ranides.assira.junit.TestContractRunner;
-import net.ranides.assira.reflection.util.ClassUtils;
+import net.ranides.assira.reflection.util.ClassLoaderUtils;
 import net.ranides.assira.reflection.util.PackageScanner;
 import net.ranides.assira.system.RuntimeUtils;
 import net.ranides.assira.trace.ExceptionUtils;
@@ -38,7 +38,7 @@ public final class ContractTesters {
                 RUNNER = new TestContractRunner(System.err);
                 
                 PackageScanner.scanner().scope("net.ranides.assira").names()
-                    .map(newtester())
+                    .map(newTester())
                     .filter(o -> o!=null)
                     .forEach(RUNNER::append);
 
@@ -53,8 +53,8 @@ public final class ContractTesters {
         return new TestContractRunner(Li.RUNNER);
     }
     
-    private static Function<String, Object> newtester() {
-        ClassLoader loader = ClassUtils.loader();
+    private static Function<String, Object> newTester() {
+        ClassLoader loader = ClassLoaderUtils.getDefault();
         return name -> {
             try {
                 return name.endsWith("Tester") ? Class.forName(name, false, loader).newInstance() : null;

+ 11 - 8
assira.core/src/test/java/net/ranides/assira/io/ResourceUtilsTest.java

@@ -6,15 +6,18 @@
  */
 package net.ranides.assira.io;
 
+import org.junit.Test;
+
+import net.ranides.assira.ContractTesters;
+import net.ranides.assira.reflection.util.ClassLoaderUtils;
+import net.ranides.assira.text.Charsets;
+import net.ranides.assira.text.IOStrings;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
-import net.ranides.assira.ContractTesters;
-import net.ranides.assira.reflection.util.ClassUtils;
-import net.ranides.assira.text.Charsets;
-import net.ranides.assira.text.IOStrings;
-import org.junit.Test;
+
 import static net.ranides.assira.junit.NewAssert.*;
 
 /**
@@ -25,7 +28,7 @@ public class ResourceUtilsTest {
 
     @Test
     public void testReader() throws IOException {
-        ClassLoader loader = ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST);
+        ClassLoader loader = ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST);
         
         Reader reader1 = ResourceUtils.reader(loader, "text/info.txt", Charsets.UTF8);
         assertEquals("Hello world", IOStrings.read(reader1));
@@ -45,7 +48,7 @@ public class ResourceUtilsTest {
     
     @Test
     public void testStream() throws IOException {
-        ClassLoader loader = ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST);
+        ClassLoader loader = ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST);
         
         InputStream istream1 = ResourceUtils.stream(loader, "text/info.txt");
         assertEquals("Hello world", IOStrings.read(istream1, Charsets.UTF8));
@@ -65,7 +68,7 @@ public class ResourceUtilsTest {
     
     @Test
     public void testExtract() throws IOException {
-        ClassLoader loader = ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST);
+        ClassLoader loader = ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST);
         
         File out1 = File.createTempFile("assira.ResourceUtils", ".txt");
         ResourceUtils.extract(loader, "text/info.txt", out1);

+ 5 - 4
assira.core/src/test/java/net/ranides/assira/io/uri/impl/CClassPathHandlerTest.java

@@ -1,17 +1,18 @@
 package net.ranides.assira.io.uri.impl;
 
+import org.junit.Test;
+
 import net.ranides.assira.ContractTesters;
 import net.ranides.assira.io.uri.URIFlags;
 import net.ranides.assira.io.uri.URIHandle;
 import net.ranides.assira.io.uri.URIResolver;
-import net.ranides.assira.reflection.util.ClassUtils;
+import net.ranides.assira.reflection.util.ClassLoaderUtils;
 import net.ranides.assira.text.ResolveFormatUtils;
 import net.ranides.assira.text.StringUtils;
 import net.ranides.assira.trace.ExceptionUtils;
-import org.junit.Test;
 
 import java.io.IOException;
-import java.net.*;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.List;
 
@@ -49,7 +50,7 @@ public class CClassPathHandlerTest {
 
         ClassLoader prev = Thread.currentThread().getContextClassLoader();
         try {
-            ClassLoader loader = ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST.getCanonicalFile());
+            ClassLoader loader = ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST.getCanonicalFile());
             Thread.currentThread().setContextClassLoader(loader);
 
             assertThrows(e -> e instanceof IOException && e.getMessage().contains("not found"), () -> {

+ 15 - 15
assira.core/src/test/java/net/ranides/assira/reflection/impl/bean/ABeanPropertyTest.java

@@ -98,7 +98,7 @@ public class ABeanPropertyTest {
         bean.$width = 8;
         assertEquals(8, map.get("width"));
         assertEquals(5*8, map.get("area"));
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             map.get("height");
         });
         
@@ -135,7 +135,7 @@ public class ABeanPropertyTest {
         Wrapper<Object> w3 = p3.bind(bean); 
         w3.set(4);
         assertEquals(4, bean.$height);
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             w3.get();
         });
         assertFalse(p3.isReadable());
@@ -143,7 +143,7 @@ public class ABeanPropertyTest {
         
         BeanProperty p4 = model.property("area").get();
         assertEquals(4*17, p4.get(bean));
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p4.set(bean, 6);
         });
         assertTrue(p4.isReadable());
@@ -237,12 +237,12 @@ public class ABeanPropertyTest {
         BeanProperty p3 = model.property("arrayOW").get();
         assertTrue(p3.isWritable());
         assertFalse(p3.isReadable());
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p3.get(bean);
         });
         p3.set(bean, Arrays.asList("a","b","c"));
         assertArrayEquals(new String[]{"a","b","c"}, bean.$arrayOW);
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p3.get(bean);
         });
         
@@ -250,10 +250,10 @@ public class ABeanPropertyTest {
         BeanProperty p4 = model.property("arrayOR").get();
         assertFalse(p4.isWritable());
         assertTrue(p4.isReadable());
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p4.set(bean, Arrays.asList("41","42"));
         });
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p4.set(bean, null);
         });
         assertNull(p4.get(bean));
@@ -270,7 +270,7 @@ public class ABeanPropertyTest {
         assertEquals(new TypeToken<List<String>>(){}, p5.type());
         Wrapper<List<String>> w5 = p5.$bind(bean);
         assertNull(w5.get());
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             w5.set(Arrays.asList("q51","q52","q53"));
         });
         bean.$arrayIR = new String[]{"51","52","53"};
@@ -359,12 +359,12 @@ public class ABeanPropertyTest {
         BeanProperty p3 = model.property("listOW").get();
         assertTrue(p3.isWritable());
         assertFalse(p3.isReadable());
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p3.get(bean);
         });
         p3.set(bean, Arrays.asList("a","b","c"));
         assertEquals(Arrays.asList("a","b","c"), bean.$listOW);
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p3.get(bean);
         });
         
@@ -372,10 +372,10 @@ public class ABeanPropertyTest {
         BeanProperty p4 = model.property("listOR").get();
         assertFalse(p4.isWritable());
         assertTrue(p4.isReadable());
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p4.set(bean, Arrays.asList("41","42"));
         });
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p4.set(bean, null);
         });
         assertNull(p4.get(bean));
@@ -392,7 +392,7 @@ public class ABeanPropertyTest {
         assertEquals(new TypeToken<List<String>>(){}, p5.type());
         Wrapper<List<String>> w5 = p5.$bind(bean);
         assertNull(w5.get());
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             w5.set(Arrays.asList("q51","q52","q53"));
         });
         bean.$listIR = Arrays.asList("51","52","53");
@@ -425,12 +425,12 @@ public class ABeanPropertyTest {
         BeanProperty p3 = model.property("listIW").get();
         assertTrue(p3.isWritable());
         assertFalse(p3.isReadable());
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p3.get(bean);
         });
         p3.set(bean, Arrays.asList("a","b","c"));
         assertEquals(Arrays.asList("a","b","c"), bean.$listIW);
-        assertThrows(IReflectiveException.class, ()->{
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, ()->{
             p3.get(bean);
         });
 

+ 2 - 2
assira.core/src/test/java/net/ranides/assira/reflection/impl/bean/RBeanModelTest.java

@@ -318,10 +318,10 @@ public class RBeanModelTest {
         fluent.put("y", 4);
         assertEquals(5, fluent.get("length"));
 
-        assertThrows(IReflectiveException.class, () -> {
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, () -> {
             fluent.put("length", 4);
         });
-        assertThrows(IReflectiveException.class, () -> {
+        assertThrows(UnsupportedOperationException.class, IReflectiveException.class, () -> {
             fluent.put("other", 4);
         });
     }

+ 20 - 20
assira.core/src/test/java/net/ranides/assira/reflection/util/ClassUtilsTest.java

@@ -71,7 +71,7 @@ public class ClassUtilsTest {
         b = new IType1.IType2.IType3();
         assertTrue(ClassUtils.isLoaded("net.ranides.assira.reflection.util.ClassUtilsTest$IType1$IType2$IType3"));
 		
-		ClassLoader prev = replace(ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST));
+		ClassLoader prev = replace(ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST));
 
 		assertTrue(ClassUtils.isLoaded("net.ranides.assira.collection.mockup.TPoint"));
 		assertTrue(ClassUtils.isLoaded("net.ranides.assira.reflection.util.ClassUtilsTest$IType1"));
@@ -83,24 +83,24 @@ public class ClassUtilsTest {
 	@Test
 	public void testIsChild() throws IOException {
 		ClassLoader loader0 = getClass().getClassLoader();
-		ClassLoader loader1 = ClassUtils.loader(loader0, ContractTesters.JAR_RULES);
-		ClassLoader loader2 = ClassUtils.loader(loader1, ContractTesters.JAR_TEST);
-		
-		assertTrue(ClassUtils.isParent(loader0, loader2));
-		assertTrue(ClassUtils.isParent(loader0, loader1));
-		assertTrue(ClassUtils.isParent(loader1, loader1));
-		assertTrue(ClassUtils.isParent(loader1, loader2));
-		assertTrue(ClassUtils.isParent(loader2, loader2));
-		
-		assertFalse(ClassUtils.isParent(loader2, loader0));
-		assertFalse(ClassUtils.isParent(loader1, loader0));
-		assertFalse(ClassUtils.isParent(loader2, loader1));
+		ClassLoader loader1 = ClassLoaderUtils.newLoader(loader0, ContractTesters.JAR_RULES);
+		ClassLoader loader2 = ClassLoaderUtils.newLoader(loader1, ContractTesters.JAR_TEST);
+		
+		assertTrue(ClassLoaderUtils.isParent(loader0, loader2));
+		assertTrue(ClassLoaderUtils.isParent(loader0, loader1));
+		assertTrue(ClassLoaderUtils.isParent(loader1, loader1));
+		assertTrue(ClassLoaderUtils.isParent(loader1, loader2));
+		assertTrue(ClassLoaderUtils.isParent(loader2, loader2));
+		
+		assertFalse(ClassLoaderUtils.isParent(loader2, loader0));
+		assertFalse(ClassLoaderUtils.isParent(loader1, loader0));
+		assertFalse(ClassLoaderUtils.isParent(loader2, loader1));
 	}
 	
 	
 	@Test
 	public void testLoader() throws Exception {
-		ClassLoader loader = ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST);
+		ClassLoader loader = ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST);
 		
 		Function<String,Supplier<Integer>> f1 = newInstance(loader, "net.ranides.assira.test.TypeLoader1");
 		BiFunction<String, ClassLoader, Supplier<Integer>> f2 = newInstance(loader, "net.ranides.assira.test.TypeLoader2");
@@ -113,16 +113,16 @@ public class ClassUtilsTest {
 		assertEquals(22, s2.get().intValue());
 		
 		assertThrows(AssertionError.class, ()->{
-			f2.apply("net.ranides.assira.test.Type3", ClassUtils.loader());
+			f2.apply("net.ranides.assira.test.Type3", ClassLoaderUtils.getDefault());
 		});
 		assertThrows(AssertionError.class, ()->{
-			f3.apply("net.ranides.assira.test.Type3", ClassUtils::loader);
+			f3.apply("net.ranides.assira.test.Type3", ClassLoaderUtils::getDefault);
 		});
 		
 		
 		ClassLoader prev = replace(loader);
 		
-		Supplier<Integer> s3 = f3.apply("net.ranides.assira.test.Type3", ClassUtils::loader);
+		Supplier<Integer> s3 = f3.apply("net.ranides.assira.test.Type3", ClassLoaderUtils::getDefault);
 		
 		assertEquals(33, s3.get().intValue());
 		
@@ -133,8 +133,8 @@ public class ClassUtilsTest {
     public void testLoaderJAR() throws IOException, ReflectiveOperationException {
         String cname = "net.ranides.assira.test.TypeLoader1";
         
-		ClassLoader loader1 = ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST);
-		ClassLoader loader2 = ClassUtils.loader(ClassUtils.loader(), ContractTesters.JAR_TEST.toURI());
+		ClassLoader loader1 = ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST);
+		ClassLoader loader2 = ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), ContractTesters.JAR_TEST.toURI());
         
         
         Class<?> c1 = loader1.loadClass(cname);
@@ -145,7 +145,7 @@ public class ClassUtilsTest {
         assertNotEquals(c1, c2);
         
         assertThrows(FileNotFoundException.class, () -> {
-            ClassUtils.loader(ClassUtils.loader(), new File("HTTP404"));
+			ClassLoaderUtils.newLoader(ClassLoaderUtils.getDefault(), new File("HTTP404"));
         });
     }
 	

+ 1 - 1
assira.core/src/test/java/net/ranides/assira/reflection/util/ReflectUtilsTest.java

@@ -53,7 +53,7 @@ public class ReflectUtilsTest {
         String src4 = ReflectUtils.getSource(ReflectUtils.class);
         
         assertEquals(src3, src4);
-        assertTrue(src3.contains("return readSourceCode(ClassUtils.loader(), classname);"));
+        assertTrue(src3.contains("return readSourceCode(ClassLoaderUtils.getDefault(), classname);"));
         
         assertThrows(IOException.class, ()->{
             ReflectUtils.getSource("net.ranides.InvalidClass");

+ 7 - 7
assira.debugger/pom.xml

@@ -62,13 +62,13 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.sun</groupId>-->
-<!--            <artifactId>tools</artifactId>-->
-<!--            <version>1.8</version>-->
-<!--            <scope>system</scope>-->
-<!--            <systemPath>${java.home}/../lib/tools.jar</systemPath>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>com.sun</groupId>
+            <artifactId>tools</artifactId>
+            <version>1.8</version>
+            <scope>system</scope>
+            <systemPath>${java.home}/../lib/tools.jar</systemPath>
+        </dependency>
     </dependencies>
 
 </project>

+ 15 - 0
assira.junit/src/main/java/net/ranides/assira/junit/NewAssert.java

@@ -52,6 +52,21 @@ public final class NewAssert extends org.junit.Assert {
             }
         }
     }
+
+    public static void assertThrows(Class<? extends Throwable> error, Class<? extends Throwable> cause, Action action) {
+        try {
+            action.run();
+            fail(error + " expected");
+        } catch(Throwable e) { // NOPMD
+            if( !error.isInstance(e)) {
+                throw TestUtils.rethrow(e);
+            }
+            Throwable c = e.getCause();
+            if( !cause.isInstance(c)) {
+                throw TestUtils.rethrow(e);
+            }
+        }
+    }
     
     public static void assertThrows(Class<? extends Throwable> error, String message, Action action) {
         try {