summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/CommunicatorI.java5
-rw-r--r--java/src/Ice/ConnectionI.java20
-rw-r--r--java/src/IceInternal/CommunicatorObserverI.java117
-rw-r--r--java/src/IceInternal/ConnectionObserverI.java11
-rw-r--r--java/src/IceInternal/DispatchObserverI.java11
-rw-r--r--java/src/IceInternal/EndpointHostResolver.java6
-rw-r--r--java/src/IceInternal/Incoming.java2
-rw-r--r--java/src/IceInternal/Instance.java22
-rw-r--r--java/src/IceInternal/InvocationObserverI.java19
-rw-r--r--java/src/IceInternal/ObserverHelper.java5
-rw-r--r--java/src/IceInternal/OutgoingConnectionFactory.java4
-rw-r--r--java/src/IceInternal/RemoteObserverI.java7
-rw-r--r--java/src/IceInternal/ThreadObserverI.java8
-rw-r--r--java/src/IceInternal/ThreadPool.java2
-rw-r--r--java/src/IceMX/ObserverFactory.java17
-rw-r--r--java/src/IceMX/ObserverFactoryWithDelegate.java48
-rw-r--r--java/src/IceMX/ObserverWithDelegate.java71
-rw-r--r--java/src/IceMX/ObserverWithDelegateI.java (renamed from java/src/IceMX/ObserverI.java)2
18 files changed, 304 insertions, 73 deletions
diff --git a/java/src/Ice/CommunicatorI.java b/java/src/Ice/CommunicatorI.java
index 82fd56d46a6..21b6525a05a 100644
--- a/java/src/Ice/CommunicatorI.java
+++ b/java/src/Ice/CommunicatorI.java
@@ -140,9 +140,10 @@ public final class CommunicatorI implements Communicator
return _instance.initializationData().stats;
}
- public Ice.Instrumentation.CommunicatorObserver getObserver()
+ public Ice.Instrumentation.CommunicatorObserver
+ getObserver()
{
- return _instance.initializationData().observer;
+ return _instance.getObserver();
}
public RouterPrx
diff --git a/java/src/Ice/ConnectionI.java b/java/src/Ice/ConnectionI.java
index 32bf6308d05..bdd49e86ab7 100644
--- a/java/src/Ice/ConnectionI.java
+++ b/java/src/Ice/ConnectionI.java
@@ -257,11 +257,11 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
return;
}
- assert(_instance.initializationData().observer != null);
- _observer = _instance.initializationData().observer.getConnectionObserver(initConnectionInfo(),
- _endpoint,
- toConnectionState(_state),
- _observer);
+ assert(_instance.getObserver() != null);
+ _observer = _instance.getObserver().getConnectionObserver(initConnectionInfo(),
+ _endpoint,
+ toConnectionState(_state),
+ _observer);
if(_observer != null)
{
_observer.attach();
@@ -1831,16 +1831,16 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
}
}
- if(_instance.initializationData().observer != null)
+ if(_instance.getObserver() != null)
{
Ice.Instrumentation.ConnectionState oldState = toConnectionState(_state);
Ice.Instrumentation.ConnectionState newState = toConnectionState(state);
if(oldState != newState)
{
- _observer = _instance.initializationData().observer.getConnectionObserver(initConnectionInfo(),
- _endpoint,
- newState,
- _observer);
+ _observer = _instance.getObserver().getConnectionObserver(initConnectionInfo(),
+ _endpoint,
+ newState,
+ _observer);
if(_observer != null)
{
_observer.attach();
diff --git a/java/src/IceInternal/CommunicatorObserverI.java b/java/src/IceInternal/CommunicatorObserverI.java
index 056ef2cd007..78c44da0905 100644
--- a/java/src/IceInternal/CommunicatorObserverI.java
+++ b/java/src/IceInternal/CommunicatorObserverI.java
@@ -583,16 +583,27 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
public
CommunicatorObserverI(IceInternal.MetricsAdminI metrics)
{
- _metrics = metrics;
+ this(metrics, null);
+ }
- _connections = new ObserverFactory<ConnectionMetrics, ConnectionObserverI>(metrics, "Connection",
- ConnectionMetrics.class);
- _dispatch = new ObserverFactory<DispatchMetrics, DispatchObserverI>(metrics, "Dispatch", DispatchMetrics.class);
- _invocations = new ObserverFactory<InvocationMetrics, InvocationObserverI>(metrics, "Invocation",
- InvocationMetrics.class);
- _threads = new ObserverFactory<ThreadMetrics, ThreadObserverI>(metrics, "Thread", ThreadMetrics.class);
- _connects = new ObserverFactory<Metrics, ObserverI>(metrics, "ConnectionEstablishment", Metrics.class);
- _endpointLookups = new ObserverFactory<Metrics, ObserverI>(metrics, "EndpointLookup", Metrics.class);
+ public
+ CommunicatorObserverI(IceInternal.MetricsAdminI metrics, Ice.Instrumentation.CommunicatorObserver delegate)
+ {
+ _metrics = metrics;
+ _delegate = delegate;
+
+ _connections = new ObserverFactoryWithDelegate<ConnectionMetrics, ConnectionObserverI,
+ Ice.Instrumentation.ConnectionObserver>(metrics, "Connection", ConnectionMetrics.class);
+ _dispatch = new ObserverFactoryWithDelegate<DispatchMetrics, DispatchObserverI,
+ Ice.Instrumentation.DispatchObserver>(metrics, "Dispatch", DispatchMetrics.class);
+ _invocations = new ObserverFactoryWithDelegate<InvocationMetrics, InvocationObserverI,
+ Ice.Instrumentation.InvocationObserver>(metrics, "Invocation", InvocationMetrics.class);
+ _threads = new ObserverFactoryWithDelegate<ThreadMetrics, ThreadObserverI,
+ Ice.Instrumentation.ThreadObserver>(metrics, "Thread", ThreadMetrics.class);
+ _connects = new ObserverFactoryWithDelegate<Metrics, ObserverWithDelegateI,
+ Ice.Instrumentation.Observer>(metrics, "ConnectionEstablishment", Metrics.class);
+ _endpointLookups = new ObserverFactoryWithDelegate<Metrics, ObserverWithDelegateI,
+ Ice.Instrumentation.Observer>(metrics, "EndpointLookup", Metrics.class);
try
{
@@ -612,11 +623,17 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
{
try
{
- return _connects.getObserver(new EndpointHelper(endpt, connector), ObserverI.class);
+ Ice.Instrumentation.Observer delegate = null;
+ if(_delegate != null)
+ {
+ delegate = _delegate.getConnectionEstablishmentObserver(endpt, connector);
+ }
+ return _connects.getObserver(new EndpointHelper(endpt, connector), ObserverWithDelegateI.class,
+ delegate);
}
catch(Exception ex)
{
- _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + ex);
+ _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + Ex.toString(ex));
}
}
return null;
@@ -629,11 +646,16 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
{
try
{
- return _endpointLookups.getObserver(new EndpointHelper(endpt), ObserverI.class);
+ Ice.Instrumentation.Observer delegate = null;
+ if(_delegate != null)
+ {
+ delegate = _delegate.getEndpointLookupObserver(endpt);
+ }
+ return _endpointLookups.getObserver(new EndpointHelper(endpt), ObserverWithDelegateI.class, delegate);
}
catch(Exception ex)
{
- _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + ex);
+ _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + Ex.toString(ex));
}
}
@@ -642,34 +664,47 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
public Ice.Instrumentation.ConnectionObserver
getConnectionObserver(Ice.ConnectionInfo c, Ice.Endpoint e, Ice.Instrumentation.ConnectionState s,
- Ice.Instrumentation.ConnectionObserver o)
+ Ice.Instrumentation.ConnectionObserver observer)
{
if(_connections.isEnabled())
{
try
{
- return _connections.getObserver(new ConnectionHelper(c, e, s), o, ConnectionObserverI.class);
+ Ice.Instrumentation.ConnectionObserver delegate = null;
+ ConnectionObserverI o = observer instanceof ConnectionObserverI ? (ConnectionObserverI)observer : null;
+ if(_delegate != null)
+ {
+ delegate = _delegate.getConnectionObserver(c, e, s, o != null ? o.getDelegate() : observer);
+ }
+ return _connections.getObserver(new ConnectionHelper(c, e, s), o, ConnectionObserverI.class, delegate);
}
catch(Exception ex)
{
- _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + ex);
+ _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + Ex.toString(ex));
}
}
return null;
}
public Ice.Instrumentation.ThreadObserver
- getThreadObserver(String parent, String id, Ice.Instrumentation.ThreadState s, Ice.Instrumentation.ThreadObserver o)
+ getThreadObserver(String parent, String id, Ice.Instrumentation.ThreadState s,
+ Ice.Instrumentation.ThreadObserver observer)
{
if(_threads.isEnabled())
{
try
{
- return _threads.getObserver(new ThreadHelper(parent, id, s), o, ThreadObserverI.class);
+ Ice.Instrumentation.ThreadObserver delegate = null;
+ ThreadObserverI o = observer instanceof ThreadObserverI ? (ThreadObserverI)observer : null;
+ if(_delegate != null)
+ {
+ delegate = _delegate.getThreadObserver(parent, id, s, o != null ? o.getDelegate() : observer);
+ }
+ return _threads.getObserver(new ThreadHelper(parent, id, s), o, ThreadObserverI.class, delegate);
}
catch(Exception ex)
{
- _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + ex);
+ _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + Ex.toString(ex));
}
}
return null;
@@ -682,11 +717,18 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
{
try
{
- return _invocations.getObserver(new InvocationHelper(prx, operation, ctx), InvocationObserverI.class);
+ Ice.Instrumentation.InvocationObserver delegate = null;
+ if(_delegate != null)
+ {
+ delegate = _delegate.getInvocationObserver(prx, operation, ctx);
+ }
+ return _invocations.getObserver(new InvocationHelper(prx, operation, ctx),
+ InvocationObserverI.class,
+ delegate);
}
catch(Exception ex)
{
- _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + ex);
+ _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + Ex.toString(ex));
}
}
return null;
@@ -699,11 +741,16 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
{
try
{
- return _dispatch.getObserver(new DispatchHelper(c, size), DispatchObserverI.class);
+ Ice.Instrumentation.DispatchObserver delegate = null;
+ if(_delegate != null)
+ {
+ delegate = _delegate.getDispatchObserver(c, size);
+ }
+ return _dispatch.getObserver(new DispatchHelper(c, size), DispatchObserverI.class, delegate);
}
catch(Exception ex)
{
- _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + ex);
+ _metrics.getLogger().error("unexpected exception trying to obtain observer:\n" + Ex.toString(ex));
}
}
return null;
@@ -726,6 +773,11 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
updater.updateThreadObservers();
}
});
+
+ if(_delegate != null)
+ {
+ _delegate.setObserverUpdater(updater);
+ }
}
public IceInternal.MetricsAdminI getMetricsAdmin()
@@ -734,10 +786,17 @@ public class CommunicatorObserverI implements Ice.Instrumentation.CommunicatorOb
}
final private IceInternal.MetricsAdminI _metrics;
- final private ObserverFactory<ConnectionMetrics, ConnectionObserverI> _connections;
- final private ObserverFactory<DispatchMetrics, DispatchObserverI> _dispatch;
- final private ObserverFactory<InvocationMetrics, InvocationObserverI> _invocations;
- final private ObserverFactory<ThreadMetrics, ThreadObserverI> _threads;
- final private ObserverFactory<Metrics, ObserverI> _connects;
- final private ObserverFactory<Metrics, ObserverI> _endpointLookups;
+ final private Ice.Instrumentation.CommunicatorObserver _delegate;
+ final private ObserverFactoryWithDelegate<ConnectionMetrics, ConnectionObserverI,
+ Ice.Instrumentation.ConnectionObserver> _connections;
+ final private ObserverFactoryWithDelegate<DispatchMetrics, DispatchObserverI,
+ Ice.Instrumentation.DispatchObserver> _dispatch;
+ final private ObserverFactoryWithDelegate<InvocationMetrics, InvocationObserverI,
+ Ice.Instrumentation.InvocationObserver> _invocations;
+ final private ObserverFactoryWithDelegate<ThreadMetrics, ThreadObserverI,
+ Ice.Instrumentation.ThreadObserver> _threads;
+ final private ObserverFactoryWithDelegate<Metrics, ObserverWithDelegateI,
+ Ice.Instrumentation.Observer> _connects;
+ final private ObserverFactoryWithDelegate<Metrics, ObserverWithDelegateI,
+ Ice.Instrumentation.Observer> _endpointLookups;
}
diff --git a/java/src/IceInternal/ConnectionObserverI.java b/java/src/IceInternal/ConnectionObserverI.java
index 847b0216ec8..9aa68be1280 100644
--- a/java/src/IceInternal/ConnectionObserverI.java
+++ b/java/src/IceInternal/ConnectionObserverI.java
@@ -9,7 +9,8 @@
package IceInternal;
-public class ConnectionObserverI extends IceMX.Observer<IceMX.ConnectionMetrics>
+public class ConnectionObserverI
+ extends IceMX.ObserverWithDelegate<IceMX.ConnectionMetrics, Ice.Instrumentation.ConnectionObserver>
implements Ice.Instrumentation.ConnectionObserver
{
public void
@@ -17,6 +18,10 @@ public class ConnectionObserverI extends IceMX.Observer<IceMX.ConnectionMetrics>
{
_sentBytes = num;
forEach(_sentBytesUpdate);
+ if(_delegate != null)
+ {
+ _delegate.sentBytes(num);
+ }
}
public void
@@ -24,6 +29,10 @@ public class ConnectionObserverI extends IceMX.Observer<IceMX.ConnectionMetrics>
{
_receivedBytes = num;
forEach(_receivedBytesUpdate);
+ if(_delegate != null)
+ {
+ _delegate.receivedBytes(num);
+ }
}
private MetricsUpdate<IceMX.ConnectionMetrics> _sentBytesUpdate = new MetricsUpdate<IceMX.ConnectionMetrics>()
diff --git a/java/src/IceInternal/DispatchObserverI.java b/java/src/IceInternal/DispatchObserverI.java
index 97dadc19d0d..c5366c4ac69 100644
--- a/java/src/IceInternal/DispatchObserverI.java
+++ b/java/src/IceInternal/DispatchObserverI.java
@@ -9,13 +9,18 @@
package IceInternal;
-public class DispatchObserverI extends IceMX.Observer<IceMX.DispatchMetrics>
+public class DispatchObserverI
+ extends IceMX.ObserverWithDelegate<IceMX.DispatchMetrics, Ice.Instrumentation.DispatchObserver>
implements Ice.Instrumentation.DispatchObserver
{
public void
userException()
{
forEach(_userException);
+ if(_delegate != null)
+ {
+ _delegate.userException();
+ }
}
public void
@@ -29,6 +34,10 @@ public class DispatchObserverI extends IceMX.Observer<IceMX.DispatchMetrics>
v.replySize += size;
}
});
+ if(_delegate != null)
+ {
+ _delegate.reply(size);
+ }
}
final MetricsUpdate<IceMX.DispatchMetrics> _userException = new MetricsUpdate<IceMX.DispatchMetrics>()
diff --git a/java/src/IceInternal/EndpointHostResolver.java b/java/src/IceInternal/EndpointHostResolver.java
index 25f144c66a5..57ed431299d 100644
--- a/java/src/IceInternal/EndpointHostResolver.java
+++ b/java/src/IceInternal/EndpointHostResolver.java
@@ -52,7 +52,7 @@ public class EndpointHostResolver
}
}
- Ice.Instrumentation.CommunicatorObserver obsv = _instance.initializationData().observer;
+ Ice.Instrumentation.CommunicatorObserver obsv = _instance.getObserver();
Ice.Instrumentation.Observer observer = null;
if(obsv != null)
{
@@ -110,7 +110,7 @@ public class EndpointHostResolver
entry.endpoint = endpoint;
entry.callback = callback;
- Ice.Instrumentation.CommunicatorObserver obsv = _instance.initializationData().observer;
+ Ice.Instrumentation.CommunicatorObserver obsv = _instance.getObserver();
if(obsv != null)
{
entry.observer = obsv.getEndpointLookupObserver(endpoint);
@@ -240,7 +240,7 @@ public class EndpointHostResolver
synchronized public void
updateObserver()
{
- Ice.Instrumentation.CommunicatorObserver obsv = _instance.initializationData().observer;
+ Ice.Instrumentation.CommunicatorObserver obsv = _instance.getObserver();
if(obsv != null)
{
_observer = obsv.getThreadObserver("Communicator",
diff --git a/java/src/IceInternal/Incoming.java b/java/src/IceInternal/Incoming.java
index cccdfc43a33..5b76d223f8c 100644
--- a/java/src/IceInternal/Incoming.java
+++ b/java/src/IceInternal/Incoming.java
@@ -123,7 +123,7 @@ final public class Incoming extends IncomingBase implements Ice.Request
_current.ctx.put(first, second);
}
- CommunicatorObserver obsv = _instance.initializationData().observer;
+ CommunicatorObserver obsv = _instance.getObserver();
if(obsv != null)
{
// Read the parameter encapsulation size.
diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java
index 03fbc58c434..a837018cd6a 100644
--- a/java/src/IceInternal/Instance.java
+++ b/java/src/IceInternal/Instance.java
@@ -531,6 +531,13 @@ public final class Instance
return result;
}
+ public Ice.Instrumentation.CommunicatorObserver
+ getObserver()
+ {
+ return _observer; // Immutable
+ }
+
+
public synchronized void
setDefaultLocator(Ice.LocatorPrx locator)
{
@@ -817,18 +824,20 @@ public final class Instance
// Setup the communicator observer only if the user didn't already set an
// Ice observer resolver and if the admininistrative endpoints are set.
//
- if(_initData.observer == null &&
- (_adminFacetFilter.isEmpty() || _adminFacetFilter.contains("Metrics")) &&
+ if((_adminFacetFilter.isEmpty() || _adminFacetFilter.contains("Metrics")) &&
_initData.properties.getProperty("Ice.Admin.Endpoints").length() > 0)
{
- CommunicatorObserverI observer = new CommunicatorObserverI(admin);
- _initData.observer = observer;
+ _observer = new CommunicatorObserverI(admin, _initData.observer);
//
// Make sure the admin plugin receives property updates.
//
props.addUpdateCallback(admin);
}
+ else
+ {
+ _observer = _initData.observer;
+ }
}
catch(Ice.LocalException ex)
{
@@ -882,9 +891,9 @@ public final class Instance
//
// Set observer updater
//
- if(_initData.observer != null)
+ if(_observer != null)
{
- _initData.observer.setObserverUpdater(new ObserverUpdaterI(this));
+ _observer.setObserverUpdater(new ObserverUpdaterI(this));
}
//
@@ -1235,6 +1244,7 @@ public final class Instance
private final int _clientACM; // Immutable, not reset by destroy().
private final int _serverACM; // Immutable, not reset by destroy().
private final Ice.ImplicitContextI _implicitContext;
+ private final Ice.Instrumentation.CommunicatorObserver _observer;
private RouterManager _routerManager;
private LocatorManager _locatorManager;
private ReferenceFactory _referenceFactory;
diff --git a/java/src/IceInternal/InvocationObserverI.java b/java/src/IceInternal/InvocationObserverI.java
index c36b8a581c3..dd98db9df23 100644
--- a/java/src/IceInternal/InvocationObserverI.java
+++ b/java/src/IceInternal/InvocationObserverI.java
@@ -11,7 +11,8 @@ package IceInternal;
import IceMX.*;
-public class InvocationObserverI extends IceMX.Observer<IceMX.InvocationMetrics>
+public class InvocationObserverI
+ extends IceMX.ObserverWithDelegate<IceMX.InvocationMetrics, Ice.Instrumentation.InvocationObserver>
implements Ice.Instrumentation.InvocationObserver
{
static public final class RemoteInvocationHelper extends MetricsHelper<RemoteMetrics>
@@ -117,21 +118,35 @@ public class InvocationObserverI extends IceMX.Observer<IceMX.InvocationMetrics>
userException()
{
forEach(_userException);
+ if(_delegate != null)
+ {
+ _delegate.userException();
+ }
}
public void
retried()
{
forEach(_incrementRetry);
+ if(_delegate != null)
+ {
+ _delegate.retried();
+ }
}
public Ice.Instrumentation.RemoteObserver
getRemoteObserver(Ice.ConnectionInfo con, Ice.Endpoint edpt, int requestId, int sz)
{
+ Ice.Instrumentation.RemoteObserver delegate = null;
+ if(_delegate != null)
+ {
+ delegate = _delegate.getRemoteObserver(con, edpt, requestId, sz);
+ }
return (Ice.Instrumentation.RemoteObserver)getObserver("Remote",
new RemoteInvocationHelper(con, edpt, requestId, sz),
RemoteMetrics.class,
- RemoteObserverI.class);
+ RemoteObserverI.class,
+ delegate);
}
final MetricsUpdate<InvocationMetrics> _incrementRetry = new MetricsUpdate<InvocationMetrics>()
diff --git a/java/src/IceInternal/ObserverHelper.java b/java/src/IceInternal/ObserverHelper.java
index d2b2be71177..6e1514baa8f 100644
--- a/java/src/IceInternal/ObserverHelper.java
+++ b/java/src/IceInternal/ObserverHelper.java
@@ -17,7 +17,7 @@ public final class ObserverHelper
static public InvocationObserver
get(Instance instance, String op)
{
- CommunicatorObserver obsv = instance.initializationData().observer;
+ CommunicatorObserver obsv = instance.getObserver();
if(obsv != null)
{
InvocationObserver observer = obsv.getInvocationObserver(null, op, _emptyContext);
@@ -39,8 +39,7 @@ public final class ObserverHelper
static public InvocationObserver
get(Ice.ObjectPrx proxy, String op, java.util.Map<String, String> context)
{
- CommunicatorObserver obsv =
- ((Ice.ObjectPrxHelperBase)proxy).__reference().getInstance().initializationData().observer;
+ CommunicatorObserver obsv = ((Ice.ObjectPrxHelperBase)proxy).__reference().getInstance().getObserver();
if(obsv != null)
{
InvocationObserver observer;
diff --git a/java/src/IceInternal/OutgoingConnectionFactory.java b/java/src/IceInternal/OutgoingConnectionFactory.java
index 82e7c1adfe8..3bf55802f61 100644
--- a/java/src/IceInternal/OutgoingConnectionFactory.java
+++ b/java/src/IceInternal/OutgoingConnectionFactory.java
@@ -217,7 +217,7 @@ public final class OutgoingConnectionFactory
// Try to establish the connection to the connectors.
//
DefaultsAndOverrides defaultsAndOverrides = _instance.defaultsAndOverrides();
- Ice.Instrumentation.CommunicatorObserver obsv = _instance.initializationData().observer;
+ Ice.Instrumentation.CommunicatorObserver obsv = _instance.getObserver();
java.util.Iterator<ConnectorInfo> q = connectors.iterator();
ConnectorInfo ci = null;
while(q.hasNext())
@@ -1212,7 +1212,7 @@ public final class OutgoingConnectionFactory
assert(_iter.hasNext());
_current = _iter.next();
- Ice.Instrumentation.CommunicatorObserver obsv = _factory._instance.initializationData().observer;
+ Ice.Instrumentation.CommunicatorObserver obsv = _factory._instance.getObserver();
if(obsv != null)
{
_observer = obsv.getConnectionEstablishmentObserver(_current.endpoint,
diff --git a/java/src/IceInternal/RemoteObserverI.java b/java/src/IceInternal/RemoteObserverI.java
index 4ebc62e51d2..eb5b470a765 100644
--- a/java/src/IceInternal/RemoteObserverI.java
+++ b/java/src/IceInternal/RemoteObserverI.java
@@ -9,7 +9,8 @@
package IceInternal;
-public class RemoteObserverI extends IceMX.Observer<IceMX.RemoteMetrics>
+public class RemoteObserverI
+ extends IceMX.ObserverWithDelegate<IceMX.RemoteMetrics, Ice.Instrumentation.RemoteObserver>
implements Ice.Instrumentation.RemoteObserver
{
public void
@@ -23,5 +24,9 @@ public class RemoteObserverI extends IceMX.Observer<IceMX.RemoteMetrics>
v.replySize += size;
}
});
+ if(_delegate != null)
+ {
+ _delegate.reply(size);
+ }
}
} \ No newline at end of file
diff --git a/java/src/IceInternal/ThreadObserverI.java b/java/src/IceInternal/ThreadObserverI.java
index 7086618b4f7..f92784b12c1 100644
--- a/java/src/IceInternal/ThreadObserverI.java
+++ b/java/src/IceInternal/ThreadObserverI.java
@@ -9,7 +9,9 @@
package IceInternal;
-public class ThreadObserverI extends IceMX.Observer<IceMX.ThreadMetrics> implements Ice.Instrumentation.ThreadObserver
+public class ThreadObserverI
+ extends IceMX.ObserverWithDelegate<IceMX.ThreadMetrics, Ice.Instrumentation.ThreadObserver>
+ implements Ice.Instrumentation.ThreadObserver
{
public void
stateChanged(final Ice.Instrumentation.ThreadState oldState, final Ice.Instrumentation.ThreadState newState)
@@ -17,6 +19,10 @@ public class ThreadObserverI extends IceMX.Observer<IceMX.ThreadMetrics> impleme
_oldState = oldState;
_newState = newState;
forEach(_threadStateUpdate);
+ if(_delegate != null)
+ {
+ _delegate.stateChanged(oldState, newState);
+ }
}
private MetricsUpdate<IceMX.ThreadMetrics> _threadStateUpdate = new MetricsUpdate<IceMX.ThreadMetrics>()
diff --git a/java/src/IceInternal/ThreadPool.java b/java/src/IceInternal/ThreadPool.java
index 19783697d1d..b7bc1b83c50 100644
--- a/java/src/IceInternal/ThreadPool.java
+++ b/java/src/IceInternal/ThreadPool.java
@@ -622,7 +622,7 @@ public final class ThreadPool
updateObserver()
{
// Must be called with the thread pool mutex locked
- Ice.Instrumentation.CommunicatorObserver obsv = _instance.initializationData().observer;
+ Ice.Instrumentation.CommunicatorObserver obsv = _instance.getObserver();
if(obsv != null)
{
_observer = obsv.getThreadObserver(_prefix, _name, _state, _observer);
diff --git a/java/src/IceMX/ObserverFactory.java b/java/src/IceMX/ObserverFactory.java
index 9a99e7a86e1..3881877c427 100644
--- a/java/src/IceMX/ObserverFactory.java
+++ b/java/src/IceMX/ObserverFactory.java
@@ -29,14 +29,6 @@ public class ObserverFactory<T extends Metrics, O extends Observer<T>>
});
}
- public
- ObserverFactory(String name, Class<T> cl)
- {
- _name = name;
- _metrics = null;
- _class = cl;
- }
-
public void
destroy()
{
@@ -56,7 +48,14 @@ public class ObserverFactory<T extends Metrics, O extends Observer<T>>
public synchronized O
getObserver(MetricsHelper<T> helper, Object observer, Class<O> cl)
{
- O old = (O)observer;
+ O old = null;
+ try
+ {
+ old = (O)observer;
+ }
+ catch(ClassCastException ex)
+ {
+ }
java.util.List<MetricsMap<T>.Entry> metricsObjects = null;
for(MetricsMap<T> m : _maps)
{
diff --git a/java/src/IceMX/ObserverFactoryWithDelegate.java b/java/src/IceMX/ObserverFactoryWithDelegate.java
new file mode 100644
index 00000000000..e900d09df40
--- /dev/null
+++ b/java/src/IceMX/ObserverFactoryWithDelegate.java
@@ -0,0 +1,48 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2013 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 IceMX;
+
+public class ObserverFactoryWithDelegate<T extends Metrics,
+ OImpl extends ObserverWithDelegate<T, O>,
+ O extends Ice.Instrumentation.Observer>
+ extends ObserverFactory<T, OImpl>
+{
+ public
+ ObserverFactoryWithDelegate(IceInternal.MetricsAdminI metrics, String name, Class<T> cl)
+ {
+ super(metrics, name, cl);
+ }
+
+ @SuppressWarnings("unchecked")
+ public O
+ getObserver(MetricsHelper<T> helper, Class<OImpl> cl, O delegate)
+ {
+ OImpl o = super.getObserver(helper, cl);
+ if(o != null)
+ {
+ o.setDelegate(delegate);
+ return (O)o;
+ }
+ return delegate;
+ }
+
+ @SuppressWarnings("unchecked")
+ public O
+ getObserver(MetricsHelper<T> helper, Object observer, Class<OImpl> cl, O delegate)
+ {
+ OImpl o = super.getObserver(helper, observer, cl);
+ if(o != null)
+ {
+ o.setDelegate(delegate);
+ return (O)o;
+ }
+ return delegate;
+ }
+};
diff --git a/java/src/IceMX/ObserverWithDelegate.java b/java/src/IceMX/ObserverWithDelegate.java
new file mode 100644
index 00000000000..a699533e282
--- /dev/null
+++ b/java/src/IceMX/ObserverWithDelegate.java
@@ -0,0 +1,71 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2013 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 IceMX;
+
+public class ObserverWithDelegate<T extends Metrics, O extends Ice.Instrumentation.Observer> extends Observer<T>
+{
+ public void
+ attach()
+ {
+ super.attach();
+ if(_delegate != null)
+ {
+ _delegate.attach();
+ }
+ }
+
+ public void
+ detach()
+ {
+ super.detach();
+ if(_delegate != null)
+ {
+ _delegate.detach();
+ }
+ }
+
+ public void
+ failed(String exceptionName)
+ {
+ super.failed(exceptionName);
+ if(_delegate != null)
+ {
+ _delegate.failed(exceptionName);
+ }
+ }
+
+ public O
+ getDelegate()
+ {
+ return _delegate;
+ }
+
+ public void
+ setDelegate(O del)
+ {
+ _delegate = del;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <S extends Metrics, ObserverImpl extends ObserverWithDelegate<S, Obs>,
+ Obs extends Ice.Instrumentation.Observer> Obs
+ getObserver(String mapName, MetricsHelper<S> helper, Class<S> mcl, Class<ObserverImpl> ocl, Obs delegate)
+ {
+ ObserverImpl obsv = super.getObserver(mapName, helper, mcl, ocl);
+ if(obsv != null)
+ {
+ obsv.setDelegate(delegate);
+ return (Obs)obsv;
+ }
+ return delegate;
+ }
+
+ protected O _delegate;
+};
diff --git a/java/src/IceMX/ObserverI.java b/java/src/IceMX/ObserverWithDelegateI.java
index 23baf30408d..ab0c72c48ee 100644
--- a/java/src/IceMX/ObserverI.java
+++ b/java/src/IceMX/ObserverWithDelegateI.java
@@ -9,6 +9,6 @@
package IceMX;
-public class ObserverI extends Observer<Metrics>
+public class ObserverWithDelegateI extends ObserverWithDelegate<Metrics, Ice.Instrumentation.Observer>
{
};