package org.mobicents.javax.media.mscontrol; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.media.mscontrol.EventType; import javax.media.mscontrol.Parameter; import javax.media.mscontrol.resource.enums.EventTypeEnum; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.mobicents.javax.media.mscontrol.mediagroup.PlayerEventDetectorFactory; import org.mobicents.javax.media.mscontrol.mediagroup.RecorderEventDetectorFactory; import org.mobicents.javax.media.mscontrol.mediagroup.signals.SignalDetectorEventDetectorFactory; import org.mobicents.javax.media.mscontrol.resource.ExtendedParameter; import org.mobicents.jsr309.mgcp.MgcpWrapper; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XMLParser implements TagNames { private static final String LINE_SEPARATOR = "\n"; public static Map<String, Parameter> strvsParameter = new HashMap<String, Parameter>(); public static Map<String, EventType> strvsEventType = new HashMap<String, EventType>(); static { // Parameter Mapping strvsParameter.put(ExtendedParameter.ENDPOINT_LOCAL_NAME.toString(), ExtendedParameter.ENDPOINT_LOCAL_NAME); // EventType mapping strvsEventType.put(EventTypeEnum.PLAY_COMPLETED.toString(), EventTypeEnum.PLAY_COMPLETED); strvsEventType.put(EventTypeEnum.SIGNAL_DETECTED.toString(), EventTypeEnum.SIGNAL_DETECTED); }; private void populatePlayer(NodeList playerNodeList, MediaConfigImpl medConfimpl) { // Player for (int i = 0; i < playerNodeList.getLength(); i++) { List<DefaultEventGeneratorFactory> generatorList = new ArrayList<DefaultEventGeneratorFactory>(); List<PlayerEventDetectorFactory> detectorList = new ArrayList<PlayerEventDetectorFactory>(); Node player = playerNodeList.item(i); NodeList sigAndEves = player.getChildNodes(); for (int j = 0; j < sigAndEves.getLength(); j++) { Node sigOrEve = sigAndEves.item(j); if (SIGNAL.compareTo(sigOrEve.getNodeName()) == 0) { NodeList signalsList = sigOrEve.getChildNodes(); Node mgcpEventNode = signalsList.item(0); Node mgcpPackageNode = signalsList.item(1); Node onEndpointNode = signalsList.item(2); generatorList.add(new DefaultEventGeneratorFactory(mgcpPackageNode.getTextContent(), mgcpEventNode .getTextContent(), Boolean.parseBoolean(onEndpointNode.getTextContent()))); } else if (EVENT.compareTo(sigOrEve.getNodeName()) == 0) { NodeList signalsList = sigOrEve.getChildNodes(); Node mgcpEventNode = signalsList.item(0); Node mgcpPackageNode = signalsList.item(1); Node onEndpointNode = signalsList.item(2); Node eventTypeNode = signalsList.item(3); detectorList.add(new PlayerEventDetectorFactory(mgcpPackageNode.getTextContent(), mgcpEventNode .getTextContent(), Boolean.parseBoolean(onEndpointNode.getTextContent()), strvsEventType .get(eventTypeNode.getTextContent()))); } } medConfimpl.setPlayerDetFactList(detectorList); medConfimpl.setPlayerGeneFactList(generatorList); medConfimpl.setPlayer(true); } } private void populateRecorder(NodeList recorderNodeList, MediaConfigImpl medConfimpl) { for (int i = 0; i < recorderNodeList.getLength(); i++) { List<DefaultEventGeneratorFactory> generatorList = new ArrayList<DefaultEventGeneratorFactory>(); List<RecorderEventDetectorFactory> detectorList = new ArrayList<RecorderEventDetectorFactory>(); Node recorder = recorderNodeList.item(i); NodeList sigAndEves = recorder.getChildNodes(); for (int j = 0; j < sigAndEves.getLength(); j++) { Node sigOrEve = sigAndEves.item(j); if (SIGNAL.compareTo(sigOrEve.getNodeName()) == 0) { NodeList signalsList = sigOrEve.getChildNodes(); Node mgcpEventNode = signalsList.item(0); Node mgcpPackageNode = signalsList.item(1); Node onEndpointNode = signalsList.item(2); generatorList.add(new DefaultEventGeneratorFactory(mgcpPackageNode.getTextContent(), mgcpEventNode .getTextContent(), Boolean.parseBoolean(onEndpointNode.getTextContent()))); } else if (EVENT.compareTo(sigOrEve.getNodeName()) == 0) { NodeList signalsList = sigOrEve.getChildNodes(); Node mgcpEventNode = signalsList.item(0); Node mgcpPackageNode = signalsList.item(1); Node onEndpointNode = signalsList.item(2); Node eventTypeNode = signalsList.item(3); detectorList.add(new RecorderEventDetectorFactory(mgcpPackageNode.getTextContent(), mgcpEventNode .getTextContent(), Boolean.parseBoolean(onEndpointNode.getTextContent()), strvsEventType .get(eventTypeNode.getTextContent()))); } } medConfimpl.setRecorderDetFactList(detectorList); medConfimpl.setRecorderGeneFactList(generatorList); medConfimpl.setRecorder(true); } } private void populateSignalDetector(NodeList sigDetNodeList, MediaConfigImpl medConfimpl) { for (int i = 0; i < sigDetNodeList.getLength(); i++) { List<DefaultEventGeneratorFactory> generatorList = new ArrayList<DefaultEventGeneratorFactory>(); List<SignalDetectorEventDetectorFactory> detectorList = new ArrayList<SignalDetectorEventDetectorFactory>(); Node sigDet = sigDetNodeList.item(i); NodeList sigAnEves = sigDet.getChildNodes(); for (int j = 0; j < sigAnEves.getLength(); j++) { Node sigOrEve = sigAnEves.item(j); if (SIGNAL.compareTo(sigOrEve.getNodeName()) == 0) { NodeList signalsList = sigOrEve.getChildNodes(); Node mgcpEventNode = signalsList.item(0); Node mgcpPackageNode = signalsList.item(1); Node onEndpointNode = signalsList.item(2); generatorList.add(new DefaultEventGeneratorFactory(mgcpPackageNode.getTextContent(), mgcpEventNode .getTextContent(), Boolean.parseBoolean(onEndpointNode.getTextContent()))); } else if (EVENT.compareTo(sigOrEve.getNodeName()) == 0) { NodeList signalsList = sigOrEve.getChildNodes(); Node mgcpEventNode = signalsList.item(0); Node mgcpPackageNode = signalsList.item(1); Node onEndpointNode = signalsList.item(2); Node eventTypeNode = signalsList.item(3); detectorList.add(new SignalDetectorEventDetectorFactory(mgcpPackageNode.getTextContent(), mgcpEventNode.getTextContent(), Boolean.parseBoolean(onEndpointNode.getTextContent()), strvsEventType.get(eventTypeNode.getTextContent()))); } } medConfimpl.setSigDeteEveDetFactList(detectorList); medConfimpl.setSigDeteEveGeneFactList(generatorList); medConfimpl.setSignaldetector(true); } } protected MediaConfigImpl parse(MgcpWrapper mgcpWrapper, InputStream stream) throws ParserConfigurationException, SAXException, IOException { MediaConfigImpl medConfimpl = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document document = builder.parse(stream); Element root = document.getDocumentElement(); // Parameter NodeList params = root.getElementsByTagName(PARAMETER); ParametersImpl parameters = new ParametersImpl(); for (int i = 0; i < params.getLength(); i++) { Node n = params.item(i); NodeList childs = n.getChildNodes(); String key = childs.item(0).getTextContent(); String value = childs.item(1).getTextContent(); parameters.put(strvsParameter.get(key), value); } SupportedFeaturesImpl suppfetImpl = new SupportedFeaturesImpl(); suppfetImpl.setParameter(parameters.keySet()); medConfimpl = new MediaConfigImpl(mgcpWrapper); medConfimpl.setParameters(parameters); medConfimpl.setSupportedFeatures(suppfetImpl); // Player NodeList playerNodeList = root.getElementsByTagName(PLAYER); if (playerNodeList.getLength() > 0) { populatePlayer(playerNodeList, medConfimpl); } // Recorder NodeList recorderNodeList = root.getElementsByTagName(RECORDER); if (recorderNodeList.getLength() > 0) { populateRecorder(recorderNodeList, medConfimpl); } // Signal-Detector NodeList sigDetNodeList = root.getElementsByTagName(SIGNAL_DETECTOR); if (sigDetNodeList.getLength() > 0) { populateSignalDetector(sigDetNodeList, medConfimpl); } return medConfimpl; } public String serialize(MediaConfigImpl mediaConfig) { StringBuffer b = new StringBuffer(); b.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); b.append(LINE_SEPARATOR); b.append("<"); b.append(RESOURCE_CONTAINER); b.append(">"); b.append(LINE_SEPARATOR); if (mediaConfig.getParameters() != null) { for (Parameter p : mediaConfig.getParameters().keySet()) { b.append("<").append(PARAMETER).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(KEY).append(">"); b.append(p.toString()); b.append("</").append(KEY).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(VALUE).append(">"); b.append(mediaConfig.getParameters().get(p).toString()); b.append("</").append(VALUE).append(">"); b.append(LINE_SEPARATOR); b.append("</").append(PARAMETER).append(">"); b.append(LINE_SEPARATOR); } } if (mediaConfig.isPlayer()) { b.append("<").append(PLAYER).append(">"); b.append(LINE_SEPARATOR); for (DefaultEventGeneratorFactory d : mediaConfig.getPlayerGeneFactList()) { b.append("<").append(SIGNAL).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_EVENT).append(">"); b.append(d.getEventName()); b.append("</").append(MGCP_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_PACKAGE).append(">"); b.append(d.getPkgName()); b.append("</").append(MGCP_PACKAGE).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(ON_ENDPOINT).append(">"); b.append(d.isOnEndpoint()); b.append("</").append(ON_ENDPOINT).append(">"); b.append(LINE_SEPARATOR); b.append("</").append(SIGNAL).append(">"); b.append(LINE_SEPARATOR); } if (mediaConfig.getPlayerDetFactList() != null) { for (PlayerEventDetectorFactory d : mediaConfig.getPlayerDetFactList()) { b.append("<").append(EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_EVENT).append(">"); b.append(d.getEventName()); b.append("</").append(MGCP_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_PACKAGE).append(">"); b.append(d.getPkgName()); b.append("</").append(MGCP_PACKAGE).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(ON_ENDPOINT).append(">"); b.append(d.isOnEndpoint()); b.append("</").append(ON_ENDPOINT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MEDIA_EVENT).append(">"); b.append(d.getMediaEventType().toString()); b.append("</").append(MEDIA_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("</").append(EVENT).append(">"); b.append(LINE_SEPARATOR); } } b.append("</").append(PLAYER).append(">"); b.append(LINE_SEPARATOR); } if (mediaConfig.isRecorder()) { b.append("<").append(RECORDER).append(">"); b.append(LINE_SEPARATOR); for (DefaultEventGeneratorFactory d : mediaConfig.getRecorderGeneFactList()) { b.append("<").append(SIGNAL).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_EVENT).append(">"); b.append(d.getEventName()); b.append("</").append(MGCP_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_PACKAGE).append(">"); b.append(d.getPkgName()); b.append("</").append(MGCP_PACKAGE).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(ON_ENDPOINT).append(">"); b.append(d.isOnEndpoint()); b.append("</").append(ON_ENDPOINT).append(">"); b.append(LINE_SEPARATOR); b.append("</").append(SIGNAL).append(">"); b.append(LINE_SEPARATOR); } if (mediaConfig.getRecorderDetFactList() != null) { for (RecorderEventDetectorFactory d : mediaConfig.getRecorderDetFactList()) { b.append("<").append(EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_EVENT).append(">"); b.append(d.getEventName()); b.append("</").append(MGCP_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_PACKAGE).append(">"); b.append(d.getPkgName()); b.append("</").append(MGCP_PACKAGE).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(ON_ENDPOINT).append(">"); b.append(d.isOnEndpoint()); b.append("</").append(ON_ENDPOINT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MEDIA_EVENT).append(">"); b.append(d.getMediaEventType().toString()); b.append("</").append(MEDIA_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("</").append(EVENT).append(">"); b.append(LINE_SEPARATOR); } } b.append("</").append(RECORDER).append(">"); b.append(LINE_SEPARATOR); } if (mediaConfig.isSignaldetector()) { b.append("<").append(SIGNAL_DETECTOR).append(">"); b.append(LINE_SEPARATOR); for (SignalDetectorEventDetectorFactory d : mediaConfig.getSigDeteEveDetFactList()) { b.append("<").append(EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_EVENT).append(">"); b.append(d.getEventName()); b.append("</").append(MGCP_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MGCP_PACKAGE).append(">"); b.append(d.getPkgName()); b.append("</").append(MGCP_PACKAGE).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(ON_ENDPOINT).append(">"); b.append(d.isOnEndpoint()); b.append("</").append(ON_ENDPOINT).append(">"); b.append(LINE_SEPARATOR); b.append("<").append(MEDIA_EVENT).append(">"); b.append(d.getMediaEventType().toString()); b.append("</").append(MEDIA_EVENT).append(">"); b.append(LINE_SEPARATOR); b.append("</").append(EVENT).append(">"); b.append(LINE_SEPARATOR); } b.append("</").append(SIGNAL_DETECTOR).append(">"); b.append(LINE_SEPARATOR); } b.append("</").append(RESOURCE_CONTAINER).append(">"); return b.toString(); } }