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 <talli...@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);