package com.limegroup.gnutella.spam; import java.io.Serializable; /** * An abstract Token class that uses an exponential moving average to update * its spam rating. Each subclass can have a different weight that determines * how sensitive its spam rating is to updates. */ public abstract class Token implements Serializable { private static final long serialVersionUID = -1519906405576105402L; /** * The spam rating of this token, between 0 (not spam) and 1 (spam). * Initialised to 0. */ protected float rating = 0; /** * Returns a weight between 0 and 1 that determines how sensitive this * token's spam rating is to updates - 0 means an update has no effect on * the rating, while 1 means an update completely changes the rating. * * @return a weight between 0 (not sensitive) and 1 (sensitive) */ abstract protected float getWeight(); /** * Gets this token's spam rating * * @return a rating between 0 (not spam) and 1 (spam) */ protected float getRating() { return rating; } /** Sets this token's spam rating * * @param rating a rating between 0 (not spam) and 1 (spam) */ protected void setRating(float rating) { this.rating = rating; } /** * Updates this token's spam rating by using an exponential moving average * to combine the new rating with the current rating. Subclasses must * supply the weight of the exponential moving average (between 0 and 1). * * @param update the new rating */ protected void updateRating(float update) { float weight = getWeight(); rating = rating * (1 - weight) + update * weight; } }