package us.twinners;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.security.auth.login.LoginException;
import org.asteriskjava.manager.AuthenticationFailedException;
import org.asteriskjava.manager.ManagerEventListener;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.event.ManagerEvent;
import net.ser1.stomp.Client;
import org.asteriskjava.manager.SendActionCallback;
import org.asteriskjava.manager.response.ManagerResponse;
/**
*
* @author jicksta
*/
public class StompToManagerBridge implements ManagerEventListener,
net.ser1.stomp.Listener, SendActionCallback {
public final static int RECONNECT_RETRY_TIMEOUT_IN_SECONDS = 3;
private DynamicManagerConnection managerConnection;
private Client stompClient;
public StompToManagerBridge(Client stompClient) throws IOException {
this.stompClient = stompClient;
this.managerConnection = new DynamicManagerConnection("localhost", "admin", "leiden");
}
public void run() throws IOException, AuthenticationFailedException, TimeoutException, InterruptedException {
stompClient.subscribe("amiactions", this);
managerConnection.addEventListener(this);
managerConnection.login();
}
// Forward Asterisk Manager Interface events to Stomp
public void onManagerEvent(ManagerEvent event) {
System.out.println("Handling event: " + event.toString());
this.stompClient.send("amievents", "", event.properties());
}
// Forward Stomp messages to the Asterisk Manager Interface
public void message(Map headers, final String actionName) {
headers = stripStompRelatedHeaders(headers);
System.out.println("Handling Stomp action " + actionName + ": " + headers.toString());
try {
managerConnection.sendAction(new DynamicManagerAction(actionName, headers), this);
} catch (IOException ex) {
Logger.getLogger(StompToManagerBridge.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalStateException ex) {
Logger.getLogger(StompToManagerBridge.class.getName()).log(Level.SEVERE, null, ex);
}
}
// Execute this when responses come back from AMI
public void onResponse(ManagerResponse response) {
System.out.println("Got AMI response " + response.toString());
}
private Map<String, String> stripStompRelatedHeaders(Map<String, String> headers) {
Map<String,String> newHeaders = new HashMap<String,String>();
for(String key : headers.keySet()) {
if(key.equals("content-length") || key.equals("message-id") || key.equals("content-type")) continue;
newHeaders.put(key, headers.get(key));
}
return newHeaders;
}
public static void main(String[] args) throws AuthenticationFailedException, InterruptedException, TimeoutException, LoginException {
boolean successful = false;
while (!successful) {
Client stompClient;
try {
stompClient = new Client("localhost", 61613, "testing", "f13fa60c2ba5");
} catch (IOException ioe) {
System.err.println("Failed to connect to Stomp! Retrying in " +
String.valueOf(RECONNECT_RETRY_TIMEOUT_IN_SECONDS) + " seconds.");
Thread.sleep(RECONNECT_RETRY_TIMEOUT_IN_SECONDS * 1000);
continue;
}
StompToManagerBridge manager;
try {
manager = new StompToManagerBridge(stompClient);
} catch (IOException ex) {
System.err.println("Failed to connect to AMI! Retrying in " +
String.valueOf(RECONNECT_RETRY_TIMEOUT_IN_SECONDS) + " seconds.");
Thread.sleep(RECONNECT_RETRY_TIMEOUT_IN_SECONDS * 1000);
continue;
}
try {
System.out.println("Running now!");
manager.run();
} catch (Exception ex) {
System.err.println("Exception while running bridge! Retrying in" +
String.valueOf(RECONNECT_RETRY_TIMEOUT_IN_SECONDS) + " seconds.");
Thread.sleep(RECONNECT_RETRY_TIMEOUT_IN_SECONDS * 1000);
continue;
}
successful = true;
}
}
}