aboutsummaryrefslogblamecommitdiff
path: root/nailgun_launcher/ClassLoaderCache.java
blob: 4898687b3b175e20c6f50f5c20f1ca22f712b442 (plain) (tree)
























































                                                                                                      
                                                                                                







                          
package cbt;

import java.util.*;
import static java.io.File.pathSeparator;
import static cbt.Stage0Lib.*;

final public class ClassLoaderCache{
  public Map<Object,Object> hashMap;
  final ThreadLocal<HashSet<String>> seen = new ThreadLocal<HashSet<String>>(){
    @Override protected HashSet<String> initialValue(){
      return new HashSet<String>();
    }
  };

  public ClassLoaderCache(
    Map<Object,Object> hashMap
  ){
    this.hashMap = hashMap;
  }

  public ClassLoader get( String key, long timestamp ){
    seen.get().add( key );
    @SuppressWarnings("unchecked")
    ClassLoader t = (ClassLoader) hashMap.get(
      hashMap.get( key )
    );
    assert hashMap.get(t).equals(timestamp);
    return t;
  }

  public boolean containsKey( String key, long timestamp ){
    boolean contains = hashMap.containsKey( key );
    if( contains ){
      Object keyObject = hashMap.get( key );
      Object classLoader = hashMap.get( keyObject );
      long oldTimestamp = (long) hashMap.get( classLoader );
      boolean res = oldTimestamp == timestamp;
      return res;
    } else {
      return false;
    }
  }

  public void put( String key, ClassLoader value, long timestamp ){
    assert !seen.get().contains( key ): "Thread tries to update cache key after observing it: " + key;
    LockableJavaKey keyObject = new LockableJavaKey();
    hashMap.put( key, keyObject );
    hashMap.put( keyObject, value );
    hashMap.put( value, timestamp );
  }

  @Override public String toString(){
    StringBuilder res = new StringBuilder();
    res.append("ClassLoaderCache(\n\n");
    for( Object key: hashMap.keySet() ){
      if( key instanceof String )
        res.append(
          mkString( "\n", key.toString().split(":") ) + " -> " + hashMap.get( hashMap.get(key) )
          + "\n\n"
        );
    }
    res.append("\n\n");
    return res.toString();
  }
}
class LockableJavaKey{}