package org.mobicents.servers.diameter.utils;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.jdiameter.api.Answer;
import org.jdiameter.api.ApplicationId;
import org.jdiameter.api.Configuration;
import org.jdiameter.api.EventListener;
import org.jdiameter.api.IllegalDiameterStateException;
import org.jdiameter.api.InternalException;
import org.jdiameter.api.MetaData;
import org.jdiameter.api.Mode;
import org.jdiameter.api.Network;
import org.jdiameter.api.NetworkReqListener;
import org.jdiameter.api.Request;
import org.jdiameter.api.SessionFactory;
import org.jdiameter.api.Stack;
import org.jdiameter.server.impl.StackImpl;
import org.jdiameter.server.impl.helpers.XMLConfiguration;
public class StackCreator extends StackImpl implements Stack {
private static Logger logger = Logger.getLogger(StackCreator.class);
private Stack stack = null;
public StackCreator(Configuration config, NetworkReqListener networkReqListener, EventListener<Request, Answer> eventListener, String identifier,
Boolean isServer) {
super();
this.stack = new org.jdiameter.server.impl.StackImpl();
try {
this.stack.init(config);
// Let it stabilize...
Thread.sleep(500);
Network network = stack.unwrap(Network.class);
Set<ApplicationId> appIds = stack.getMetaData().getLocalPeer().getCommonApplications();
for (ApplicationId appId : appIds) {
if (logger.isInfoEnabled()) {
logger.info("Diameter " + identifier + " :: Adding Listener for [" + appId + "].");
}
network.addNetworkReqListener(networkReqListener, appId);
}
if (logger.isInfoEnabled()) {
logger.info("Diameter " + identifier + " :: Supporting " + appIds.size() + " applications.");
}
}
catch (Exception e) {
logger.error("Failure creating stack '" + identifier + "'", e);
}
}
public StackCreator(InputStream streamConfig, NetworkReqListener networkReqListener, EventListener<Request, Answer> eventListener, String dooer,
Boolean isServer) throws Exception {
this(isServer ? new XMLConfiguration(streamConfig) : new org.jdiameter.client.impl.helpers.XMLConfiguration(streamConfig), networkReqListener,
eventListener, dooer, isServer);
}
public StackCreator(String stringConfig, NetworkReqListener networkReqListener, EventListener<Request, Answer> eventListener, String dooer, Boolean isServer)
throws Exception {
this(isServer ? new XMLConfiguration(new ByteArrayInputStream(stringConfig.getBytes())) : new org.jdiameter.client.impl.helpers.XMLConfiguration(
new ByteArrayInputStream(stringConfig.getBytes())), networkReqListener, eventListener, dooer, isServer);
}
@Override
public void destroy() {
stack.destroy();
}
@Override
public java.util.logging.Logger getLogger() {
return stack.getLogger();
}
@Override
public MetaData getMetaData() {
return stack.getMetaData();
}
@Override
public SessionFactory getSessionFactory() throws IllegalDiameterStateException {
return stack.getSessionFactory();
}
@Override
public SessionFactory init(Configuration config) throws IllegalDiameterStateException, InternalException {
return stack.init(config);
}
@Override
public boolean isActive() {
return stack.isActive();
}
@Override
public boolean isWrapperFor(Class<?> iface) throws InternalException {
return stack.isWrapperFor(iface);
}
@Override
public void start() throws IllegalDiameterStateException, InternalException {
stack.start();
}
@Override
public void start(Mode mode, long timeout, TimeUnit unit) throws IllegalDiameterStateException, InternalException {
stack.start(mode, timeout, unit);
}
@Override
public void stop(long timeout, TimeUnit unit, int disconnectReason) throws IllegalDiameterStateException, InternalException {
stack.stop(timeout, unit, disconnectReason);
}
@Override
public <T> T unwrap(Class<T> iface) throws InternalException {
return stack.unwrap(iface);
}
}