/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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.*; import com.rayo.core.verb.SayCompleteEvent.Reason; public class HandsetProvider extends BaseProvider { // XML -> Object // ================================================================================ private static final Namespace NAMESPACE = new Namespace("", "urn:xmpp:rayo:handset:1"); private static final Namespace COMPLETE_NAMESPACE = new Namespace("", "urn:xmpp:rayo:handset:complete:1"); private static final QName ONHOOK_QNAME = new QName("onhook", NAMESPACE); private static final QName OFFHOOK_QNAME = new QName("offhook", NAMESPACE); private static final QName PRIVATE_QNAME = new QName("private", NAMESPACE); private static final QName PUBLIC_QNAME = new QName("public", NAMESPACE); private static final QName MUTE_QNAME = new QName("mute", NAMESPACE); private static final QName UNMUTE_QNAME = new QName("unmute", NAMESPACE); private static final QName HOLD_QNAME = new QName("hold", NAMESPACE); private static final QName TALK_QNAME = new QName("talk", NAMESPACE); private static final QName UNTALK_QNAME = new QName("untalk", NAMESPACE); private static final QName ONSPEAKER_QNAME = new QName("onspeaker", NAMESPACE); private static final QName OFFSPEAKER_QNAME = new QName("offspeaker", NAMESPACE); private static final QName CREATE_SPEAKER_QNAME = new QName("createspeaker", NAMESPACE); private static final QName DESTROY_SPEAKER_QNAME = new QName("destroyspeaker", NAMESPACE); @Override protected Object processElement(Element element) throws Exception { if (ONHOOK_QNAME.equals(element.getQName())) { return buildOnHookCommand(element); } else if (OFFHOOK_QNAME.equals(element.getQName())) { return buildOffHookCommand(element); } else if (PRIVATE_QNAME.equals(element.getQName())) { return buildPrivateCommand(element); } else if (PUBLIC_QNAME.equals(element.getQName())) { return buildPublicCommand(element); } else if (MUTE_QNAME.equals(element.getQName())) { return buildMuteCommand(element); } else if (UNMUTE_QNAME.equals(element.getQName())) { return buildUnmuteCommand(element); } else if (HOLD_QNAME.equals(element.getQName())) { return buildHoldCommand(element); } else if (TALK_QNAME.equals(element.getQName())) { return buildTalkCommand(element); } else if (UNTALK_QNAME.equals(element.getQName())) { return buildUntalkCommand(element); } else if (ONSPEAKER_QNAME.equals(element.getQName())) { return buildOnSpeakerCommand(element); } else if (OFFSPEAKER_QNAME.equals(element.getQName())) { return buildOffSpeakerCommand(element); } else if (CREATE_SPEAKER_QNAME.equals(element.getQName())) { return buildCreateSpeakerCommand(element); } else if (DESTROY_SPEAKER_QNAME.equals(element.getQName())) { return buildDestroySpeakerCommand(element); } else if (element.getNamespace().equals(RAYO_COMPONENT_NAMESPACE)) { return buildCompleteCommand(element); } return null; } private Object buildPrivateCommand(Element element) { return new PrivateCommand(); } private Object buildPublicCommand(Element element) { return new PublicCommand(); } private Object buildMuteCommand(Element element) { return new MuteCommand(); } private Object buildUnmuteCommand(Element element) { return new UnmuteCommand(); } private Object buildHoldCommand(Element element) { return new HoldCommand(); } 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 buildOffHookCommand(Element element) throws URISyntaxException { Handset handset; String sipuri = element.attributeValue("sipuri"); if (sipuri != null && "".equals(sipuri) == false) { handset = new Handset( element.attributeValue("sipuri"), element.attributeValue("mixer"), element.attributeValue("codec")); } else { handset = new Handset( element.attributeValue("cryptosuite"), element.attributeValue("localcrypto"), element.attributeValue("remotecrypto"), element.attributeValue("codec"), element.attributeValue("stereo"), element.attributeValue("mixer")); } handset.group = element.attributeValue("group"); handset.callId = element.attributeValue("callid"); OffHookCommand command = new OffHookCommand(); command.setHandset(handset); return command; } private Object buildOnHookCommand(Element element) throws URISyntaxException { return new OnHookCommand(); } private Object buildTalkCommand(Element element) { return new TalkCommand(); } private Object buildUntalkCommand(Element element) { return new UntalkCommand(); } private Object buildOnSpeakerCommand(Element element) { return new PutOnSpeakerCommand(); } private Object buildOffSpeakerCommand(Element element) { return new TakeOffSpeakerCommand(); } private Object buildCreateSpeakerCommand(Element element) { return new CreateSpeakerCommand(element.attributeValue("sipuri"), element.attributeValue("mixer"), element.attributeValue("codec")); } private Object buildDestroySpeakerCommand(Element element) { return new DestroySpeakerCommand(); } // Object -> XML // ================================================================================ @Override protected void generateDocument(Object object, Document document) throws Exception { if (object instanceof OnHookCommand) { createOnHookCommand((OnHookCommand) object, document); } else if (object instanceof OffHookCommand) { createOffHookCommand((OffHookCommand) object, document); } else if (object instanceof SayCompleteEvent) { createHandsetCompleteEvent((SayCompleteEvent) object, document); } else if (object instanceof OnHoldEvent) { createOnHoldEvent((OnHoldEvent) object, document); } else if (object instanceof OffHoldEvent) { createOffHoldEvent((OffHoldEvent) object, document); } else if (object instanceof MutedEvent) { createMutedEvent((MutedEvent) object, document); } else if (object instanceof UnmutedEvent) { createUnmutedEvent((UnmutedEvent) object, document); } else if (object instanceof PrivateEvent) { createPrivateEvent((PrivateEvent) object, document); } else if (object instanceof PublicEvent) { createPublicEvent((PublicEvent) object, document); } else if (object instanceof TransferredEvent) { createTransferredEvent((TransferredEvent) object, document); } else if (object instanceof TransferringEvent) { createTransferringEvent((TransferringEvent) object, document); } } private void createOffHookCommand(OffHookCommand command, Document document) throws Exception { Handset handset = command.getHandset(); Element root = document.addElement(new QName("offhook", NAMESPACE)); root.addAttribute("cryptoSuite", handset.cryptoSuite); root.addAttribute("localCrypto", handset.localCrypto); root.addAttribute("remoteCrypto", handset.cryptoSuite); root.addAttribute("codec", handset.codec); root.addAttribute("stereo", handset.stereo); root.addAttribute("mixer", handset.mixer); } private void createOnHookCommand(OnHookCommand command, Document document) throws Exception { document.addElement(new QName("onhook", NAMESPACE)); } private void createHandsetCompleteEvent(SayCompleteEvent event, Document document) throws Exception { addCompleteElement(document, event, COMPLETE_NAMESPACE); } private void createOnHoldEvent(OnHoldEvent onHold, Document document) { document.addElement(new QName("onhold", NAMESPACE)); } private void createOffHoldEvent(OffHoldEvent offHold, Document document) { document.addElement(new QName("offhold", NAMESPACE)); } private void createMutedEvent(MutedEvent muted, Document document) { document.addElement(new QName("onmute", NAMESPACE)); } private void createUnmutedEvent(UnmutedEvent unmuted, Document document) { document.addElement(new QName("offmute", NAMESPACE)); } private void createPrivateEvent(PrivateEvent event, Document document) { document.addElement(new QName("private", NAMESPACE)); } private void createPublicEvent(PublicEvent event, Document document) { document.addElement(new QName("public", NAMESPACE)); } private void createTransferredEvent(TransferredEvent event, Document document) { document.addElement(new QName("transferred", NAMESPACE)); } private void createTransferringEvent(TransferringEvent event, Document document) { document.addElement(new QName("transferring", NAMESPACE)); } }