RLPark 1.0.0
Reinforcement Learning Framework in Java

NetworkClassLoader.java

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark