/*
* Copyright 2009 Thomas Bocek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package net.tomp2p.connection;
import java.security.KeyPair;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import net.tomp2p.p2p.MaintenanceTask;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.peers.PeerMap;
import net.tomp2p.peers.PeerStatusListener;
import net.tomp2p.peers.RTT;
import net.tomp2p.rpc.BloomfilterFactory;
import net.tomp2p.storage.DigestStorage;
import net.tomp2p.storage.DigestTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A bean that holds non-sharable (unique for each peer) configuration settings for the peer. The sharable
* configurations are stored in a {@link ConnectionBean}.
*
* @author Thomas Bocek
*/
@NoArgsConstructor
@Accessors(chain = true, fluent = true)
public class PeerBean {
private static final Logger LOG = LoggerFactory.getLogger(PeerBean.class);
@Getter final private List<PeerStatusListener> peerStatusListeners = new ArrayList<PeerStatusListener>(1);
@Getter @Setter private KeyPair keyPair;
@Getter @Setter private PeerAddress serverPeerAddress;
@Getter @Setter private PeerMap peerMap;
@Getter @Setter private BloomfilterFactory bloomfilterFactory;
@Getter @Setter private MaintenanceTask maintenanceTask;
@Getter @Setter private DigestStorage digestStorage;
@Getter @Setter private DigestTracker digestTracker;
@Getter @Setter private NATHandler natHandler;
//This map is used for all open PeerConnections which are meant to stay open. {@link Number160} = peer ID.
private ConcurrentHashMap<Number160, PeerConnection> openPeerConnections =
new ConcurrentHashMap<Number160, PeerConnection>();
public PeerBean notifyPeerFound(PeerAddress sender, PeerAddress reporter, PeerConnection peerConnection,
RTT roundTripTime) {
synchronized (peerStatusListeners) {
for (PeerStatusListener peerStatusListener : peerStatusListeners) {
peerStatusListener.peerFound(sender, reporter, peerConnection, roundTripTime);
}
}
return this;
}
/**
* Adds a PeerStatusListener to this peer.
*
* @param peerStatusListener The new listener that is interested in the peer's status
* @return This class
*/
public PeerBean addPeerStatusListener(final PeerStatusListener peerStatusListener) {
synchronized (peerStatusListeners) {
peerStatusListeners.add(peerStatusListener);
}
return this;
}
/**
* Removes a PeerStatusListener from this peer.
*
* @param peerStatusListener The listener that is no longer intereseted in the peer's status
* @return This class
*/
public PeerBean removePeerStatusListener(final PeerStatusListener peerStatusListener) {
synchronized (peerStatusListeners) {
peerStatusListeners.remove(peerStatusListener);
}
return this;
}
/**
* Returns a {@link ConcurrentHashMap} with all currently open PeerConnections. Number160 = peer ID.
*
* @return openPeerConnections
*/
public ConcurrentHashMap<Number160, PeerConnection> openPeerConnections() {
return openPeerConnections;
}
/**
* Returns the {@link PeerConnection} for the given {@link Number160} peerId.
*
* @param {@link Number160} peerId The ID of the peer
* @return {@link PeerConnection} peerConnection The connection associated to the peer ID
*/
public PeerConnection peerConnection(final Number160 peerId) {
PeerConnection peerConnection = openPeerConnections.get(peerId);
if (peerConnection != null) {
return peerConnection;
} else {
LOG.error("There was no PeerConnection for peerId = " + peerId);
return null;
}
}
}