package org.mobicents.servlet.management.server.router;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import org.apache.catalina.mbeans.MBeanUtils;
import org.mobicents.servlet.management.client.router.DARConfigurationService;
import org.mobicents.servlet.management.client.router.DARRoute;
import org.mobicents.servlet.management.client.router.DARRouteNode;
import org.mobicents.servlet.sip.router.DefaultApplicationRouterParser;
import org.mobicents.servlet.sip.router.DefaultSipApplicationRouterInfo;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class DARConfigurationServiceImpl extends RemoteServiceServlet implements DARConfigurationService {
private static MBeanServer mserver = MBeanUtils.createServer();
private ObjectName getApplicationDispatcher() {
try {
ObjectName dispatcherQuery = new ObjectName("*:type=SipApplicationDispatcher");
ObjectInstance dispatcherInstance = (ObjectInstance)
mserver.queryMBeans(dispatcherQuery, null).iterator().next();
ObjectName dispatcherName = dispatcherInstance.getObjectName();
return dispatcherName;
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
public void configure(String config) {
try {
ObjectName dispatcherName = getApplicationDispatcher();
Properties props = new Properties();
byte bytes[] = config.getBytes();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
props.load(byteArrayInputStream);
mserver.invoke(dispatcherName, "updateApplicationRouterConfiguration", new Object[]{props},
new String[]{Object.class.getName()});
} catch (Throwable t) {
throw new RuntimeException("Error", t);
}
}
public String[] getApplications() {
try {
ObjectName dispatcherName = getApplicationDispatcher();
String[] applications = (String[]) mserver.invoke(dispatcherName, "findInstalledSipApplications", new Object[]{},
new String[]{});
return applications;
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
public DARRoute[] getConfiguration() {
try {
ObjectName dispatcherName = getApplicationDispatcher();
Object configuration = (Object) mserver.invoke(dispatcherName, "retrieveApplicationRouterConfiguration", new Object[]{},
new String[]{});
Properties properties = (Properties) configuration;
DefaultApplicationRouterParser parser = new DefaultApplicationRouterParser();
Map<String, List<DefaultSipApplicationRouterInfo>> infos = parser.parse(properties);
Set<String> requests = infos.keySet();
ArrayList<DARRoute> allRoutes = new ArrayList<DARRoute>();
for(String request: requests) {
List<DefaultSipApplicationRouterInfo> routeInfo = infos.get(request);
DARRoute clientRoute = new DARRoute();
clientRoute.setRequest(request);
ArrayList<DARRouteNode> clientRouteArray = new ArrayList<DARRouteNode>();
for(DefaultSipApplicationRouterInfo routeNode: routeInfo) {
DARRouteNode clientNode = new DARRouteNode();
clientNode.setApplication(routeNode.getApplicationName());
clientNode.setOrder(new Integer(routeNode.getOrder()).toString());
clientNode.setRoute(routeNode.getRoutes()[0]);
clientNode.setSubscriber(routeNode.getSubscriberIdentity());
clientNode.setRouteModifier(routeNode.getRouteModifier().toString());
clientNode.setRoutingRegion(routeNode.getRoutingRegion().toString());
clientRouteArray.add(clientNode);
}
DARRouteNode[] array = new DARRouteNode[clientRouteArray.size()];
array = clientRouteArray.toArray(array);
clientRoute.setNodes(array);
allRoutes.add(clientRoute);
}
DARRoute[] result = new DARRoute[allRoutes.size()];
result = allRoutes.toArray(result);
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}