package de.dhbw.tinf12.pattern.eventbus; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; public class EventBus { private final Map<String, Set<NewsReceiver>> receivers; public EventBus() { super(); this.receivers = new HashMap<String, Set<NewsReceiver>>(); } public void post(News news, String topic) { if (containsWildcards(topic)) { postWithWildcards(news, topic); return; } postDirectly(news, topic); } private void postDirectly(News news, String topic) { for (NewsReceiver each : receiversFor(topic)) { each.receive(news); } } private void postWithWildcards(News news, String topic) { for (String each : this.receivers.keySet()) { if (each.matches(topic.replace("*", ".*"))) { postDirectly(news, each); } } } private boolean containsWildcards(String topic) { return topic.endsWith("*"); } public void subscribe(String topic, NewsReceiver receiver) { receiversFor(topic).add(receiver); } public void unsubscribe(String topic, NewsReceiver receiver) { receiversFor(topic).remove(receiver); } protected Set<NewsReceiver> receiversFor(String topic) { if (!this.receivers.containsKey(topic)) { this.receivers.put(topic, new LinkedHashSet<NewsReceiver>()); } return this.receivers.get(topic); } }