summaryrefslogtreecommitdiff
path: root/java/src/IceBox/ServiceManagerI.java
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2014-10-20 11:40:05 -0230
committerMatthew Newhook <matthew@zeroc.com>2014-10-20 11:40:05 -0230
commitb51469b41167fb86ae2059a15cf0475c53fdda7b (patch)
treefc85d6ca2efd89c67e1e4e7438f437c3e08313f4 /java/src/IceBox/ServiceManagerI.java
parentFixed (ICE-5695) - IceSSL: misleading exception (diff)
downloadice-b51469b41167fb86ae2059a15cf0475c53fdda7b.tar.bz2
ice-b51469b41167fb86ae2059a15cf0475c53fdda7b.tar.xz
ice-b51469b41167fb86ae2059a15cf0475c53fdda7b.zip
Down with ant. From the gradle to the grave.
Diffstat (limited to 'java/src/IceBox/ServiceManagerI.java')
-rw-r--r--java/src/IceBox/ServiceManagerI.java1175
1 files changed, 0 insertions, 1175 deletions
diff --git a/java/src/IceBox/ServiceManagerI.java b/java/src/IceBox/ServiceManagerI.java
deleted file mode 100644
index 03f949ef43d..00000000000
--- a/java/src/IceBox/ServiceManagerI.java
+++ /dev/null
@@ -1,1175 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-
-package IceBox;
-
-//
-// NOTE: the class isn't final on purpose to allow users to eventually
-// extend it.
-//
-public class ServiceManagerI extends _ServiceManagerDisp
-{
- public
- ServiceManagerI(Ice.Communicator communicator, String[] args)
- {
- _communicator = communicator;
- _logger = _communicator.getLogger();
-
- Ice.Properties props = _communicator.getProperties();
-
- if(props.getProperty("Ice.Admin.Enabled").isEmpty())
- {
- _adminEnabled = !props.getProperty("Ice.Admin.Endpoints").isEmpty();
- }
- else
- {
- _adminEnabled = props.getPropertyAsInt("Ice.Admin.Enabled") > 0;
- }
-
- if(_adminEnabled)
- {
- String[] facetFilter = props.getPropertyAsList("Ice.Admin.Facets");
- if(facetFilter.length > 0)
- {
- _adminFacetFilter = new java.util.HashSet<String>(java.util.Arrays.asList(facetFilter));
- }
- else
- {
- _adminFacetFilter = new java.util.HashSet<String>();
- }
- }
-
- _argv = args;
- _traceServiceObserver = props.getPropertyAsInt("IceBox.Trace.ServiceObserver");
- _observerCompletedCB = new Ice.Callback()
- {
- @Override
- public void completed(Ice.AsyncResult result)
- {
- try
- {
- result.throwLocalException();
- }
- catch(Ice.LocalException ex)
- {
- ServiceObserverPrx observer = ServiceObserverPrxHelper.uncheckedCast(result.getProxy());
- synchronized(ServiceManagerI.this)
- {
- if(_observers.remove(observer))
- {
- observerRemoved(observer, ex);
- }
- }
- }
- }
- };
- }
-
- @Override
- public java.util.Map<String, String>
- getSliceChecksums(Ice.Current current)
- {
- return SliceChecksums.checksums;
- }
-
- @Override
- public void
- startService(String name, Ice.Current current)
- throws AlreadyStartedException, NoSuchServiceException
- {
- ServiceInfo info = null;
- synchronized(this)
- {
- //
- // Search would be more efficient if services were contained in
- // a map, but order is required for shutdown.
- //
- for(ServiceInfo p : _services)
- {
- if(p.name.equals(name))
- {
- if(p.status == StatusStarted)
- {
- throw new AlreadyStartedException();
- }
- p.status = StatusStarting;
- info = (ServiceInfo)p.clone();
- break;
- }
- }
- if(info == null)
- {
- throw new NoSuchServiceException();
- }
- _pendingStatusChanges = true;
- }
-
- boolean started = false;
- try
- {
- info.service.start(name, info.communicator == null ? _sharedCommunicator : info.communicator, info.args);
- started = true;
- }
- catch(java.lang.Exception e)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- e.printStackTrace(pw);
- pw.flush();
- _logger.warning("ServiceManager: exception while starting service " + info.name + ":\n" + sw.toString());
- }
-
- synchronized(this)
- {
- for(ServiceInfo p : _services)
- {
- if(p.name.equals(name))
- {
- if(started)
- {
- p.status = StatusStarted;
-
- java.util.List<String> services = new java.util.ArrayList<String>();
- services.add(name);
- servicesStarted(services, _observers);
- }
- else
- {
- p.status = StatusStopped;
- }
- break;
- }
- }
- _pendingStatusChanges = false;
- notifyAll();
- }
- }
-
- @Override
- public void
- stopService(String name, Ice.Current current)
- throws AlreadyStoppedException, NoSuchServiceException
- {
- ServiceInfo info = null;
- synchronized(this)
- {
- //
- // Search would be more efficient if services were contained in
- // a map, but order is required for shutdown.
- //
- for(ServiceInfo p : _services)
- {
- if(p.name.equals(name))
- {
- if(p.status == StatusStopped)
- {
- throw new AlreadyStoppedException();
- }
- p.status = StatusStopping;
- info = (ServiceInfo)p.clone();
- break;
- }
- }
- if(info == null)
- {
- throw new NoSuchServiceException();
- }
- _pendingStatusChanges = true;
- }
-
- boolean stopped = false;
- try
- {
- info.service.stop();
- stopped = true;
- }
- catch(java.lang.Exception e)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- e.printStackTrace(pw);
- pw.flush();
- _logger.warning("ServiceManager: exception while stopping service " + info.name + ":\n" + sw.toString());
- }
-
- synchronized(this)
- {
- for(ServiceInfo p : _services)
- {
- if(p.name.equals(name))
- {
- if(stopped)
- {
- p.status = StatusStopped;
-
- java.util.List<String> services = new java.util.ArrayList<String>();
- services.add(name);
- servicesStopped(services, _observers);
- }
- else
- {
- p.status = StatusStarted;
- }
- break;
- }
- }
- _pendingStatusChanges = false;
- notifyAll();
- }
- }
-
- @Override
- public void
- addObserver(final ServiceObserverPrx observer, Ice.Current current)
- {
- java.util.List<String> activeServices = new java.util.LinkedList<String>();
-
- //
- // Null observers and duplicate registrations are ignored
- //
-
- synchronized(this)
- {
- if(observer != null && _observers.add(observer))
- {
- if(_traceServiceObserver >= 1)
- {
- _logger.trace("IceBox.ServiceObserver",
- "Added service observer " + _communicator.proxyToString(observer));
- }
-
- for(ServiceInfo info: _services)
- {
- if(info.status == StatusStarted)
- {
- activeServices.add(info.name);
- }
- }
- }
- }
-
- if(activeServices.size() > 0)
- {
- observer.begin_servicesStarted(activeServices.toArray(new String[0]), _observerCompletedCB);
- }
- }
-
- @Override
- public void
- shutdown(Ice.Current current)
- {
- _communicator.shutdown();
- }
-
- public int
- run()
- {
- try
- {
- Ice.Properties properties = _communicator.getProperties();
-
- //
- // Create an object adapter. Services probably should NOT share
- // this object adapter, as the endpoint(s) for this object adapter
- // will most likely need to be firewalled for security reasons.
- //
- Ice.ObjectAdapter adapter = null;
- if(properties.getProperty("IceBox.ServiceManager.Endpoints").length() != 0)
- {
- adapter = _communicator.createObjectAdapter("IceBox.ServiceManager");
-
- Ice.Identity identity = new Ice.Identity();
- identity.category = properties.getPropertyWithDefault("IceBox.InstanceName", "IceBox");
- identity.name = "ServiceManager";
- adapter.add(this, identity);
- }
-
- //
- // Parse the property set with the prefix "IceBox.Service.". These
- // properties should have the following format:
- //
- // IceBox.Service.Foo=[jar-or-dir:]Package.Foo [args]
- //
- // We parse the service properties specified in IceBox.LoadOrder
- // first, then the ones from remaining services.
- //
- final String prefix = "IceBox.Service.";
- java.util.Map<String, String> services = properties.getPropertiesForPrefix(prefix);
- String[] loadOrder = properties.getPropertyAsList("IceBox.LoadOrder");
- java.util.List<StartServiceInfo> servicesInfo = new java.util.ArrayList<StartServiceInfo>();
- for(String name : loadOrder)
- {
- if(name.length() > 0)
- {
- String key = prefix + name;
- String value = services.get(key);
- if(value == null)
- {
- FailureException ex = new FailureException();
- ex.reason = "ServiceManager: no service definition for `" + name + "'";
- throw ex;
- }
- servicesInfo.add(new StartServiceInfo(name, value, _argv));
- services.remove(key);
- }
- }
- for(java.util.Map.Entry<String, String> p : services.entrySet())
- {
- String name = p.getKey().substring(prefix.length());
- String value = p.getValue();
- servicesInfo.add(new StartServiceInfo(name, value, _argv));
- }
-
- //
- // Check if some services are using the shared communicator in which
- // case we create the shared communicator now with a property set that
- // is the union of all the service properties (from services that use
- // the shared communicator).
- //
- if(properties.getPropertiesForPrefix("IceBox.UseSharedCommunicator.").size() > 0)
- {
- Ice.InitializationData initData = new Ice.InitializationData();
- initData.properties = createServiceProperties("SharedCommunicator");
- for(StartServiceInfo service : servicesInfo)
- {
- if(properties.getPropertyAsInt("IceBox.UseSharedCommunicator." + service.name) <= 0)
- {
- continue;
- }
-
- //
- // Load the service properties using the shared communicator properties as
- // the default properties.
- //
- Ice.StringSeqHolder serviceArgs = new Ice.StringSeqHolder(service.args);
- Ice.Properties svcProperties = Ice.Util.createProperties(serviceArgs, initData.properties);
- service.args = serviceArgs.value;
-
- //
- // Remove properties from the shared property set that a service explicitly clears.
- //
- java.util.Map<String, String> allProps = initData.properties.getPropertiesForPrefix("");
- for(String key : allProps.keySet())
- {
- if(svcProperties.getProperty(key).length() == 0)
- {
- initData.properties.setProperty(key, "");
- }
- }
-
- //
- // Add the service properties to the shared communicator properties.
- //
- for(java.util.Map.Entry<String, String> p : svcProperties.getPropertiesForPrefix("").entrySet())
- {
- initData.properties.setProperty(p.getKey(), p.getValue());
- }
-
- //
- // Parse <service>.* command line options (the Ice command line options
- // were parsed by the call to createProperties above).
- //
- service.args = initData.properties.parseCommandLineOptions(service.name, service.args);
- }
-
- String facetNamePrefix = "IceBox.SharedCommunicator.";
- boolean addFacets = configureAdmin(initData.properties, facetNamePrefix);
-
- _sharedCommunicator = Ice.Util.initialize(initData);
-
- if(addFacets)
- {
- // Add all facets created on shared communicator to the IceBox communicator
- // but renamed <prefix>.<facet-name>, except for the Process facet which is
- // never added.
- for(java.util.Map.Entry<String, Ice.Object> p : _sharedCommunicator.findAllAdminFacets().entrySet())
- {
- if(!p.getKey().equals("Process"))
- {
- _communicator.addAdminFacet(p.getValue(), facetNamePrefix + p.getKey());
- }
- }
- }
- }
-
- for(StartServiceInfo s : servicesInfo)
- {
- start(s.name, s.className, s.classDir, s.absolutePath, s.args);
- }
-
- //
- // We may want to notify external scripts that the services
- // have started. This is done by defining the property:
- //
- // IceBox.PrintServicesReady=bundleName
- //
- // Where bundleName is whatever you choose to call this set of
- // services. It will be echoed back as "bundleName ready".
- //
- // This must be done after start() has been invoked on the
- // services.
- //
- String bundleName = properties.getProperty("IceBox.PrintServicesReady");
- if(bundleName.length() > 0)
- {
- System.out.println(bundleName + " ready");
- }
-
- //
- // Don't move after the adapter activation. This allows
- // applications to wait for the service manager to be
- // reachable before sending a signal to shutdown the
- // IceBox.
- //
- Ice.Application.shutdownOnInterrupt();
-
- //
- // Register "this" as a facet to the Admin object and
- // create Admin object
- //
- try
- {
- _communicator.addAdminFacet(this, "IceBox.ServiceManager");
- _communicator.getAdmin();
- }
- catch(Ice.ObjectAdapterDeactivatedException ex)
- {
- //
- // Expected if the communicator has been shutdown.
- //
- }
-
- //
- // Start request dispatching after we've started the services.
- //
- if(adapter != null)
- {
- try
- {
- adapter.activate();
- }
- catch(Ice.ObjectAdapterDeactivatedException ex)
- {
- //
- // Expected if the communicator has been shutdown.
- //
- }
- }
-
- _communicator.waitForShutdown();
- Ice.Application.defaultInterrupt();
- }
- catch(FailureException ex)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- pw.println(ex.reason);
- ex.printStackTrace(pw);
- pw.flush();
- _logger.error(sw.toString());
- return 1;
- }
- catch(Throwable ex)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- ex.printStackTrace(pw);
- pw.flush();
- _logger.error("ServiceManager: caught exception:\n" + sw.toString());
- return 1;
- }
- finally
- {
- //
- // Invoke stop() on the services.
- //
- stopAll();
- }
-
- return 0;
- }
-
- synchronized private void
- start(String service, String className, String classDir, boolean absolutePath, String[] args)
- throws FailureException
- {
- //
- // Load the class.
- //
-
- //
- // Use a class loader if the user specified a JAR file or class directory.
- //
- Class<?> c = null;
- if(classDir != null)
- {
- try
- {
- if(!absolutePath)
- {
- classDir = new java.io.File(System.getProperty("user.dir") + java.io.File.separator +
- classDir).getCanonicalPath();
- }
-
- if(!classDir.endsWith(java.io.File.separator) && !classDir.endsWith(".jar"))
- {
- classDir += java.io.File.separator;
- }
-
- //
- // Reuse an existing class loader if we have already loaded a plug-in with
- // the same value for classDir, otherwise create a new one.
- //
- ClassLoader cl = null;
-
- if(_classLoaders == null)
- {
- _classLoaders = new java.util.HashMap<String, ClassLoader>();
- }
- else
- {
- cl = _classLoaders.get(classDir);
- }
-
- if(cl == null)
- {
- final java.net.URL[] url = new java.net.URL[] { new java.net.URL("file:///" + classDir) };
-
- cl = new java.net.URLClassLoader(url);
-
- _classLoaders.put(classDir, cl);
- }
-
- c = cl.loadClass(className);
- }
- catch(java.net.MalformedURLException ex)
- {
- throw new FailureException("ServiceManager: invalid entry point format `" + classDir + "'", ex);
- }
- catch(java.io.IOException ex)
- {
- throw new FailureException("ServiceManager: invalid path in plug-in entry point `" + classDir +
- "'", ex);
- }
- catch(java.lang.ClassNotFoundException ex)
- {
- // Ignored
- }
- }
- else
- {
- c = IceInternal.Util.findClass(className, null);
- }
-
- if(c == null)
- {
- throw new FailureException("ServiceManager: class " + className + " not found");
- }
-
- ServiceInfo info = new ServiceInfo();
- info.name = service;
- info.status = StatusStopped;
- info.args = args;
-
- //
- // If Ice.UseSharedCommunicator.<name> is defined, create a
- // communicator for the service. The communicator inherits
- // from the shared communicator properties. If it's not
- // defined, add the service properties to the shared
- // commnunicator property set.
- //
- Ice.Communicator communicator;
- if(_communicator.getProperties().getPropertyAsInt("IceBox.UseSharedCommunicator." + service) > 0)
- {
- assert(_sharedCommunicator != null);
- communicator = _sharedCommunicator;
- }
- else
- {
- try
- {
- //
- // Create the service properties. We use the communicator properties as the default
- // properties if IceBox.InheritProperties is set.
- //
- Ice.InitializationData initData = new Ice.InitializationData();
- initData.properties = createServiceProperties(service);
- Ice.StringSeqHolder serviceArgs = new Ice.StringSeqHolder(info.args);
- if(serviceArgs.value.length > 0)
- {
- //
- // Create the service properties with the given service arguments. This should
- // read the service config file if it's specified with --Ice.Config.
- //
- initData.properties = Ice.Util.createProperties(serviceArgs, initData.properties);
-
- //
- // Next, parse the service "<service>.*" command line options (the Ice command
- // line options were parsed by the createProperties above)
- //
- serviceArgs.value = initData.properties.parseCommandLineOptions(service, serviceArgs.value);
- }
-
- //
- // Clone the logger to assign a new prefix. If one of the built-in loggers is configured
- // don't set any logger.
- //
- if(initData.properties.getProperty("Ice.LogFile").length() == 0 &&
- (initData.properties.getPropertyAsInt("Ice.UseSyslog") <= 0 ||
- System.getProperty("os.name").startsWith("Windows")))
- {
- initData.logger = _logger.cloneWithPrefix(initData.properties.getProperty("Ice.ProgramName"));
- }
-
- //
- // If Admin is enabled on the IceBox communicator, for each service that does not set
- // Ice.Admin.Enabled, we set Ice.Admin.Enabled=1 to have this service create facets; then
- // we add these facets to the IceBox Admin object as IceBox.Service.<service>.<facet>.
- //
- String serviceFacetNamePrefix = "IceBox.Service." + service + ".";
- boolean addFacets = configureAdmin(initData.properties, serviceFacetNamePrefix);
-
- //
- // Remaining command line options are passed to the communicator. This is
- // necessary for Ice plug-in properties (e.g.: IceSSL).
- //
- info.communicator = Ice.Util.initialize(serviceArgs, initData);
- info.args = serviceArgs.value;
- communicator = info.communicator;
-
- if(addFacets)
- {
- // Add all facets created on the service communicator to the IceBox communicator
- // but renamed IceBox.Service.<service>.<facet-name>, except for the Process facet
- // which is never added
- for(java.util.Map.Entry<String, Ice.Object> p : communicator.findAllAdminFacets().entrySet())
- {
- if(!p.getKey().equals("Process"))
- {
- _communicator.addAdminFacet(p.getValue(), serviceFacetNamePrefix + p.getKey());
- }
- }
- }
- }
- catch(Throwable ex)
- {
- FailureException e = new FailureException();
- e.reason = "ServiceManager: exception while starting service " + service;
- e.initCause(ex);
- throw e;
- }
- }
-
- try
- {
- //
- // Instantiate the service.
- //
- try
- {
- //
- // If the service class provides a constructor that accepts an Ice.Communicator argument,
- // use that in preference to the default constructor.
- //
- java.lang.Object obj = null;
- try
- {
- java.lang.reflect.Constructor<?> con = c.getDeclaredConstructor(Ice.Communicator.class);
- obj = con.newInstance(_communicator);
- }
- catch(IllegalAccessException ex)
- {
- throw new FailureException(
- "ServiceManager: unable to access service constructor " + className + "(Ice.Communicator)", ex);
- }
- catch(NoSuchMethodException ex)
- {
- // Ignore.
- }
- catch(java.lang.reflect.InvocationTargetException ex)
- {
- if(ex.getCause() != null)
- {
- throw ex.getCause();
- }
- else
- {
- throw new FailureException("ServiceManager: exception in service constructor for " + className, ex);
- }
- }
-
- if(obj == null)
- {
- //
- // Fall back to the default constructor.
- //
- try
- {
- obj = c.newInstance();
- }
- catch(IllegalAccessException ex)
- {
- throw new FailureException(
- "ServiceManager: unable to access default service constructor in class " + className, ex);
- }
- }
-
- try
- {
- info.service = (Service)obj;
- }
- catch(ClassCastException ex)
- {
- throw new FailureException("ServiceManager: class " + className + " does not implement IceBox.Service");
- }
- }
- catch(InstantiationException ex)
- {
- throw new FailureException("ServiceManager: unable to instantiate class " + className, ex);
- }
- catch(FailureException ex)
- {
- throw ex;
- }
- catch(Throwable ex)
- {
- throw new FailureException("ServiceManager: exception in service constructor for " + className, ex);
- }
-
- try
- {
- info.service.start(service, communicator, info.args);
-
- //
- // There is no need to notify the observers since the 'start all'
- // (that indirectly calls this method) occurs before the creation of
- // the Server Admin object, and before the activation of the main
- // object adapter (so before any observer can be registered)
- //
- }
- catch(FailureException ex)
- {
- throw ex;
- }
- catch(Throwable ex)
- {
- FailureException e = new FailureException();
- e.reason = "ServiceManager: exception while starting service " + service;
- e.initCause(ex);
- throw e;
- }
-
- info.status = StatusStarted;
- _services.add(info);
- }
- catch(RuntimeException ex)
- {
- if(info.communicator != null)
- {
- destroyServiceCommunicator(service, info.communicator);
- }
-
- throw ex;
- }
- }
-
- private synchronized void
- stopAll()
- {
- //
- // First wait for any active startService/stopService calls to complete.
- //
- while(_pendingStatusChanges)
- {
- try
- {
- wait();
- }
- catch(java.lang.InterruptedException ex)
- {
- }
- }
-
- //
- // For each service, we call stop on the service and flush its database environment to
- // the disk. Services are stopped in the reverse order of the order they were started.
- //
- java.util.List<String> stoppedServices = new java.util.ArrayList<String>();
- java.util.ListIterator<ServiceInfo> p = _services.listIterator(_services.size());
- while(p.hasPrevious())
- {
- ServiceInfo info = p.previous();
- if(info.status == StatusStarted)
- {
- try
- {
- info.service.stop();
- info.status = StatusStopped;
- stoppedServices.add(info.name);
- }
- catch(Throwable e)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- e.printStackTrace(pw);
- pw.flush();
- _logger.warning("ServiceManager: exception while stopping service " + info.name + ":\n" +
- sw.toString());
- }
- }
-
- if(info.communicator != null)
- {
- destroyServiceCommunicator(info.name, info.communicator);
- }
- }
-
- if(_sharedCommunicator != null)
- {
- removeAdminFacets("IceBox.SharedCommunicator.");
-
- try
- {
- _sharedCommunicator.destroy();
- }
- catch(java.lang.Exception e)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- e.printStackTrace(pw);
- pw.flush();
- _logger.warning("ServiceManager: exception while destroying shared communicator:\n" + sw.toString());
- }
- _sharedCommunicator = null;
- }
-
- _services.clear();
- servicesStopped(stoppedServices, _observers);
- }
-
- private void
- servicesStarted(java.util.List<String> services, java.util.Set<ServiceObserverPrx> observers)
- {
- if(services.size() > 0)
- {
- String[] servicesArray = services.toArray(new String[0]);
-
- for(final ServiceObserverPrx observer: observers)
- {
- observer.begin_servicesStarted(servicesArray, _observerCompletedCB);
- }
- }
- }
-
- private void
- servicesStopped(java.util.List<String> services, java.util.Set<ServiceObserverPrx> observers)
- {
- if(services.size() > 0)
- {
- String[] servicesArray = services.toArray(new String[0]);
-
- for(final ServiceObserverPrx observer: observers)
- {
- observer.begin_servicesStopped(servicesArray, _observerCompletedCB);
- }
- }
- }
-
- private void
- observerRemoved(ServiceObserverPrx observer, RuntimeException ex)
- {
- if(_traceServiceObserver >= 1)
- {
- //
- // CommunicatorDestroyedException may occur during shutdown. The observer notification has
- // been sent, but the communicator was destroyed before the reply was received. We do not
- // log a message for this exception.
- //
- if(!(ex instanceof Ice.CommunicatorDestroyedException))
- {
- _logger.trace("IceBox.ServiceObserver",
- "Removed service observer " + _communicator.proxyToString(observer)
- + "\nafter catching " + ex.toString());
- }
- }
- }
-
- public final static int StatusStopping = 0;
- public final static int StatusStopped = 1;
- public final static int StatusStarting = 2;
- public final static int StatusStarted = 3;
-
- static class ServiceInfo implements Cloneable
- {
- @Override
- public Object clone()
- {
- Object o = null;
- try
- {
- o = super.clone();
- }
- catch(CloneNotSupportedException ex)
- {
- }
- return o;
- }
-
- public String name;
- public Service service;
- public Ice.Communicator communicator = null;
- public int status;
- public String[] args;
- }
-
- static class StartServiceInfo
- {
- StartServiceInfo(String service, String value, String[] serverArgs)
- {
- name = service;
-
- //
- // We support the following formats:
- //
- // <class-name> [args]
- // <jar-file>:<class-name> [args]
- // <class-dir>:<class-name> [args]
- // "<path with spaces>":<class-name> [args]
- // "<path with spaces>:<class-name>" [args]
- //
-
- try
- {
- args = IceUtilInternal.Options.split(value);
- }
- catch(IceUtilInternal.Options.BadQuote ex)
- {
- throw new FailureException("ServiceManager: invalid arguments for service `" + name + "':\n" +
- ex.getMessage());
- }
-
- assert(args.length > 0);
-
- final String entryPoint = args[0];
-
- final boolean isWindows = System.getProperty("os.name").startsWith("Windows");
- absolutePath = false;
-
- //
- // Find first ':' that isn't part of the file path.
- //
- int pos = entryPoint.indexOf(':');
- if(isWindows)
- {
- final String driveLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- if(pos == 1 && entryPoint.length() > 2 && driveLetters.indexOf(entryPoint.charAt(0)) != -1 &&
- (entryPoint.charAt(2) == '\\' || entryPoint.charAt(2) == '/'))
- {
- absolutePath = true;
- pos = entryPoint.indexOf(':', pos + 1);
- }
- if(!absolutePath)
- {
- absolutePath = entryPoint.startsWith("\\\\");
- }
- }
- else
- {
- absolutePath = entryPoint.startsWith("/");
- }
-
- if((pos == -1 && absolutePath) || (pos != -1 && entryPoint.length() <= pos + 1))
- {
- //
- // Class name is missing.
- //
- throw new FailureException("ServiceManager: invalid entry point for service `" + name + "':\n" +
- entryPoint);
- }
-
- //
- // Extract the JAR file or subdirectory, if any.
- //
- classDir = null; // Path name of JAR file or subdirectory.
-
- if(pos == -1)
- {
- className = entryPoint;
- }
- else
- {
- classDir = entryPoint.substring(0, pos).trim();
- className = entryPoint.substring(pos + 1).trim();
- }
-
- //
- // Shift the arguments.
- //
- String[] tmp = new String[args.length - 1];
- System.arraycopy(args, 1, tmp, 0, args.length - 1);
- args = tmp;
-
- if(serverArgs.length > 0)
- {
- java.util.List<String> l = new java.util.ArrayList<String>(java.util.Arrays.asList(args));
- for(String arg : serverArgs)
- {
- if(arg.startsWith("--" + service + "."))
- {
- l.add(arg);
- }
- }
- args = l.toArray(args);
- }
- }
-
- String name;
- String[] args;
- String className;
- String classDir;
- boolean absolutePath;
- }
-
- private Ice.Properties
- createServiceProperties(String service)
- {
- Ice.Properties properties;
- Ice.Properties communicatorProperties = _communicator.getProperties();
- if(communicatorProperties.getPropertyAsInt("IceBox.InheritProperties") > 0)
- {
- properties = communicatorProperties._clone();
- // Inherit all except Ice.Admin.xxx properties
- for(String p : properties.getPropertiesForPrefix("Ice.Admin.").keySet())
- {
- properties.setProperty(p, "");
- }
- }
- else
- {
- properties = Ice.Util.createProperties();
- }
-
- String programName = communicatorProperties.getProperty("Ice.ProgramName");
- if(programName.length() == 0)
- {
- properties.setProperty("Ice.ProgramName", service);
- }
- else
- {
- properties.setProperty("Ice.ProgramName", programName + "-" + service);
- }
- return properties;
- }
-
- private void
- destroyServiceCommunicator(String service, Ice.Communicator communicator)
- {
- try
- {
- communicator.shutdown();
- communicator.waitForShutdown();
- }
- catch(Ice.CommunicatorDestroyedException e)
- {
- //
- // Ignore, the service might have already destroyed
- // the communicator for its own reasons.
- //
- }
- catch(java.lang.Exception e)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- e.printStackTrace(pw);
- pw.flush();
- _logger.warning("ServiceManager: exception in shutting down communicator for service "
- + service + "\n" + sw.toString());
- }
-
- removeAdminFacets("IceBox.Service." + service + ".");
-
- try
- {
- communicator.destroy();
- }
- catch(java.lang.Exception e)
- {
- java.io.StringWriter sw = new java.io.StringWriter();
- java.io.PrintWriter pw = new java.io.PrintWriter(sw);
- e.printStackTrace(pw);
- pw.flush();
- _logger.warning("ServiceManager: exception in destroying communicator for service "
- + service + "\n" + sw.toString());
- }
- }
-
- private boolean configureAdmin(Ice.Properties properties, String prefix)
- {
- if(_adminEnabled && properties.getProperty("Ice.Admin.Enabled").isEmpty())
- {
- java.util.List<String> facetNames = new java.util.LinkedList<String>();
- for(String p : _adminFacetFilter)
- {
- if(p.startsWith(prefix))
- {
- facetNames.add(p.substring(prefix.length()));
- }
- }
-
- if(_adminFacetFilter.isEmpty() || !facetNames.isEmpty())
- {
- properties.setProperty("Ice.Admin.Enabled", "1");
-
- if(!facetNames.isEmpty())
- {
- // TODO: need joinString with escape!
- properties.setProperty("Ice.Admin.Facets", IceUtilInternal.StringUtil.joinString(facetNames, " "));
- }
- return true;
- }
- }
- return false;
- }
-
- private void removeAdminFacets(String prefix)
- {
- try
- {
- for(String p : _communicator.findAllAdminFacets().keySet())
- {
- if(p.startsWith(prefix))
- {
- _communicator.removeAdminFacet(p);
- }
- }
- }
- catch(Ice.CommunicatorDestroyedException ex)
- {
- // Ignored
- }
- catch(Ice.ObjectAdapterDeactivatedException ex)
- {
- // Ignored
- }
- }
-
-
- private Ice.Communicator _communicator;
- private boolean _adminEnabled = false;
- private java.util.Set<String> _adminFacetFilter;
- private Ice.Communicator _sharedCommunicator;
- private Ice.Logger _logger;
- private String[] _argv; // Filtered server argument vector
- private java.util.List<ServiceInfo> _services = new java.util.LinkedList<ServiceInfo>();
- private boolean _pendingStatusChanges = false;
- private Ice.Callback _observerCompletedCB;
- private java.util.HashSet<ServiceObserverPrx> _observers = new java.util.HashSet<ServiceObserverPrx>();
- private int _traceServiceObserver = 0;
- private java.util.Map<String, ClassLoader> _classLoaders;
-}