RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package rlpark.plugin.rltoys.experiments.scheduling.internal.network; 00002 00003 import java.security.AccessController; 00004 import java.security.PrivilegedAction; 00005 import java.util.HashMap; 00006 import java.util.Map; 00007 00008 import rlpark.plugin.rltoys.experiments.scheduling.internal.messages.ClassLoading.NetworkFindClass; 00009 import rlpark.plugin.rltoys.experiments.scheduling.internal.messages.MessageClassData; 00010 00011 00012 public class NetworkClassLoader extends ClassLoader implements NetworkFindClass { 00013 private final SyncSocket socket; 00014 private final Map<String, Class<?>> cache = new HashMap<String, Class<?>>(); 00015 private boolean isDisposed = false; 00016 private ClassLoader contextClassLoader = null; 00017 00018 public NetworkClassLoader(SyncSocket socket) { 00019 this.socket = socket; 00020 } 00021 00022 @Override 00023 protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { 00024 if (isDisposed) 00025 return null; 00026 return super.loadClass(name, resolve); 00027 } 00028 00029 @Override 00030 synchronized public Class<?> findClass(String name) { 00031 if (isDisposed) 00032 return null; 00033 Class<?> result = null; 00034 if (contextClassLoader != null) 00035 try { 00036 result = contextClassLoader.loadClass(name); 00037 } catch (ClassNotFoundException e1) { 00038 } 00039 if (result != null) 00040 return result; 00041 result = cache.get(name); 00042 if (result != null) 00043 return result; 00044 try { 00045 MessageClassData messageClassData = socket.classTransaction(name); 00046 if (messageClassData == null) 00047 return null; 00048 byte[] classData = messageClassData.classData(); 00049 result = defineClass(name, classData, 0, classData.length, getClass().getProtectionDomain()); 00050 cache.put(name, result); 00051 return result; 00052 } catch (Throwable e) { 00053 e.printStackTrace(); 00054 } 00055 return null; 00056 } 00057 00058 public void dispose() { 00059 isDisposed = true; 00060 } 00061 00062 static public NetworkClassLoader newClassLoader(final SyncSocket socket) { 00063 return AccessController.doPrivileged(new PrivilegedAction<NetworkClassLoader>() { 00064 @Override 00065 public NetworkClassLoader run() { 00066 return new NetworkClassLoader(socket); 00067 } 00068 }); 00069 } 00070 00071 public void setDefaultClassLoader(ClassLoader contextClassLoader) { 00072 this.contextClassLoader = contextClassLoader; 00073 } 00074 }