IORToSocketInfoImplpublic class IORToSocketInfoImpl extends Object implements com.sun.corba.ee.spi.transport.IORToSocketInfoThis implements IORToSocketInfo for ORB.
Part of logic is from previous version of IIOPSSLSocketFactory. |
Fields Summary |
---|
private static Logger | _logger | private final String | baseMsg | private Map | primaryToAddresses | private Map | primaryToRandomizedAddresses |
Methods Summary |
---|
public static com.sun.corba.ee.spi.transport.SocketInfo | createSocketInfo(java.lang.String msg, java.lang.String type, java.lang.String host, int port)
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE,
"Address from: "
+ msg
+ "; type/address/port: "
+ type + "/" + host + "/" + port);
}
return new SocketInfo() {
public String getType() {
return type;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (! (o instanceof SocketInfo)) {
return false;
}
SocketInfo other = (SocketInfo)o;
if (other.getPort() != port) {
return false;
}
if (! other.getHost().equals(host)) {
return false;
}
if (! other.getType().equals(type)) {
return false;
}
return true;
}
public int hashCode() {
return type.hashCode() ^ host.hashCode() ^ port;
}
public String toString() {
return "SocketInfo[" + type + " " + host + " " + port +"]";
}
};
| public java.util.List | getSocketInfo(com.sun.corba.ee.spi.ior.IOR ior, java.util.List previous)
//----- implements com.sun.corba.ee.spi.transport.IORToSocketInfo -----
try {
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg + ".getSocketInfo->:");
}
List result = new ArrayList();
SecurityMechanismSelector selector = new SecurityMechanismSelector();
IIOPProfileTemplate iiopProfileTemplate = (IIOPProfileTemplate)ior.
getProfile().getTaggedProfileTemplate();
IIOPAddress primary = iiopProfileTemplate.getPrimaryAddress() ;
String host = primary.getHost().toLowerCase();
String type = null;
int port = 0;
ConnectionContext ctx = new ConnectionContext();
SocketInfo socketInfo = selector.getSSLPort(ior, ctx);
selector.setClientConnectionContext(ctx);
if (socketInfo == null) {
type = SocketInfo.IIOP_CLEAR_TEXT;
port = primary.getPort();
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: did not find SSL SocketInfo");
}
} else {
type = socketInfo.getType();
port = socketInfo.getPort();
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: found SSL socketInfo");
}
}
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: Connection Context:" + ctx);
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: ENDPOINT INFO:type=" + type + ",host=" +host + ", port=" + port);
}
// for SSL
if (socketInfo != null ) {
result.add(socketInfo);
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: returning SSL socketInfo:"
+ " " + socketInfo.getType()
+ " " + socketInfo.getHost()
+ " " + socketInfo.getPort());
}
// REVISIT: should call IIOPPrimaryToContactInfo.reset
// right here to invalidate sticky for this result.
// However, SSL and IIOP-FO is not a supported feature.
return result;
}
////////////////////////////////////////////////////
//
// The remainder of this code is non-SSL.
// Author: Harold Carr
// Please contact author is changes needed.
//
// for non-SSL
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: returning non SSL socketInfo");
}
if (! previous.isEmpty()) {
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: returning previous socketInfo: "
+ previous);
}
return previous;
}
//
// Save and add primary address
//
SocketInfo primarySocketInfo =
createSocketInfo("primary", type, host, port);
result.add(primarySocketInfo);
//
// List alternate addresses.
//
Iterator iterator = iiopProfileTemplate.iteratorById(
org.omg.IOP.TAG_ALTERNATE_IIOP_ADDRESS.value
);
while (iterator.hasNext()) {
AlternateIIOPAddressComponent alternate =
(AlternateIIOPAddressComponent) iterator.next();
host = alternate.getAddress().getHost().toLowerCase();
port = alternate.getAddress().getPort();
result.add(createSocketInfo(
"AlternateIIOPAddressComponent",
SocketInfo.IIOP_CLEAR_TEXT, host, port));
}
synchronized (this) {
List existing = (List)
primaryToAddresses.get(primarySocketInfo);
if ( existing == null ) {
// First time we've seen this primary.
// Save unrandomized list with primary at head.
primaryToAddresses.put(primarySocketInfo, result);
result.remove(0); // do not randomize primary
// Randomized the alternates.
java.util.Collections.shuffle(result);
result.add(0, primarySocketInfo); // put primary at head
// Save for subsequent use.
primaryToRandomizedAddresses.put(primarySocketInfo,result);
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: initial randomized result: "
+ result);
}
return result;
} else {
if ( result.equals(existing) ) {
// The are the same so return the randomized version.
result = (List)
primaryToRandomizedAddresses.get(primarySocketInfo);
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg
+ ".getSocketInfo: existing randomized result: "
+ result);
}
return result;
} else {
// The lists should be the same.
// If not log a warning and return the
// non-randomized current list since it is different.
_logger.log(Level.FINE,
baseMsg + ".getSocketInfo:"
+ " Address lists do not match: primary: "
+ primarySocketInfo
+ "; returning current: " + result
+ "; existing is: " + existing);
return result;
}
}
}
} catch ( Exception ex ) {
_logger.log(Level.WARNING, "Exception getting SocketInfo",ex);
RuntimeException rte = new RuntimeException(ex.getMessage());
rte.initCause(ex);
throw rte;
} finally {
if (_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, baseMsg + ".getSocketInfo<-:");
}
}
|
|