Explorar o código

ClassUtils - use optional

Ranides Atterwim %!s(int64=5) %!d(string=hai) anos
pai
achega
564217a974

+ 1 - 6
assira/src/main/java/net/ranides/assira/collection/maps/CacheMap.java

@@ -129,12 +129,7 @@ public abstract class CacheMap<K,V> implements Cache<K,V> {
             return false;
         }
         // check if there is cleaner for Java EE
-        try {
-            ClassUtils.forName("net.ranides.assira.ee.CacheMapCleaner");
-            return false;
-        } catch (ClassNotFoundException cause) {
-            return true;
-        }
+        return !ClassUtils.forName("net.ranides.assira.ee.CacheMapCleaner").isPresent();
     }
 
     private static final class SimpleCache<K,V> extends CacheMap<K,V> {

+ 3 - 5
assira/src/main/java/net/ranides/assira/reflection/IClass.java

@@ -59,11 +59,9 @@ public interface IClass<T> extends IElement, Comparable<IClass<?>> {
 
     
     static IClass<?> typeinfo(String type) {
-        try {
-            return IContext.DEFAULT.typeinfo(ClassUtils.forName(type));
-        } catch (ClassNotFoundException cause) {
-            throw new IReflectiveException("Unknown class name: " + type, cause);
-        }
+        return ClassUtils.forName(type)
+            .map(IContext.DEFAULT::typeinfo)
+            .orElseThrow(() -> new IReflectiveException("Unknown class name: " + type));
     }
     
     static <R> IClass<R> typefor(R object) {

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

@@ -57,6 +57,11 @@ public final class ClassUtils {
     public static <T> Function<Object, Optional<T>> cast(Class<T> type) {
         return value -> cast(type, value);
     }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public static <T> Optional<Class<? extends T>> asSubclass(Class<T> target, Class<?> source) {
+        return (Optional)Optional.ofNullable(source).filter(target::isAssignableFrom);
+    }
     
     public static IClass<?> box(IClass<?> ic) {
         return ic.attributes().has(IAttribute.PRIMITIVE) ? IClass.typeinfo(box(ic.raw())) : ic;
@@ -153,8 +158,12 @@ public final class ClassUtils {
         return false;
     }
     
-    public static Class<?> forName(String type) throws ClassNotFoundException {
-        return Class.forName(type, true, loader());
+    public static Optional<Class<?>> forName(String type) {
+        try {
+            return Optional.of(Class.forName(type, true, loader()));
+        } catch (ClassNotFoundException cause) {
+            return Optional.empty();
+        }
     }
     
     public static ClassLoader loader() {

+ 7 - 2
assira/src/test/java/net/ranides/assira/io/PathUtilsTest.java

@@ -44,8 +44,6 @@ public class PathUtilsTest {
 
         assertEquals("file", PathUtils.getSimpleName("c:/ms/file"));
         assertEquals("file", PathUtils.getSimpleName("c:/ms/file.txt"));
-        assertEquals("file", PathUtils.getSimpleName("/c:/ms/file.info."));
-        assertEquals("file", PathUtils.getSimpleName("/c:/ms/file.info.txt"));
     }
 
     @Test
@@ -60,8 +58,15 @@ public class PathUtilsTest {
     public void testGetSimpleName_NIX() {
         Assume.assumeFalse(HostSystem.WINDOWS.detected());
 
+        assertEquals("file", PathUtils.getSimpleName("/root/ms/file.info."));
+        assertEquals("file", PathUtils.getSimpleName("/root/ms/file.info.txt"));
+
+        assertEquals("file", PathUtils.getSimpleName("/c:/ms/file.info."));
+        assertEquals("file", PathUtils.getSimpleName("/c:/ms/file.info.txt"));
+
         assertEquals("c:\\ms\\file", PathUtils.getSimpleName("c:\\ms\\file.txt"));
         assertEquals("c:\\ms\\file", PathUtils.getSimpleName("c:\\ms\\file.info.txt"));
+
     }
 
     @Test