package org.limewire.friend.impl; import java.net.URI; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.limewire.friend.api.FriendPresence; import org.limewire.friend.api.feature.Feature; import org.limewire.friend.api.feature.FeatureEvent; import org.limewire.friend.api.feature.FeatureTransport; import org.limewire.listener.EventBroadcaster; import org.limewire.listener.EventListenerList; /** * Abstract implementation of {@link FriendPresence} providing * management of features and feature transports. */ public abstract class AbstractFriendPresence implements FriendPresence { private final Map<URI, Feature> features; private final Map<Class<? extends Feature<?>>, FeatureTransport> featureTransports; private final EventBroadcaster<FeatureEvent> featureBroadcaster; public AbstractFriendPresence() { this(new EventListenerList<FeatureEvent>()); } public AbstractFriendPresence(EventBroadcaster<FeatureEvent> featureEventBroadcaster){ this.features = new ConcurrentHashMap<URI, Feature>(5, 0.75f, 1); this.featureTransports = new ConcurrentHashMap<Class<? extends Feature<?>>, FeatureTransport>(5, 0.75f, 1); this.featureBroadcaster = featureEventBroadcaster; } @Override public Collection<Feature> getFeatures() { return features.values(); } @Override public Feature getFeature(URI id) { return features.get(id); } @Override public boolean hasFeatures(URI... id) { for(URI uri : id) { if(getFeature(uri) == null) { return false; } } return true; } @Override public void addFeature(Feature feature) { features.put(feature.getID(), feature); featureBroadcaster.broadcast(new FeatureEvent(this, FeatureEvent.Type.ADDED, feature)); } @Override public void removeFeature(URI id) { Feature feature = features.remove(id); if(feature != null) { featureBroadcaster.broadcast(new FeatureEvent(this, FeatureEvent.Type.REMOVED, feature)); } } @SuppressWarnings("unchecked") @Override public <T extends Feature<U>, U> FeatureTransport<U> getTransport(Class<T> feature) { return featureTransports.get(feature); } @Override public <D, F extends Feature<D>> void addTransport(Class<F> clazz, FeatureTransport<D> transport) { featureTransports.put(clazz, transport); } }