blob: 1e8024e3bfe53d1d6280c9b49d60b108c9d8a009 [file] [log] [blame]
/*
* 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.felix.framework.util;
import java.io.*;
import java.lang.reflect.*;
import java.lang.reflect.Proxy;
import java.net.*;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.security.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.function.Consumer;
import java.util.jar.JarFile;
import java.util.zip.ZipFile;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.hooks.resolver.ResolverHook;
import org.osgi.framework.hooks.service.ListenerHook;
import org.osgi.framework.wiring.BundleCapability;
import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleRevision;
/**
* <p>
* This is a utility class to centralize all action that should be performed
* in a <tt>doPrivileged()</tt> block. To perform a secure action, simply
* create an instance of this class and use the specific method to perform
* the desired action. When an instance is created, this class will capture
* the security context and will then use that context when checking for
* permission to perform the action. Instances of this class should not be
* passed around since they may grant the receiver a capability to perform
* privileged actions.
* </p>
**/
public class SecureAction
{
private static final byte[] accessor;
static
{
byte[] result;
try (ByteArrayOutputStream output = new ByteArrayOutputStream();
InputStream input = SecureAction.class.getResourceAsStream("accessor.bytes"))
{
byte[] buffer = new byte[input.available() > 0 ? input.available() : 1024];
for (int i = input.read(buffer); i != -1; i = input.read(buffer))
{
output.write(buffer, 0, i);
}
result = output.toByteArray();
}
catch (Throwable t)
{
t.printStackTrace();
result = new byte[0];
}
accessor = result;
getAccessor(URL.class);
}
private static final ThreadLocal m_actions = new ThreadLocal()
{
public Object initialValue()
{
return new Actions();
}
};
protected static transient int BUFSIZE = 4096;
private AccessControlContext m_acc = null;
public SecureAction()
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INITIALIZE_CONTEXT_ACTION, null);
m_acc = (AccessControlContext) AccessController.doPrivileged(actions);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
m_acc = AccessController.getContext();
}
}
public String getSystemProperty(String name, String def)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_PROPERTY_ACTION, name, def);
return (String) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return System.getProperty(name, def);
}
}
public ClassLoader getParentClassLoader(ClassLoader loader)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_PARENT_CLASS_LOADER_ACTION, loader);
return (ClassLoader) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return loader.getParent();
}
}
public ClassLoader getSystemClassLoader()
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_SYSTEM_CLASS_LOADER_ACTION);
return (ClassLoader) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return ClassLoader.getSystemClassLoader();
}
}
public ClassLoader getClassLoader(Class clazz)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_CLASS_LOADER_ACTION, clazz);
return (ClassLoader) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return clazz.getClassLoader();
}
}
public Class forName(String name, ClassLoader classloader) throws ClassNotFoundException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.FOR_NAME_ACTION, name, classloader);
return (Class) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof ClassNotFoundException)
{
throw (ClassNotFoundException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else if (classloader != null)
{
return Class.forName(name, true, classloader);
}
else
{
return Class.forName(name);
}
}
public URL createURL(String protocol, String host,
int port, String path, URLStreamHandler handler)
throws MalformedURLException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.CREATE_URL_ACTION, protocol, host,
new Integer(port), path, handler);
return (URL) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof MalformedURLException)
{
throw (MalformedURLException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return new URL(protocol, host, port, path, handler);
}
}
public URL createURL(URL context, String spec, URLStreamHandler handler)
throws MalformedURLException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.CREATE_URL_WITH_CONTEXT_ACTION, context,
spec, handler);
return (URL) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof MalformedURLException)
{
throw (MalformedURLException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return new URL(context, spec, handler);
}
}
public Process exec(String command) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.EXEC_ACTION, command);
return (Process) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return Runtime.getRuntime().exec(command);
}
}
public String getAbsolutePath(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_ABSOLUTE_PATH_ACTION, file);
return (String) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.getAbsolutePath();
}
}
public boolean fileExists(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.FILE_EXISTS_ACTION, file);
return ((Boolean) AccessController.doPrivileged(actions, m_acc))
.booleanValue();
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.exists();
}
}
public boolean isFile(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.FILE_IS_FILE_ACTION, file);
return ((Boolean) AccessController.doPrivileged(actions, m_acc))
.booleanValue();
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.isFile();
}
}
public boolean isFileDirectory(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.FILE_IS_DIRECTORY_ACTION, file);
return ((Boolean) AccessController.doPrivileged(actions, m_acc))
.booleanValue();
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.isDirectory();
}
}
public boolean mkdir(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.MAKE_DIRECTORY_ACTION, file);
return ((Boolean) AccessController.doPrivileged(actions, m_acc))
.booleanValue();
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.mkdir();
}
}
public boolean mkdirs(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.MAKE_DIRECTORIES_ACTION, file);
return ((Boolean) AccessController.doPrivileged(actions, m_acc))
.booleanValue();
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.mkdirs();
}
}
public File[] listDirectory(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.LIST_DIRECTORY_ACTION, file);
return (File[]) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.listFiles();
}
}
public boolean renameFile(File oldFile, File newFile)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.RENAME_FILE_ACTION, oldFile, newFile);
return ((Boolean) AccessController.doPrivileged(actions, m_acc))
.booleanValue();
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return oldFile.renameTo(newFile);
}
}
public InputStream getInputStream(File file) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_INPUT_ACTION, file);
return (InputStream) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return Files.newInputStream(file.toPath());
}
}
public OutputStream getOutputStream(File file) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_OUTPUT_ACTION, file);
return (OutputStream) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return Files.newOutputStream(file.toPath());
}
}
public FileInputStream getFileInputStream(File file) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_FILE_INPUT_ACTION, file);
return (FileInputStream) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return new FileInputStream(file);
}
}
public FileOutputStream getFileOutputStream(File file) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_FILE_OUTPUT_ACTION, file);
return (FileOutputStream) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return new FileOutputStream(file);
}
}
public FileChannel getFileChannel(File file) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_FILE_CHANNEL_ACTION, file);
return (FileChannel) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return FileChannel.open(file.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
}
}
public URI toURI(File file)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.TO_URI_ACTION, file);
return (URI) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return file.toURI();
}
}
public InputStream getURLConnectionInputStream(URLConnection conn)
throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_URL_INPUT_ACTION, conn);
return (InputStream) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return conn.getInputStream();
}
}
public boolean deleteFile(File target)
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.DELETE_FILE_ACTION, target);
return ((Boolean) AccessController.doPrivileged(actions, m_acc))
.booleanValue();
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return target.delete();
}
}
public File createTempFile(String prefix, String suffix, File dir)
throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.CREATE_TMPFILE_ACTION, prefix, suffix, dir);
return (File) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return File.createTempFile(prefix, suffix, dir);
}
}
public void deleteFileOnExit(File file)
throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.DELETE_FILEONEXIT_ACTION, file);
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
file.deleteOnExit();
}
}
public URLConnection openURLConnection(URL url) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.OPEN_URLCONNECTION_ACTION, url);
return (URLConnection) AccessController.doPrivileged(actions,
m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return url.openConnection();
}
}
public ZipFile openZipFile(File file) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.OPEN_ZIPFILE_ACTION, file);
return (ZipFile) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return new ZipFile(file);
}
}
public JarFile openJarFile(File file) throws IOException
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.OPEN_JARFILE_ACTION, file);
return (JarFile) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
if (ex.getException() instanceof IOException)
{
throw (IOException) ex.getException();
}
throw (RuntimeException) ex.getException();
}
}
else
{
return new JarFile(file);
}
}
public void startActivator(BundleActivator activator, BundleContext context)
throws Exception
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.START_ACTIVATOR_ACTION, activator, context);
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw ex.getException();
}
}
else
{
activator.start(context);
}
}
public void stopActivator(BundleActivator activator, BundleContext context)
throws Exception
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.STOP_ACTIVATOR_ACTION, activator, context);
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw ex.getException();
}
}
else
{
activator.stop(context);
}
}
public Policy getPolicy()
{
if (System.getSecurityManager() != null)
{
try
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_POLICY_ACTION, null);
return (Policy) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException ex)
{
throw (RuntimeException) ex.getException();
}
}
else
{
return Policy.getPolicy();
}
}
public void addURLToURLClassLoader(URL extension, ClassLoader loader) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.ADD_EXTENSION_URL_ACTION, extension, loader);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
Method addURL =
URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] {URL.class});
getAccessor(URLClassLoader.class).accept(new AccessibleObject[]{addURL});
addURL.invoke(loader, new Object[]{extension});
}
}
public Constructor getConstructor(Class target, Class[] types) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_CONSTRUCTOR_ACTION, target, types);
try
{
return (Constructor) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return target.getConstructor(types);
}
}
public Constructor getDeclaredConstructor(Class target, Class[] types) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_DECLARED_CONSTRUCTOR_ACTION, target, types);
try
{
return (Constructor) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return target.getDeclaredConstructor(types);
}
}
public Method getMethod(Class target, String method, Class[] types) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_METHOD_ACTION, target, method, types);
try
{
return (Method) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return target.getMethod(method, types);
}
}
public Method getDeclaredMethod(Class target, String method, Class[] types) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_DECLARED_METHOD_ACTION, target, method, types);
try
{
return (Method) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return target.getDeclaredMethod(method, types);
}
}
public void setAccesssible(Executable ao)
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.SET_ACCESSIBLE_ACTION, ao);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw (RuntimeException) e.getException();
}
}
else
{
getAccessor(ao.getDeclaringClass()).accept(new AccessibleObject[]{ao});
}
}
public Object invoke(Method method, Object target, Object[] params) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_METHOD_ACTION, method, target, params);
try
{
return AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
getAccessor(method.getDeclaringClass()).accept(new AccessibleObject[]{method});
return method.invoke(target, params);
}
}
public Object invokeDirect(Method method, Object target, Object[] params) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_DIRECTMETHOD_ACTION, method, target, params);
try
{
return AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return method.invoke(target, params);
}
}
public Object invoke(Constructor constructor, Object[] params) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_CONSTRUCTOR_ACTION, constructor, params);
try
{
return AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return constructor.newInstance(params);
}
}
public Object getDeclaredField(Class targetClass, String name, Object target)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_FIELD_ACTION, targetClass, name, target);
try
{
return AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
Field field = targetClass.getDeclaredField(name);
getAccessor(targetClass).accept(new AccessibleObject[]{field});
return field.get(target);
}
}
public Object swapStaticFieldIfNotClass(Class targetClazz,
Class targetType, Class condition, String lockName) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.SWAP_FIELD_ACTION, targetClazz, targetType,
condition, lockName);
try
{
return AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return _swapStaticFieldIfNotClass(targetClazz, targetType,
condition, lockName);
}
}
private static volatile Consumer<AccessibleObject[]> m_accessorCache = null;
@SuppressWarnings("unchecked")
private static Consumer<AccessibleObject[]> getAccessor(Class clazz)
{
String packageName = clazz.getPackage().getName();
if ("java.net".equals(packageName) || "jdk.internal.loader".equals(packageName))
{
if (m_accessorCache == null)
{
try
{
// Use reflection on Unsafe to avoid having to compile against it
Class<?> unsafeClass = Class.forName("sun.misc.Unsafe"); //$NON-NLS-1$
Field theUnsafe = unsafeClass.getDeclaredField("theUnsafe"); //$NON-NLS-1$
// NOTE: deep reflection is allowed on sun.misc package for java 9.
theUnsafe.setAccessible(true);
Object unsafe = theUnsafe.get(null);
// using defineAnonymousClass here because it seems more simple to get what we need
Method defineAnonymousClass = unsafeClass.getMethod("defineAnonymousClass", Class.class, byte[].class, Object[].class); //$NON-NLS-1$
// The bytes stored in a resource to avoid real loading of it (see accessible.src for source).
Class<Consumer<AccessibleObject[]>> result =
(Class<Consumer<AccessibleObject[]>>)
defineAnonymousClass.invoke(unsafe, URL.class, accessor , null);
m_accessorCache = result.getConstructor().newInstance();
}
catch (Throwable t)
{
t.printStackTrace();
m_accessorCache = objects -> AccessibleObject.setAccessible(objects, true);
}
}
return m_accessorCache;
}
else
{
return objects -> AccessibleObject.setAccessible(objects, true);
}
}
private static Object _swapStaticFieldIfNotClass(Class targetClazz,
Class targetType, Class condition, String lockName) throws Exception
{
Object lock = null;
if (lockName != null)
{
try
{
Field lockField =
targetClazz.getDeclaredField(lockName);
getAccessor(targetClazz).accept(new AccessibleObject[]{lockField});
lock = lockField.get(null);
}
catch (NoSuchFieldException ex)
{
}
}
if (lock == null)
{
lock = targetClazz;
}
synchronized (lock)
{
Field[] fields = targetClazz.getDeclaredFields();
getAccessor(targetClazz).accept(fields);
Object result = null;
for (int i = 0; (i < fields.length) && (result == null); i++)
{
if (Modifier.isStatic(fields[i].getModifiers()) &&
(fields[i].getType() == targetType))
{
result = fields[i].get(null);
if (result != null)
{
if ((condition == null) ||
!result.getClass().getName().equals(condition.getName()))
{
fields[i].set(null, null);
}
}
}
}
if (result != null)
{
if ((condition == null) || !result.getClass().getName().equals(condition.getName()))
{
// reset cache
for (int i = 0; i < fields.length; i++)
{
if (Modifier.isStatic(fields[i].getModifiers()) &&
(fields[i].getType() == Hashtable.class))
{
Hashtable cache = (Hashtable) fields[i].get(null);
if (cache != null)
{
cache.clear();
}
}
}
}
return result;
}
}
return null;
}
public void flush(Class targetClazz, Object lock) throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.FLUSH_FIELD_ACTION, targetClazz, lock);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
_flush(targetClazz, lock);
}
}
private static void _flush(Class targetClazz, Object lock) throws Exception
{
synchronized (lock)
{
Field[] fields = targetClazz.getDeclaredFields();
getAccessor(targetClazz).accept(fields);
// reset cache
for (int i = 0; i < fields.length; i++)
{
if (Modifier.isStatic(fields[i].getModifiers()) &&
((fields[i].getType() == Hashtable.class) || (fields[i].getType() == HashMap.class)))
{
if (fields[i].getType() == Hashtable.class)
{
Hashtable cache = (Hashtable) fields[i].get(null);
if (cache != null)
{
cache.clear();
}
}
else
{
HashMap cache = (HashMap) fields[i].get(null);
if (cache != null)
{
cache.clear();
}
}
}
}
}
}
public void invokeBundleCollisionHook(
org.osgi.framework.hooks.bundle.CollisionHook ch, int operationType,
Bundle targetBundle, Collection<Bundle> collisionCandidates)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_BUNDLE_COLLISION_HOOK, ch, operationType, targetBundle, collisionCandidates);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
ch.filterCollisions(operationType, targetBundle, collisionCandidates);
}
}
public void invokeBundleFindHook(
org.osgi.framework.hooks.bundle.FindHook fh,
BundleContext bc, Collection<Bundle> bundles)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_BUNDLE_FIND_HOOK, fh, bc, bundles);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
fh.find(bc, bundles);
}
}
public void invokeBundleEventHook(
org.osgi.framework.hooks.bundle.EventHook eh,
BundleEvent event, Collection<BundleContext> contexts)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_BUNDLE_EVENT_HOOK, eh, event, contexts);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
eh.event(event, contexts);
}
}
public void invokeWeavingHook(
org.osgi.framework.hooks.weaving.WeavingHook wh,
org.osgi.framework.hooks.weaving.WovenClass wc)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_WEAVING_HOOK, wh, wc);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
wh.weave(wc);
}
}
public void invokeServiceEventHook(
org.osgi.framework.hooks.service.EventHook eh,
ServiceEvent event, Collection<BundleContext> contexts)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_SERVICE_EVENT_HOOK, eh, event, contexts);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
eh.event(event, contexts);
}
}
public void invokeServiceFindHook(
org.osgi.framework.hooks.service.FindHook fh,
BundleContext context, String name, String filter,
boolean allServices, Collection<ServiceReference<?>> references)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(
Actions.INVOKE_SERVICE_FIND_HOOK, fh, context, name, filter,
(allServices) ? Boolean.TRUE : Boolean.FALSE, references);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
fh.find(context, name, filter, allServices, references);
}
}
public void invokeServiceListenerHookAdded(
org.osgi.framework.hooks.service.ListenerHook lh,
Collection<ListenerHook.ListenerInfo> listeners)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_SERVICE_LISTENER_HOOK_ADDED, lh, listeners);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
lh.added(listeners);
}
}
public void invokeServiceListenerHookRemoved(
org.osgi.framework.hooks.service.ListenerHook lh,
Collection<ListenerHook.ListenerInfo> listeners)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_SERVICE_LISTENER_HOOK_REMOVED, lh, listeners);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
lh.removed(listeners);
}
}
public void invokeServiceEventListenerHook(
org.osgi.framework.hooks.service.EventListenerHook elh,
ServiceEvent event,
Map<BundleContext, Collection<ListenerHook.ListenerInfo>> listeners)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_SERVICE_EVENT_LISTENER_HOOK, elh, event, listeners);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
elh.event(event, listeners);
}
}
public ResolverHook invokeResolverHookFactory(
org.osgi.framework.hooks.resolver.ResolverHookFactory rhf,
Collection<BundleRevision> triggers)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_RESOLVER_HOOK_FACTORY, rhf, triggers);
try
{
return (ResolverHook) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return rhf.begin(triggers);
}
}
public void invokeResolverHookResolvable(
org.osgi.framework.hooks.resolver.ResolverHook rh,
Collection<BundleRevision> candidates)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_RESOLVER_HOOK_RESOLVABLE, rh, candidates);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
rh.filterResolvable(candidates);
}
}
public void invokeResolverHookSingleton(
org.osgi.framework.hooks.resolver.ResolverHook rh,
BundleCapability singleton,
Collection<BundleCapability> collisions)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_RESOLVER_HOOK_SINGLETON, rh, singleton, collisions);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
rh.filterSingletonCollisions(singleton, collisions);
}
}
public void invokeResolverHookMatches(
org.osgi.framework.hooks.resolver.ResolverHook rh,
BundleRequirement req,
Collection<BundleCapability> candidates)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_RESOLVER_HOOK_MATCHES, rh, req, candidates);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
rh.filterMatches(req, candidates);
}
}
public void invokeResolverHookEnd(
org.osgi.framework.hooks.resolver.ResolverHook rh)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_RESOLVER_HOOK_END, rh);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
rh.end();
}
}
public void invokeWovenClassListener(
org.osgi.framework.hooks.weaving.WovenClassListener wcl,
org.osgi.framework.hooks.weaving.WovenClass wc)
throws Exception
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.INVOKE_WOVEN_CLASS_LISTENER, wcl, wc);
try
{
AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
wcl.modified(wc);
}
}
public <T> T run(PrivilegedAction<T> action)
{
if (System.getSecurityManager() != null)
{
return AccessController.doPrivileged(action);
}
else
{
return action.run();
}
}
public <T> T run(PrivilegedExceptionAction<T> action) throws Exception
{
if (System.getSecurityManager() != null)
{
try
{
return AccessController.doPrivileged(action);
}
catch (PrivilegedActionException e)
{
throw e.getException();
}
}
else
{
return action.run();
}
}
public String getCanonicalPath(File dataFile) throws IOException
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.GET_CANONICAL_PATH, dataFile);
try
{
return (String) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw (IOException) e.getException();
}
}
else
{
return dataFile.getCanonicalPath();
}
}
public Object createProxy(ClassLoader classLoader,
Class<?>[] interfaces, InvocationHandler handler)
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.CREATE_PROXY, classLoader, interfaces, handler);
try
{
return AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw (RuntimeException) e.getException();
}
}
else
{
return Proxy.newProxyInstance(classLoader, interfaces, handler);
}
}
public long getLastModified(File file)
{
if (System.getSecurityManager() != null)
{
Actions actions = (Actions) m_actions.get();
actions.set(Actions.LAST_MODIFIED, file);
try
{
return (Long) AccessController.doPrivileged(actions, m_acc);
}
catch (PrivilegedActionException e)
{
throw (RuntimeException) e.getException();
}
}
else
{
return file.lastModified();
}
}
private static class Actions implements PrivilegedExceptionAction
{
public static final int INITIALIZE_CONTEXT_ACTION = 0;
public static final int ADD_EXTENSION_URL_ACTION = 1;
public static final int CREATE_TMPFILE_ACTION = 2;
public static final int CREATE_URL_ACTION = 3;
public static final int CREATE_URL_WITH_CONTEXT_ACTION = 4;
public static final int DELETE_FILE_ACTION = 5;
public static final int EXEC_ACTION = 6;
public static final int FILE_EXISTS_ACTION = 7;
public static final int FILE_IS_DIRECTORY_ACTION = 8;
public static final int FOR_NAME_ACTION = 9;
public static final int GET_ABSOLUTE_PATH_ACTION = 10;
public static final int GET_CONSTRUCTOR_ACTION = 11;
public static final int GET_DECLARED_CONSTRUCTOR_ACTION = 12;
public static final int GET_DECLARED_METHOD_ACTION = 13;
public static final int GET_FIELD_ACTION = 14;
public static final int GET_FILE_INPUT_ACTION = 15;
public static final int GET_FILE_OUTPUT_ACTION = 16;
public static final int TO_URI_ACTION = 17;
public static final int GET_METHOD_ACTION = 18;
public static final int GET_POLICY_ACTION = 19;
public static final int GET_PROPERTY_ACTION = 20;
public static final int GET_PARENT_CLASS_LOADER_ACTION = 21;
public static final int GET_SYSTEM_CLASS_LOADER_ACTION = 22;
public static final int GET_URL_INPUT_ACTION = 23;
public static final int INVOKE_CONSTRUCTOR_ACTION = 24;
public static final int INVOKE_DIRECTMETHOD_ACTION = 25;
public static final int INVOKE_METHOD_ACTION = 26;
public static final int LIST_DIRECTORY_ACTION = 27;
public static final int MAKE_DIRECTORIES_ACTION = 28;
public static final int MAKE_DIRECTORY_ACTION = 29;
public static final int OPEN_ZIPFILE_ACTION = 30;
public static final int OPEN_URLCONNECTION_ACTION = 31;
public static final int RENAME_FILE_ACTION = 32;
public static final int SET_ACCESSIBLE_ACTION = 33;
public static final int START_ACTIVATOR_ACTION = 34;
public static final int STOP_ACTIVATOR_ACTION = 35;
public static final int SWAP_FIELD_ACTION = 36;
public static final int SYSTEM_EXIT_ACTION = 37;
public static final int FLUSH_FIELD_ACTION = 38;
public static final int GET_CLASS_LOADER_ACTION = 39;
public static final int INVOKE_BUNDLE_FIND_HOOK = 40;
public static final int INVOKE_BUNDLE_EVENT_HOOK = 41;
public static final int INVOKE_WEAVING_HOOK = 42;
public static final int INVOKE_SERVICE_EVENT_HOOK = 43;
public static final int INVOKE_SERVICE_FIND_HOOK = 44;
public static final int INVOKE_SERVICE_LISTENER_HOOK_ADDED = 45;
public static final int INVOKE_SERVICE_LISTENER_HOOK_REMOVED = 46;
public static final int INVOKE_SERVICE_EVENT_LISTENER_HOOK = 47;
public static final int INVOKE_RESOLVER_HOOK_FACTORY = 48;
public static final int INVOKE_RESOLVER_HOOK_RESOLVABLE = 49;
public static final int INVOKE_RESOLVER_HOOK_SINGLETON = 50;
public static final int INVOKE_RESOLVER_HOOK_MATCHES = 51;
public static final int INVOKE_RESOLVER_HOOK_END = 52;
public static final int INVOKE_BUNDLE_COLLISION_HOOK = 53;
public static final int OPEN_JARFILE_ACTION = 54;
public static final int DELETE_FILEONEXIT_ACTION = 55;
public static final int INVOKE_WOVEN_CLASS_LISTENER = 56;
public static final int GET_CANONICAL_PATH = 57;
public static final int CREATE_PROXY = 58;
public static final int LAST_MODIFIED = 59;
public static final int FILE_IS_FILE_ACTION = 60;
public static final int GET_FILE_CHANNEL_ACTION = 61;
private static final int GET_INPUT_ACTION = 62;
private static final int GET_OUTPUT_ACTION = 63;
private int m_action = -1;
private Object m_arg1 = null;
private Object m_arg2 = null;
private Object m_arg3 = null;
private Object m_arg4 = null;
private Object m_arg5 = null;
private Object m_arg6 = null;
public void set(int action)
{
m_action = action;
}
public void set(int action, Object arg1)
{
m_action = action;
m_arg1 = arg1;
}
public void set(int action, Object arg1, Object arg2)
{
m_action = action;
m_arg1 = arg1;
m_arg2 = arg2;
}
public void set(int action, Object arg1, Object arg2, Object arg3)
{
m_action = action;
m_arg1 = arg1;
m_arg2 = arg2;
m_arg3 = arg3;
}
public void set(int action, Object arg1, Object arg2, Object arg3,
Object arg4)
{
m_action = action;
m_arg1 = arg1;
m_arg2 = arg2;
m_arg3 = arg3;
m_arg4 = arg4;
}
public void set(int action, Object arg1, Object arg2, Object arg3,
Object arg4, Object arg5)
{
m_action = action;
m_arg1 = arg1;
m_arg2 = arg2;
m_arg3 = arg3;
m_arg4 = arg4;
m_arg5 = arg5;
}
public void set(int action, Object arg1, Object arg2, Object arg3,
Object arg4, Object arg5, Object arg6)
{
m_action = action;
m_arg1 = arg1;
m_arg2 = arg2;
m_arg3 = arg3;
m_arg4 = arg4;
m_arg5 = arg5;
m_arg6 = arg6;
}
private void unset()
{
m_action = -1;
m_arg1 = null;
m_arg2 = null;
m_arg3 = null;
m_arg4 = null;
m_arg5 = null;
m_arg6 = null;
}
public Object run() throws Exception
{
int action = m_action;
Object arg1 = m_arg1;
Object arg2 = m_arg2;
Object arg3 = m_arg3;
Object arg4 = m_arg4;
Object arg5 = m_arg5;
Object arg6 = m_arg6;
unset();
switch (action)
{
case INITIALIZE_CONTEXT_ACTION:
return AccessController.getContext();
case ADD_EXTENSION_URL_ACTION:
Method addURL =
URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] {URL.class});
getAccessor(URLClassLoader.class).accept(new AccessibleObject[]{addURL});
addURL.invoke(arg2, new Object[]{arg1});
return null;
case CREATE_TMPFILE_ACTION:
return File.createTempFile((String) arg1, (String) arg2, (File) arg3);
case CREATE_URL_ACTION:
return new URL((String) arg1, (String) arg2,
((Integer) arg3).intValue(), (String) arg4,
(URLStreamHandler) arg5);
case CREATE_URL_WITH_CONTEXT_ACTION:
return new URL((URL) arg1, (String) arg2, (URLStreamHandler) arg3);
case DELETE_FILE_ACTION:
return ((File) arg1).delete() ? Boolean.TRUE : Boolean.FALSE;
case EXEC_ACTION:
return Runtime.getRuntime().exec((String) arg1);
case FILE_EXISTS_ACTION:
return ((File) arg1).exists() ? Boolean.TRUE : Boolean.FALSE;
case FILE_IS_DIRECTORY_ACTION:
return ((File) arg1).isDirectory() ? Boolean.TRUE : Boolean.FALSE;
case FOR_NAME_ACTION:
return (arg2 == null) ? Class.forName((String) arg1) : Class.forName((String) arg1, true,
(ClassLoader) arg2);
case GET_ABSOLUTE_PATH_ACTION:
return ((File) arg1).getAbsolutePath();
case GET_CONSTRUCTOR_ACTION:
return ((Class) arg1).getConstructor((Class[]) arg2);
case GET_DECLARED_CONSTRUCTOR_ACTION:
return ((Class) arg1).getDeclaredConstructor((Class[]) arg2);
case GET_DECLARED_METHOD_ACTION:
return ((Class) arg1).getDeclaredMethod((String) arg2, (Class[]) arg3);
case GET_FIELD_ACTION:
Field field = ((Class) arg1).getDeclaredField((String) arg2);
getAccessor((Class) arg1).accept(new AccessibleObject[]{field});
return field.get(arg3);
case GET_FILE_INPUT_ACTION:
return new FileInputStream((File) arg1);
case GET_FILE_OUTPUT_ACTION:
return new FileOutputStream((File) arg1);
case TO_URI_ACTION:
return ((File) arg1).toURI();
case GET_METHOD_ACTION:
return ((Class) arg1).getMethod((String) arg2, (Class[]) arg3);
case GET_POLICY_ACTION:
return Policy.getPolicy();
case GET_PROPERTY_ACTION:
return System.getProperty((String) arg1, (String) arg2);
case GET_PARENT_CLASS_LOADER_ACTION:
return ((ClassLoader) arg1).getParent();
case GET_SYSTEM_CLASS_LOADER_ACTION:
return ClassLoader.getSystemClassLoader();
case GET_URL_INPUT_ACTION:
return ((URLConnection) arg1).getInputStream();
case INVOKE_CONSTRUCTOR_ACTION:
return ((Constructor) arg1).newInstance((Object[]) arg2);
case INVOKE_DIRECTMETHOD_ACTION:
return ((Method) arg1).invoke(arg2, (Object[]) arg3);
case INVOKE_METHOD_ACTION:
getAccessor(((Method) arg1).getDeclaringClass()).accept(new AccessibleObject[]{(Method) arg1});
return ((Method) arg1).invoke(arg2, (Object[]) arg3);
case LIST_DIRECTORY_ACTION:
return ((File) arg1).listFiles();
case MAKE_DIRECTORIES_ACTION:
return ((File) arg1).mkdirs() ? Boolean.TRUE : Boolean.FALSE;
case MAKE_DIRECTORY_ACTION:
return ((File) arg1).mkdir() ? Boolean.TRUE : Boolean.FALSE;
case OPEN_ZIPFILE_ACTION:
return new ZipFile((File) arg1);
case OPEN_URLCONNECTION_ACTION:
return ((URL) arg1).openConnection();
case RENAME_FILE_ACTION:
return ((File) arg1).renameTo((File) arg2) ? Boolean.TRUE : Boolean.FALSE;
case SET_ACCESSIBLE_ACTION:
getAccessor(((Executable) arg1).getDeclaringClass()).accept(new AccessibleObject[]{(Executable) arg1});
return null;
case START_ACTIVATOR_ACTION:
((BundleActivator) arg1).start((BundleContext) arg2);
return null;
case STOP_ACTIVATOR_ACTION:
((BundleActivator) arg1).stop((BundleContext) arg2);
return null;
case SWAP_FIELD_ACTION:
return _swapStaticFieldIfNotClass((Class) arg1,
(Class) arg2, (Class) arg3, (String) arg4);
case SYSTEM_EXIT_ACTION:
System.exit(((Integer) arg1).intValue());
case FLUSH_FIELD_ACTION:
_flush(((Class) arg1), arg2);
return null;
case GET_CLASS_LOADER_ACTION:
return ((Class) arg1).getClassLoader();
case INVOKE_BUNDLE_FIND_HOOK:
((org.osgi.framework.hooks.bundle.FindHook) arg1).find(
(BundleContext) arg2, (Collection<Bundle>) arg3);
return null;
case INVOKE_BUNDLE_EVENT_HOOK:
((org.osgi.framework.hooks.bundle.EventHook) arg1).event(
(BundleEvent) arg2, (Collection<BundleContext>) arg3);
return null;
case INVOKE_WEAVING_HOOK:
((org.osgi.framework.hooks.weaving.WeavingHook) arg1).weave(
(org.osgi.framework.hooks.weaving.WovenClass) arg2);
return null;
case INVOKE_SERVICE_EVENT_HOOK:
((org.osgi.framework.hooks.service.EventHook) arg1).event(
(ServiceEvent) arg2, (Collection<BundleContext>) arg3);
return null;
case INVOKE_SERVICE_FIND_HOOK:
((org.osgi.framework.hooks.service.FindHook) arg1).find(
(BundleContext) arg2, (String) arg3, (String) arg4,
((Boolean) arg5).booleanValue(),
(Collection<ServiceReference<?>>) arg6);
return null;
case INVOKE_SERVICE_LISTENER_HOOK_ADDED:
((org.osgi.framework.hooks.service.ListenerHook) arg1).added(
(Collection<ListenerHook.ListenerInfo>) arg2);
return null;
case INVOKE_SERVICE_LISTENER_HOOK_REMOVED:
((org.osgi.framework.hooks.service.ListenerHook) arg1).removed(
(Collection<ListenerHook.ListenerInfo>) arg2);
return null;
case INVOKE_SERVICE_EVENT_LISTENER_HOOK:
((org.osgi.framework.hooks.service.EventListenerHook) arg1).event(
(ServiceEvent) arg2,
(Map<BundleContext, Collection<ListenerHook.ListenerInfo>>) arg3);
return null;
case INVOKE_RESOLVER_HOOK_FACTORY:
return ((org.osgi.framework.hooks.resolver.ResolverHookFactory) arg1).begin(
(Collection<BundleRevision>) arg2);
case INVOKE_RESOLVER_HOOK_RESOLVABLE:
((org.osgi.framework.hooks.resolver.ResolverHook) arg1).filterResolvable(
(Collection<BundleRevision>) arg2);
return null;
case INVOKE_RESOLVER_HOOK_SINGLETON:
((org.osgi.framework.hooks.resolver.ResolverHook) arg1)
.filterSingletonCollisions(
(BundleCapability) arg2,
(Collection<BundleCapability>) arg3);
return null;
case INVOKE_RESOLVER_HOOK_MATCHES:
((org.osgi.framework.hooks.resolver.ResolverHook) arg1).filterMatches(
(BundleRequirement) arg2,
(Collection<BundleCapability>) arg3);
return null;
case INVOKE_RESOLVER_HOOK_END:
((org.osgi.framework.hooks.resolver.ResolverHook) arg1).end();
return null;
case INVOKE_BUNDLE_COLLISION_HOOK:
((org.osgi.framework.hooks.bundle.CollisionHook) arg1).filterCollisions((Integer) arg2,
(Bundle) arg3, (Collection<Bundle>) arg4);
return null;
case OPEN_JARFILE_ACTION:
return new JarFile((File) arg1);
case DELETE_FILEONEXIT_ACTION:
((File) arg1).deleteOnExit();
return null;
case INVOKE_WOVEN_CLASS_LISTENER:
((org.osgi.framework.hooks.weaving.WovenClassListener) arg1).modified(
(org.osgi.framework.hooks.weaving.WovenClass) arg2);
return null;
case GET_CANONICAL_PATH:
return ((File) arg1).getCanonicalPath();
case CREATE_PROXY:
return Proxy.newProxyInstance((ClassLoader)arg1, (Class<?>[])arg2,
(InvocationHandler) arg3);
case LAST_MODIFIED:
return ((File) arg1).lastModified();
case FILE_IS_FILE_ACTION:
return ((File) arg1).isFile() ? Boolean.TRUE : Boolean.FALSE;
case GET_FILE_CHANNEL_ACTION:
return FileChannel.open(((File) arg1).toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
case GET_INPUT_ACTION:
return Files.newInputStream(((File) arg1).toPath());
case GET_OUTPUT_ACTION:
return Files.newOutputStream(((File) arg1).toPath());
}
return null;
}
}
}