package com.rayo.core.xml.providers;
import java.net.URISyntaxException;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
import com.rayo.core.verb.PauseCommand;
import com.rayo.core.verb.ResumeCommand;
import com.rayo.core.verb.Say;
import com.rayo.core.verb.SayCompleteEvent;
import com.rayo.core.verb.SayCompleteEvent.Reason;
public class SayProvider extends BaseProvider {
// XML -> Object
// ================================================================================
private static final Namespace NAMESPACE = new Namespace("", "urn:xmpp:tropo:say:1");
private static final Namespace COMPLETE_NAMESPACE = new Namespace("", "urn:xmpp:tropo:say:complete:1");
private static final QName PAUSE_QNAME = new QName("pause", NAMESPACE);
private static final QName RESUME_QNAME = new QName("resume", NAMESPACE);
@Override
protected Object processElement(Element element) throws Exception {
if (element.getName().equals("say")) {
return buildSay(element);
} else if (PAUSE_QNAME.equals(element.getQName())) {
return buildPauseCommand(element);
} else if (RESUME_QNAME.equals(element.getQName())) {
return buildResumeCommand(element);
} else if (element.getNamespace().equals(RAYO_COMPONENT_NAMESPACE)) {
return buildCompleteCommand(element);
}
return null;
}
private Object buildCompleteCommand(Element element) {
Element reasonElement = (Element)element.elements().get(0);
String reasonValue = reasonElement.getName().toUpperCase();
Reason reason = Reason.valueOf(reasonValue);
SayCompleteEvent complete = new SayCompleteEvent();
complete.setReason(reason);
return complete;
}
private Object buildSay(Element element) throws URISyntaxException {
Say say = new Say();
say.setPrompt(extractSsml(element));
return say;
}
private Object buildPauseCommand(Element element) throws URISyntaxException {
return new PauseCommand();
}
private Object buildResumeCommand(Element element) throws URISyntaxException {
return new ResumeCommand();
}
// Object -> XML
// ================================================================================
@Override
protected void generateDocument(Object object, Document document) throws Exception {
if (object instanceof Say) {
createSay((Say) object, document);
} else if (object instanceof PauseCommand) {
createPauseCommand((PauseCommand) object, document);
} else if (object instanceof ResumeCommand) {
createResumeCommand((ResumeCommand) object, document);
} else if (object instanceof SayCompleteEvent) {
createSayCompleteEvent((SayCompleteEvent) object, document);
}
}
private void createSay(Say say, Document document) throws Exception {
Element root = document.addElement(new QName("say", NAMESPACE));
if (say.getPrompt() != null) {
addSsml(say.getPrompt(), root);
}
}
private void createPauseCommand(PauseCommand command, Document document) throws Exception {
document.addElement(new QName("pause", NAMESPACE));
}
private void createResumeCommand(ResumeCommand command, Document document) throws Exception {
document.addElement(new QName("resume", NAMESPACE));
}
private void createSayCompleteEvent(SayCompleteEvent event, Document document) throws Exception {
addCompleteElement(document, event, COMPLETE_NAMESPACE);
}
}