瀏覽代碼

change: TraceUtils: use StackWalker, deprecate methods which are slow on JDK11

Ranides Atterwim 6 年之前
父節點
當前提交
d1c43a0911

+ 1 - 1
assira/src/main/java/net/ranides/assira/generic/EnumFactory.java

@@ -9,7 +9,7 @@ import net.ranides.assira.reflection.IClass;
 import net.ranides.assira.reflection.IField;
 
 /**
- * @todo (assira #1) move to drafts or somewhere...
+ *
  * @param <E>
  */
 public final class EnumFactory<E extends Enum<E>> {

+ 5 - 17
assira/src/test/java/net/ranides/assira/generic/EnumFactoryTest.java

@@ -1,22 +1,10 @@
-/*
- * @author Ranides Atterwim <ranides@gmail.com>
- * @copyright Ranides Atterwim
- * @license WTFPL
- * @url http://ranides.net/projects/assira
- */
 package net.ranides.assira.generic;
 
-import java.util.Map;
-import net.ranides.assira.collection.maps.IntMap;
-import static org.junit.Assert.*;
-
 import org.junit.Assume;
 import org.junit.Test;
 
-/**
- *
- * @author Ranides Atterwim <ranides@gmail.com>
- */
+import static org.junit.Assert.*;
+
 public class EnumFactoryTest {
 
     @Test
@@ -40,7 +28,7 @@ public class EnumFactoryTest {
         ITEM(4),
         ENTRY(2),
         CONST(8);
-        
+
         private final int v;
 
         MyEnum(int v) {
@@ -48,5 +36,5 @@ public class EnumFactoryTest {
         }
 
     }
-    
-}
+
+}

+ 1 - 1
assira.lambda/src/main/java/net/ranides/assira/reflection/LamdaReflect.java

@@ -12,7 +12,7 @@ public class LamdaReflect {
      * @param object
      * @return
      */
-    static IMethod typeinfo(Object object) {
+    public static IMethod typeinfo(Object object) {
         return LMethodFactory.typeinfo(object);
     }
 

+ 5 - 13
assira/src/main/java/net/ranides/assira/io/uri/impl/CClassPathHandler.java

@@ -69,19 +69,11 @@ public class CClassPathHandler implements URIHandler {
     }
 
     private static Class<?> caller() {
-        for (Class<?> type : TraceUtils.getTypes()) {
-            if( type.getName().startsWith("net.ranides.assira.io.uri.impl.CClassPathHandler$") ) {
-                continue;
-            }
-            if( CClassPathHandler.class.equals(type) ) {
-                continue;
-            }
-            if( URIResolver.class.equals(type) ) {
-                continue;
-            }
-            return type;
-        }
-        return URIResolver.class;
+        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);
     }
 
 }

+ 1 - 1
assira/src/main/java/net/ranides/assira/system/HostSystem.java

@@ -39,7 +39,7 @@ public enum HostSystem {
     WINDOWS_7("windows 7"),
     WINDOWS_8("windows 8"),
     WINDOWS_10("windows 10"),
-    MAVEN( TraceUtils.getNames().stream().anyMatch(c -> c.startsWith("org.apache.maven.surefire.")) ),
+    MAVEN( TraceUtils.getName(c -> c.startsWith("org.apache.maven.surefire.")).isPresent() ),
     JUNIT( null!=RuntimeUtils.getProperty("test") )
     ;
     

+ 65 - 32
assira/src/main/java/net/ranides/assira/trace/TraceUtils.java

@@ -6,23 +6,29 @@
  */
 package net.ranides.assira.trace;
 
+import java.lang.StackWalker.StackFrame;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
 
 import net.ranides.assira.collection.lists.ListUtils;
 import net.ranides.assira.generic.ValueUtils;
 
 /**
- * 
+ *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
 public final class TraceUtils {
 
     // @todo (assira #1) JDK11: migrate to StackWalker
+    static final Supplier<RuntimeException> THROW = () -> new RuntimeException("Internal: TraceUtils");
 
     static final SecurityResolver RESOLVER_SECURITY = getSecurityResolver();
-    
+
     static final ThreadResolver RESOLVER_THREAD = new ThreadResolver();
 
     static final ExceptionResolver RESOLVER_EXCEPT = new ExceptionResolver();
@@ -62,83 +68,110 @@ public final class TraceUtils {
             RESOLVER_EXCEPT
     );
 
-    private TraceUtils() { 
-        /* utility class */ 
+    private TraceUtils() {
+        /* utility class */
     }
-    
+
+    @Deprecated
     public static List<StackTraceElement> getFrames() {
         return AUTO_LIST_FRAMES.frames();
     }
-    
+
+    @Deprecated
     public static List<Class<?>> getTypes() {
         return AUTO_LIST_TYPES.types();
     }
-    
+
+    @Deprecated
     public static List<String> getNames() {
         return AUTO_LIST_NAMES.names();
     }
-    
+
+    public static Optional<StackTraceElement> getFrame(Predicate<StackTraceElement> filter) {
+        return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
+                .walk(s -> s.map(StackFrame::toStackTraceElement).filter(filter).findFirst());
+    }
+
+    public static Optional<Class<?>> getType(Predicate<Class<?>> filter) {
+        return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
+                .walk(s -> s.filter(f -> filter.test(f.getDeclaringClass())).findFirst().map(StackFrame::getDeclaringClass));
+    }
+
+    public static Optional<String> getName(Predicate<String> filter) {
+        return StackWalker.getInstance()
+                .walk(s -> s.filter(f -> filter.test(f.getClassName())).findFirst().map(StackFrame::getClassName));
+    }
+
+    @Deprecated
     public static StackTraceElement getFrame(int index) {
         return AUTO_FRAME.frame(index);
     }
-    
+
+    @Deprecated
     public static Class<?> getType(int index) {
         return AUTO_TYPE.type(index);
     }
-    
+
+    @Deprecated
     public static String getName(int index) {
         return AUTO_NAME.name(index);
     }
-    
+
     public static StackTraceElement getCalleeFrame() {
-        return getFrame(1);
+        return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
+                .walk(f -> f.skip(1).map(StackFrame::toStackTraceElement).findFirst().orElseThrow(THROW));
     }
-    
+
     public static Class<?> getCalleeType() {
-        return getType(1);
+        return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
+                .walk(f -> f.skip(1).map(StackFrame::getDeclaringClass).findFirst().orElseThrow(THROW));
     }
-    
+
     public static String getCalleeName() {
-        return getName(1);
+        return StackWalker.getInstance()
+                .walk(f -> f.skip(1).map(StackFrame::getClassName).findFirst().orElseThrow(THROW));
     }
-    
+
     public static StackTraceElement getCallerFrame() {
-        return getFrame(2);
+        return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
+                .walk(f -> f.skip(2).map(StackFrame::toStackTraceElement).findFirst().orElseThrow(THROW));
     }
-    
+
     public static Class<?> getCallerType() {
-        return getType(2);
+        return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
+                .walk(f -> f.skip(2).map(StackFrame::getDeclaringClass).findFirst().orElseThrow(THROW));
     }
-    
+
     public static String getCallerName() {
-        return getName(2);
+        return StackWalker.getInstance()
+                .walk(f -> f.skip(2).map(StackFrame::getClassName).findFirst().orElseThrow(THROW));
     }
-    
+
     @SuppressWarnings("PMD")
     static List<Class<?>> test_getTypes(Resolver resolver) {
         return resolver.types();
     }
-    
+
     @SuppressWarnings("PMD")
     static List<String> test_getNames(Resolver resolver) {
         return resolver.names();
     }
-    
+
 	@SuppressWarnings("PMD")
     static Class<?> test_getCalleeType(Resolver resolver) {
         return resolver.type(0);
     }
-    
+
 	@SuppressWarnings("PMD")
     static String test_getCalleeName(Resolver resolver) {
         return resolver.name(0);
     }
-    
+
     @SuppressWarnings("PMD")
     static Class<?> test_getCallerType(Resolver resolver) {
         return resolver.type(1);
     }
-    
+
 	@SuppressWarnings("PMD")
     static String test_getCallerName(Resolver resolver) {
         return resolver.name(1);
@@ -174,9 +207,9 @@ public final class TraceUtils {
     private static <T,R> List<R> tail(int index, Function<T,R> map, List<T> list) {
         return ListUtils.map(list, map).subList(index, list.size());
     }
-    
+
     private static final class SecurityResolver extends SecurityManager implements Resolver {
-        
+
         private static final int FIRST = 2;
 
         @Override
@@ -212,7 +245,7 @@ public final class TraceUtils {
     }
 
     private static final class ThreadResolver implements Resolver {
-        
+
         private static final int FIRST = 3;
 
         @Override
@@ -245,7 +278,7 @@ public final class TraceUtils {
             throw new UnsupportedOperationException("ThreadResolver does not support Class<?>");
         }
 
-        
+
     }
 
     private static final class ExceptionResolver implements Resolver {

+ 2 - 2
pom.xml

@@ -11,8 +11,8 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.source>1.8</maven.compiler.source>
-        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
         <netbeans.hint.license>WTFPL</netbeans.hint.license>
         <assira.junit.debug>false</assira.junit.debug>