package org.mobicents.jsr309.mgcp; import jain.protocol.ip.mgcp.CreateProviderException; import jain.protocol.ip.mgcp.DeleteProviderException; import jain.protocol.ip.mgcp.JainMgcpStack; import jain.protocol.ip.mgcp.message.parms.NotifiedEntity; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Properties; import java.util.TooManyListenersException; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; import org.mobicents.mgcp.stack.JainMgcpStackImpl; import org.mobicents.mgcp.stack.JainMgcpStackProviderImpl; /** * * @author amit bhayani * */ public class MgcpStackFactory { private static final Logger logger = Logger.getLogger(MgcpStackFactory.class); private static MgcpStackFactory mgcpStackFactory; /** * Store the MGCP Stack with name provided in HashMap. This gives * flexibility for different applications to instantiate different stacks. * Hence in case if one goes down or mis behaves not all applications have * to pay penalty */ private ConcurrentHashMap<String, MgcpWrapper> stringToMgcpWrapper = new ConcurrentHashMap<String, MgcpWrapper>(); public static final String MGCP_STACK_NAME = "mgcp.stack.name"; public static final String MGCP_STACK_IP = "mgcp.stack.ip"; public static final String MGCP_STACK_PORT = "mgcp.stack.port"; public static final String MGCP_PEER_IP = "mgcp.stack.peer.ip"; public static final String MGCP_PEER_PORT = "mgcp.stack.peer.port"; private MgcpStackFactory() { } public static MgcpStackFactory getInstance() { if (mgcpStackFactory == null) { mgcpStackFactory = new MgcpStackFactory(); } return mgcpStackFactory; } public MgcpWrapper getMgcpStackProvider(Properties properties) { String stackName = "DEFAULT"; if (properties != null) { stackName = properties.getProperty(MGCP_STACK_NAME, "DEFAULT"); } MgcpWrapper mgcpWrapper = stringToMgcpWrapper.get(stackName); if (mgcpWrapper == null) { String ip = "127.0.0.1"; String portString = "2727"; String mgcpStackPeerIp = "127.0.0.1"; int mgcpStackPeerPort = 2427; if (properties != null) { ip = properties.getProperty(MGCP_STACK_IP, "127.0.0.1"); portString = properties.getProperty(MGCP_STACK_PORT, "2727"); mgcpStackPeerIp = properties.getProperty(MgcpStackFactory.MGCP_PEER_IP, "127.0.0.1"); mgcpStackPeerPort = Integer.parseInt(properties.getProperty(MgcpStackFactory.MGCP_PEER_PORT, "2427")); } InetAddress inetAddress; try { inetAddress = InetAddress.getByName(ip); int port = Integer.parseInt(portString); JainMgcpStackImpl stack = new JainMgcpStackImpl(inetAddress, port); JainMgcpStackProviderImpl jainMgcpStackProviderImpl = (JainMgcpStackProviderImpl) stack .createProvider(); if (properties != null) { } NotifiedEntity notifiedEntity = new NotifiedEntity(inetAddress.getHostName(), inetAddress .getHostAddress(), stack.getPort()); mgcpWrapper = new MgcpWrapper(jainMgcpStackProviderImpl, notifiedEntity, mgcpStackPeerPort, mgcpStackPeerIp); jainMgcpStackProviderImpl.addJainMgcpListener(mgcpWrapper); stringToMgcpWrapper.put(stackName, mgcpWrapper); if (logger.isDebugEnabled()) { logger.debug("Created new MgcpWrapper for MGCP_STACK_NAME = " + stackName); } return mgcpWrapper; } catch (UnknownHostException e) { logger.error(e); } catch (CreateProviderException e) { logger.error(e); } catch (TooManyListenersException e) { logger.error(e); } } else { if (logger.isDebugEnabled()) { logger.debug("Found JainMgcpStackProvider for MGCP_STACK_NAME = " + stackName); } return mgcpWrapper; } return null; } public void clearMgcpStackProvider(Properties properties) { String stackName = "DEFAULT"; if (properties != null) { stackName = properties.getProperty(MGCP_STACK_NAME, "DEFAULT"); } MgcpWrapper mgcpWrapper = this.stringToMgcpWrapper.get(stackName); if (mgcpWrapper == null) { logger.warn("No JainMgcpStackProvider found for MGCP_STACK_NAME = " + stackName); } else { JainMgcpStackProviderImpl stackProvider = mgcpWrapper.getJainMgcpStackProvider(); stackProvider.removeJainMgcpListener(mgcpWrapper); JainMgcpStack mgcpStack = stackProvider.getJainMgcpStack(); try { mgcpStack.deleteProvider(mgcpWrapper.getJainMgcpStackProvider()); this.stringToMgcpWrapper.remove(stackName); if (logger.isDebugEnabled()) { logger.debug("Successfully deleted JainMgcpStackProvider for MGCP_STACK_NAME = " + stackName); } } catch (DeleteProviderException e) { logger.error(e); } } } }