/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package us.twinners;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import org.asteriskjava.manager.action.ManagerAction;
import org.asteriskjava.manager.internal.ManagerUtil;
import org.asteriskjava.manager.internal.ManagerWriterImpl;
/**
*
* @author jicksta
*/
public class DynamicManagerWriter extends ManagerWriterImpl {
protected final String LINE_SEPARATOR = "\r\n";
public void sendAction(final ManagerAction managerAction, final String internalActionId) throws IOException {
if (managerAction instanceof DynamicManagerAction) {
System.out.println("Handling a DynamicManagerAction");
DynamicManagerAction dynamicAction = (DynamicManagerAction) managerAction;
String actionName = dynamicAction.getAction();
Map<String, String> properties = dynamicAction.properties;
StringBuilder buffer = new StringBuilder();
// WHERE I LEFT OFF: SUPER MUST BE CALLED. THIS METHOD IS NOT DONE BUILDING A MANAGER ACTION PROPERLY. WHAT ELSE DID I LEVAE OUT? CHECK OTHER MANAGERACTION IMPLEMENTATION.
// Add the action name
appendKeyValue(buffer, "Action", actionName);
// Ensure we've sent an ActionID through
if (internalActionId != null) {
String actionId = ManagerUtil.addInternalActionId(dynamicAction.getActionId(), internalActionId);
appendKeyValue(buffer, "actionid", actionId);
} else if (dynamicAction.getActionId() != null) {
appendKeyValue(buffer, "actionid", dynamicAction.getActionId());
}
// Inject across our dynamic fields building up a String.
Iterator propertyIterator = properties.entrySet().iterator();
while (propertyIterator.hasNext()) {
Map.Entry<String, String> pairs = (Map.Entry<String, String>) propertyIterator.next();
appendKeyValue(buffer, pairs.getKey(), pairs.getValue());
}
buffer.append(LINE_SEPARATOR);
String action = buffer.toString();
if (this.socket == null) {
throw new IllegalStateException("Unable to send action: socket is null");
}
System.out.println("Final action\n" + action);
// Finally write to the socket
synchronized (this.socket) {
this.socket.write(action);
this.socket.flush();
}
} else {
// This is copied from ManagerWriterImpl.java
final String actionString;
if (socket == null) {
throw new IllegalStateException("Unable to send action: socket is null");
}
synchronized (socket) {
actionString = actionBuilder.buildAction(managerAction, internalActionId);
socket.write(actionString);
socket.flush();
}
}
}
private void appendKeyValue(StringBuilder buffer, String key, String value) {
buffer.append(key);
buffer.append(": ");
buffer.append(value);
buffer.append(LINE_SEPARATOR);
}
}