package com.robonobo.core.service;
import java.util.*;
import com.robonobo.core.api.*;
import com.robonobo.core.api.model.*;
import com.robonobo.core.wang.WangListener;
import com.robonobo.mina.external.ConnectedNode;
import com.robonobo.mina.external.MinaListener;
public class EventService extends AbstractService implements MinaListener {
private List<TrackListener> trList = new ArrayList<TrackListener>();
private List<PlaybackListener> pbList = new ArrayList<PlaybackListener>();
private List<UserListener> ulList = new ArrayList<UserListener>();
private List<PlaylistListener> plList = new ArrayList<PlaylistListener>();
private List<LoginListener> liList = new ArrayList<LoginListener>();
private List<RobonoboStatusListener> stList = new ArrayList<RobonoboStatusListener>();
private List<WangListener> wList = new ArrayList<WangListener>();
private List<TransferSpeedListener> tsList = new ArrayList<TransferSpeedListener>();
private List<TaskListener> tlList = new ArrayList<TaskListener>();
private List<LibraryListener> llList = new ArrayList<LibraryListener>();
private int minaSupernodes = 0;
public EventService() {
}
public synchronized void addTrackListener(TrackListener listener) {
trList.add(listener);
}
public synchronized void removeTrackListener(TrackListener listener) {
trList.remove(listener);
}
public synchronized void addPlaybackListener(PlaybackListener l) {
pbList.add(l);
}
public synchronized void removePlaybackListener(PlaybackListener l) {
pbList.remove(l);
}
public synchronized void addStatusListener(RobonoboStatusListener l) {
stList.add(l);
}
public synchronized void removeStatusListener(RobonoboStatusListener l) {
stList.remove(l);
}
public synchronized void addUserListener(UserListener l) {
ulList.add(l);
}
public synchronized void removeUserListener(UserListener l) {
ulList.remove(l);
}
public synchronized void addPlaylistListener(PlaylistListener l) {
plList.add(l);
}
public synchronized void removePlaylistListener(PlaylistListener l) {
plList.remove(l);
}
public synchronized void addLoginListener(LoginListener l) {
liList.add(l);
}
public synchronized void removeLoginListener(LoginListener l) {
liList.remove(l);
}
public synchronized void addLibraryListener(LibraryListener l) {
llList.add(l);
}
public synchronized void removeLibraryListener(LibraryListener l) {
llList.remove(l);
}
public synchronized void addWangListener(WangListener l) {
wList.add(l);
}
public synchronized void removeWangListener(WangListener l) {
wList.remove(l);
}
public synchronized void addTransferSpeedListener(TransferSpeedListener l) {
tsList.add(l);
}
public synchronized void removeTransferSpeedListener(TransferSpeedListener l) {
tsList.remove(l);
}
public synchronized void addTaskListener(TaskListener l) {
tlList.add(l);
}
public synchronized void removeTaskListener(TaskListener l) {
tlList.remove(l);
}
public void fireTrackUpdated(String streamId) {
TrackListener[] arr;
synchronized (this) {
arr = getTrArr();
}
if (arr.length > 0) {
Track t = rbnb.getTrackService().getTrack(streamId);
for (TrackListener listener : arr) {
listener.trackUpdated(streamId, t);
}
}
}
public void fireTracksUpdated(Collection<String> streamIds) {
TrackListener[] arr;
synchronized (this) {
arr = getTrArr();
}
List<Track> trax = new ArrayList<Track>();
for (String sid : streamIds) {
trax.add(rbnb.getTrackService().getTrack(sid));
}
for (TrackListener listener : arr) {
listener.tracksUpdated(trax);
}
}
public void fireAllTracksLoaded() {
TrackListener[] arr;
synchronized (this) {
arr = getTrArr();
}
for (TrackListener listener : arr) {
listener.allTracksLoaded();
}
}
public void firePlaybackStarted() {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.playbackRunning();
}
}
public void firePlaybackStarting() {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.playbackStarting();
}
}
public void firePlaybackPaused() {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.playbackPaused();
}
}
public void firePlaybackStopped() {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.playbackStopped();
}
}
public void firePlaybackCompleted() {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.playbackCompleted();
}
}
public void firePlaybackProgress(long microsecs) {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.playbackProgress(microsecs);
}
}
public void firePlaybackError(String error) {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.playbackError(error);
}
}
public void fireSeekStarted() {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.seekStarted();
}
}
public void fireSeekFinished() {
PlaybackListener[] arr;
synchronized (this) {
arr = getPbArr();
}
for (PlaybackListener listener : arr) {
listener.seekFinished();
}
}
public void fireUserChanged(User u) {
UserListener[] arr;
synchronized (this) {
arr = getUlArr();
}
for (UserListener listener : arr) {
listener.userChanged(u);
}
}
public void fireAllUsersAndPlaylistsLoaded() {
UserListener[] arr;
synchronized (this) {
arr = getUlArr();
}
for (UserListener listener : arr) {
listener.allUsersAndPlaylistsLoaded();
}
}
public void firePlaylistChanged(Playlist p) {
PlaylistListener[] arr;
synchronized (this) {
arr = getPlArr();
}
for (PlaylistListener listener : arr) {
listener.playlistChanged(p);
}
}
public void fireGotPlaylistComments(long plId, boolean hasUnseen, Map<Comment, Boolean> cNewMap) {
PlaylistListener[] arr;
synchronized (this) {
arr = getPlArr();
}
for (PlaylistListener listener : arr) {
listener.gotPlaylistComments(plId, hasUnseen, cNewMap);
}
}
public void fireLoginSucceeded(User me) {
LoginListener[] arr;
synchronized (this) {
arr = getLiArr();
}
for (LoginListener listener : arr) {
listener.loginSucceeded(me);
}
}
public void fireLoginFailed(String reason) {
LoginListener[] arr;
synchronized (this) {
arr = getLiArr();
}
for (LoginListener listener : arr) {
listener.loginFailed(reason);
}
}
public void fireFriendLibraryUpdated(long userId, int numUnseen, Map<String, Date> newTracks) {
LibraryListener[] arr;
synchronized (this) {
arr = getLlArr();
}
for (LibraryListener listener : arr) {
listener.friendLibraryUpdated(userId, numUnseen, newTracks);
}
}
public void fireMyLibraryUpdated() {
LibraryListener[] arr;
synchronized (this) {
arr = getLlArr();
}
for (LibraryListener listener : arr) {
listener.myLibraryUpdated();
}
}
public void fireFriendLibraryReady(long userId, int numUnseen) {
LibraryListener[] arr;
synchronized (this) {
arr = getLlArr();
}
for (LibraryListener listener : arr) {
listener.friendLibraryReady(userId, numUnseen);
}
}
public void fireGotLibraryComments(long userId, boolean anyUnread, Map<Comment, Boolean> cNewMap) {
LibraryListener[] arr;
synchronized (this) {
arr = getLlArr();
}
for (LibraryListener listener : arr) {
listener.gotLibraryComments(userId, anyUnread, cNewMap);
}
}
public void fireUserConfigChanged(UserConfig cfg) {
UserListener[] arr;
synchronized (this) {
arr = getUlArr();
}
for (UserListener listener : arr) {
listener.userConfigChanged(cfg);
}
}
public void fireStatusChanged() {
RobonoboStatusListener[] arr;
synchronized (this) {
arr = getStArr();
}
for (RobonoboStatusListener listener : arr) {
listener.roboStatusChanged();
}
}
public void fireConnectionAdded(ConnectedNode node) {
RobonoboStatusListener[] arr;
synchronized (this) {
arr = getStArr();
}
for (RobonoboStatusListener listener : arr) {
listener.connectionAdded(node);
}
}
public void fireConnectionLost(ConnectedNode node) {
RobonoboStatusListener[] arr;
synchronized (this) {
arr = getStArr();
}
for (RobonoboStatusListener listener : arr) {
listener.connectionLost(node);
}
}
public void removeAllListeners() {
trList.clear();
pbList.clear();
ulList.clear();
plList.clear();
liList.clear();
stList.clear();
wList.clear();
tsList.clear();
tlList.clear();
llList.clear();
}
public void nodeConnected(ConnectedNode node) {
if (node.isSupernode()) {
minaSupernodes++;
if (minaSupernodes > 0 && getRobonobo().getUserService().isLoggedIn()) {
getRobonobo().setStatus(RobonoboStatus.Connected);
fireStatusChanged();
}
}
fireConnectionAdded(node);
}
public void nodeDisconnected(ConnectedNode node) {
if (node.isSupernode()) {
if (minaSupernodes == 1) {
rbnb.setStatus(RobonoboStatus.NotConnected);
fireStatusChanged();
}
if (minaSupernodes > 0)
minaSupernodes--;
}
fireConnectionLost(node);
}
public void fireWangBalanceChanged(double newBalance) {
WangListener[] arr;
synchronized (this) {
arr = getWArr();
}
for (WangListener listener : arr) {
listener.balanceChanged(newBalance);
}
}
public void fireWangAccountActivity(double creditValue, String narration) {
WangListener[] arr;
synchronized (this) {
arr = getWArr();
}
for (WangListener listener : arr) {
listener.accountActivity(creditValue, narration);
}
}
public void fireNewTransferSpeeds(Map<String, TransferSpeed> speedsByStream, Map<String, TransferSpeed> speedsByNode) {
TransferSpeedListener[] arr;
synchronized (this) {
arr = getTSArr();
}
for (TransferSpeedListener listener : arr) {
listener.newTransferSpeeds(speedsByStream, speedsByNode);
}
}
public void fireTaskUpdated(Task t) {
TaskListener[] arr;
synchronized (this) {
arr = getTLArr();
}
for (TaskListener listener : arr) {
listener.taskUpdated(t);
}
}
/** Copy the list of listeners, to remove deadlock possibilities */
private TrackListener[] getTrArr() {
TrackListener[] result = new TrackListener[trList.size()];
trList.toArray(result);
return result;
}
/** Copy the list of listeners, to remove deadlock possibilities */
private PlaybackListener[] getPbArr() {
PlaybackListener[] result = new PlaybackListener[pbList.size()];
pbList.toArray(result);
return result;
}
private UserListener[] getUlArr() {
UserListener[] result = new UserListener[ulList.size()];
ulList.toArray(result);
return result;
}
private PlaylistListener[] getPlArr() {
PlaylistListener[] result = new PlaylistListener[plList.size()];
plList.toArray(result);
return result;
}
private LoginListener[] getLiArr() {
LoginListener[] result = new LoginListener[liList.size()];
liList.toArray(result);
return result;
}
private LibraryListener[] getLlArr() {
LibraryListener[] result = new LibraryListener[llList.size()];
llList.toArray(result);
return result;
}
private RobonoboStatusListener[] getStArr() {
RobonoboStatusListener[] result = new RobonoboStatusListener[stList.size()];
stList.toArray(result);
return result;
}
private WangListener[] getWArr() {
WangListener[] result = new WangListener[wList.size()];
wList.toArray(result);
return result;
}
private TransferSpeedListener[] getTSArr() {
TransferSpeedListener[] result = new TransferSpeedListener[tsList.size()];
tsList.toArray(result);
return result;
}
private TaskListener[] getTLArr() {
TaskListener[] result = new TaskListener[tlList.size()];
tlList.toArray(result);
return result;
}
public void receptionCompleted(String streamId) {
}
public void receptionConnsChanged(String streamId) {
DownloadingTrack d = rbnb.getDownloadService().getDownload(streamId);
if (d != null)
fireTrackUpdated(streamId);
}
@Override
public void shutdown() throws Exception {
}
@Override
public void startup() throws Exception {
// This will fire our status as 'starting'
fireStatusChanged();
}
public String getName() {
return "Event Service";
}
public String getProvides() {
return "core.events";
}
}