/* * 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.message; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.tomp2p.peers.Number160; import net.tomp2p.peers.PeerAddress; import net.tomp2p.peers.PeerStatistic; import net.tomp2p.storage.Data; import net.tomp2p.utils.Pair; import net.tomp2p.utils.Utils; public class TrackerData { private final static Data EMPTY_DATA = new Data(0, 0); private final Map<PeerAddress, Data> peerAddresses; final private boolean couldProvideMoreData; public TrackerData(Map<PeerAddress, Data> peerAddresses) { this(peerAddresses, false); } public TrackerData(Map<PeerAddress, Data> peerAddresses, boolean couldProvideMoreData) { if(peerAddresses == null) { throw new IllegalArgumentException("Peer addresses must be set"); } this.peerAddresses = peerAddresses; this.couldProvideMoreData = couldProvideMoreData; } public TrackerData(Collection<Pair<PeerStatistic, Data>> value) { this.peerAddresses = new HashMap<PeerAddress, Data>(value.size()); for(Pair<PeerStatistic, Data> pair:value) { peerAddresses.put(pair.element0().peerAddress(), pair.element1()); } this.couldProvideMoreData = false; } public Map<PeerAddress, Data> peerAddresses() { return peerAddresses; } @Override public String toString() { StringBuilder sb = new StringBuilder("tdata:"); sb.append("p:").append(peerAddresses); return sb.toString(); } public boolean couldProvideMoreData() { return couldProvideMoreData; } public int size() { return peerAddresses.size(); } public void put(PeerAddress remotePeer, Data attachment) { peerAddresses.put(remotePeer, attachment == null ? EMPTY_DATA : attachment); } public Map.Entry<PeerAddress, Data> remove(Number160 remotePeerId) { for (Iterator<Map.Entry<PeerAddress, Data>> iterator = peerAddresses.entrySet().iterator(); iterator .hasNext();) { Map.Entry<PeerAddress, Data> entry = iterator.next(); if (entry.getKey().peerId().equals(remotePeerId)) { iterator.remove(); return entry; } } return null; } public boolean containsKey(Number160 tmpKey) { for (Iterator<Map.Entry<PeerAddress, Data>> iterator = peerAddresses.entrySet().iterator(); iterator .hasNext();) { Map.Entry<PeerAddress, Data> entry = iterator.next(); if (entry.getKey().peerId().equals(tmpKey)) { return true; } } return false; } public Map.Entry<PeerAddress, Data> get(Number160 tmpKey) { for (Iterator<Map.Entry<PeerAddress, Data>> iterator = peerAddresses.entrySet().iterator(); iterator .hasNext();) { Map.Entry<PeerAddress, Data> entry = iterator.next(); if (entry.getKey().peerId().equals(tmpKey)) { return entry; } } return null; } public boolean isEmpty() { return peerAddresses.isEmpty(); } @Override public boolean equals(Object obj) { if (!(obj instanceof TrackerData)) { return false; } if (obj == this) { return true; } final TrackerData other = (TrackerData) obj; return Utils.isSameSets(other.peerAddresses.keySet(), peerAddresses.keySet()) && Utils.isSameSets(other.peerAddresses.values(), peerAddresses.values()); } @Override public int hashCode() { int hashCode = 31; for (Map.Entry<PeerAddress, Data> entry : peerAddresses.entrySet()) { hashCode ^= entry.getKey().hashCode(); if (entry.getValue() != null) { hashCode ^= entry.getValue().hashCode(); } } return hashCode; } }