/*
* Copyright (C) 2003, C. Ramakrishnan / Auracle.
* All rights reserved.
*
* This code is licensed under the BSD 3-Clause license.
* See file LICENSE (or LICENSE.html) for more information.
*/
package com.illposed.osc.utility;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import com.illposed.osc.OSCBundle;
import com.illposed.osc.OSCListener;
import com.illposed.osc.OSCMessage;
import com.illposed.osc.OSCPacket;
/**
* Dispatches OSCMessages to registered listeners.
*
* @author Chandrasekhar Ramakrishnan
*/
public class OSCPacketDispatcher {
private Map<String, OSCListener> addressToListener
= new ConcurrentHashMap<String, OSCListener>();
/**
*
*/
public OSCPacketDispatcher() {
}
public void addListener(String address, OSCListener listener) {
addressToListener.put(address, listener);
}
public void removeListener(String query){
addressToListener.remove(query);
}
public void dispatchPacket(OSCPacket packet) {
if (packet instanceof OSCBundle) {
dispatchBundle((OSCBundle) packet);
} else {
dispatchMessage((OSCMessage) packet);
}
}
public void dispatchPacket(OSCPacket packet, Date timestamp) {
if (packet instanceof OSCBundle) {
dispatchBundle((OSCBundle) packet);
} else {
dispatchMessage((OSCMessage) packet, timestamp);
}
}
private void dispatchBundle(OSCBundle bundle) {
Date timestamp = bundle.getTimestamp();
OSCPacket[] packets = bundle.getPackets();
for (OSCPacket packet : packets) {
dispatchPacket(packet, timestamp);
}
}
private void dispatchMessage(OSCMessage message) {
dispatchMessage(message, null);
}
private void dispatchMessage(OSCMessage message, Date time) {
for (Entry<String, OSCListener> addrList : addressToListener.entrySet()) {
if (message.getAddress().matches(addrList.getKey())) {
addrList.getValue().acceptMessage(time, message);
}
}
}
}