package org.torrent.internal.transfer; import java.beans.IndexedPropertyChangeEvent; import java.beans.PropertyChangeEvent; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Logger; import org.merapi.helper.handlers.BarUpdateRequestHandler; import org.merapi.helper.messages.BarUpdateRespondMessage; import org.torrent.internal.data.BTPart; import org.torrent.internal.peer.connection.BTConnection; import org.torrent.internal.protocol.message.BittorrentMessage; import org.torrent.internal.protocol.message.Piece; import org.torrent.internal.service.ContentStateListener; import org.torrent.internal.util.BTUtil; import org.torrent.internal.util.Time; import org.torrent.internal.util.Validator; public class DefaultSession implements BTSession { protected static final Logger LOG = Logger.getLogger(DefaultSession.class .getName()); private Collection<BTConnection> connections = new HashSet<BTConnection>(); private List<BTSessionListener> listeners = new CopyOnWriteArrayList<BTSessionListener>(); public DefaultSession() { } @Override public synchronized void addConnection(BTConnection connection) { Validator.notNull(connection, "Connection is null!"); if (connections.contains(connection)) { throw new IllegalStateException("Already added connection: " + connection); } connections.add(connection); fireAddedConnection(connection); } @Override public synchronized void removeConnection(BTConnection connection) { Validator.notNull(connection, "Connection is null!"); if (connections.remove(connection)) { fireRemovedConnection(connection); } } private void fireRemovedConnection(final BTConnection connection) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.removedConnection(connection); } } }); } private void fireAddedConnection(final BTConnection connection) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.addedConnection(connection); } } }); } @Override public synchronized void received(BTConnection from, BittorrentMessage message) { fireMessageReceived(from, message); } private void fireMessageReceived(final BTConnection from, final BittorrentMessage message) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { Time t = new Time(); l.receivedBTMessage(from, message); if (t.delta() > 100) { LOG.warning("Listener " + l + " took " + t.delta() + "ms to handle " + message); } } } }); } /** * Returns the connections, currently managed by this session. This method * is potentially dangerous. If you're accessing it in the event loop, keep * in mind that it's possible for connections to be added/removed with the * event still yet to be dispatched. * * @return the current managed connections */ @Override public synchronized Collection<BTConnection> getConnections() { return new ArrayList<BTConnection>(connections); } @Override public void sent(BTConnection from, BittorrentMessage msg) { fireMessageSent(from, msg); } private void fireMessageSent(final BTConnection from, final BittorrentMessage msg) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.sentBTMessage(from, msg); } } }); } // @Override // public List<BTSessionListener> getListenerChain() { // return listenerChain; // } @Override public void connectionEstablished(BTConnection connection) { fireConnectionEstablished(connection); } private void fireConnectionEstablished(final BTConnection connection) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.connectionEstablished(connection); } } }); } @Override public void bitFieldBitChanged(IndexedPropertyChangeEvent event) { fireBitFieldChanged(event); } private void fireBitFieldChanged(final IndexedPropertyChangeEvent event) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.bitFieldBitChanged(event); } } }); } @Override public void bitFieldChanged(PropertyChangeEvent event) { fireBitFieldChanged(event); } private void fireBitFieldChanged(final PropertyChangeEvent event) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.bitFieldChanged(event); } } }); } @Override public void close() { fireSessionClosed(); } private void fireSessionClosed() { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.closed(); } } }); } @Override public void unrequestedPiece(BTConnection connection, Piece piece) { fireUnrequestedPiece(connection, piece); } private void fireUnrequestedPiece(final BTConnection connection, final Piece piece) { BTUtil.invokeLater(new Runnable() { @Override public void run() { for (BTSessionListener l : listeners) { l.receivedUnrequestedPiece(connection, piece); } } }); } @Override public void addBTSessionListener(BTSessionListener listener) { Validator.notNull(listener, "Listener is null!"); listeners.add(listener); } @Override public boolean isAvailable(BTPart part) { // TODO Auto-generated method stub return false; } @Override public boolean isRequired(org.torrent.internal.data.TorrentMetaInfo.Piece piece) { // TODO Auto-generated method stub return false; } @Override public boolean isValidated(org.torrent.internal.data.TorrentMetaInfo.Piece piece) { // TODO Auto-generated method stub return false; } @Override public void removeContentStateListener(ContentStateListener listener) { // TODO Auto-generated method stub } @Override public void setAvailable(BTPart part) { // TODO Auto-generated method stub } @Override public void setRequired(org.torrent.internal.data.TorrentMetaInfo.Piece piece) { // TODO Auto-generated method stub } @Override public void setValidated(org.torrent.internal.data.TorrentMetaInfo.Piece piece) { // TODO Auto-generated method stub } @Override public List<BTSessionListener> getListenerChain() { // TODO Auto-generated method stub return null; } //1 @Override public void addContentStateListener(ContentStateListener listener) { // TODO Auto-generated method stub } }