package com.limegroup.gnutella.spam; /** * A token holding the file size * * unlike addresses or keywords, we consider file sizes to be very accurate * identifiers of a file, so we will consider a certain file size spam after * only a few bad ratings in a row. */ public class SizeToken extends AbstractToken { private static final long serialVersionUID = 3906652994404955696L; /** * after MAX bad evaluations this token's spamrating will be 1 */ private static final int MAX = 10; private static final int TYPE = TYPE_SIZE; private final long _size; /* How suspect this file is, on a scale of [0, MAX] */ private byte _bad; public SizeToken(long size) { _bad = 0; _size = size; } /** * implements interface <tt>Token</tt> */ public float getRating() { return ((float) _bad) / MAX; } /** * 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 += 3; if (_bad > MAX) { _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() { // Even when we support files larger than // 2 GB, the upper 32 bits of the file size // hold much much less entropy than the lower // 32 bits. return (int)(_size); } public final boolean equals(Object o) { if (o == null) return false; if (!(o instanceof SizeToken)) return false; return hashCode() == o.hashCode(); } /** * overrides method from <tt>Object</tt> */ public String toString() { return "" + _size + " " + _bad; } }