uschindler commented on code in PR #12311:
URL: https://github.com/apache/lucene/pull/12311#discussion_r1198170915


##########
lucene/core/src/java/org/apache/lucene/util/VectorUtil.java:
##########
@@ -270,4 +216,134 @@ public static float dotProductScore(byte[] a, byte[] b) {
     float denom = (float) (a.length * (1 << 15));
     return 0.5f + dotProduct(a, b) / denom;
   }
+
+  interface VectorUtilProvider {
+
+    // just dot product for now
+    float dotProduct(float[] a, float[] b);
+  }
+
+  private static VectorUtilProvider lookupProvider() {
+    // TODO: add a check
+    final int runtimeVersion = Runtime.version().feature();
+    if (runtimeVersion == 20) { // TODO: do we want JDK 19?
+      try {
+        ensureReadability();
+        final var lookup = MethodHandles.lookup();
+        final var cls = 
lookup.findClass("org.apache.lucene.util.JDKVectorUtilProvider");
+        // we use method handles, so we do not need to deal with setAccessible 
as we have private
+        // access through the lookup:
+        final var constr = lookup.findConstructor(cls, 
MethodType.methodType(void.class));
+        try {
+          return (VectorUtilProvider) constr.invoke();
+        } catch (RuntimeException | Error e) {
+          throw e;
+        } catch (Throwable th) {
+          throw new AssertionError(th);
+        }
+      } catch (NoSuchMethodException | IllegalAccessException e) {
+        throw new LinkageError("JDKVectorUtilProvider is missing correctly 
typed constructor", e);
+      } catch (ClassNotFoundException cnfe) {
+        throw new LinkageError("JDKVectorUtilProvider is missing in Lucene JAR 
file", cnfe);
+      }
+    } else if (runtimeVersion >= 21) {
+      LOG.warning(
+          "You are running with Java 21 or later. To make full use of the 
Vector API, please update Apache Lucene.");
+    }
+    return new LuceneVectorUtilProvider();
+  }
+
+  // Extracted to a method to be able to apply the SuppressForbidden annotation
+  @SuppressWarnings("removal")
+  @SuppressForbidden(reason = "security manager")
+  private static <T> T doPrivileged(PrivilegedAction<T> action) {
+    return AccessController.doPrivileged(action);
+  }
+
+  static void ensureReadability() {
+    ModuleLayer.boot().modules().stream()
+        .filter(m -> m.getName().equals("jdk.incubator.vector"))
+        .findFirst()
+        .ifPresentOrElse(
+            vecMod -> VectorUtilProvider.class.getModule().addReads(vecMod),
+            () -> LOG.warning("vector incubator module not present"));
+  }
+
+  static {
+    PROVIDER =

Review Comment:
   Ah you try to make the module readable. Then we need to document permissions 
and add a fallback by catching security/access exceptions.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to