You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/03/01 16:47:48 UTC

[causeway] branch master updated: CAUSEWAY-3304: prepare removal of 'privileged' artifact

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

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


The following commit(s) were added to refs/heads/master by this push:
     new b7d132c9bb CAUSEWAY-3304: prepare removal of 'privileged' artifact
b7d132c9bb is described below

commit b7d132c9bbab59fea78a457be95cb7c49d3e8f6b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 1 17:47:43 2023 +0100

    CAUSEWAY-3304: prepare removal of 'privileged' artifact
---
 .../services/ClassLoadingStrategyAdvisor.java      | 62 +++++++++++++++++-----
 .../ViewModelFacetForViewModelInterface.java       |  5 +-
 2 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/core/codegen-bytebuddy/src/main/java/org/apache/causeway/core/codegen/bytebuddy/services/ClassLoadingStrategyAdvisor.java b/core/codegen-bytebuddy/src/main/java/org/apache/causeway/core/codegen/bytebuddy/services/ClassLoadingStrategyAdvisor.java
index 843f6abf4a..0422c29e99 100644
--- a/core/codegen-bytebuddy/src/main/java/org/apache/causeway/core/codegen/bytebuddy/services/ClassLoadingStrategyAdvisor.java
+++ b/core/codegen-bytebuddy/src/main/java/org/apache/causeway/core/codegen/bytebuddy/services/ClassLoadingStrategyAdvisor.java
@@ -19,9 +19,13 @@
 package org.apache.causeway.core.codegen.bytebuddy.services;
 
 import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Method;
 
-import org.apache.causeway.core.privileged._Privileged;
+import org.apache.causeway.commons.internal.exceptions._Exceptions;
 
+import lombok.NonNull;
+import lombok.SneakyThrows;
 import net.bytebuddy.dynamic.loading.ClassInjector;
 import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
 
@@ -35,24 +39,58 @@ class ClassLoadingStrategyAdvisor {
     final MethodHandle privateLookupMethodHandle;
 
     ClassLoadingStrategyAdvisor() {
-        // JDK 9+ required
-        if (!ClassInjector.UsingLookup.isAvailable()) {
-            throw new IllegalStateException("No code generation strategy available");
-        }
-        this.privateLookupMethodHandle = _Privileged.createPrivateLookupMethodHandle();
+        this.privateLookupMethodHandle = createPrivateLookupMethodHandle();
     }
 
     public ClassLoadingStrategy<ClassLoader> getSuitableStrategy(final Class<?> targetClass) {
         try {
-            final Object privateLookup = _Privileged
-                    .invokeLookup(privateLookupMethodHandle, targetClass);
+            final Object privateLookup = invokeLookup(privateLookupMethodHandle, targetClass);
             return ClassLoadingStrategy.UsingLookup.of(privateLookup);
         } catch (Throwable e) {
-            throw new IllegalStateException(
-                    String.format("Failed to utilize code generation strategy on class '%s'",
-                            targetClass.getName())
-                    , e);
+            throw _Exceptions.illegalState(e,
+                    "Failed to utilize code generation strategy on class '%s'",
+                    targetClass.getName());
         }
     }
 
+    // -- HELPER
+
+    @SneakyThrows
+    private static Object invokeLookup(final @NonNull MethodHandle mh, final Class<?> targetClass) {
+        return mh.invoke(reads(targetClass), MethodHandles.lookup());
+    }
+
+    private static MethodHandle createPrivateLookupMethodHandle() {
+        // JDK 9+ required
+        if (!ClassInjector.UsingLookup.isAvailable()) {
+            throw new IllegalStateException("No code generation strategy available");
+        }
+        try {
+            final Method privateLookupIn = java.lang.invoke.MethodHandles.class
+                    .getMethod("privateLookupIn",
+                        Class.class,
+                        java.lang.invoke.MethodHandles.Lookup.class);
+            return MethodHandles.publicLookup().unreflect(privateLookupIn);
+        } catch (Throwable e) {
+            throw _Exceptions.illegalState(e,
+                    "MethodHandles.privateLookupIn(...) is not available");
+        }
+    }
+
+    private static Class<?> reads(final Class<?> cls) {
+        final Class<?> otherClass = cls.isArray() ? cls.getComponentType() : cls;
+        final Module otherModule = otherClass.getModule();
+        //no need for unnamed and java.base types
+        if (!otherModule.isNamed()
+                || "java.base".equals(otherModule.getName())) {
+            return cls;
+        }
+        thisModule().addReads(otherModule);
+        return cls;
+    }
+
+    private static Module thisModule() {
+        return ClassLoadingStrategyAdvisor.class.getModule();
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/viewmodel/ViewModelFacetForViewModelInterface.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/viewmodel/ViewModelFacetForViewModelInterface.java
index a05aad3a97..b8ca907c0a 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/viewmodel/ViewModelFacetForViewModelInterface.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/viewmodel/ViewModelFacetForViewModelInterface.java
@@ -36,7 +36,6 @@ import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.specloader.validator.ValidationFailure;
-import org.apache.causeway.core.privileged._Privileged;
 
 import lombok.NonNull;
 import lombok.SneakyThrows;
@@ -147,9 +146,7 @@ extends ViewModelFacetAbstract {
                 + "this can only happen, if we try to deserialize an abstract type");
 
         val resolvedArgs = resolveArgsForConstructor(constructorAnyArgs, getServiceRegistry(), memento);
-
-        val viewmodelPojo = _Privileged
-                .newInstance(constructorAnyArgs, resolvedArgs);
+        val viewmodelPojo = constructorAnyArgs.newInstance(resolvedArgs);
         return viewmodelPojo;
     }