You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/08/09 04:52:06 UTC

[groovy] 02/02: GROOVY-9675: There should be a mechanism to disable individual macro methods & extension methods (use a comma-separated list to disable)

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 2d892f30d2dc27bd4734a6c5c25dfdc2815c76d2
Author: Paul King <pa...@asert.com.au>
AuthorDate: Sat Aug 8 09:51:20 2020 +1000

    GROOVY-9675: There should be a mechanism to disable individual macro methods & extension methods (use a comma-separated list to disable)
---
 .../groovy/runtime/metaclass/MetaClassRegistryImpl.java | 17 +++++++++--------
 .../transform/stc/AbstractExtensionMethodCache.java     | 11 +++++++----
 .../groovy/transform/stc/ExtensionMethodCache.java      |  6 +++---
 .../groovy/macro/transform/MacroMethodsCache.java       |  2 +-
 4 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java b/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java
index 08d8b08..b3007e1 100644
--- a/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java
+++ b/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaClassRegistryImpl.java
@@ -47,12 +47,15 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 /**
  * A registry of MetaClass instances which caches introspection and
@@ -67,7 +70,7 @@ public class MetaClassRegistryImpl implements MetaClassRegistry{
     public static final String MODULE_META_INF_FILE = "META-INF/services/org.codehaus.groovy.runtime.ExtensionModule";
     private static final MetaClass[] EMPTY_METACLASS_ARRAY = new MetaClass[0];
     private static final MetaClassRegistryChangeEventListener[] EMPTY_METACLASSREGISTRYCHANGEEVENTLISTENER_ARRAY = new MetaClassRegistryChangeEventListener[0];
-    public static final String EXTENSION_DISABLE_PREFIX = "groovy.extension.disable";
+    public static final String EXTENSION_DISABLE_PROPERTY = "groovy.extension.disable";
 
     private final boolean useAccessible;
 
@@ -78,7 +81,9 @@ public class MetaClassRegistryImpl implements MetaClassRegistry{
     private final LinkedList<MetaClassRegistryChangeEventListener> nonRemoveableChangeListenerList = new LinkedList<MetaClassRegistryChangeEventListener>();
     private final ManagedConcurrentLinkedQueue<MetaClass> metaClassInfo = new ManagedConcurrentLinkedQueue<MetaClass>(ReferenceBundle.getWeakBundle());
     private final ExtensionModuleRegistry moduleRegistry = new ExtensionModuleRegistry();
-    private final boolean canDisable = SystemUtil.getBooleanSafe(EXTENSION_DISABLE_PREFIX);
+    private final String disabledString = SystemUtil.getSystemPropertySafe(EXTENSION_DISABLE_PROPERTY);
+    private final boolean disabling = disabledString != null;
+    private final Set<String> disabledNames = disabling ? new HashSet<>(Arrays.asList(disabledString.split(","))) : null;
 
     public static final int LOAD_DEFAULT = 0;
     public static final int DONT_LOAD_DEFAULT = 1;
@@ -202,9 +207,7 @@ public class MetaClassRegistryImpl implements MetaClassRegistry{
                 List<GeneratedMetaMethod.DgmMethodRecord> records = GeneratedMetaMethod.DgmMethodRecord.loadDgmInfo();
 
                 for (GeneratedMetaMethod.DgmMethodRecord record : records) {
-                    if (canDisable && SystemUtil.getBooleanSafe(EXTENSION_DISABLE_PREFIX + "." + record.methodName)) {
-                        continue;
-                    }
+                    if (disabling && disabledNames.contains(record.methodName)) continue;
                     Class[] newParams = new Class[record.parameters.length - 1];
                     System.arraycopy(record.parameters, 1, newParams, 0, record.parameters.length-1);
 
@@ -231,9 +234,7 @@ public class MetaClassRegistryImpl implements MetaClassRegistry{
             for (CachedMethod method : methods) {
                 final int mod = method.getModifiers();
                 if (Modifier.isStatic(mod) && Modifier.isPublic(mod) && method.getAnnotation(Deprecated.class) == null) {
-                    if (canDisable && SystemUtil.getBooleanSafe(EXTENSION_DISABLE_PREFIX + "." + method.getName())) {
-                        continue;
-                    }
+                    if (disabling && disabledNames.contains(method.getName())) continue;
                     CachedClass[] paramTypes = method.getParameterTypes();
                     if (paramTypes.length > 0) {
                         List<MetaMethod> arr = map.computeIfAbsent(paramTypes[0], k -> new ArrayList<MetaMethod>(4));
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/AbstractExtensionMethodCache.java b/src/main/java/org/codehaus/groovy/transform/stc/AbstractExtensionMethodCache.java
index e55ccab..c50624e 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/AbstractExtensionMethodCache.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/AbstractExtensionMethodCache.java
@@ -29,8 +29,10 @@ import org.codehaus.groovy.runtime.memoize.EvictableCache;
 import org.codehaus.groovy.runtime.memoize.StampedCommonCache;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -47,7 +49,9 @@ import static org.codehaus.groovy.ast.ClassHelper.makeWithoutCaching;
  */
 public abstract class AbstractExtensionMethodCache {
     final EvictableCache<ClassLoader, Map<String, List<MethodNode>>> cache = new StampedCommonCache<>(new WeakHashMap<>());
-    private final boolean canDisable = SystemUtil.getBooleanSafe(getDisablePrefix());
+    private final String disabledString = SystemUtil.getSystemPropertySafe(getDisablePropertyName());
+    private final boolean disabling = disabledString != null;
+    private final Set<String> disabledNames = disabling ? new HashSet<>(Arrays.asList(disabledString.split(","))) : null;
 
     public Map<String, List<MethodNode>> get(ClassLoader loader) {
         return cache.getAndPut(loader, this::getMethodsFromClassLoader);
@@ -81,7 +85,6 @@ public abstract class AbstractExtensionMethodCache {
      * which is applicable for this class.
      *
      * @param modules extension modules
-     * @return
      */
     private Map<String, List<MethodNode>> getMethods(List<ExtensionModule> modules) {
         Set<Class> instanceExtClasses = new LinkedHashSet<>();
@@ -118,14 +121,14 @@ public abstract class AbstractExtensionMethodCache {
             for (MethodNode methodNode : cn.getMethods()) {
                 if (!(methodNode.isStatic() && methodNode.isPublic()) || methodNode.getParameters().length == 0) continue;
                 if (methodFilter.test(methodNode)) continue;
-                if (canDisable && SystemUtil.getBooleanSafe(getDisablePrefix() + "." + methodNode.getName())) continue;
+                if (disabling && disabledNames.contains(methodNode.getName())) continue;
 
                 accumulate(accumulator, isStatic, methodNode, methodMapper);
             }
         }
     }
 
-    protected abstract String getDisablePrefix();
+    protected abstract String getDisablePropertyName();
     protected abstract Predicate<MethodNode> getMethodFilter();
     protected abstract Function<MethodNode, String> getMethodMapper();
 
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/ExtensionMethodCache.java b/src/main/java/org/codehaus/groovy/transform/stc/ExtensionMethodCache.java
index eaff591..713aca3 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/ExtensionMethodCache.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/ExtensionMethodCache.java
@@ -29,7 +29,7 @@ import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
-import static org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.EXTENSION_DISABLE_PREFIX;
+import static org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.EXTENSION_DISABLE_PROPERTY;
 
 /**
  * This class is used to make extension methods lookup faster. Basically, it will only
@@ -63,8 +63,8 @@ public class ExtensionMethodCache extends AbstractExtensionMethodCache {
     }
 
     @Override
-    protected String getDisablePrefix() {
-        return EXTENSION_DISABLE_PREFIX;
+    protected String getDisablePropertyName() {
+        return EXTENSION_DISABLE_PROPERTY;
     }
 
     @Override
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java
index dc8b74f..6346d60 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroMethodsCache.java
@@ -42,7 +42,7 @@ class MacroMethodsCache extends AbstractExtensionMethodCache {
     protected void addAdditionalClassesToScan(Set<Class> instanceExtClasses, Set<Class> staticExtClasses) {}
 
     @Override
-    protected String getDisablePrefix() {
+    protected String getDisablePropertyName() {
         return "groovy.macro.disable";
     }