summaryrefslogtreecommitdiff
path: root/java/src/Ice/PluginManagerI.java
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2006-04-26 03:22:49 +0000
committerMark Spruiell <mes@zeroc.com>2006-04-26 03:22:49 +0000
commitd24b35ce1f999f86c6f856821d51f4adf72c76e6 (patch)
treeb1d1dbe50724a4d42ce1e46622aa49fde0a5492d /java/src/Ice/PluginManagerI.java
parentuse two stages for plugin initialization; refactoring to remove Context (diff)
downloadice-d24b35ce1f999f86c6f856821d51f4adf72c76e6.tar.bz2
ice-d24b35ce1f999f86c6f856821d51f4adf72c76e6.tar.xz
ice-d24b35ce1f999f86c6f856821d51f4adf72c76e6.zip
use two stages for plugin initialization
Diffstat (limited to 'java/src/Ice/PluginManagerI.java')
-rw-r--r--java/src/Ice/PluginManagerI.java65
1 files changed, 64 insertions, 1 deletions
diff --git a/java/src/Ice/PluginManagerI.java b/java/src/Ice/PluginManagerI.java
index 780333c0b2f..d0583e7b192 100644
--- a/java/src/Ice/PluginManagerI.java
+++ b/java/src/Ice/PluginManagerI.java
@@ -11,7 +11,56 @@ package Ice;
public final class PluginManagerI extends LocalObjectImpl implements PluginManager
{
- private static String _kindOfObject = "plug-in";
+ private static String _kindOfObject = "plugin";
+
+ public synchronized void
+ initializePlugins()
+ {
+ if(_initialized)
+ {
+ InitializationException ex = new InitializationException();
+ ex.reason = "plugins already initialized";
+ throw ex;
+ }
+
+ //
+ // Invoke initialize() on the plugins, in the order they were loaded.
+ //
+ java.util.ArrayList initializedPlugins = new java.util.ArrayList();
+ try
+ {
+ java.util.Iterator i = _initOrder.iterator();
+ while(i.hasNext())
+ {
+ Plugin p = (Plugin)i.next();
+ p.initialize();
+ initializedPlugins.add(p);
+ }
+ }
+ catch(RuntimeException ex)
+ {
+ //
+ // Destroy the plugins that have been successfully initialized, in the
+ // reverse order.
+ //
+ java.util.ListIterator i = initializedPlugins.listIterator(initializedPlugins.size());
+ while(i.hasPrevious())
+ {
+ Plugin p = (Plugin)i.previous();
+ try
+ {
+ p.destroy();
+ }
+ catch(RuntimeException e)
+ {
+ // Ignore.
+ }
+ }
+ throw ex;
+ }
+
+ _initialized = true;
+ }
public synchronized Plugin
getPlugin(String name)
@@ -70,6 +119,7 @@ public final class PluginManagerI extends LocalObjectImpl implements PluginManag
PluginManagerI(Communicator communicator)
{
_communicator = communicator;
+ _initialized = false;
}
public void
@@ -132,6 +182,16 @@ public final class PluginManagerI extends LocalObjectImpl implements PluginManag
String value = (String)entry.getValue();
loadPlugin(name, value, cmdArgs);
}
+
+ //
+ // An application can set Ice.InitPlugins=0 if it wants to postpone
+ // initialization until after it has interacted directly with the
+ // plugins.
+ //
+ if(properties.getPropertyAsIntWithDefault("Ice.InitPlugins", 1) > 0)
+ {
+ initializePlugins();
+ }
}
private void
@@ -243,8 +303,11 @@ public final class PluginManagerI extends LocalObjectImpl implements PluginManag
}
_plugins.put(name, plugin);
+ _initOrder.add(plugin);
}
private Communicator _communicator;
private java.util.HashMap _plugins = new java.util.HashMap();
+ private java.util.ArrayList _initOrder = new java.util.ArrayList();
+ private boolean _initialized;
}