summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2014-09-08 12:03:16 -0400
committerBernard Normier <bernard@zeroc.com>2014-09-08 12:03:16 -0400
commita0f6b6fc1a619c40979f5ba00d71dc661cfc6499 (patch)
tree81b40da86417ed18a186d595c119bb7823b17fcf /java/src
parentICE-5658 - NPM support for IceJS distribution (diff)
downloadice-a0f6b6fc1a619c40979f5ba00d71dc661cfc6499.tar.bz2
ice-a0f6b6fc1a619c40979f5ba00d71dc661cfc6499.tar.xz
ice-a0f6b6fc1a619c40979f5ba00d71dc661cfc6499.zip
Fixed ICE-5667: Added Communicator::createAdmin in C++, Java, C# and Python
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/CommunicatorI.java8
-rw-r--r--java/src/Ice/ObjectAdapterI.java14
-rw-r--r--java/src/IceInternal/Instance.java324
-rw-r--r--java/src/IceInternal/PropertyNames.java3
4 files changed, 230 insertions, 119 deletions
diff --git a/java/src/Ice/CommunicatorI.java b/java/src/Ice/CommunicatorI.java
index bb95a3583f7..3f0dcbebe8f 100644
--- a/java/src/Ice/CommunicatorI.java
+++ b/java/src/Ice/CommunicatorI.java
@@ -288,6 +288,14 @@ public final class CommunicatorI implements Communicator
ri.__wait();
}
+
+ @Override
+ public ObjectPrx
+ createAdmin(ObjectAdapter adminAdapter, Identity adminId)
+ {
+ return _instance.createAdmin(adminAdapter, adminId);
+ }
+
@Override
public ObjectPrx
getAdmin()
diff --git a/java/src/Ice/ObjectAdapterI.java b/java/src/Ice/ObjectAdapterI.java
index 82841fdf67c..11eb4225e14 100644
--- a/java/src/Ice/ObjectAdapterI.java
+++ b/java/src/Ice/ObjectAdapterI.java
@@ -660,6 +660,20 @@ public final class ObjectAdapterI implements ObjectAdapter
}
@Override
+ public synchronized LocatorPrx
+ getLocator()
+ {
+ if(_locatorInfo == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _locatorInfo.getLocator();
+ }
+ }
+
+ @Override
public void
refreshPublishedEndpoints()
{
diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java
index e5ca5e8a71c..f9dc6364b4e 100644
--- a/java/src/IceInternal/Instance.java
+++ b/java/src/IceInternal/Instance.java
@@ -299,87 +299,55 @@ public final class Instance
return Ice.Util.identityToString(ident);
}
- public Ice.ObjectPrx
- getAdmin()
+ public synchronized Ice.ObjectPrx
+ createAdmin(Ice.ObjectAdapter adminAdapter, Ice.Identity adminIdentity)
{
- Ice.ObjectAdapter adapter = null;
- String serverId = null;
- Ice.LocatorPrx defaultLocator = null;
-
+ boolean createAdapter = (adminAdapter == null);
+
synchronized(this)
{
if(_state == StateDestroyed)
{
throw new Ice.CommunicatorDestroyedException();
}
-
- final String adminOA = "Ice.Admin";
-
+
+ if(adminIdentity == null || adminIdentity.name == null || adminIdentity.name.isEmpty())
+ {
+ throw new Ice.IllegalIdentityException(adminIdentity);
+ }
+
if(_adminAdapter != null)
{
- return _adminAdapter.createProxy(_adminIdentity);
+ throw new Ice.InitializationException("Admin already created");
}
- else if(_initData.properties.getProperty(adminOA + ".Endpoints").length() == 0)
+
+ if(!_adminEnabled)
{
- return null;
+ throw new Ice.InitializationException("Admin is disabled");
}
- else
+
+ if(createAdapter)
{
- serverId = _initData.properties.getProperty("Ice.Admin.ServerId");
- String instanceName = _initData.properties.getProperty("Ice.Admin.InstanceName");
-
- defaultLocator = _referenceFactory.getDefaultLocator();
-
- if((defaultLocator != null && serverId.length() > 0) || instanceName.length() > 0)
+ if(!_initData.properties.getProperty("Ice.Admin.Endpoints").isEmpty())
{
- if(_adminIdentity == null)
- {
- if(instanceName.length() == 0)
- {
- instanceName = java.util.UUID.randomUUID().toString();
- }
- _adminIdentity = new Ice.Identity("admin", instanceName);
- //
- // Afterwards, _adminIdentity is read-only
- //
- }
-
- //
- // Create OA
- //
- _adminAdapter = _objectAdapterFactory.createObjectAdapter(adminOA, null);
-
- //
- // Add all facets to OA
- //
- java.util.Map<String, Ice.Object> filteredFacets = new java.util.HashMap<String, Ice.Object>();
- for(java.util.Map.Entry<String, Ice.Object> p : _adminFacets.entrySet())
- {
- if(_adminFacetFilter.isEmpty() || _adminFacetFilter.contains(p.getKey()))
- {
- _adminAdapter.addFacet(p.getValue(), _adminIdentity, p.getKey());
- }
- else
- {
- filteredFacets.put(p.getKey(), p.getValue());
- }
- }
- _adminFacets = filteredFacets;
-
- adapter = _adminAdapter;
+ adminAdapter = _objectAdapterFactory.createObjectAdapter("Ice.Admin", null);
+ }
+ else
+ {
+ throw new Ice.InitializationException("Ice.Admin.Endpoints is not set");
}
}
+
+ _adminIdentity = adminIdentity;
+ _adminAdapter = adminAdapter;
+ addAllAdminFacets();
}
-
- if(adapter == null)
- {
- return null;
- }
- else
+
+ if(createAdapter)
{
try
{
- adapter.activate();
+ adminAdapter.activate();
}
catch(Ice.LocalException ex)
{
@@ -388,66 +356,83 @@ public final class Instance
// (can't call again getAdmin() after fixing the problem)
// since all the facets (servants) in the adapter are lost
//
- adapter.destroy();
+ adminAdapter.destroy();
synchronized(this)
{
_adminAdapter = null;
}
throw ex;
}
+ }
+ setServerProcessProxy(adminAdapter, adminIdentity);
+ return adminAdapter.createProxy(adminIdentity);
+ }
- Ice.ObjectPrx admin = adapter.createProxy(_adminIdentity);
- if(defaultLocator != null && serverId.length() > 0)
- {
- Ice.ProcessPrx process = Ice.ProcessPrxHelper.uncheckedCast(admin.ice_facet("Process"));
+ public Ice.ObjectPrx
+ getAdmin()
+ {
+ Ice.ObjectAdapter adminAdapter;
+ Ice.Identity adminIdentity;
- try
+ synchronized(this)
+ {
+ if(_state == StateDestroyed)
+ {
+ throw new Ice.CommunicatorDestroyedException();
+ }
+
+ if(_adminAdapter != null)
+ {
+ return _adminAdapter.createProxy(_adminIdentity);
+ }
+ else if(_adminEnabled)
+ {
+ if(getAdminEnabledDefaultValue())
{
- //
- // Note that as soon as the process proxy is registered, the communicator might be
- // shutdown by a remote client and admin facets might start receiving calls.
- //
- defaultLocator.getRegistry().setServerProcessProxy(serverId, process);
+ adminAdapter = _objectAdapterFactory.createObjectAdapter("Ice.Admin", null);
}
- catch(Ice.ServerNotFoundException ex)
+ else
{
- if(_traceLevels.location >= 1)
- {
- StringBuilder s = new StringBuilder(128);
- s.append("couldn't register server `");
- s.append(serverId);
- s.append("' with the locator registry:\n");
- s.append("the server is not known to the locator registry");
- _initData.logger.trace(_traceLevels.locationCat, s.toString());
- }
-
- throw new Ice.InitializationException("Locator knows nothing about server '" + serverId + "'");
+ return null;
}
- catch(Ice.LocalException ex)
+ adminIdentity = new Ice.Identity("admin", _initData.properties.getProperty("Ice.Admin.InstanceName"));
+ if(adminIdentity.category.isEmpty())
{
- if(_traceLevels.location >= 1)
- {
- StringBuilder s = new StringBuilder(128);
- s.append("couldn't register server `");
- s.append(serverId);
- s.append("' with the locator registry:\n");
- s.append(ex.toString());
- _initData.logger.trace(_traceLevels.locationCat, s.toString());
- }
- throw ex;
+ adminIdentity.category = java.util.UUID.randomUUID().toString();
}
+
+ _adminIdentity = adminIdentity;
+ _adminAdapter = adminAdapter;
+ addAllAdminFacets();
+ // continue below outside synchronization
+ }
+ else
+ {
+ return null;
+ }
+ }
- if(_traceLevels.location >= 1)
- {
- StringBuilder s = new StringBuilder(128);
- s.append("registered server `");
- s.append(serverId);
- s.append("' with the locator registry");
- _initData.logger.trace(_traceLevels.locationCat, s.toString());
- }
+ try
+ {
+ adminAdapter.activate();
+ }
+ catch(Ice.LocalException ex)
+ {
+ //
+ // We cleanup _adminAdapter, however this error is not recoverable
+ // (can't call again getAdmin() after fixing the problem)
+ // since all the facets (servants) in the adapter are lost
+ //
+ adminAdapter.destroy();
+ synchronized(this)
+ {
+ _adminAdapter = null;
}
- return admin;
+ throw ex;
}
+
+ setServerProcessProxy(adminAdapter, adminIdentity);
+ return adminAdapter.createProxy(adminIdentity);
}
public synchronized void
@@ -822,35 +807,51 @@ public final class Instance
_retryQueue = new RetryQueue(this);
//
- // Add Process and Properties facets
+ // Add Process and Properties facets
+ // TODO: move after we load the plugins!
//
- String[] facetFilter = _initData.properties.getPropertyAsList("Ice.Admin.Facets");
- if(facetFilter.length > 0)
+
+ if(_initData.properties.getProperty("Ice.Admin.Enabled").isEmpty())
+ {
+ _adminEnabled = getAdminEnabledDefaultValue();
+ }
+ else
{
- _adminFacetFilter.addAll(java.util.Arrays.asList(facetFilter));
+ _adminEnabled = _initData.properties.getPropertyAsInt("Ice.Admin.Enabled") > 0;
}
+
+ PropertiesAdminI propsAdmin = null;
+ MetricsAdminI metricsAdmin = null;
- _adminFacets.put("Process", new ProcessI(communicator));
+ if(_adminEnabled)
+ {
+ String[] facetFilter = _initData.properties.getPropertyAsList("Ice.Admin.Facets");
+ if(facetFilter.length > 0)
+ {
+ _adminFacetFilter.addAll(java.util.Arrays.asList(facetFilter));
+ }
- MetricsAdminI admin = new MetricsAdminI(_initData.properties, _initData.logger);
- _adminFacets.put("Metrics", admin);
+ _adminFacets.put("Process", new ProcessI(communicator));
- PropertiesAdminI props = new PropertiesAdminI("Properties", _initData.properties, _initData.logger);
- _adminFacets.put("Properties", props);
+ metricsAdmin = new MetricsAdminI(_initData.properties, _initData.logger);
+ _adminFacets.put("Metrics", metricsAdmin);
+
+ propsAdmin = new PropertiesAdminI("Properties", _initData.properties, _initData.logger);
+ _adminFacets.put("Properties", propsAdmin);
+ }
//
// Setup the communicator observer only if the user didn't already set an
- // Ice observer resolver and if the admininistrative endpoints are set.
+ // Ice observer resolver and Admin is enabled
//
- if((_adminFacetFilter.isEmpty() || _adminFacetFilter.contains("Metrics")) &&
- _initData.properties.getProperty("Ice.Admin.Endpoints").length() > 0)
+ if(_adminEnabled && (_adminFacetFilter.isEmpty() || _adminFacetFilter.contains("Metrics")))
{
- _observer = new CommunicatorObserverI(admin, _initData.observer);
+ _observer = new CommunicatorObserverI(metricsAdmin, _initData.observer);
//
// Make sure the admin plugin receives property updates.
//
- props.addUpdateCallback(admin);
+ propsAdmin.addUpdateCallback(metricsAdmin);
}
else
{
@@ -1293,6 +1294,92 @@ public final class Instance
return packages.toArray(new String[packages.size()]);
}
+ private synchronized void
+ addAllAdminFacets()
+ {
+ java.util.Map<String, Ice.Object> filteredFacets = new java.util.HashMap<String, Ice.Object>();
+ for(java.util.Map.Entry<String, Ice.Object> p : _adminFacets.entrySet())
+ {
+ if(_adminFacetFilter.isEmpty() || _adminFacetFilter.contains(p.getKey()))
+ {
+ _adminAdapter.addFacet(p.getValue(), _adminIdentity, p.getKey());
+ }
+ else
+ {
+ filteredFacets.put(p.getKey(), p.getValue());
+ }
+ }
+ _adminFacets = filteredFacets;
+ }
+
+ private void
+ setServerProcessProxy(Ice.ObjectAdapter adminAdapter, Ice.Identity adminIdentity)
+ {
+ Ice.ObjectPrx admin = adminAdapter.createProxy(adminIdentity);
+ Ice.LocatorPrx locator = adminAdapter.getLocator();
+ String serverId = _initData.properties.getProperty("Ice.Admin.ServerId");
+
+ if(locator != null && !serverId.isEmpty())
+ {
+ Ice.ProcessPrx process = Ice.ProcessPrxHelper.uncheckedCast(admin.ice_facet("Process"));
+ try
+ {
+ //
+ // Note that as soon as the process proxy is registered, the communicator might be
+ // shutdown by a remote client and admin facets might start receiving calls.
+ //
+ locator.getRegistry().setServerProcessProxy(serverId, process);
+ }
+ catch(Ice.ServerNotFoundException ex)
+ {
+ if(_traceLevels.location >= 1)
+ {
+ StringBuilder s = new StringBuilder(128);
+ s.append("couldn't register server `");
+ s.append(serverId);
+ s.append("' with the locator registry:\n");
+ s.append("the server is not known to the locator registry");
+ _initData.logger.trace(_traceLevels.locationCat, s.toString());
+ }
+
+ throw new Ice.InitializationException("Locator knows nothing about server `" + serverId + "'");
+ }
+ catch(Ice.LocalException ex)
+ {
+ if(_traceLevels.location >= 1)
+ {
+ StringBuilder s = new StringBuilder(128);
+ s.append("couldn't register server `");
+ s.append(serverId);
+ s.append("' with the locator registry:\n");
+ s.append(ex.toString());
+ _initData.logger.trace(_traceLevels.locationCat, s.toString());
+ }
+ throw ex;
+ }
+
+ if(_traceLevels.location >= 1)
+ {
+ StringBuilder s = new StringBuilder(128);
+ s.append("registered server `");
+ s.append(serverId);
+ s.append("' with the locator registry");
+ _initData.logger.trace(_traceLevels.locationCat, s.toString());
+ }
+ }
+ }
+
+ private synchronized boolean
+ getAdminEnabledDefaultValue()
+ {
+ Ice.Properties props = _initData.properties;
+
+ return !props.getProperty("Ice.Admin.Endpoints").isEmpty() &&
+ (!props.getProperty("Ice.Admin.InstanceName").isEmpty() ||
+ (!props.getProperty("Ice.Admin.ServerId").isEmpty() &&
+ (_referenceFactory.getDefaultLocator() != null || !props.getProperty("Ice.Default.Locator").isEmpty())));
+ }
+
private static final int StateActive = 0;
private static final int StateDestroyInProgress = 1;
private static final int StateDestroyed = 2;
@@ -1325,6 +1412,7 @@ public final class Instance
private EndpointFactoryManager _endpointFactoryManager;
private Ice.PluginManager _pluginManager;
+ private boolean _adminEnabled = false;
private Ice.ObjectAdapter _adminAdapter;
private java.util.Map<String, Ice.Object> _adminFacets = new java.util.HashMap<String, Ice.Object>();
private java.util.Set<String> _adminFacetFilter = new java.util.HashSet<String>();
diff --git a/java/src/IceInternal/PropertyNames.java b/java/src/IceInternal/PropertyNames.java
index 8bdc3158420..82607dfd1c9 100644
--- a/java/src/IceInternal/PropertyNames.java
+++ b/java/src/IceInternal/PropertyNames.java
@@ -6,7 +6,7 @@
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
-// Generated by makeprops.py from file ../config/PropertyNames.xml, Fri Sep 5 15:02:22 2014
+// Generated by makeprops.py from file ../config/PropertyNames.xml, Mon Sep 8 11:41:52 2014
// IMPORTANT: Do not edit this file -- any edits made here will be lost!
@@ -67,6 +67,7 @@ public final class PropertyNames
new Property("Ice\\.Admin\\.ThreadPool\\.ThreadIdleTime", false, null),
new Property("Ice\\.Admin\\.ThreadPool\\.ThreadPriority", false, null),
new Property("Ice\\.Admin\\.DelayCreation", false, null),
+ new Property("Ice\\.Admin\\.Enabled", false, null),
new Property("Ice\\.Admin\\.Facets", false, null),
new Property("Ice\\.Admin\\.InstanceName", false, null),
new Property("Ice\\.Admin\\.Logger", false, null),