package com.rayo.core.xml.providers; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Namespace; import org.dom4j.QName; import com.rayo.core.verb.Record; import com.rayo.core.verb.RecordCompleteEvent; import com.rayo.core.verb.RecordPauseCommand; import com.rayo.core.verb.RecordResumeCommand; import com.rayo.core.verb.VerbCompleteEvent; import com.rayo.core.verb.VerbCompleteReason; import com.rayo.core.verb.RecordCompleteEvent.Reason; public class RecordProvider extends BaseProvider { // XML -> Object // ================================================================================ private static final Namespace NAMESPACE = new Namespace("", "urn:xmpp:rayo:record:1"); private static final Namespace COMPLETE_NAMESPACE = new Namespace("", "urn:xmpp:rayo:record: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("record")) { return buildRecord(element); } else if (PAUSE_QNAME.equals(element.getQName())) { return buildPauseCommand(element); } else if (RESUME_QNAME.equals(element.getQName())) { return buildResumeCommand(element); } else if (RAYO_COMPONENT_NAMESPACE.equals(element.getNamespace())) { return buildCompleteCommand(element); } return null; } private Object buildPauseCommand(Element element) throws URISyntaxException { return new RecordPauseCommand(); } private Object buildResumeCommand(Element element) throws URISyntaxException { return new RecordResumeCommand(); } private Object buildRecord(Element element) throws URISyntaxException { Record record = new Record(); if (element.attribute("to") != null) { record.setTo(toURI(element.attributeValue("to"))); } if (element.attribute("final-timeout") != null) { record.setFinalTimeout(toDuration("final-timeout", element)); } if (element.attribute("format") != null) { record.setFormat(element.attributeValue("format")); } if (element.attribute("initial-timeout") != null) { record.setInitialTimeout(toDuration("initial-timeout",element)); } if (element.attribute("max-duration") != null) { record.setMaxDuration(toDuration("max-duration", element)); } if (element.attribute("start-beep") != null) { record.setStartBeep(toBoolean("start-beep", element)); } if (element.attribute("stop-beep") != null) { record.setStopBeep(toBoolean("stop-beep", element)); } if (element.attribute("start-paused") != null) { record.setStartPaused(toBoolean("start-paused", element)); } if (element.attribute("duplex") != null) { record.setDuplex(toBoolean("duplex", element)); } return record; } private Object buildCompleteCommand(Element element) throws URISyntaxException { RecordCompleteEvent event = new RecordCompleteEvent(); @SuppressWarnings("unchecked") List<Element> children = (List<Element>)element.elements(); for (Element child: children) { if (child.getName().equals("recording")) { event.setUri(new URI(child.attributeValue("uri"))); if (child.attribute("duration") != null) { event.setDuration(toDuration("duration", child)); } if (child.attribute("size") != null) { event.setSize(toLong("size", child)); } } else { String reasonValue = child.getName().toUpperCase(); event.setReason(findReason(reasonValue)); } } return event; } // Object -> XML // ================================================================================ @Override protected void generateDocument(Object object, Document document) throws Exception { if (object instanceof Record) { createRecord((Record) object, document); } else if (object instanceof RecordCompleteEvent) { createRecordCompleteEvent((RecordCompleteEvent) object, document); } else if (object instanceof RecordPauseCommand) { createPauseCommand((RecordPauseCommand) object, document); } else if (object instanceof RecordResumeCommand) { createResumeCommand((RecordResumeCommand) object, document); } } private void createPauseCommand(RecordPauseCommand command, Document document) throws Exception { document.addElement(new QName("pause", NAMESPACE)); } private void createResumeCommand(RecordResumeCommand command, Document document) throws Exception { document.addElement(new QName("resume", NAMESPACE)); } private void createRecordCompleteEvent(RecordCompleteEvent event, Document document) throws Exception { addCompleteElement(document, event, COMPLETE_NAMESPACE); if (event.getUri() != null) { Element completeElement = document.getRootElement().addElement("recording", RecordProvider.COMPLETE_NAMESPACE.getURI()); completeElement.addAttribute("uri", event.getUri().toString()); completeElement.addAttribute("size", String.valueOf(event.getSize())); if (event.getDuration() != null) { completeElement.addAttribute("duration", Long.toString(event.getDuration().getMillis())); } } } private void createRecord(Record record, Document document) throws Exception { Element root = document.addElement(new QName("record", NAMESPACE)); if (record.getTo() != null) { root.addAttribute("to", record.getTo().toString()); } if (record.getStartBeep() != null) { root.addAttribute("start-beep", record.getStartBeep().toString()); } if (record.getStopBeep() != null) { root.addAttribute("stop-beep", record.getStopBeep().toString()); } if (record.getStartPaused() != null) { root.addAttribute("start-paused", record.getStartPaused().toString()); } if (record.getFinalTimeout() != null) { root.addAttribute("final-timeout", String.valueOf(record.getFinalTimeout().getMillis())); } if (record.getFormat() != null) { root.addAttribute("format", record.getFormat()); } if (record.getInitialTimeout() != null) { root.addAttribute("initial-timeout", String.valueOf(record.getInitialTimeout().getMillis())); } if (record.getMaxDuration() != null) { root.addAttribute("max-duration", String.valueOf(record.getMaxDuration().getMillis())); } if (record.getDuplex() != null) { root.addAttribute("duplex", String.valueOf(record.getDuplex())); } } private VerbCompleteReason findReason(String reasonValue) { for (Reason reason: Reason.values()) { if (reason.toString().equals(reasonValue)) { return reason; } } return VerbCompleteEvent.Reason.valueOf(reasonValue); } }