// Copyright 2000 Samuele Pedroni package org.python.core; import java.util.*; import java.lang.ref.*; public class InternalTables2 extends InternalTables1 { protected static class TableProvid2 extends HashMap implements Table { } protected void commitTemp() { ((TableProvid2) this.classes).putAll((TableProvid2) this.temp); this.temp.clear(); } protected WeakHashMap adapters; protected Object getAdapter(Object o, String evc) { HashMap ads = (HashMap) this.adapters.get(o); if (ads == null) { return null; } WeakReference adw = (WeakReference) ads.get(evc); if (adw == null) { return null; } return adw.get(); } protected void putAdapter(Object o, String evc, Object ad) { HashMap ads = (HashMap) this.adapters.get(o); if (ads == null) { ads = new HashMap(); this.adapters.put(o, ads); } ads.put(evc, new WeakReference(ad)); } protected Iterator iter; protected Iterator grand; public void _beginCanonical() { beginStable(this.JCSTABLE); this.iter = ((TableProvid2) this.classes).values().iterator(); this.iterType = JCLASS; } public void _beginLazyCanonical() { beginStable(this.GSTABLE); this.iter = ((TableProvid2) this.lazyClasses).values().iterator(); this.iterType = LAZY_JCLASS; } public void _beginOverAdapterClasses() { beginStable(this.GSTABLE); this.iter = ((TableProvid2) this.adapterClasses).entrySet().iterator(); this.iterType = ADAPTER_CLASS; } public void _beginOverAdapters() { beginStable((short) 0); this.grand = this.adapters.values().iterator(); this.iter = null; this.iterType = ADAPTER; } public Object _next() { if (this.iterType == ADAPTER) { for (;;) { if (this.iter == null || !this.iter.hasNext()) { if (this.grand.hasNext()) { this.cur = this.grand.next(); this.iter = ((HashMap) this.cur).values().iterator(); } else { this.iter = null; } } if (this.iter != null) { WeakReference adw = (WeakReference) this.iter.next(); Object ad = adw.get(); if (ad != null) { return ad.getClass().getInterfaces()[0]; } else { continue; } } this.grand = null; break; } } else if (this.iter.hasNext()) { this.cur = this.iter.next(); switch (this.iterType) { case JCLASS: return (PyJavaClass) this.cur; case LAZY_JCLASS: PyJavaClass lazy = (PyJavaClass) this.cur; return new _LazyRep(lazy.__name__, lazy.__mgr__); case ADAPTER_CLASS: Map.Entry entry = (Map.Entry) this.cur; return entry.getKey(); } } this.cur = null; endStable(); this.iter = null; return null; } public void _flushCurrent() { this.iter.remove(); switch (this.iterType) { case JCLASS: classesDec(((PyJavaClass) this.cur).__name__); break; case ADAPTER: if (((HashMap) this.cur).size() == 0) this.grand.remove(); } } public InternalTables2() { super(true); this.classes = new TableProvid2(); this.temp = new TableProvid2(); this.counters = new TableProvid2(); this.lazyClasses = new TableProvid2(); this.adapterClasses = new TableProvid2(); this.adapters = new WeakHashMap(); } }