package com.limegroup.gnutella.spam; public class VendorToken extends AbstractToken { private static final long serialVersionUID = -3593261726550970847L; private static final byte INITAL_GOOD = 20; private static final int MAX = 100; /** * cache Tokens for the most popular vendors */ public static final VendorToken ALT = new ALTVendor(); public static final VendorToken LIME = new VendorToken("LIME"); public static final VendorToken BEAR = new VendorToken("BEAR"); public static final VendorToken RAZA = new VendorToken("RAZA"); public static final VendorToken OREO = new VendorToken("GNZL"); public static final VendorToken GNUC = new VendorToken("GNUC"); public static final VendorToken GTKG = new VendorToken("GTKG"); public static final VendorToken GIFT = new VendorToken("GIFT"); public static VendorToken getToken(String vendor) { if (vendor.equals("ALT")) return ALT; if (vendor.equals("LIME")) return LIME; if (vendor.equals("BEAR")) return BEAR; if (vendor.equals("RAZA")) return RAZA; if (vendor.equals("GNZL")) return OREO; if (vendor.equals("GNUC")) return GNUC; if (vendor.equals("GTKG")) return GTKG; if (vendor.equals("GIFT")) return GIFT; else return new VendorToken(vendor); } private final String vendor; private final int hashCode; private byte _good; private byte _bad; private VendorToken(String vendor) { this.vendor = vendor; hashCode = vendor.hashCode(); } public final int hashCode() { return hashCode; } public final boolean equals(Object o) { if (! (o instanceof VendorToken)) return false; if (hashCode != o.hashCode()) { return false; } return vendor.equals(((VendorToken)o).vendor); } public int getType() { return TYPE_VENDOR; } public float getRating() { return (float)Math.pow(1.f * _bad / (_good + _bad + 1), 2); } public void rate(int rating) { _age = 0; switch (rating) { case RATING_GOOD: _good++; break; case RATING_SPAM: _bad++; break; case RATING_USER_MARKED_GOOD: _bad = (byte) (_bad / 2); // bad rating should decrease slowly break; case RATING_USER_MARKED_SPAM: // bad rating should increase slowly. _bad = (byte) Math.min(_bad + 2, MAX); break; case RATING_CLEARED: _bad = 0; _good = INITAL_GOOD; break; default: throw new IllegalArgumentException("unknown type of rating"); } if (_good >= MAX || _bad >= MAX) { _good = (byte) (_good * 9 / 10); _bad = (byte) (_bad * 9 / 10); } } /** * Alternate locations should not be marked as spam */ private static class ALTVendor extends VendorToken { private static final long serialVersionUID = 703031386150175127L; ALTVendor() { super("ALT"); } public float getRating() { return 0; } public void rate(int rating) {} } }