FileDocCategorySizeDatePackage
IORToSocketInfoImpl.javaAPI DocGlassfish v2 API10418Fri May 04 22:34:54 BST 2007com.sun.enterprise.iiop

IORToSocketInfoImpl

public class IORToSocketInfoImpl extends Object implements com.sun.corba.ee.spi.transport.IORToSocketInfo
This implements IORToSocketInfo for ORB. Part of logic is from previous version of IIOPSSLSocketFactory.
author
Shing Wai Chan

Fields Summary
private static Logger
_logger
private final String
baseMsg
private Map
primaryToAddresses
private Map
primaryToRandomizedAddresses
Constructors Summary
Methods Summary
public static com.sun.corba.ee.spi.transport.SocketInfocreateSocketInfo(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.ListgetSocketInfo(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<-:");
	    }
	}