package org.opennaas.extensions.protocols.tl1; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import org.opennaas.core.resources.protocol.IProtocolSession; import org.opennaas.core.resources.protocol.IProtocolSessionFactory; import org.opennaas.core.resources.protocol.ProtocolException; import org.opennaas.core.resources.protocol.ProtocolSessionContext; import org.opennaas.core.resources.transport.ITransport; import org.opennaas.core.resources.transport.ITransportConstants; import org.opennaas.core.resources.transport.ITransportFactory; import org.opennaas.core.resources.transport.TransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class manages TL1 Protocol sessions * * @author edu * */ public class TL1ProtocolSessionFactory implements IProtocolSessionFactory { /** The logger **/ Logger logger = LoggerFactory.getLogger(TL1ProtocolSessionFactory.class); /** The transport factory **/ private Map<String, ITransportFactory> transportFactories = null; public TL1ProtocolSessionFactory() { super(); logger.info("TL1 Protocol Session Factory created"); this.transportFactories = new HashMap<String, ITransportFactory>(); } /** * Called by blueprint every time a transport factory is registered * * @param serviceInstance * @param serviceProperties */ public void transportFactoryAdded(ITransportFactory serviceInstance, Map serviceProperties) { if (serviceInstance != null && serviceProperties != null) { transportFactories.put((String) serviceProperties.get("transport"), serviceInstance); logger.debug("New transport factory added for transports of type: " + serviceProperties.get("transport")); } } /** * Called by blueprint every time a transport factory is unregistered * * @param serviceInstance * @param serviceProperties */ public void transportFactoryRemoved(ITransportFactory serviceInstance, Map serviceProperties) { if (serviceInstance != null && serviceProperties != null) { transportFactories.remove((String) serviceProperties.get("transport")); logger.debug("Existing transport factory removed for transports of type: " + serviceProperties.get("transport")); } } public IProtocolSession createProtocolSession(String sessionID, ProtocolSessionContext protocolSessionContext) throws ProtocolException { parseProtocolURI(protocolSessionContext); if ((String) protocolSessionContext.getSessionParameters().get(ProtocolSessionContext.USERNAME) == null) { throw new ProtocolException("The TL1 protocol session needs the " + ProtocolSessionContext.USERNAME + " parameter"); } if ((String) protocolSessionContext.getSessionParameters().get(ProtocolSessionContext.PASSWORD) == null) { throw new ProtocolException("The TL1 protocol session needs the " + ProtocolSessionContext.PASSWORD + " parameter"); } String transportId = (String) protocolSessionContext.getSessionParameters().get(ITransportConstants.TRANSPORT); if (transportId == null) { throw new ProtocolException("The TL1 protocol session needs the " + ITransportConstants.TRANSPORT + " parameter"); } ITransportFactory transportFactory = this.transportFactories.get(transportId); if (transportFactory == null) { throw new ProtocolException("Could not find a Transport Factory for the " + transportId + " type of transport."); } TL1ProtocolSession session = new TL1ProtocolSession(protocolSessionContext, sessionID); ITransport transport = null; try { transport = transportFactory.createTransportInstance(protocolSessionContext); } catch (TransportException ex) { throw new ProtocolException(ex); } session.wireTransport(transport); return session; } private void parseProtocolURI(ProtocolSessionContext protocolSessionContext) throws ProtocolException { Map<String, Object> params = protocolSessionContext.getSessionParameters(); String uriStr = (String) params.get(ProtocolSessionContext.PROTOCOL_URI); if (uriStr == null) { throw new ProtocolException("Invalid uri"); } try { URI uri = new URI(uriStr); String host = uri.getHost(); // Get transport String transport = uri.getScheme(); logger.debug("Adding " + ITransportConstants.TRANSPORT + "=" + transport + " to protocol session context"); protocolSessionContext.addParameter(ITransportConstants.TRANSPORT, transport); // Get transport.host and transport.port protocolSessionContext.addParameter(ITransportConstants.TRANSPORT_HOST, host); int port = uri.getPort(); if (port != -1) { protocolSessionContext.addParameter(ITransportConstants.TRANSPORT_PORT, "" + port); } // Get protocol.username and protocol.password String userInfo = uri.getUserInfo(); String[] aux = null; if (userInfo != null) { aux = userInfo.split(":"); if (aux.length == 1 && aux[0].indexOf(":") == -1) { protocolSessionContext.addParameter(ProtocolSessionContext.USERNAME, aux[0]); } else if (aux.length == 1 && aux[0].indexOf(":") != -1) { protocolSessionContext.addParameter(ProtocolSessionContext.PASSWORD, aux[0]); } else if (aux.length == 2) { protocolSessionContext.addParameter(ProtocolSessionContext.USERNAME, aux[0]); protocolSessionContext.addParameter(ProtocolSessionContext.PASSWORD, aux[1]); } } // Get optional parameters if present if (uri.getQuery() != null) { aux = uri.getQuery().split("&"); String[] aux2 = null; for (int i = 0; i < aux.length; i++) { aux2 = aux[0].split("="); protocolSessionContext.addParameter(aux2[0], aux2[1]); } } } catch (URISyntaxException e) { throw new ProtocolException(e); } } }