%PDF- %PDF-
| Direktori : /home/waritko/yacy/source/net/yacy/cora/federate/yacy/ |
| Current File : //home/waritko/yacy/source/net/yacy/cora/federate/yacy/Peer.java |
/**
* Peer
* Copyright 2012 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany
* First released 21.09.2012 at http://yacy.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program in the file lgpl21.txt
* If not, see <http://www.gnu.org/licenses/>.
*/
package net.yacy.cora.federate.yacy;
import java.io.Serializable;
import java.util.HashMap;
import net.yacy.cora.document.encoding.ASCII;
import net.yacy.cora.order.Base64Order;
/**
* new implemenentation of "Seed" objects: Peers.
* A Peer contains the attributes that a peer wants to show in public.
* This Class is simply a representation of the XML Schema that is used in the Network.xml interface.
*/
public class Peer extends HashMap<Peer.Schema, String> implements Comparable<Peer>, Serializable {
private static final long serialVersionUID = -3279480981385980050L;
public enum Schema implements Serializable {
hash,fullname,version,ppm,qph,uptime,links,
words,rurls,lastseen,sendWords,receivedWords,
sendURLs,receivedURLs,type,direct,acceptcrawl,dhtreceive,
nodestate,location,seedurl,age,seeds,connects,address,useragent;
}
private long time;
public Peer() {
super();
this.time = System.currentTimeMillis();
}
/**
* Get the number of minutes that the peer which returns the peer list knows when the peer was last seen.
* This value is only a relative to the moment when another peer was asked for fresh information.
* To compute an absolute value for last-seen, use the lastseenTime() method.
* @return time in minutes
*/
public int lastseen() {
String x = this.get(Schema.lastseen);
if (x == null) return Integer.MAX_VALUE;
try {
return Integer.parseInt(x);
} catch (final NumberFormatException e) {
return Integer.MAX_VALUE;
}
}
/**
* get the absolute time when this peer was seen in the network
* @return time in milliseconds
*/
public long lastseenTime() {
return time - lastseen() * 60000;
}
/**
* get the version number of the peer
* @return
*/
public float version() {
String x = this.get(Schema.version); if (x == null) return 0.0f;
int p = x.indexOf('/'); if (p < 0) return 0.0f;
x = x.substring(0, p);
try {
return Float.parseFloat(x);
} catch (final NumberFormatException e) {
return 0.0f;
}
}
/**
* check if the peer supports the solr interface
* @return true if the peer supports the solr interface
*/
public boolean supportsSolr() {
return version() >= 1.041f;
}
/**
* compare the peer to another peer.
* The comparisment is done using the base 64 order on the peer hash.
*/
@Override
public int compareTo(Peer o) {
String h0 = this.get(Schema.hash);
String h1 = o.get(Schema.hash);
return Base64Order.enhancedCoder.compare(ASCII.getBytes(h0), ASCII.getBytes(h1));
}
/**
* get the hash code of the peer.
* The hash code is a number that has the same order as the peer order.
*/
@Override
public int hashCode() {
String h = this.get(Schema.hash);
return (int) (Base64Order.enhancedCoder.cardinal(h) >> 32);
}
/**
* check if two peers are equal:
* two peers are equal if they have the same hash.
*/
@Override
public boolean equals(Object o) {
if (!(o instanceof Peer)) return false;
String h0 = this.get(Schema.hash);
String h1 = ((Peer) o).get(Schema.hash);
return h0.equals(h1);
}
public static void main(String[] args) {
String h = "____________";
long l = Base64Order.enhancedCoder.cardinal(h);
System.out.println("l = " + l + ", h = " + ((int) (l >> 32)));
System.out.println("l-maxlong = " + (l - Long.MAX_VALUE) + ", (h-maxint) = " + (((int) (l >> 32)) - Integer.MAX_VALUE));
}
}