You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2023/09/13 19:11:54 UTC

[tika] branch main updated: Enable clean build with target of 17

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

tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new 4bba971e3 Enable clean build with target of 17
4bba971e3 is described below

commit 4bba971e3ec959be2adf74fa50cc1f7316615ac6
Author: tallison <ta...@apache.org>
AuthorDate: Wed Sep 13 15:11:41 2023 -0400

    Enable clean build with target of 17
---
 .../org/apache/tika/io/MappedBufferCleaner.java    | 179 ---------------------
 .../org/apache/tika/utils/AnnotationUtils.java     |   7 +-
 .../tika/server/core/IntegrationTestBase.java      |  24 ---
 3 files changed, 1 insertion(+), 209 deletions(-)

diff --git a/tika-core/src/main/java/org/apache/tika/io/MappedBufferCleaner.java b/tika-core/src/main/java/org/apache/tika/io/MappedBufferCleaner.java
deleted file mode 100644
index 815b506d6..000000000
--- a/tika-core/src/main/java/org/apache/tika/io/MappedBufferCleaner.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.io;
-
-import static java.lang.invoke.MethodHandles.Lookup;
-import static java.lang.invoke.MethodHandles.constant;
-import static java.lang.invoke.MethodHandles.dropArguments;
-import static java.lang.invoke.MethodHandles.filterReturnValue;
-import static java.lang.invoke.MethodHandles.guardWithTest;
-import static java.lang.invoke.MethodHandles.lookup;
-import static java.lang.invoke.MethodType.methodType;
-
-import java.io.IOException;
-import java.lang.invoke.MethodHandle;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.nio.ByteBuffer;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.Objects;
-
-/**
- * Copied/pasted from the Apache Lucene/Solr project.
- */
-public class MappedBufferCleaner {
-    /**
-     * <code>true</code>, if this platform supports unmapping mmapped files.
-     */
-    public static final boolean UNMAP_SUPPORTED;
-    /**
-     * if {@link #UNMAP_SUPPORTED} is {@code false}, this contains the reason  why unmapping is
-     * not supported.
-     */
-    public static final String UNMAP_NOT_SUPPORTED_REASON;
-    /**
-     * Reference to a BufferCleaner that does unmapping; {@code null} if not supported.
-     */
-    private static final BufferCleaner CLEANER;
-
-    static {
-        final Object hack = AccessController
-                .doPrivileged((PrivilegedAction<Object>) MappedBufferCleaner::unmapHackImpl);
-        if (hack instanceof BufferCleaner) {
-            CLEANER = (BufferCleaner) hack;
-            UNMAP_SUPPORTED = true;
-            UNMAP_NOT_SUPPORTED_REASON = null;
-        } else {
-            CLEANER = null;
-            UNMAP_SUPPORTED = false;
-            UNMAP_NOT_SUPPORTED_REASON = hack.toString();
-        }
-    }
-
-    /**
-     * If a cleaner is available, this buffer will be cleaned.
-     * Otherwise, this is a no-op.
-     *
-     * @param b buffer to clean; no-op if buffer is null
-     * @throws IOException
-     */
-    public static void freeBuffer(ByteBuffer b) throws IOException {
-        if (CLEANER != null && b != null) {
-            CLEANER.freeBuffer("", b);
-        }
-    }
-
-    //"Needs access to private APIs in DirectBuffer, sun.misc.Cleaner, and sun.misc.Unsafe to
-    // enable hack")
-    private static Object unmapHackImpl() {
-        final Lookup lookup = lookup();
-        try {
-            try {
-                // *** sun.misc.Unsafe unmapping (Java 9+) ***
-                final Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
-                // first check if Unsafe has the right method, otherwise we can give up
-                // without doing any security critical stuff:
-                final MethodHandle unmapper = lookup.findVirtual(unsafeClass, "invokeCleaner",
-                        methodType(void.class, ByteBuffer.class));
-                // fetch the unsafe instance and bind it to the virtual MH:
-                final Field f = unsafeClass.getDeclaredField("theUnsafe");
-                f.setAccessible(true);
-                final Object theUnsafe = f.get(null);
-                return newBufferCleaner(ByteBuffer.class, unmapper.bindTo(theUnsafe));
-            } catch (SecurityException se) {
-                // rethrow to report errors correctly (we need to catch it here, as we also
-                // catch RuntimeException below!):
-                throw se;
-            } catch (ReflectiveOperationException | RuntimeException e) {
-                // *** sun.misc.Cleaner unmapping (Java 8) ***
-                final Class<?> directBufferClass = Class.forName("java.nio.DirectByteBuffer");
-
-                final Method m = directBufferClass.getMethod("cleaner");
-                m.setAccessible(true);
-                final MethodHandle directBufferCleanerMethod = lookup.unreflect(m);
-                final Class<?> cleanerClass = directBufferCleanerMethod.type().returnType();
-
-                /* "Compile" a MH that basically is equivalent to the following code:
-                 * void unmapper(ByteBuffer byteBuffer) {
-                 *   sun.misc.Cleaner cleaner = ((java.nio.DirectByteBuffer) byteBuffer).cleaner();
-                 *   if (Objects.nonNull(cleaner)) {
-                 *     cleaner.clean();
-                 *   } else {
-                 *     noop(cleaner); // the noop is needed because MethodHandles#guardWithTest
-                 * always needs ELSE
-                 *   }
-                 * }
-                 */
-                final MethodHandle cleanMethod =
-                        lookup.findVirtual(cleanerClass, "clean", methodType(void.class));
-                final MethodHandle nonNullTest = lookup.findStatic(Objects.class, "nonNull",
-                        methodType(boolean.class, Object.class))
-                        .asType(methodType(boolean.class, cleanerClass));
-                final MethodHandle noop =
-                        dropArguments(constant(Void.class, null).asType(methodType(void.class)), 0,
-                                cleanerClass);
-                final MethodHandle unmapper = filterReturnValue(directBufferCleanerMethod,
-                        guardWithTest(nonNullTest, cleanMethod, noop))
-                        .asType(methodType(void.class, ByteBuffer.class));
-                return newBufferCleaner(directBufferClass, unmapper);
-            }
-        } catch (SecurityException se) {
-            return "Unmapping is not supported, because not all required permissions are given to" +
-                    "  the Tika JAR file: " + se +
-                    " [Please grant at least the following permissions: " +
-                    " RuntimePermission(\"accessClassInPackage.sun.misc\") " +
-                    " and ReflectPermission(\"suppressAccessChecks\")]";
-        } catch (ReflectiveOperationException | RuntimeException e) {
-            return "Unmapping is not supported on this platform, because internal Java APIs are " +
-                    "not compatible with this Lucene version: " +
-                    e;
-        }
-    }
-
-    private static BufferCleaner newBufferCleaner(final Class<?> unmappableBufferClass,
-                                                  final MethodHandle unmapper) {
-        assert Objects.equals(methodType(void.class, ByteBuffer.class), unmapper.type());
-        return (String resourceDescription, ByteBuffer buffer) -> {
-            if (!buffer.isDirect()) {
-                throw new IllegalArgumentException("unmapping only works with direct buffers");
-            }
-            if (!unmappableBufferClass.isInstance(buffer)) {
-                throw new IllegalArgumentException(
-                        "buffer is not an instance of " + unmappableBufferClass.getName());
-            }
-            final Throwable error =
-                    AccessController.doPrivileged((PrivilegedAction<Throwable>) () -> {
-                        try {
-                            unmapper.invokeExact(buffer);
-                            return null;
-                        } catch (Throwable t) {
-                            return t;
-                        }
-                    });
-            if (error != null) {
-                throw new IOException("Unable to unmap the mapped buffer: " + resourceDescription,
-                        error);
-            }
-        };
-    }
-
-    //Copied/pasted from Lucene's MMapDirectory
-    private interface BufferCleaner {
-        void freeBuffer(String resourceDescription, ByteBuffer b) throws IOException;
-    }
-}
diff --git a/tika-core/src/main/java/org/apache/tika/utils/AnnotationUtils.java b/tika-core/src/main/java/org/apache/tika/utils/AnnotationUtils.java
index cb47afb0a..b3b8264b4 100644
--- a/tika-core/src/main/java/org/apache/tika/utils/AnnotationUtils.java
+++ b/tika-core/src/main/java/org/apache/tika/utils/AnnotationUtils.java
@@ -19,8 +19,6 @@ package org.apache.tika.utils;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -72,10 +70,7 @@ public class AnnotationUtils {
 
         for (final AccessibleObject member : members) {
             if (member.isAnnotationPresent(annotation)) {
-                AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
-                    member.setAccessible(true);
-                    return null;
-                });
+                member.setAccessible(true);
                 annotatedMembers.add(member);
             }
         }
diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/IntegrationTestBase.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/IntegrationTestBase.java
index 86d964e30..af664259f 100644
--- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/IntegrationTestBase.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/IntegrationTestBase.java
@@ -33,7 +33,6 @@ import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,7 +62,6 @@ public class IntegrationTestBase extends TikaTest {
     static Path TEMP_WORKING_DIR;
     static Path LOG_FILE;
     static Path STREAMS_DIR;
-    private SecurityManager existingSecurityManager = null;
     protected Process process = null;
 
     @BeforeAll
@@ -77,30 +75,8 @@ public class IntegrationTestBase extends TikaTest {
         STREAMS_DIR = Files.createTempDirectory(TEMP_WORKING_DIR, "tika-server-integration");
     }
 
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        existingSecurityManager = System.getSecurityManager();
-/*        System.setSecurityManager(new SecurityManager() {
-            @Override
-            public void checkExit(int status) {
-                super.checkExit(status);
-                throw new MyExitException(status);
-            }
-            @Override
-            public void checkPermission(Permission perm) {
-                // all ok
-            }
-            @Override
-            public void checkPermission(Permission perm, Object context) {
-                // all ok
-            }
-        });*/
-    }
-
     @AfterEach
     public void tearDown() throws Exception {
-        System.setSecurityManager(existingSecurityManager);
         if (process != null) {
             process.destroyForcibly();
             process.waitFor(30, TimeUnit.SECONDS);