Ranides Atterwim 3 년 전
부모
커밋
8b98c87f41

+ 2 - 1
README.md

@@ -6,7 +6,8 @@
     <properties>
         <assira.version>2.8.2</assira.version>
         <assira.junit.debug>true | false</assira.junit.debug>
-        <assira.junit.log>trace | debug | info | warning | error</assira.junit.log>
+        <assira.junit.logger.level>trace | debug | info | warning | error</assira.junit.logger.level>
+        <assira.junit.logger.observe>true | false</assira.junit.logger.observe>
     </properties>
     
     <dependency>

+ 2 - 2
assira.core/src/main/java/net/ranides/assira/collection/maps/CacheMap.java

@@ -18,7 +18,7 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 import net.ranides.assira.reflection.util.ClassUtils;
-import net.ranides.assira.system.AssiraConfiguration;
+import net.ranides.assira.system.RuntimeConfiguration;
 
 /**
  * This class provides few cache implementations with different behaviour.
@@ -184,7 +184,7 @@ public abstract class CacheMap<K,V> implements Cache<K,V> {
     }
 
     protected static boolean isThreadEnabled() {
-        if( !AssiraConfiguration.CACHE_USE_THREAD()) {
+        if( !RuntimeConfiguration.FEATURE_CACHE_DAEMON()) {
             return false;
         }
         // check if there is cleaner for Java EE

+ 8 - 10
assira.core/src/main/java/net/ranides/assira/collection/query/support/BaseFlat.java

@@ -5,7 +5,7 @@ import net.ranides.assira.collection.arrays.ArrayUtils;
 import net.ranides.assira.collection.iterators.IteratorUtils;
 import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.collection.query.base.CQAbstractFilter;
-import net.ranides.assira.system.AssiraConfiguration;
+import net.ranides.assira.system.RuntimeConfiguration;
 
 import java.util.Iterator;
 import java.util.List;
@@ -28,8 +28,6 @@ import java.util.stream.Stream;
 @UtilityClass
 public class BaseFlat {
 
-    private static final boolean DONT_USE_FLAT_STREAM = AssiraConfiguration.DONT_USE_FLAT_STREAM();
-
     /**
      * Creates new flat stream which tries to apply flattening operation to every core method:
      * stream, iterator, each, list.
@@ -58,7 +56,7 @@ public class BaseFlat {
 
             @Override
             public Stream<R> stream() {
-                if (DONT_USE_FLAT_STREAM) {
+                if (RuntimeConfiguration.FIX_FLAT_STREAM()) {
                     return BaseIterable.stream(this);
                 }
                 return source.stream().flatMap(s -> f.apply(s).stream());
@@ -110,7 +108,7 @@ public class BaseFlat {
 
             @Override
             public Stream<R> stream() {
-                if (DONT_USE_FLAT_STREAM) {
+                if (RuntimeConfiguration.FIX_FLAT_STREAM()) {
                     return BaseIterable.stream(this);
                 }
                 return source.stream().flatMap(s -> IteratorUtils.stream(f.apply(s).iterator()));
@@ -158,7 +156,7 @@ public class BaseFlat {
 
             @Override
             public Stream<R> stream() {
-                if (DONT_USE_FLAT_STREAM) {
+                if (RuntimeConfiguration.FIX_FLAT_STREAM()) {
                     return BaseIterable.stream(this);
                 }
                 return source.stream().flatMap(s -> Stream.of(f.apply(s)));
@@ -208,7 +206,7 @@ public class BaseFlat {
 
             @Override
             public Stream<T> stream() {
-                if (DONT_USE_FLAT_STREAM) {
+                if (RuntimeConfiguration.FIX_FLAT_STREAM()) {
                     return BaseIterable.stream(this);
                 }
                 return source.stream().flatMap(s -> p.test(s) ? f.apply(s).stream() : Stream.of(s));
@@ -258,7 +256,7 @@ public class BaseFlat {
 
             @Override
             public Stream<T> stream() {
-                if (DONT_USE_FLAT_STREAM) {
+                if (RuntimeConfiguration.FIX_FLAT_STREAM()) {
                     return BaseIterable.stream(this);
                 }
                 return source.stream().flatMap(s -> {
@@ -311,7 +309,7 @@ public class BaseFlat {
 
             @Override
             public Stream<T> stream() {
-                if (DONT_USE_FLAT_STREAM) {
+                if (RuntimeConfiguration.FIX_FLAT_STREAM()) {
                     return BaseIterable.stream(this);
                 }
                 return source.stream().flatMap(s -> {
@@ -371,7 +369,7 @@ public class BaseFlat {
 
         @Override
         public boolean hasFastStream() {
-            return !DONT_USE_FLAT_STREAM && source.features().hasFastStream();
+            return !RuntimeConfiguration.FIX_FLAT_STREAM() && source.features().hasFastStream();
         }
     }
 

+ 3 - 7
assira.core/src/main/java/net/ranides/assira/io/PathUtils.java

@@ -9,13 +9,10 @@ package net.ranides.assira.io;
 import lombok.experimental.UtilityClass;
 import net.ranides.assira.collection.iterators.IterableUtils;
 import net.ranides.assira.collection.query.CQuery;
-import net.ranides.assira.functional.checked.CheckedSupplier;
-import net.ranides.assira.system.AssiraConfiguration;
+import net.ranides.assira.system.RuntimeConfiguration;
 import net.ranides.assira.text.Wildcard;
 
-import java.io.File;
 import java.io.IOException;
-import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.file.Files;
@@ -24,7 +21,6 @@ import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Locale;
-import java.util.function.Supplier;
 
 /**
  * Utility methods for working with Paths.
@@ -215,7 +211,7 @@ public class PathUtils {
      * @return boolean
      */
     public static boolean hasExtension(String path, String extension) {
-        if(AssiraConfiguration.CASE_SENSITIVE_FILES()) {
+        if(RuntimeConfiguration.FEATURE_CASE_SENSITIVE_FILES()) {
             return path.endsWith(extension);
         } else {
             return path.toUpperCase(Locale.ROOT).endsWith(extension.toUpperCase(Locale.ROOT));
@@ -293,7 +289,7 @@ public class PathUtils {
      * @return query
      */
     public static CQuery<Path> list(Path dir) {
-        if(AssiraConfiguration.WALKER_JDK7()) {
+        if(RuntimeConfiguration.FIX_FILES_WALKER()) {
             return listJDK7(dir);
         } else {
             return listJDK8(dir);

+ 2 - 2
assira.core/src/main/java/net/ranides/assira/reflection/impl/RCompareUtils.java

@@ -11,7 +11,7 @@ import lombok.experimental.UtilityClass;
 import net.ranides.assira.collection.lists.ListUtils;
 import net.ranides.assira.reflection.util.ClassTraits;
 import net.ranides.assira.reflection.*;
-import net.ranides.assira.system.AssiraConfiguration;
+import net.ranides.assira.system.RuntimeConfiguration;
 
 /**
  * Utility methods used for comparing IClasses
@@ -181,7 +181,7 @@ public final class RCompareUtils {
         Bound sw = new Bound(isuper);
         Bound cw = new Bound(iclass);
 
-        if(!raw && AssiraConfiguration.STRICT_REFLECTIVE_RESOLVE()) {
+        if(!raw && RuntimeConfiguration.FEATURE_STRICT_REFLECTIVE_RESOLVE()) {
             if(!isuper.isResolved() || !iclass.isResolved()) {
                 throw new IllegalArgumentException("We can't check type relation for unresolved generic types:" + isuper + " / " + iclass);
             }

+ 0 - 65
assira.core/src/main/java/net/ranides/assira/system/AssiraConfiguration.java

@@ -1,65 +0,0 @@
-package net.ranides.assira.system;
-
-import lombok.experimental.UtilityClass;
-
-import java.io.File;
-
-@UtilityClass
-public class AssiraConfiguration {
-
-    private static final String CACHE_USE_THREAD_PROPERTY = "assira.cache.use-thread";
-
-    private static final String CACHE_USE_THREAD_DEFAULT = "false";
-
-    private static final boolean DONT_USE_FLAT_STREAM_VALUE = true;
-
-    private static final boolean WALKER_JDK7_VALUE = true;
-
-    private static final boolean CASE_SENSITIVE_FILES_VALUE = !new File( "a" ).equals( new File( "A" ) );
-
-    private static final boolean STRICT_REFLECTIVE_RESOLVE_VALUE = false;
-
-    public static boolean CACHE_USE_THREAD() {
-        return !RuntimeUtils.getProperty(CACHE_USE_THREAD_PROPERTY, CACHE_USE_THREAD_DEFAULT).equals("true");
-    }
-
-    /**
-     * We can't use stream#flatMap because derived stream evaluates too much.
-     * more precisely, it applies #map to all elements generated from element:
-     *
-     * EXPECTED:
-     *       A source:   abc def ghi
-     *       B flat:     a b c | d e f | .
-     *       C map:      A B C | D . .
-     *       d limit(4)  A B C | D
-     * UNFORTUNATELY:
-     *       A source:   abc def ghi
-     *       B flat:     a b c | d e f | .
-     *       C map:      A B C | D E F
-     *       d limit(4)  A B C | D
-     *
-     * So we fall-back to our own iterator implementation, sorry
-     *
-     * Reference:
-     *   https://bugs.openjdk.java.net/browse/JDK-8075939
-     *   https://stackoverflow.com/questions/29229373/why-filter-after-flatmap-is-not-completely-lazy-in-java-streams
-     *
-     * @return boolean
-     */
-    public static boolean DONT_USE_FLAT_STREAM() {
-        return DONT_USE_FLAT_STREAM_VALUE;
-    }
-
-    public static boolean WALKER_JDK7() {
-        return WALKER_JDK7_VALUE;
-    }
-
-    public static boolean CASE_SENSITIVE_FILES() {
-        return CASE_SENSITIVE_FILES_VALUE;
-    }
-
-    public static boolean STRICT_REFLECTIVE_RESOLVE() {
-        return STRICT_REFLECTIVE_RESOLVE_VALUE;
-    }
-
-}

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

@@ -48,7 +48,7 @@ public enum HostSystem {
     WINDOWS_10("windows 10"),
     MAVEN( TraceUtils.getName(c -> c.startsWith("org.apache.maven.surefire.")).isPresent() ),
     IDEA( TraceUtils.getName(c -> c.startsWith("com.intellij.")).isPresent() ),
-    JUNIT( null!=RuntimeUtils.getProperty("test") ),
+    JUNIT( RuntimeUtils.getProperty("test").isPresent() ),
     ;
     
     private static final class Li { // NOPMD - lazy init idiom

+ 82 - 0
assira.core/src/main/java/net/ranides/assira/system/RuntimeConfiguration.java

@@ -0,0 +1,82 @@
+package net.ranides.assira.system;
+
+import lombok.experimental.UtilityClass;
+
+import java.io.File;
+
+@UtilityClass
+public class RuntimeConfiguration {
+
+    private static final String FEATURE_CACHE_DAEMON = "assira.feature:cache-daemon";
+
+    private static final String FEATURE_CASE_SENSITIVE_FILES = "assira.feature:case-sensitive-files";
+
+    private static final String FEATURE_STRICT_REFLECTIVE_RESOLVE = "assira.feature:strict-reflective-resolve";
+
+    private static final String FIX_FLAT_STREAM = "assira.fix:java.util.stream.Stream#flatMap";
+
+    private static final String FIX_FILES_WALKER = "assira.fix:java.nio.file.Files.newDirectoryStream";
+
+    private static final boolean FEATURE_CACHE_DAEMON_VALUE =
+        getBoolean(FEATURE_CACHE_DAEMON, false);
+
+    private static final boolean FIX_FLAT_STREAM_VALUE =
+        getBoolean(FIX_FLAT_STREAM, RuntimeUtils.getJavaVersion() <= 11);
+
+    private static final boolean FIX_FILES_WALKER_VALUE =
+        getBoolean(FIX_FILES_WALKER, RuntimeUtils.getJavaVersion() <= 7);
+
+    private static final boolean FEATURE_CASE_SENSITIVE_FILES_VALUE =
+        getBoolean(FEATURE_CASE_SENSITIVE_FILES, !new File( "a" ).equals( new File( "A" )));
+
+    private static final boolean FEATURE_STRICT_REFLECTIVE_RESOLVE_VALUE =
+        getBoolean(FEATURE_STRICT_REFLECTIVE_RESOLVE, false);
+
+    public static boolean FEATURE_CACHE_DAEMON() {
+        return FEATURE_CACHE_DAEMON_VALUE;
+    }
+
+    /**
+     * We can't use stream#flatMap because derived stream evaluates too much.
+     * more precisely, it applies #map to all elements generated from element:
+     *
+     * EXPECTED:
+     *       A source:   abc def ghi
+     *       B flat:     a b c | d e f | .
+     *       C map:      A B C | D . .
+     *       d limit(4)  A B C | D
+     * UNFORTUNATELY:
+     *       A source:   abc def ghi
+     *       B flat:     a b c | d e f | .
+     *       C map:      A B C | D E F
+     *       d limit(4)  A B C | D
+     *
+     * So we fall-back to our own iterator implementation, sorry
+     *
+     * Reference:
+     *   https://bugs.openjdk.java.net/browse/JDK-8075939
+     *   https://stackoverflow.com/questions/29229373/why-filter-after-flatmap-is-not-completely-lazy-in-java-streams
+     *
+     * @return boolean
+     */
+    public static boolean FIX_FLAT_STREAM() {
+        return FIX_FLAT_STREAM_VALUE;
+    }
+
+    public static boolean FIX_FILES_WALKER() {
+        return FIX_FILES_WALKER_VALUE;
+    }
+
+    public static boolean FEATURE_CASE_SENSITIVE_FILES() {
+        return FEATURE_CASE_SENSITIVE_FILES_VALUE;
+    }
+
+    public static boolean FEATURE_STRICT_REFLECTIVE_RESOLVE() {
+        return FEATURE_STRICT_REFLECTIVE_RESOLVE_VALUE;
+    }
+
+    private static Boolean getBoolean(String name, boolean other) {
+        return RuntimeUtils.getProperty(name).map(Boolean::parseBoolean).orElse(other);
+    }
+
+}

+ 20 - 10
assira.core/src/main/java/net/ranides/assira/system/RuntimeUtils.java

@@ -13,13 +13,14 @@ import net.ranides.assira.reflection.ResolveException;
 import net.ranides.assira.text.FormatNumber;
 import net.ranides.assira.text.ResolveDialect;
 import net.ranides.assira.text.ResolveFormat;
-import net.ranides.assira.trace.LoggerUtils;
+import org.slf4j.LoggerFactory;
 
 import java.security.AccessControlException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Utility class build on top of {@link Runtime} class.
@@ -28,8 +29,8 @@ import java.util.List;
  */
 @UtilityClass
 public class RuntimeUtils {
-    
-    private static final org.slf4j.Logger LOGGER = LoggerUtils.getLogger();
+
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(RuntimeUtils.class);
 
     /**
      * Estimates memory used by application, in bytes.
@@ -117,8 +118,12 @@ public class RuntimeUtils {
      * @param name name
      * @return value or null
      */
-    public static String getProperty(String name) {
-        return getProperty(name, null);
+    public static Optional<String> getProperty(String name) {
+        try {
+            return Optional.ofNullable(doPrivileged(() -> System.getProperty(name)));
+        } catch(AccessControlException $0) {
+            return Optional.empty();
+        }
     }
 
     /**
@@ -138,13 +143,18 @@ public class RuntimeUtils {
     }
 
     /**
-     * Returns current JVM version as double value.
-     * Integer part represent major version and fractional part represents minor.
+     * Returns current JVM major version as int value.
+     * For old JDK version using "1.X" scheme it returns "X", for example return 8 for JDK 1.8
      *
-     * @return double
+     * @return int
      */
-    public static double getJavaVersion() {
-        return Double.parseDouble(getProperty("java.specification.version", "0"));
+    public static int getJavaVersion() {
+        double version = Double.parseDouble(getProperty("java.specification.version", "0"));
+        if(version < 2) {
+            return (int)Math.round(10*version-10);
+        } else {
+            return (int)Math.round(version);
+        }
     }
 
     /**

+ 13 - 0
assira.core/src/test/java/net/ranides/assira/system/RuntimeConfigurationTest.java

@@ -0,0 +1,13 @@
+package net.ranides.assira.system;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class RuntimeConfigurationTest {
+
+    @Test
+    public void run() {
+        assertFalse(RuntimeConfiguration.FEATURE_CACHE_DAEMON());
+    }
+}

+ 1 - 1
assira.junit/src/main/java/net/ranides/assira/junit/LogObserver.java

@@ -25,7 +25,7 @@ import java.util.stream.Stream;
  * You can enable log collection by setting system properties:
  *  "assira.junit.debug"            - messages are printed to console
  *  "assira.junit.logger.observe"   - messages are collected
- *  "assira.junit.log"              - set minimum level of collected messages ("debug" by default)
+ *  "assira.junit.logger.level"     - set minimum level of collected messages ("debug" by default)
  *                                    allowed values: trace, debug, info, warn, warning, error
  *
  * You can change "debug" and "observe" states at runtime, by calling static methods: "debug" and "reset".

+ 1 - 1
assira.junit/src/main/java/org/slf4j/impl/ObserveLogger.java

@@ -25,7 +25,7 @@ public final class ObserveLogger extends MarkerIgnoringBase {
 
     ObserveLogger(String name) {
         this.name = name;
-        this.level = levelToInt(System.getProperty("assira.junit.log", "debug"));
+        this.level = levelToInt(System.getProperty("assira.junit.logger.level", "debug"));
     }
 
     private static int levelToInt(String text) {

+ 2 - 2
pom.xml

@@ -48,7 +48,7 @@
         <maven.compiler.target>1.8</maven.compiler.target>
         <netbeans.hint.license>WTFPL</netbeans.hint.license>
         <assira.junit.debug>false</assira.junit.debug>
-        <assira.junit.log>debug</assira.junit.log>
+        <assira.junit.logger.level>debug</assira.junit.logger.level>
 
 
         <org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap>none</org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap>
@@ -200,7 +200,7 @@
                     <systemPropertyVariables>
                         <assira.junit.debug>${assira.junit.debug}</assira.junit.debug>
                         <assira.version>${project.version}</assira.version>
-                        <assira.junit.log>${assira.junit.log}</assira.junit.log>
+                        <assira.junit.logger.level>${assira.junit.logger.level}</assira.junit.logger.level>
                     </systemPropertyVariables>
                     <testFailureIgnore>false</testFailureIgnore>
                     <skip>false</skip>