summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2014-09-05 10:42:18 -0230
committerDwayne Boone <dwayne@zeroc.com>2014-09-05 10:42:18 -0230
commit9786853ab2d88598021aaec5c0409d3a45a50a13 (patch)
treed64858749513c529fdb84a98d8637d19f2c125e4 /java/src
parentMinor change to JS print stack traces (diff)
downloadice-9786853ab2d88598021aaec5c0409d3a45a50a13.tar.bz2
ice-9786853ab2d88598021aaec5c0409d3a45a50a13.tar.xz
ice-9786853ab2d88598021aaec5c0409d3a45a50a13.zip
ICE-4891 Refactor network tracing
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/ConnectionI.java115
-rw-r--r--java/src/IceInternal/Acceptor.java3
-rw-r--r--java/src/IceInternal/EndpointI.java22
-rw-r--r--java/src/IceInternal/IncomingConnectionFactory.java69
-rw-r--r--java/src/IceInternal/OpaqueEndpointI.java33
-rw-r--r--java/src/IceInternal/OutgoingConnectionFactory.java21
-rw-r--r--java/src/IceInternal/TcpAcceptor.java56
-rw-r--r--java/src/IceInternal/TcpConnector.java30
-rw-r--r--java/src/IceInternal/TcpEndpointI.java37
-rw-r--r--java/src/IceInternal/TcpTransceiver.java163
-rw-r--r--java/src/IceInternal/Transceiver.java2
-rw-r--r--java/src/IceInternal/UdpEndpointI.java37
-rw-r--r--java/src/IceInternal/UdpTransceiver.java176
-rw-r--r--java/src/IceInternal/WSAcceptor.java17
-rw-r--r--java/src/IceInternal/WSEndpoint.java83
-rw-r--r--java/src/IceInternal/WSTransceiver.java13
-rw-r--r--java/src/IceSSL/AcceptorI.java55
-rw-r--r--java/src/IceSSL/ConnectorI.java36
-rw-r--r--java/src/IceSSL/EndpointI.java39
-rw-r--r--java/src/IceSSL/TransceiverI.java209
20 files changed, 643 insertions, 573 deletions
diff --git a/java/src/Ice/ConnectionI.java b/java/src/Ice/ConnectionI.java
index 5cc8188ef09..29a2bd5543c 100644
--- a/java/src/Ice/ConnectionI.java
+++ b/java/src/Ice/ConnectionI.java
@@ -954,7 +954,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
java.util.List<OutgoingMessage> sentCBs = null;
MessageInfo info = null;
int dispatchCount = 0;
-
+
synchronized(this)
{
if(_state >= StateClosed)
@@ -982,7 +982,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
{
observerStartWrite(buf);
}
- writeOp = _transceiver.write(buf);
+ writeOp = write(buf);
if(_observer != null && (writeOp & IceInternal.SocketOperation.Write) == 0)
{
observerFinishWrite(buf);
@@ -997,7 +997,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
observerStartRead(buf);
}
- readOp = _transceiver.read(buf, _hasMoreData);
+ readOp = read(buf);
if((readOp & IceInternal.SocketOperation.Read) != 0)
{
break;
@@ -1392,6 +1392,33 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
public void finish()
{
+ if(!_initialized)
+ {
+ if(_instance.traceLevels().network >= 2)
+ {
+ StringBuffer s = new StringBuffer("failed to ");
+ s.append(_connector != null ? "establish" : "accept");
+ s.append(" ");
+ s.append(_endpoint.protocol());
+ s.append(" connection\n");
+ s.append(toString());
+ s.append("\n");
+ s.append(_exception);
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+ }
+ else
+ {
+ if(_instance.traceLevels().network >= 1)
+ {
+ StringBuffer s = new StringBuffer("closed ");
+ s.append(_endpoint.protocol());
+ s.append(" connection\n");
+ s.append(toString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+ }
+
if(_startCallback != null)
{
_startCallback.connectionStartFailed(this, _exception);
@@ -1448,6 +1475,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
synchronized(this)
{
setState(StateFinished);
+
if(_dispatchCount == 0)
{
reap();
@@ -1987,6 +2015,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
// initialized.
//
_desc = _transceiver.toString();
+ _initialized = true;
setState(StateNotValidated);
return true;
@@ -2022,7 +2051,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
if(_writeStream.pos() != _writeStream.size())
{
- int op = _transceiver.write(_writeStream.getBuffer());
+ int op = write(_writeStream.getBuffer());
if(op != 0)
{
scheduleTimeout(op);
@@ -2052,7 +2081,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
if(_readStream.pos() != _readStream.size())
{
- int op = _transceiver.read(_readStream.getBuffer(), _hasMoreData);
+ int op = read(_readStream.getBuffer());
if(op != 0)
{
scheduleTimeout(op);
@@ -2108,6 +2137,29 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
_readStream.pos(0);
_readHeader = true;
+ if(_instance.traceLevels().network >= 1)
+ {
+ StringBuffer s = new StringBuffer();
+ if(_endpoint.datagram())
+ {
+ s.append("starting to ");
+ s.append(_connector != null ? "send" : "receive");
+ s.append(" ");
+ s.append(_endpoint.protocol());
+ s.append(" messages\n");
+ s.append(_transceiver.toDetailedString());
+ }
+ else
+ {
+ s.append(_connector != null ? "established" : "accepted");
+ s.append(" ");
+ s.append(_endpoint.protocol());
+ s.append(" connection\n");
+ s.append(toString());
+ }
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+
return true;
}
@@ -2192,7 +2244,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
}
if(_writeStream.pos() != _writeStream.size())
{
- int op = _transceiver.write(_writeStream.getBuffer());
+ int op = write(_writeStream.getBuffer());
if(op != 0)
{
return op;
@@ -2267,7 +2319,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
{
observerStartWrite(message.stream.getBuffer());
}
- op = _transceiver.write(message.stream.getBuffer());
+ op = write(message.stream.getBuffer());
if(op == 0)
{
if(_observer != null)
@@ -2856,6 +2908,54 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
}
}
+ private int read(IceInternal.Buffer buf)
+ {
+ int start = buf.b.position();
+ int op = _transceiver.read(buf, _hasMoreData);
+ if(_instance.traceLevels().network >= 3 && buf.b.position() != start)
+ {
+ StringBuffer s = new StringBuffer("received ");
+ if(_endpoint.datagram())
+ {
+ s.append(buf.b.limit());
+ }
+ else
+ {
+ s.append(buf.b.position() - start);
+ s.append(" of ");
+ s.append(buf.b.limit() - start);
+ }
+ s.append(" bytes via ");
+ s.append(_endpoint.protocol());
+ s.append("\n");
+ s.append(toString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+ return op;
+ }
+
+ private int write(IceInternal.Buffer buf)
+ {
+ int start = buf.b.position();
+ int op = _transceiver.write(buf);
+ if(_instance.traceLevels().network >= 3 && buf.b.position() != start)
+ {
+ StringBuffer s = new StringBuffer("sent ");
+ s.append(buf.b.position() - start);
+ if(!_endpoint.datagram())
+ {
+ s.append(" of ");
+ s.append(buf.b.limit() - start);
+ }
+ s.append(" bytes via ");
+ s.append(_endpoint.protocol());
+ s.append("\n");
+ s.append(toString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+ return op;
+ }
+
private static class OutgoingMessage
{
OutgoingMessage(IceInternal.BasicStream stream, boolean compress, boolean adopt)
@@ -2977,6 +3077,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
private int _state; // The current state.
private boolean _shutdownInitiated = false;
+ private boolean _initialized = false;
private boolean _validated = false;
private IceInternal.Incoming _incomingCache;
diff --git a/java/src/IceInternal/Acceptor.java b/java/src/IceInternal/Acceptor.java
index d5910130fa2..1adc2349db7 100644
--- a/java/src/IceInternal/Acceptor.java
+++ b/java/src/IceInternal/Acceptor.java
@@ -13,9 +13,10 @@ public interface Acceptor
{
java.nio.channels.ServerSocketChannel fd();
void close();
- void listen();
+ EndpointI listen(EndpointI endp);
Transceiver accept();
String protocol();
@Override
String toString();
+ String toDetailedString();
}
diff --git a/java/src/IceInternal/EndpointI.java b/java/src/IceInternal/EndpointI.java
index 10248ba71c1..f752291c6f3 100644
--- a/java/src/IceInternal/EndpointI.java
+++ b/java/src/IceInternal/EndpointI.java
@@ -93,12 +93,9 @@ abstract public class EndpointI implements Ice.Endpoint, java.lang.Comparable<En
//
// Return a server side transceiver for this endpoint, or null if a
- // transceiver can only be created by an acceptor. In case a
- // transceiver is created, this operation also returns a new
- // "effective" endpoint, which might differ from this endpoint,
- // for example, if a dynamic port number is assigned.
+ // transceiver can only be created by an acceptor.
//
- public abstract Transceiver transceiver(EndpointIHolder endpoint);
+ public abstract Transceiver transceiver();
//
// Return connectors for this endpoint, or empty list if no connector
@@ -109,12 +106,17 @@ abstract public class EndpointI implements Ice.Endpoint, java.lang.Comparable<En
//
// Return an acceptor for this endpoint, or null if no acceptors
- // is available. In case an acceptor is created, this operation
- // also returns a new "effective" endpoint, which might differ
- // from this endpoint, for example, if a dynamic port number is
- // assigned.
+ // is available.
+ //
+ public abstract Acceptor acceptor(String adapterName);
+
+ //
+ // Return (potentially) new endpoint based on info from associated
+ // Transceiver or Acceptor, which might differ from this endpoint,
+ // for example, if a dynamic port number was assigned.
//
- public abstract Acceptor acceptor(EndpointIHolder endpoint, String adapterName);
+ public abstract EndpointI endpoint(Transceiver transceiver);
+ public abstract EndpointI endpoint(Acceptor acceptor);
//
// Expand endpoint out in to separate endpoints for each local
diff --git a/java/src/IceInternal/IncomingConnectionFactory.java b/java/src/IceInternal/IncomingConnectionFactory.java
index e0413fc1b5d..e0ecfcc2fc3 100644
--- a/java/src/IceInternal/IncomingConnectionFactory.java
+++ b/java/src/IceInternal/IncomingConnectionFactory.java
@@ -224,6 +224,15 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice
try
{
transceiver = _acceptor.accept();
+
+ if(_instance.traceLevels().network >= 2)
+ {
+ StringBuffer s = new StringBuffer("trying to accept ");
+ s.append(_endpoint.protocol());
+ s.append(" connection\n");
+ s.append(transceiver.toString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
}
catch(Ice.SocketException ex)
{
@@ -368,13 +377,19 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice
try
{
- EndpointIHolder h = new EndpointIHolder();
- h.value = _endpoint;
- _transceiver = _endpoint.transceiver(h);
-
+ _transceiver = _endpoint.transceiver();
if(_transceiver != null)
{
- _endpoint = h.value;
+ if(_instance.traceLevels().network >= 2)
+ {
+ StringBuffer s = new StringBuffer("attempting to bind to ");
+ s.append(_endpoint.protocol());
+ s.append(" socket\n");
+ s.append(_transceiver.toString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+ _endpoint = _transceiver.bind(_endpoint);
+
Ice.ConnectionI connection =
new Ice.ConnectionI(_adapter.getCommunicator(), _instance, null, _transceiver, null, _endpoint,
_adapter);
@@ -383,11 +398,29 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice
}
else
{
- h.value = _endpoint;
- _acceptor = _endpoint.acceptor(h, adapterName);
- _endpoint = h.value;
+ _acceptor = _endpoint.acceptor(adapterName);
assert(_acceptor != null);
- _acceptor.listen();
+
+ if(_instance.traceLevels().network >= 2)
+ {
+ StringBuffer s = new StringBuffer("attempting to bind to ");
+ s.append(_endpoint.protocol());
+ s.append(" socket ");
+ s.append(_acceptor.toString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+
+ _endpoint = _acceptor.listen(_endpoint);
+
+ if(_instance.traceLevels().network >= 1)
+ {
+ StringBuffer s = new StringBuffer("listening for ");
+ s.append(_endpoint.protocol());
+ s.append(" connections\n");
+ s.append(_acceptor.toDetailedString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+
((Ice.ObjectAdapterI)_adapter).getThreadPool().initialize(this);
}
}
@@ -412,7 +445,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice
{
try
{
- _acceptor.close();
+ closeAcceptor();
}
catch(Ice.LocalException e)
{
@@ -548,7 +581,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice
assert(_state == StateClosed);
if(_acceptor != null)
{
- _acceptor.close();
+ closeAcceptor();
}
break;
}
@@ -559,6 +592,20 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice
}
private void
+ closeAcceptor()
+ {
+ if(_instance.traceLevels().network >= 1)
+ {
+ StringBuffer s = new StringBuffer("stopping to accept ");
+ s.append(_endpoint.protocol());
+ s.append(" connections at ");
+ s.append(_acceptor.toString());
+ _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
+ }
+ _acceptor.close();
+ }
+
+ private void
warning(Ice.LocalException ex)
{
String s = "connection exception:\n" + Ex.toString(ex) + '\n' + _acceptor.toString();
diff --git a/java/src/IceInternal/OpaqueEndpointI.java b/java/src/IceInternal/OpaqueEndpointI.java
index b14beda4036..8932c41c7de 100644
--- a/java/src/IceInternal/OpaqueEndpointI.java
+++ b/java/src/IceInternal/OpaqueEndpointI.java
@@ -175,15 +175,11 @@ final class OpaqueEndpointI extends EndpointI
//
// Return a server side transceiver for this endpoint, or null if a
- // transceiver can only be created by an acceptor. In case a
- // transceiver is created, this operation also returns a new
- // "effective" endpoint, which might differ from this endpoint,
- // for example, if a dynamic port number is assigned.
+ // transceiver can only be created by an acceptor.d.
//
@Override
- public Transceiver transceiver(EndpointIHolder endpoint)
+ public Transceiver transceiver()
{
- endpoint.value = null;
return null;
}
@@ -205,15 +201,28 @@ final class OpaqueEndpointI extends EndpointI
//
// Return an acceptor for this endpoint, or null if no acceptors
- // is available. In case an acceptor is created, this operation
- // also returns a new "effective" endpoint, which might differ
- // from this endpoint, for example, if a dynamic port number is
- // assigned.
+ // is available.
+ //
+ @Override
+ public Acceptor acceptor(String adapterName)
+ {
+ return null;
+ }
+
//
+ // Return (potentially) new endpoint based on info from associated
+ // Transceiver or Acceptor, which might differ from this endpoint,
+ // for example, if a dynamic port number was assigned.
+ //
+ @Override
+ public EndpointI endpoint(Transceiver transceiver)
+ {
+ return null;
+ }
+
@Override
- public Acceptor acceptor(EndpointIHolder endpoint, String adapterName)
+ public EndpointI endpoint(Acceptor acceptor)
{
- endpoint.value = null;
return null;
}
diff --git a/java/src/IceInternal/OutgoingConnectionFactory.java b/java/src/IceInternal/OutgoingConnectionFactory.java
index 3629661e533..773d735faff 100644
--- a/java/src/IceInternal/OutgoingConnectionFactory.java
+++ b/java/src/IceInternal/OutgoingConnectionFactory.java
@@ -1082,11 +1082,32 @@ public final class OutgoingConnectionFactory
}
}
+ if(_factory._instance.traceLevels().network >= 2)
+ {
+ StringBuffer s = new StringBuffer("trying to establish ");
+ s.append(_current.endpoint.protocol());
+ s.append(" connection to ");
+ s.append(_current.connector.toString());
+ _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat,
+ s.toString());
+ }
+
connection = _factory.createConnection(_current.connector.connect(), _current);
connection.start(this);
}
catch(Ice.LocalException ex)
{
+ if(_factory._instance.traceLevels().network >= 2)
+ {
+ StringBuffer s = new StringBuffer("failed to establish ");
+ s.append(_current.endpoint.protocol());
+ s.append(" connection to ");
+ s.append(_current.connector.toString());
+ s.append(ex);
+ _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat,
+ s.toString());
+ }
+
connectionStartFailed(connection, ex);
}
}
diff --git a/java/src/IceInternal/TcpAcceptor.java b/java/src/IceInternal/TcpAcceptor.java
index 84c025301dd..ff5d5b918c1 100644
--- a/java/src/IceInternal/TcpAcceptor.java
+++ b/java/src/IceInternal/TcpAcceptor.java
@@ -20,37 +20,16 @@ class TcpAcceptor implements Acceptor
@Override
public void close()
{
- if(_instance.traceLevel() >= 1)
- {
- String s = "stopping to accept " + protocol() + " connections at " + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
assert(_fd != null);
Network.closeSocketNoThrow(_fd);
_fd = null;
}
@Override
- public void listen()
+ public EndpointI listen(EndpointI endp)
{
- // Nothing to do.
-
- if(_instance.traceLevel() >= 1)
- {
- StringBuffer s = new StringBuffer("listening for " + protocol() + " connections at ");
- s.append(toString());
-
- java.util.List<String> interfaces =
- Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), _instance.protocolSupport(),
- true);
- if(!interfaces.isEmpty())
- {
- s.append("\nlocal interfaces: ");
- s.append(IceUtilInternal.StringUtil.joinString(interfaces, ", "));
- }
- _instance.logger().trace(_instance.traceCategory(), s.toString());
- }
+ _addr = Network.doBind(_fd, _addr, _backlog);
+ return endp.endpoint(this);
}
@Override
@@ -59,13 +38,6 @@ class TcpAcceptor implements Acceptor
java.nio.channels.SocketChannel fd = Network.doAccept(_fd);
Network.setBlock(fd, false);
Network.setTcpBufSize(fd, _instance.properties(), _instance.logger());
-
- if(_instance.traceLevel() >= 1)
- {
- String s = "accepted " + protocol() + " connection\n" + Network.fdToString(fd);
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
return new TcpTransceiver(_instance, fd);
}
@@ -81,6 +53,22 @@ class TcpAcceptor implements Acceptor
return Network.addrToString(_addr);
}
+ @Override
+ public String toDetailedString()
+ {
+ StringBuffer s = new StringBuffer("local address = ");
+ s.append(toString());
+
+ java.util.List<String> intfs =
+ Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), _instance.protocolSupport(), true);
+ if(!intfs.isEmpty())
+ {
+ s.append("\nlocal interfaces = ");
+ s.append(IceUtilInternal.StringUtil.joinString(intfs, ", "));
+ }
+ return s.toString();
+ }
+
int effectivePort()
{
return _addr.getPort();
@@ -114,12 +102,6 @@ class TcpAcceptor implements Acceptor
}
_addr = Network.getAddressForServer(host, port, instance.protocolSupport(), instance.preferIPv6());
- if(instance.traceLevel() >= 2)
- {
- String s = "attempting to bind to " + protocol() + " socket " + toString();
- instance.logger().trace(instance.traceCategory(), s);
- }
- _addr = Network.doBind(_fd, _addr, _backlog);
}
catch(RuntimeException ex)
{
diff --git a/java/src/IceInternal/TcpConnector.java b/java/src/IceInternal/TcpConnector.java
index f8fca6619ba..0ace406c1e8 100644
--- a/java/src/IceInternal/TcpConnector.java
+++ b/java/src/IceInternal/TcpConnector.java
@@ -14,30 +14,12 @@ final class TcpConnector implements Connector
@Override
public Transceiver connect()
{
- if(_instance.traceLevel() >= 2)
- {
- String s = "trying to establish " + _instance.protocol() + " connection to " + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
- try
- {
- java.nio.channels.SocketChannel fd = Network.createTcpSocket();
- Network.setBlock(fd, false);
- Network.setTcpBufSize(fd, _instance.properties(), _instance.logger());
- final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr;
- Network.doConnect(fd, addr, _sourceAddr);
- return new TcpTransceiver(_instance, fd, _proxy, _addr);
- }
- catch(Ice.LocalException ex)
- {
- if(_instance.traceLevel() >= 2)
- {
- String s = "failed to establish " + _instance.protocol() + " connection to " + toString() + "\n" + ex;
- _instance.logger().trace(_instance.traceCategory(), s);
- }
- throw ex;
- }
+ java.nio.channels.SocketChannel fd = Network.createTcpSocket();
+ Network.setBlock(fd, false);
+ Network.setTcpBufSize(fd, _instance.properties(), _instance.logger());
+ final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr;
+ Network.doConnect(fd, addr, _sourceAddr);
+ return new TcpTransceiver(_instance, fd, _proxy, _addr);
}
@Override
diff --git a/java/src/IceInternal/TcpEndpointI.java b/java/src/IceInternal/TcpEndpointI.java
index f002f0f4101..9678e59803d 100644
--- a/java/src/IceInternal/TcpEndpointI.java
+++ b/java/src/IceInternal/TcpEndpointI.java
@@ -140,31 +140,40 @@ final class TcpEndpointI extends IPEndpointI
//
// Return a server side transceiver for this endpoint, or null if a
- // transceiver can only be created by an acceptor. In case a
- // transceiver is created, this operation also returns a new
- // "effective" endpoint, which might differ from this endpoint,
- // for example, if a dynamic port number is assigned.
+ // transceiver can only be created by an acceptor.
//
@Override
- public Transceiver transceiver(EndpointIHolder endpoint)
+ public Transceiver transceiver()
{
- endpoint.value = this;
return null;
}
//
// Return an acceptor for this endpoint, or null if no acceptors
- // is available. In case an acceptor is created, this operation
- // also returns a new "effective" endpoint, which might differ
- // from this endpoint, for example, if a dynamic port number is
- // assigned.
+ // is available.
//
@Override
- public Acceptor acceptor(EndpointIHolder endpoint, String adapterName)
+ public Acceptor acceptor(String adapterName)
{
- TcpAcceptor p = new TcpAcceptor(_instance, _host, _port);
- endpoint.value = createEndpoint(_host, p.effectivePort(), _connectionId);
- return p;
+ return new TcpAcceptor(_instance, _host, _port);
+ }
+
+ //
+ // Return (potentially) new endpoint based on info from associated
+ // Transceiver or Acceptor, which might differ from this endpoint,
+ // for example, if a dynamic port number was assigned.
+ //
+ @Override
+ public EndpointI endpoint(Transceiver transceiver)
+ {
+ return this;
+ }
+
+ @Override
+ public EndpointI endpoint(Acceptor acceptor)
+ {
+ TcpAcceptor p = (TcpAcceptor)acceptor;
+ return createEndpoint(_host, p.effectivePort(), _connectionId);
}
@Override
diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java
index ebbdfdfd1de..4d1c5577900 100644
--- a/java/src/IceInternal/TcpTransceiver.java
+++ b/java/src/IceInternal/TcpTransceiver.java
@@ -21,103 +21,84 @@ final class TcpTransceiver implements Transceiver
@Override
public int initialize(Buffer readBuffer, Buffer writeBuffer, Ice.Holder<Boolean> moreData)
{
- try
+ if(_state == StateNeedConnect)
{
- if(_state == StateNeedConnect)
- {
- _state = StateConnectPending;
- return SocketOperation.Connect;
- }
- else if(_state <= StateConnectPending)
+ _state = StateConnectPending;
+ return SocketOperation.Connect;
+ }
+ else if(_state <= StateConnectPending)
+ {
+ Network.doFinishConnect(_fd);
+ _desc = Network.fdToString(_fd, _proxy, _addr);
+
+ if(_proxy != null)
{
- Network.doFinishConnect(_fd);
- _desc = Network.fdToString(_fd, _proxy, _addr);
+ //
+ // Prepare the read & write buffers in advance.
+ //
+ _proxy.beginWriteConnectRequest(_addr, writeBuffer);
+ _proxy.beginReadConnectRequestResponse(readBuffer);
- if(_proxy != null)
+ //
+ // Write the proxy connection message.
+ //
+ if(write(writeBuffer) == SocketOperation.None)
{
//
- // Prepare the read & write buffers in advance.
+ // Write completed without blocking.
//
- _proxy.beginWriteConnectRequest(_addr, writeBuffer);
- _proxy.beginReadConnectRequestResponse(readBuffer);
+ _proxy.endWriteConnectRequest(writeBuffer);
//
- // Write the proxy connection message.
+ // Try to read the response.
//
- if(write(writeBuffer) == SocketOperation.None)
+ if(read(readBuffer, moreData) == SocketOperation.None)
{
//
- // Write completed without blocking.
- //
- _proxy.endWriteConnectRequest(writeBuffer);
-
+ // Read completed without blocking - fall through.
//
- // Try to read the response.
- //
- if(read(readBuffer, moreData) == SocketOperation.None)
- {
- //
- // Read completed without blocking - fall through.
- //
- _proxy.endReadConnectRequestResponse(readBuffer);
- }
- else
- {
- //
- // Return SocketOperationRead to indicate we need to complete the read.
- //
- _state = StateProxyConnectRequestPending; // Wait for proxy response
- return SocketOperation.Read;
- }
+ _proxy.endReadConnectRequestResponse(readBuffer);
}
else
{
//
- // Return SocketOperationWrite to indicate we need to complete the write.
+ // Return SocketOperationRead to indicate we need to complete the read.
//
- _state = StateProxyConnectRequest; // Send proxy connect request
- return SocketOperation.Write;
+ _state = StateProxyConnectRequestPending; // Wait for proxy response
+ return SocketOperation.Read;
}
}
-
- _state = StateConnected;
- }
- else if(_state == StateProxyConnectRequest)
- {
- //
- // Write completed.
- //
- _proxy.endWriteConnectRequest(writeBuffer);
- _state = StateProxyConnectRequestPending; // Wait for proxy response
- return SocketOperation.Read;
- }
- else if(_state == StateProxyConnectRequestPending)
- {
- //
- // Read completed.
- //
- _proxy.endReadConnectRequestResponse(readBuffer);
- _state = StateConnected;
+ else
+ {
+ //
+ // Return SocketOperationWrite to indicate we need to complete the write.
+ //
+ _state = StateProxyConnectRequest; // Send proxy connect request
+ return SocketOperation.Write;
+ }
}
+
+ _state = StateConnected;
}
- catch(Ice.LocalException ex)
+ else if(_state == StateProxyConnectRequest)
{
- if(_instance.traceLevel() >= 2)
- {
- StringBuilder s = new StringBuilder(128);
- s.append("failed to establish " + _instance.protocol() + " connection\n");
- s.append(Network.fdToString(_fd, _proxy, _addr));
- _instance.logger().trace(_instance.traceCategory(), s.toString());
- }
- throw ex;
+ //
+ // Write completed.
+ //
+ _proxy.endWriteConnectRequest(writeBuffer);
+ _state = StateProxyConnectRequestPending; // Wait for proxy response
+ return SocketOperation.Read;
}
-
- assert(_state == StateConnected);
- if(_instance.traceLevel() >= 1)
+ else if(_state == StateProxyConnectRequestPending)
{
- String s = _instance.protocol() + " connection established\n" + _desc;
- _instance.logger().trace(_instance.traceCategory(), s);
+ //
+ // Read completed.
+ //
+ _proxy.endReadConnectRequestResponse(readBuffer);
+ _state = StateConnected;
}
+
+ assert(_state == StateConnected);
return SocketOperation.None;
}
@@ -132,12 +113,6 @@ final class TcpTransceiver implements Transceiver
@Override
public void close()
{
- if(_state == StateConnected && _instance.traceLevel() >= 1)
- {
- String s = "closing " + _instance.protocol() + " connection\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
assert(_fd != null);
try
{
@@ -154,6 +129,13 @@ final class TcpTransceiver implements Transceiver
}
@Override
+ public EndpointI bind(EndpointI endp)
+ {
+ assert(false);
+ return null;
+ }
+
+ @Override
public int write(Buffer buf)
{
final int size = buf.b.limit();
@@ -207,13 +189,6 @@ final class TcpTransceiver implements Transceiver
return SocketOperation.Write;
}
- if(_instance.traceLevel() >= 3)
- {
- String s = "sent " + ret + " of " + packetSize + " bytes via " + _instance.protocol() + "\n" +
- toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
if(packetSize == _maxSendPacketSize)
{
assert(buf.b.position() == buf.b.limit());
@@ -264,16 +239,6 @@ final class TcpTransceiver implements Transceiver
return SocketOperation.Read;
}
- if(ret > 0)
- {
- if(_instance.traceLevel() >= 3)
- {
- String s = "received " + ret + " of " + packetSize + " bytes via " + _instance.protocol() +
- "\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
- }
-
packetSize = buf.b.remaining();
}
catch(java.io.InterruptedIOException ex)
@@ -302,6 +267,12 @@ final class TcpTransceiver implements Transceiver
}
@Override
+ public String toDetailedString()
+ {
+ return toString();
+ }
+
+ @Override
public Ice.ConnectionInfo getInfo()
{
Ice.TCPConnectionInfo info = new Ice.TCPConnectionInfo();
@@ -336,7 +307,7 @@ final class TcpTransceiver implements Transceiver
_proxy = proxy;
_addr = addr;
_state = StateNeedConnect;
- _desc = "";
+ _desc = Network.fdToString(_fd, _proxy, _addr);;
_maxSendPacketSize = 0;
if(System.getProperty("os.name").startsWith("Windows"))
diff --git a/java/src/IceInternal/Transceiver.java b/java/src/IceInternal/Transceiver.java
index dfc4522fb74..c7c1fbd3a71 100644
--- a/java/src/IceInternal/Transceiver.java
+++ b/java/src/IceInternal/Transceiver.java
@@ -17,12 +17,14 @@ public interface Transceiver
int closing(boolean initiator, Ice.LocalException ex);
void close();
+ EndpointI bind(EndpointI endp);
int write(Buffer buf);
int read(Buffer buf, Ice.Holder<Boolean> moreData);
String protocol();
@Override
String toString();
+ String toDetailedString();
Ice.ConnectionInfo getInfo();
void checkSendSize(Buffer buf, int messageSizeMax);
}
diff --git a/java/src/IceInternal/UdpEndpointI.java b/java/src/IceInternal/UdpEndpointI.java
index 44cb3b6988a..b5bab1f3bfb 100644
--- a/java/src/IceInternal/UdpEndpointI.java
+++ b/java/src/IceInternal/UdpEndpointI.java
@@ -145,34 +145,43 @@ final class UdpEndpointI extends IPEndpointI
//
// Return a server side transceiver for this endpoint, or null if a
- // transceiver can only be created by an acceptor. In case a
- // transceiver is created, this operation also returns a new
- // "effective" endpoint, which might differ from this endpoint,
- // for example, if a dynamic port number is assigned.
+ // transceiver can only be created by an acceptor.
//
@Override
- public Transceiver transceiver(EndpointIHolder endpoint)
+ public Transceiver transceiver()
{
- UdpTransceiver p = new UdpTransceiver(_instance, _host, _port, _mcastInterface, _connect);
- endpoint.value = createEndpoint(_host, p.effectivePort(), _connectionId);
- return p;
+ return new UdpTransceiver(_instance, _host, _port, _mcastInterface, _connect);
}
//
// Return an acceptor for this endpoint, or null if no acceptors
- // is available. In case an acceptor is created, this operation
- // also returns a new "effective" endpoint, which might differ
- // from this endpoint, for example, if a dynamic port number is
- // assigned.
+ // is available.
//
@Override
- public Acceptor acceptor(EndpointIHolder endpoint, String adapterName)
+ public Acceptor acceptor(String adapterName)
{
- endpoint.value = this;
return null;
}
//
+ // Return (potentially) new endpoint based on info from associated
+ // Transceiver or Acceptor, which might differ from this endpoint,
+ // for example, if a dynamic port number was assigned.
+ //
+ @Override
+ public EndpointI endpoint(Transceiver transceiver)
+ {
+ UdpTransceiver p = (UdpTransceiver)transceiver;
+ return createEndpoint(_host, p.effectivePort(), _connectionId);
+ }
+
+ @Override
+ public EndpointI endpoint(Acceptor acceptor)
+ {
+ return this;
+ }
+
+ //
// Convert the endpoint to its string form
//
@Override
diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java
index 19450b7200d..0ac66b0a366 100644
--- a/java/src/IceInternal/UdpTransceiver.java
+++ b/java/src/IceInternal/UdpTransceiver.java
@@ -41,12 +41,6 @@ final class UdpTransceiver implements Transceiver
{
assert(_fd != null);
- if(_state >= StateConnected && _instance.traceLevel() >= 1)
- {
- String s = "closing " + _instance.protocol() + " connection\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
try
{
_fd.close();
@@ -58,6 +52,61 @@ final class UdpTransceiver implements Transceiver
}
@Override
+ public EndpointI bind(EndpointI endp)
+ {
+ if(_addr.getAddress().isMulticastAddress())
+ {
+ Network.setReuseAddress(_fd, true);
+ _mcastAddr = _addr;
+ if(System.getProperty("os.name").startsWith("Windows") ||
+ System.getProperty("java.vm.name").startsWith("OpenJDK"))
+ {
+ //
+ // Windows does not allow binding to the mcast address itself
+ // so we bind to INADDR_ANY (0.0.0.0) instead. As a result,
+ // bi-directional connection won't work because the source
+ // address won't be the multicast address and the client will
+ // therefore reject the datagram.
+ //
+ int protocol =
+ _mcastAddr.getAddress().getAddress().length == 4 ? Network.EnableIPv4 : Network.EnableIPv6;
+ _addr = Network.getAddressForServer("", _port, protocol, _instance.preferIPv6());
+ }
+ _addr = Network.doBind(_fd, _addr);
+ configureMulticast(_mcastAddr, _mcastInterface, -1);
+
+ if(_port == 0)
+ {
+ _mcastAddr = new java.net.InetSocketAddress(_mcastAddr.getAddress(), _addr.getPort());
+ }
+ }
+ else
+ {
+ if(!System.getProperty("os.name").startsWith("Windows"))
+ {
+ //
+ // Enable SO_REUSEADDR on Unix platforms to allow
+ // re-using the socket even if it's in the TIME_WAIT
+ // state. On Windows, this doesn't appear to be
+ // necessary and enabling SO_REUSEADDR would actually
+ // not be a good thing since it allows a second
+ // process to bind to an address even it's already
+ // bound by another process.
+ //
+ // TODO: using SO_EXCLUSIVEADDRUSE on Windows would
+ // probably be better but it's only supported by recent
+ // Windows versions (XP SP2, Windows Server 2003).
+ //
+ Network.setReuseAddress(_fd, true);
+ }
+ _addr = Network.doBind(_fd, _addr);
+ }
+
+ _bound = true;
+ return endp.endpoint(this);
+ }
+
+ @Override
public int write(Buffer buf)
{
//
@@ -123,13 +172,8 @@ final class UdpTransceiver implements Transceiver
return SocketOperation.Write;
}
- if(_instance.traceLevel() >= 3)
- {
- String s = "sent " + ret + " bytes via " + _instance.protocol() + "\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
assert(ret == buf.b.limit());
+ buf.b.position(buf.b.limit());
return SocketOperation.None;
}
@@ -195,12 +239,6 @@ final class UdpTransceiver implements Transceiver
}
}
- if(_instance.traceLevel() >= 3)
- {
- String s = "received " + ret + " bytes via " + _instance.protocol() + "\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
buf.resize(ret, true);
buf.b.position(ret);
@@ -222,7 +260,11 @@ final class UdpTransceiver implements Transceiver
}
String s;
- if(_state == StateNotConnected)
+ if(_incoming && !_bound)
+ {
+ s = "local address = " + Network.addrToString(_addr);
+ }
+ else if(_state == StateNotConnected)
{
java.net.DatagramSocket socket = _fd.socket();
s = "local address = " + Network.addrToString((java.net.InetSocketAddress)socket.getLocalSocketAddress());
@@ -244,6 +286,20 @@ final class UdpTransceiver implements Transceiver
}
@Override
+ public String toDetailedString()
+ {
+ StringBuffer s = new StringBuffer(toString());
+ java.util.List<String> intfs =
+ Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), _instance.protocolSupport(), true);
+ if(!intfs.isEmpty())
+ {
+ s.append("\nlocal interfaces = ");
+ s.append(IceUtilInternal.StringUtil.joinString(intfs, ", "));
+ }
+ return s.toString();
+ }
+
+ @Override
public Ice.ConnectionInfo getInfo()
{
Ice.UDPConnectionInfo info = new Ice.UDPConnectionInfo();
@@ -326,12 +382,6 @@ final class UdpTransceiver implements Transceiver
}
Network.doConnect(_fd, _addr, sourceAddr);
_state = StateConnected; // We're connected now
-
- if(_instance.traceLevel() >= 1)
- {
- String s = "starting to send " + _instance.protocol() + " packets\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
}
catch(Ice.LocalException ex)
{
@@ -347,6 +397,9 @@ final class UdpTransceiver implements Transceiver
{
_instance = instance;
_state = connect ? StateNeedConnect : StateNotConnected;
+ _mcastInterface = mcastInterface;
+ _incoming = true;
+ _port = port;
try
{
@@ -354,74 +407,6 @@ final class UdpTransceiver implements Transceiver
_fd = Network.createUdpSocket(_addr);
setBufSize(instance.properties());
Network.setBlock(_fd, false);
- if(_instance.traceLevel() >= 2)
- {
- String s = "attempting to bind to " + _instance.protocol() + " socket " + Network.addrToString(_addr);
- _instance.logger().trace(_instance.traceCategory(), s);
- }
- if(_addr.getAddress().isMulticastAddress())
- {
- Network.setReuseAddress(_fd, true);
- _mcastAddr = _addr;
- if(System.getProperty("os.name").startsWith("Windows") ||
- System.getProperty("java.vm.name").startsWith("OpenJDK"))
- {
- //
- // Windows does not allow binding to the mcast address itself
- // so we bind to INADDR_ANY (0.0.0.0) instead. As a result,
- // bi-directional connection won't work because the source
- // address won't be the multicast address and the client will
- // therefore reject the datagram.
- //
- int protocol =
- _mcastAddr.getAddress().getAddress().length == 4 ? Network.EnableIPv4 : Network.EnableIPv6;
- _addr = Network.getAddressForServer("", port, protocol, instance.preferIPv6());
- }
- _addr = Network.doBind(_fd, _addr);
- configureMulticast(_mcastAddr, mcastInterface, -1);
-
- if(port == 0)
- {
- _mcastAddr = new java.net.InetSocketAddress(_mcastAddr.getAddress(), _addr.getPort());
- }
- }
- else
- {
- if(!System.getProperty("os.name").startsWith("Windows"))
- {
- //
- // Enable SO_REUSEADDR on Unix platforms to allow
- // re-using the socket even if it's in the TIME_WAIT
- // state. On Windows, this doesn't appear to be
- // necessary and enabling SO_REUSEADDR would actually
- // not be a good thing since it allows a second
- // process to bind to an address even it's already
- // bound by another process.
- //
- // TODO: using SO_EXCLUSIVEADDRUSE on Windows would
- // probably be better but it's only supported by recent
- // Windows versions (XP SP2, Windows Server 2003).
- //
- Network.setReuseAddress(_fd, true);
- }
- _addr = Network.doBind(_fd, _addr);
- }
-
- if(_instance.traceLevel() >= 1)
- {
- StringBuffer s = new StringBuffer("starting to receive " + _instance.protocol() + " packets\n");
- s.append(toString());
-
- java.util.List<String> interfaces =
- Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), instance.protocolSupport(),
- true);
- if(!interfaces.isEmpty())
- {
- s.append("\nlocal interfaces: ");
- s.append(IceUtilInternal.StringUtil.joinString(interfaces, ", "));
- }
- _instance.logger().trace(_instance.traceCategory(), s.toString());
- }
}
catch(Ice.LocalException ex)
{
@@ -624,8 +609,13 @@ final class UdpTransceiver implements Transceiver
private java.nio.channels.DatagramChannel _fd;
private java.net.InetSocketAddress _addr;
private java.net.InetSocketAddress _mcastAddr = null;
+ private String _mcastInterface;
private java.net.InetSocketAddress _peerAddr = null;
+ private boolean _incoming = false;
+ private int _port = 0;
+ private boolean _bound = false;
+
//
// The maximum IP datagram size is 65535. Subtract 20 bytes for the IP header and 8 bytes for the UDP header
// to get the maximum payload.
diff --git a/java/src/IceInternal/WSAcceptor.java b/java/src/IceInternal/WSAcceptor.java
index 4888fd7072b..65ef46623fb 100644
--- a/java/src/IceInternal/WSAcceptor.java
+++ b/java/src/IceInternal/WSAcceptor.java
@@ -24,9 +24,11 @@ final class WSAcceptor implements IceInternal.Acceptor
}
@Override
- public void listen()
+ public EndpointI listen(EndpointI endp)
{
- _delegate.listen();
+ WSEndpoint p = (WSEndpoint)endp;
+ EndpointI endpoint = _delegate.listen(p.delegate());
+ return endp.endpoint(this);
}
@Override
@@ -51,6 +53,17 @@ final class WSAcceptor implements IceInternal.Acceptor
return _delegate.toString();
}
+ @Override
+ public String toDetailedString()
+ {
+ return _delegate.toDetailedString();
+ }
+
+ public Acceptor delegate()
+ {
+ return _delegate;
+ }
+
WSAcceptor(ProtocolInstance instance, IceInternal.Acceptor del)
{
_instance = instance;
diff --git a/java/src/IceInternal/WSEndpoint.java b/java/src/IceInternal/WSEndpoint.java
index 59c4e795cb5..7170d68e252 100644
--- a/java/src/IceInternal/WSEndpoint.java
+++ b/java/src/IceInternal/WSEndpoint.java
@@ -11,17 +11,17 @@ package IceInternal;
final class WSEndpoint extends IceInternal.EndpointI
{
- public WSEndpoint(ProtocolInstance instance, IceInternal.EndpointI del, String res)
+ public WSEndpoint(ProtocolInstance instance, EndpointI del, String res)
{
_instance = instance;
- _delegate = (IceInternal.IPEndpointI)del;
+ _delegate = (IPEndpointI)del;
_resource = res;
}
- public WSEndpoint(ProtocolInstance instance, IceInternal.EndpointI del, java.util.ArrayList<String> args)
+ public WSEndpoint(ProtocolInstance instance, EndpointI del, java.util.ArrayList<String> args)
{
_instance = instance;
- _delegate = (IceInternal.IPEndpointI)del;
+ _delegate = (IPEndpointI)del;
initWithOptions(args);
@@ -31,10 +31,10 @@ final class WSEndpoint extends IceInternal.EndpointI
}
}
- public WSEndpoint(ProtocolInstance instance, IceInternal.EndpointI del, IceInternal.BasicStream s)
+ public WSEndpoint(ProtocolInstance instance, EndpointI del, BasicStream s)
{
_instance = instance;
- _delegate = (IceInternal.IPEndpointI)del;
+ _delegate = (IPEndpointI)del;
_resource = s.readString();
}
@@ -83,7 +83,7 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public void streamWrite(IceInternal.BasicStream s)
+ public void streamWrite(BasicStream s)
{
s.startWriteEncaps();
_delegate.streamWriteImpl(s);
@@ -98,7 +98,7 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public IceInternal.EndpointI timeout(int timeout)
+ public EndpointI timeout(int timeout)
{
if(timeout == _delegate.timeout())
{
@@ -117,7 +117,7 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public IceInternal.EndpointI connectionId(String connectionId)
+ public EndpointI connectionId(String connectionId)
{
if(connectionId.equals(_delegate.connectionId()))
{
@@ -136,7 +136,7 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public IceInternal.EndpointI compress(boolean compress)
+ public EndpointI compress(boolean compress)
{
if(compress == _delegate.compress())
{
@@ -161,18 +161,17 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public IceInternal.Transceiver transceiver(IceInternal.EndpointIHolder endpoint)
+ public Transceiver transceiver()
{
- endpoint.value = this;
return null;
}
@Override
- public java.util.List<IceInternal.Connector> connectors(Ice.EndpointSelectionType selType)
+ public java.util.List<Connector> connectors(Ice.EndpointSelectionType selType)
{
- java.util.List<IceInternal.Connector> connectors = _delegate.connectors(selType);
- java.util.List<IceInternal.Connector> l = new java.util.ArrayList<IceInternal.Connector>();
- for(IceInternal.Connector c : connectors)
+ java.util.List<Connector> connectors = _delegate.connectors(selType);
+ java.util.List<Connector> l = new java.util.ArrayList<Connector>();
+ for(Connector c : connectors)
{
l.add(new WSConnector(_instance, c, _delegate.host(), _delegate.port(), _resource));
}
@@ -180,15 +179,15 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public void connectors_async(Ice.EndpointSelectionType selType, final IceInternal.EndpointI_connectors callback)
+ public void connectors_async(Ice.EndpointSelectionType selType, final EndpointI_connectors callback)
{
- IceInternal.EndpointI_connectors cb = new IceInternal.EndpointI_connectors()
+ EndpointI_connectors cb = new EndpointI_connectors()
{
@Override
- public void connectors(java.util.List<IceInternal.Connector> connectors)
+ public void connectors(java.util.List<Connector> connectors)
{
- java.util.List<IceInternal.Connector> l = new java.util.ArrayList<IceInternal.Connector>();
- for(IceInternal.Connector c : connectors)
+ java.util.List<Connector> l = new java.util.ArrayList<Connector>();
+ for(Connector c : connectors)
{
l.add(new WSConnector(_instance, c, _delegate.host(), _delegate.port(), _resource));
}
@@ -205,23 +204,32 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public IceInternal.Acceptor acceptor(IceInternal.EndpointIHolder endpoint, String adapterName)
+ public Acceptor acceptor(String adapterName)
{
- IceInternal.EndpointIHolder delEndp = new IceInternal.EndpointIHolder();
- IceInternal.Acceptor delAcc = _delegate.acceptor(delEndp, adapterName);
- if(delEndp.value != null)
- {
- endpoint.value = new WSEndpoint(_instance, delEndp.value, _resource);
- }
+ Acceptor delAcc = _delegate.acceptor(adapterName);
return new WSAcceptor(_instance, delAcc);
}
@Override
- public java.util.List<IceInternal.EndpointI> expand()
+ public EndpointI endpoint(Transceiver transceiver)
{
- java.util.List<IceInternal.EndpointI> endps = _delegate.expand();
- java.util.List<IceInternal.EndpointI> l = new java.util.ArrayList<IceInternal.EndpointI>();
- for(IceInternal.EndpointI e : endps)
+ return this;
+ }
+
+ @Override
+ public EndpointI endpoint(Acceptor acceptor)
+ {
+ WSAcceptor p = (WSAcceptor)acceptor;
+ EndpointI delEndp = _delegate.endpoint(p.delegate());
+ return new WSEndpoint(_instance, delEndp, _resource);
+ }
+
+ @Override
+ public java.util.List<EndpointI> expand()
+ {
+ java.util.List<EndpointI> endps = _delegate.expand();
+ java.util.List<EndpointI> l = new java.util.ArrayList<EndpointI>();
+ for(EndpointI e : endps)
{
l.add(e == _delegate ? this : new WSEndpoint(_instance, e, _resource));
}
@@ -229,7 +237,7 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public boolean equivalent(IceInternal.EndpointI endpoint)
+ public boolean equivalent(EndpointI endpoint)
{
if(!(endpoint instanceof WSEndpoint))
{
@@ -278,7 +286,7 @@ final class WSEndpoint extends IceInternal.EndpointI
}
@Override
- public int compareTo(IceInternal.EndpointI obj) // From java.lang.Comparable
+ public int compareTo(EndpointI obj) // From java.lang.Comparable
{
if(!(obj instanceof WSEndpoint))
{
@@ -300,6 +308,11 @@ final class WSEndpoint extends IceInternal.EndpointI
return _delegate.compareTo(p._delegate);
}
+ public EndpointI delegate()
+ {
+ return _delegate;
+ }
+
@Override
protected boolean checkOption(String option, String argument, String endpoint)
{
@@ -324,6 +337,6 @@ final class WSEndpoint extends IceInternal.EndpointI
}
private ProtocolInstance _instance;
- private IceInternal.IPEndpointI _delegate;
+ private IPEndpointI _delegate;
private String _resource;
}
diff --git a/java/src/IceInternal/WSTransceiver.java b/java/src/IceInternal/WSTransceiver.java
index 84fa616dd5e..c34a1f65e1b 100644
--- a/java/src/IceInternal/WSTransceiver.java
+++ b/java/src/IceInternal/WSTransceiver.java
@@ -306,6 +306,13 @@ final class WSTransceiver implements Transceiver
}
@Override
+ public EndpointI bind(EndpointI endp)
+ {
+ assert(false);
+ return null;
+ }
+
+ @Override
public int write(Buffer buf)
{
if(_state < StateOpened)
@@ -450,6 +457,12 @@ final class WSTransceiver implements Transceiver
}
@Override
+ public String toDetailedString()
+ {
+ return _delegate.toDetailedString();
+ }
+
+ @Override
public Ice.ConnectionInfo getInfo()
{
Ice.IPConnectionInfo di = (Ice.IPConnectionInfo)_delegate.getInfo();
diff --git a/java/src/IceSSL/AcceptorI.java b/java/src/IceSSL/AcceptorI.java
index 22a5c238876..a7bc1754149 100644
--- a/java/src/IceSSL/AcceptorI.java
+++ b/java/src/IceSSL/AcceptorI.java
@@ -20,37 +20,17 @@ final class AcceptorI implements IceInternal.Acceptor
@Override
public void close()
{
- if(_instance.traceLevel() >= 1)
- {
- String s = "stopping to accept " + _instance.protocol() + " connections at " + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
assert(_fd != null);
IceInternal.Network.closeSocketNoThrow(_fd);
_fd = null;
}
@Override
- public void listen()
+ public IceInternal.EndpointI listen(IceInternal.EndpointI endp)
{
- // Nothing to do.
-
- if(_instance.traceLevel() >= 1)
- {
- StringBuffer s = new StringBuffer("listening for " + _instance.protocol() + " connections at ");
- s.append(toString());
+ _addr = IceInternal.Network.doBind(_fd, _addr, _backlog);
- java.util.List<String> interfaces =
- IceInternal.Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(),
- _instance.protocolSupport(), true);
- if(!interfaces.isEmpty())
- {
- s.append("\nlocal interfaces: ");
- s.append(IceUtilInternal.StringUtil.joinString(interfaces, ", "));
- }
- _instance.logger().trace(_instance.traceCategory(), s.toString());
- }
+ return endp.endpoint(this);
}
@Override
@@ -83,12 +63,6 @@ final class AcceptorI implements IceInternal.Acceptor
throw ex;
}
- if(_instance.traceLevel() >= 1)
- {
- _instance.logger().trace(_instance.traceCategory(), "accepting " + _instance.protocol() + " connection\n" +
- IceInternal.Network.fdToString(fd));
- }
-
return new TransceiverI(_instance, engine, fd, _adapterName);
}
@@ -104,6 +78,23 @@ final class AcceptorI implements IceInternal.Acceptor
return IceInternal.Network.addrToString(_addr);
}
+ @Override
+ public String toDetailedString()
+ {
+ StringBuffer s = new StringBuffer("local address = ");
+ s.append(toString());
+
+ java.util.List<String> intfs =
+ IceInternal.Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(),
+ _instance.protocolSupport(), true);
+ if(!intfs.isEmpty())
+ {
+ s.append("\nlocal interfaces = ");
+ s.append(IceUtilInternal.StringUtil.joinString(intfs, ", "));
+ }
+ return s.toString();
+ }
+
int effectivePort()
{
return _addr.getPort();
@@ -139,12 +130,6 @@ final class AcceptorI implements IceInternal.Acceptor
}
_addr = IceInternal.Network.getAddressForServer(host, port, _instance.protocolSupport(),
_instance.preferIPv6());
- if(_instance.traceLevel() >= 2)
- {
- String s = "attempting to bind to " + _instance.protocol() + " socket " + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
- _addr = IceInternal.Network.doBind(_fd, _addr, _backlog);
}
catch(RuntimeException ex)
{
diff --git a/java/src/IceSSL/ConnectorI.java b/java/src/IceSSL/ConnectorI.java
index 2bffb15712e..5d731029d58 100644
--- a/java/src/IceSSL/ConnectorI.java
+++ b/java/src/IceSSL/ConnectorI.java
@@ -24,37 +24,19 @@ final class ConnectorI implements IceInternal.Connector
throw ex;
}
- if(_instance.traceLevel() >= 2)
- {
- String s = "trying to establish " + _instance.protocol() + " connection to " + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
+ java.nio.channels.SocketChannel fd = IceInternal.Network.createTcpSocket();
+ IceInternal.Network.setBlock(fd, false);
+ IceInternal.Network.setTcpBufSize(fd, _instance.properties(), _instance.logger());
+ final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr;
+ IceInternal.Network.doConnect(fd, addr, _sourceAddr);
try
{
- java.nio.channels.SocketChannel fd = IceInternal.Network.createTcpSocket();
- IceInternal.Network.setBlock(fd, false);
- IceInternal.Network.setTcpBufSize(fd, _instance.properties(), _instance.logger());
- final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr;
- IceInternal.Network.doConnect(fd, addr, _sourceAddr);
- try
- {
- javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false, _addr);
- return new TransceiverI(_instance, engine, fd, _proxy, _host, _addr);
- }
- catch(RuntimeException ex)
- {
- IceInternal.Network.closeSocketNoThrow(fd);
- throw ex;
- }
+ javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false, _addr);
+ return new TransceiverI(_instance, engine, fd, _proxy, _host, _addr);
}
- catch(Ice.LocalException ex)
+ catch(RuntimeException ex)
{
- if(_instance.traceLevel() >= 2)
- {
- String s = "failed to establish " + _instance.protocol() + " connection to " + toString() + "\n" + ex;
- _instance.logger().trace(_instance.traceCategory(), s);
- }
+ IceInternal.Network.closeSocketNoThrow(fd);
throw ex;
}
}
diff --git a/java/src/IceSSL/EndpointI.java b/java/src/IceSSL/EndpointI.java
index 246100b7f26..1b42777d3c7 100644
--- a/java/src/IceSSL/EndpointI.java
+++ b/java/src/IceSSL/EndpointI.java
@@ -143,34 +143,43 @@ final class EndpointI extends IceInternal.IPEndpointI
//
// Return a server side transceiver for this endpoint, or null if a
- // transceiver can only be created by an acceptor. In case a
- // transceiver is created, this operation also returns a new
- // "effective" endpoint, which might differ from this endpoint,
- // for example, if a dynamic port number is assigned.
+ // transceiver can only be created by an acceptor.
//
@Override
- public IceInternal.Transceiver transceiver(IceInternal.EndpointIHolder endpoint)
+ public IceInternal.Transceiver transceiver()
{
- endpoint.value = this;
return null;
}
//
// Return an acceptor for this endpoint, or null if no acceptors
- // is available. In case an acceptor is created, this operation
- // also returns a new "effective" endpoint, which might differ
- // from this endpoint, for example, if a dynamic port number is
- // assigned.
+ // is available.
//
@Override
- public IceInternal.Acceptor acceptor(IceInternal.EndpointIHolder endpoint, String adapterName)
+ public IceInternal.Acceptor acceptor(String adapterName)
{
- AcceptorI p = new AcceptorI(_instance, adapterName, _host, _port);
- endpoint.value =
- new EndpointI(_instance, _host, p.effectivePort(), _sourceAddr, _timeout, _connectionId, _compress);
- return p;
+ return new AcceptorI(_instance, adapterName, _host, _port);
}
+ //
+ // Return (potentially) new endpoint based on info from associated
+ // Transceiver or Acceptor, which might differ from this endpoint,
+ // for example, if a dynamic port number was assigned.
+ //
+ @Override
+ public IceInternal.EndpointI endpoint(IceInternal.Transceiver transceiver)
+ {
+ return this;
+ }
+
+ @Override
+ public IceInternal.EndpointI endpoint(IceInternal.Acceptor acceptor)
+ {
+ AcceptorI p = (AcceptorI)acceptor;
+ return new EndpointI(_instance, _host, p.effectivePort(), _sourceAddr, _timeout, _connectionId, _compress);
+ }
+
+
@Override
public String options()
{
diff --git a/java/src/IceSSL/TransceiverI.java b/java/src/IceSSL/TransceiverI.java
index 3729bf569a5..4c07e4b26db 100644
--- a/java/src/IceSSL/TransceiverI.java
+++ b/java/src/IceSSL/TransceiverI.java
@@ -25,100 +25,86 @@ final class TransceiverI implements IceInternal.Transceiver
@Override
public int initialize(IceInternal.Buffer readBuffer, IceInternal.Buffer writeBuffer, Ice.Holder<Boolean> moreData)
{
- try
+ if(_state == StateNeedConnect)
{
- if(_state == StateNeedConnect)
- {
- _state = StateConnectPending;
- return IceInternal.SocketOperation.Connect;
- }
- else if(_state <= StateConnectPending)
+ _state = StateConnectPending;
+ return IceInternal.SocketOperation.Connect;
+ }
+ else if(_state <= StateConnectPending)
+ {
+ IceInternal.Network.doFinishConnect(_fd);
+ _desc = IceInternal.Network.fdToString(_fd, _proxy, _addr);
+
+ if(_proxy != null)
{
- IceInternal.Network.doFinishConnect(_fd);
- _desc = IceInternal.Network.fdToString(_fd, _proxy, _addr);
+ //
+ // Prepare the read & write buffers in advance.
+ //
+ _proxy.beginWriteConnectRequest(_addr, writeBuffer);
+ _proxy.beginReadConnectRequestResponse(readBuffer);
- if(_proxy != null)
+ //
+ // Write the proxy connection message.
+ //
+ if(writeRaw(writeBuffer))
{
//
- // Prepare the read & write buffers in advance.
+ // Write completed without blocking.
//
- _proxy.beginWriteConnectRequest(_addr, writeBuffer);
- _proxy.beginReadConnectRequestResponse(readBuffer);
+ _proxy.endWriteConnectRequest(writeBuffer);
//
- // Write the proxy connection message.
+ // Try to read the response.
//
- if(writeRaw(writeBuffer))
+ if(readRaw(readBuffer))
{
//
- // Write completed without blocking.
+ // Read completed without blocking - fall through.
//
- _proxy.endWriteConnectRequest(writeBuffer);
-
- //
- // Try to read the response.
- //
- if(readRaw(readBuffer))
- {
- //
- // Read completed without blocking - fall through.
- //
- _proxy.endReadConnectRequestResponse(readBuffer);
- }
- else
- {
- //
- // Return SocketOperationRead to indicate we need to complete the read.
- //
- _state = StateProxyConnectRequestPending; // Wait for proxy response
- return IceInternal.SocketOperation.Read;
- }
+ _proxy.endReadConnectRequestResponse(readBuffer);
}
else
{
//
- // Return SocketOperationWrite to indicate we need to complete the write.
+ // Return SocketOperationRead to indicate we need to complete the read.
//
- _state = StateProxyConnectRequest; // Send proxy connect request
- return IceInternal.SocketOperation.Write;
+ _state = StateProxyConnectRequestPending; // Wait for proxy response
+ return IceInternal.SocketOperation.Read;
}
}
-
- _state = StateConnected;
- }
- else if(_state == StateProxyConnectRequest)
- {
- //
- // Write completed.
- //
- _proxy.endWriteConnectRequest(writeBuffer);
- _state = StateProxyConnectRequestPending; // Wait for proxy response
- return IceInternal.SocketOperation.Read;
- }
- else if(_state == StateProxyConnectRequestPending)
- {
- //
- // Read completed.
- //
- _proxy.endReadConnectRequestResponse(readBuffer);
- _state = StateConnected;
+ else
+ {
+ //
+ // Return SocketOperationWrite to indicate we need to complete the write.
+ //
+ _state = StateProxyConnectRequest; // Send proxy connect request
+ return IceInternal.SocketOperation.Write;
+ }
}
- assert(_state == StateConnected);
-
- return handshakeNonBlocking();
+ _state = StateConnected;
}
- catch(Ice.LocalException ex)
+ else if(_state == StateProxyConnectRequest)
{
- if(_instance.traceLevel() >= 2)
- {
- StringBuilder s = new StringBuilder(128);
- s.append("failed to establish " + protocol() + " connection\n");
- s.append(IceInternal.Network.fdToString(_fd, _proxy, _addr));
- _instance.logger().trace(_instance.traceCategory(), s.toString());
- }
- throw ex;
+ //
+ // Write completed.
+ //
+ _proxy.endWriteConnectRequest(writeBuffer);
+ _state = StateProxyConnectRequestPending; // Wait for proxy response
+ return IceInternal.SocketOperation.Read;
+ }
+ else if(_state == StateProxyConnectRequestPending)
+ {
+ //
+ // Read completed.
+ //
+ _proxy.endReadConnectRequestResponse(readBuffer);
+ _state = StateConnected;
}
+
+ assert(_state == StateConnected);
+
+ return handshakeNonBlocking();
}
@Override
@@ -132,12 +118,6 @@ final class TransceiverI implements IceInternal.Transceiver
@Override
public void close()
{
- if(_state == StateHandshakeComplete && _instance.traceLevel() >= 1)
- {
- String s = "closing " + protocol() + " connection\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
assert(_fd != null);
if(_state >= StateConnected)
@@ -206,6 +186,13 @@ final class TransceiverI implements IceInternal.Transceiver
}
@Override
+ public IceInternal.EndpointI bind(IceInternal.EndpointI endp)
+ {
+ assert(false);
+ return null;
+ }
+
+ @Override
public int write(IceInternal.Buffer buf)
{
if(_state == StateProxyConnectRequest)
@@ -244,25 +231,12 @@ final class TransceiverI implements IceInternal.Transceiver
return readRaw(buf) ? IceInternal.SocketOperation.None : IceInternal.SocketOperation.Read;
}
- int rem = 0;
- if(_instance.traceLevel() >= 3)
- {
- rem = buf.b.remaining();
- }
-
//
// Try to satisfy the request from data we've already decrypted.
//
int pos = buf.b.position();
fill(buf.b);
- if(_instance.traceLevel() >= 3 && buf.b.position() > pos)
- {
- String s = "received " + (buf.b.position() - pos) + " of " + rem + " bytes via " + protocol() +
- "\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
//
// Read and decrypt more data if necessary. Note that we might read
// more data from the socket than is actually necessary to fill the
@@ -304,13 +278,6 @@ final class TransceiverI implements IceInternal.Transceiver
pos = buf.b.position();
fill(buf.b);
-
- if(_instance.traceLevel() >= 3 && buf.b.position() > pos)
- {
- String s = "received " + (buf.b.position() - pos) + " of " + rem + " bytes via " + protocol() +
- "\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
}
}
catch(SSLException ex)
@@ -338,6 +305,12 @@ final class TransceiverI implements IceInternal.Transceiver
}
@Override
+ public String toDetailedString()
+ {
+ return toString();
+ }
+
+ @Override
public Ice.ConnectionInfo getInfo()
{
return getNativeConnectionInfo();
@@ -608,20 +581,6 @@ final class TransceiverI implements IceInternal.Transceiver
//
_instance.verifyPeer(getNativeConnectionInfo(), _fd, _host);
- if(_instance.traceLevel() >= 1)
- {
- String s;
- if(_incoming)
- {
- s = "accepted " + protocol() + " connection\n" + _desc;
- }
- else
- {
- s = protocol() + " connection established\n" + _desc;
- }
- _instance.logger().trace(_instance.traceCategory(), s);
- }
-
if(_instance.securityTraceLevel() >= 1)
{
_instance.traceConnection(_fd, _engine, _incoming);
@@ -662,20 +621,6 @@ final class TransceiverI implements IceInternal.Transceiver
case OK:
break;
}
-
- //
- // If the SSL engine consumed any of the application's message buffer,
- // then log it.
- //
- if(result.bytesConsumed() > 0)
- {
- if(_instance.traceLevel() >= 3)
- {
- String s = "sent " + result.bytesConsumed() + " of " + rem + " bytes via " +
- protocol() + "\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
- }
}
//
@@ -874,12 +819,6 @@ final class TransceiverI implements IceInternal.Transceiver
{
return false;
}
-
- if(_instance.traceLevel() >= 3)
- {
- String s = "sent " + ret + " of " + packetSize + " bytes via " + protocol() + "\n" + toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
}
catch(java.io.InterruptedIOException ex)
{
@@ -914,16 +853,6 @@ final class TransceiverI implements IceInternal.Transceiver
return false;
}
- if(ret > 0)
- {
- if(_instance.traceLevel() >= 3)
- {
- String s = "received " + ret + " of " + packetSize + " bytes via " + protocol() + "\n" +
- toString();
- _instance.logger().trace(_instance.traceCategory(), s);
- }
- }
-
packetSize = buf.b.remaining();
}
catch(java.io.InterruptedIOException ex)