diff --git a/src/zutil/plugin/PluginManager.java b/src/zutil/plugin/PluginManager.java index 027aa77..fb7513e 100755 --- a/src/zutil/plugin/PluginManager.java +++ b/src/zutil/plugin/PluginManager.java @@ -98,7 +98,10 @@ public class PluginManager implements Iterable{ return plugins.values().iterator(); } public Iterator getObjectIterator(Class intf) { - return new PluginInterfaceIterator(plugins.values().iterator(), intf); + return new PluginObjectIterator(plugins.values().iterator(), intf); + } + public Iterator> getClassIterator(Class intf) { + return new PluginClassIterator(plugins.values().iterator(), intf); } public ArrayList toArray() { @@ -115,12 +118,52 @@ public class PluginManager implements Iterable{ } - public static class PluginInterfaceIterator implements Iterator { + public static class PluginClassIterator implements Iterator> { + private Class intf; + private Iterator pluginIt; + private Iterator> classIt; + + PluginClassIterator(Iterator it, Class intf){ + this.intf = intf; + this.pluginIt = it; + } + + @Override + public boolean hasNext() { + if(pluginIt == null) + return false; + if(classIt != null && classIt.hasNext()) + return true; + + while(pluginIt.hasNext()) { + classIt = pluginIt.next().getClassIterator(intf); + if(classIt.hasNext()) + return true; + } + classIt = null; + return false; + } + + @Override + public Class next() { + if(!hasNext()) + throw new NoSuchElementException(); + return (Class) classIt.next(); + } + + @Override + public void remove() { + throw new RuntimeException("Iterator is ReadOnly"); + } + } + + + public static class PluginObjectIterator implements Iterator { private Class intf; private Iterator pluginIt; private Iterator objectIt; - PluginInterfaceIterator(Iterator it, Class intf){ + PluginObjectIterator(Iterator it, Class intf){ this.intf = intf; this.pluginIt = it; }