@Override public synchronized int match( final Message message, final Set<Object> matches, final List<Subscription> triggers) { final MessageType type = message.getMsgType(); final Map<Object, List<Subscription>> objectMap = this.messageTypes.get(type); if (objectMap == null) { return 0; } int count = 0; for (final Map.Entry<Object, List<Subscription>> entry : objectMap.entrySet()) { final List<Subscription> subs = entry.getValue(); boolean matched = false; for (final Subscription sub : subs) { if (sub.filter.matchRemaining(message)) { if (!matched && matches.add(entry.getKey())) { ++count; matched = true; } if (triggers == null || sub.getTrigger() == null || !sub.getTrigger().match(message)) { break; } triggers.add(sub); } } } return count; }
@Override public synchronized void addFilter(final Subscription sub, final Object object) { final Collection<MessageType> types = sub.filter.getMessageTypes(); if (types == null) { return; } for (final MessageType tt : types) { Map<Object, List<Subscription>> objectMap = this.messageTypes.get(tt); if (objectMap == null) { objectMap = new HashMap<Object, List<Subscription>>(); this.messageTypes.put(tt, objectMap); } LinkedList<Subscription> subList = objectMap.get(object); if (subList == null) { subList = new LinkedList<Subscription>(); objectMap.put(object, subList); } if (sub.getTrigger() != null) { subList.addFirst(sub); } else { subList.addLast(sub); } } }