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";
}