package com.limegroup.gnutella.spam; import com.limegroup.gnutella.URN; /** * similar to the SizeToken but a much more accurate file identifier. If the * user marked an Urn as spam once, it should always return a very high spam * rating close to 1 afterwards */ public class UrnToken extends AbstractToken { private static final long serialVersionUID = 3546925779406631222L; /** * after MAX bad evaluations this token's spamrating will be 1 */ private static final int MAX = 4; private static final int TYPE = TYPE_URN; private final URN _urn; private byte _bad; UrnToken(URN urn) { _urn = urn; _bad = 0; } /** * implements interface <tt>Token</tt> */ public float getRating() { return 1f / MAX * _bad; } /** * implements interface <tt>Token</tt> */ public void rate(int rating) { _age = 0; switch (rating) { case RATING_GOOD: if (_bad > 0) _bad--; break; case RATING_SPAM: if (_bad < MAX) _bad++; break; case RATING_CLEARED: case RATING_USER_MARKED_GOOD: _bad = 0; break; case RATING_USER_MARKED_SPAM: _bad = MAX; break; default: throw new IllegalArgumentException("unknown type of rating"); } } /** * implements interface <tt>Token</tt> */ public int getType() { return TYPE; } public final int hashCode() { return _urn.hashCode(); } public final boolean equals(Object o) { if (o == null) return false; if (!(o instanceof UrnToken)) return false; if (hashCode() != o.hashCode()) { return false; } return _urn.equals(((UrnToken)o)._urn); } /** * overrides method from <tt>Object</tt> */ public String toString() { return _urn.toString() + " " + _bad; } }