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