// Copyright 2000 Samuele Pedroni package org.python.core; import java.lang.ref.*; import java.util.*; public abstract class AutoInternalTables extends InternalTables2 { protected ReferenceQueue queue = new ReferenceQueue(); protected abstract Reference newAutoRef(short type, Object key, Object obj); protected abstract short getAutoRefType(Reference ref); protected abstract Object getAutoRefKey(Reference ref); private synchronized void cleanup() { if (this.keepstable >= this.GSTABLE) return; this.adapters.remove(null); // trick Reference ref; while ((ref = this.queue.poll()) != null) { Object key = getAutoRefKey(ref); switch (getAutoRefType(ref)) { case JCLASS: Class cl = (Class) key; this.classes.remove(cl); classesDec(cl.getName()); break; case LAZY_JCLASS: this.lazyClasses.remove(key); break; case ADAPTER_CLASS: this.adapterClasses.remove(key); } } } protected boolean queryCanonical(String name) { cleanup(); return super.queryCanonical(name); } protected PyJavaClass getCanonical(Class c) { cleanup(); Reference ref = (Reference) classesGet(c); if (ref == null) return null; return (PyJavaClass) ref.get(); } protected PyJavaClass getLazyCanonical(String name) { cleanup(); Reference ref = (Reference) this.lazyClasses.get(name); if (ref == null) return null; return (PyJavaClass) ref.get(); } protected void putCanonical(Class c, PyJavaClass canonical) { cleanup(); classesPut(c, newAutoRef(JCLASS, c, canonical)); } protected void putLazyCanonical(String name, PyJavaClass canonical) { cleanup(); this.lazyClasses.put(name, newAutoRef(LAZY_JCLASS, name, canonical)); } protected Class getAdapterClass(Class c) { cleanup(); Reference ref = (Reference) this.adapterClasses.get(c); if (ref == null) return null; return (Class) ref.get(); } protected void putAdapterClass(Class c, Class ac) { cleanup(); this.adapterClasses.put(c, newAutoRef(ADAPTER_CLASS, c, ac)); } protected Object getAdapter(Object o, String evc) { cleanup(); return super.getAdapter(o, evc); } protected void putAdapter(Object o, String evc, Object ad) { cleanup(); super.putAdapter(o, evc, ad); } public boolean _doesSomeAutoUnload() { return true; } public void _forceCleanup() { cleanup(); } public void _beginCanonical() { cleanup(); super._beginCanonical(); } public void _beginLazyCanonical() { cleanup(); super._beginLazyCanonical(); } public void _beginOverAdapterClasses() { cleanup(); super._beginOverAdapterClasses(); } public void _beginOverAdapters() { cleanup(); super._beginOverAdapters(); } public Object _next() { if (this.iterType == ADAPTER) { Object ret = super._next(); if (ret != null) return ret; } else { while (this.iter.hasNext()) { this.cur = this.iter.next(); switch (this.iterType) { case JCLASS: PyJavaClass jc = (PyJavaClass) ((Reference) this.cur).get(); if (jc == null) continue; this.cur = jc; return jc; case LAZY_JCLASS: PyJavaClass lazy = (PyJavaClass) ((Reference) this.cur).get(); if (lazy == null) continue; return new _LazyRep(lazy.__name__, lazy.__mgr__); case ADAPTER_CLASS: Map.Entry entry = (Map.Entry) this.cur; if (((Reference) entry.getValue()).get() == null) continue; return entry.getKey(); } } this.cur = null; this.iter = null; endStable(); } cleanup(); return null; } public void _flush(PyJavaClass jc) { cleanup(); super._flush(jc); } }