package freenet.client.async; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; import freenet.keys.ClientSSK; import freenet.keys.FreenetURI; import freenet.keys.InsertableUSK; import freenet.keys.USK; /** Utility class for date-based edition hints */ public class USKDateHint { public enum Type { YEAR, MONTH, DAY, WEEK; /** cached values(). Never modify or pass this array to outside code! */ private static final Type[] values = values(); public boolean alwaysMorePreciseThan(Type type) { if(this.equals(type)) return false; if(this.equals(DAY)) { // Day beats everything. return true; } else if(this.equals(MONTH)) { // Month and week don't beat each other as they sometimes overlap. return type.equals(YEAR); } else if(this.equals(WEEK)) { return type.equals(YEAR); } else // if(this.equals(YEAR)) - everything beats year return false; } } private GregorianCalendar cal; private USKDateHint() { cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.US); } public static USKDateHint now() { return new USKDateHint(); } public String get(Type t) { StringBuffer sb = new StringBuffer(); sb.append(cal.get(Calendar.YEAR)); if(t == Type.YEAR) return sb.toString(); if(t == Type.WEEK) { sb.append("-WEEK-"); sb.append(cal.get(Calendar.WEEK_OF_YEAR)); return sb.toString(); } sb.append("-"); sb.append(cal.get(Calendar.MONTH)); if(t == Type.MONTH) return sb.toString(); sb.append("-"); sb.append(cal.get(Calendar.DAY_OF_MONTH)); return sb.toString(); } /** Return the data to insert to each hint slot. */ public String getData(long edition) { return "HINT\n"+Long.toString(edition)+"\n"+get(Type.DAY)+"\n"; } static final String PREFIX = "-DATEHINT-"; /** Return the URL's to insert hint data to */ public FreenetURI[] getInsertURIs(InsertableUSK key) { FreenetURI[] uris = new FreenetURI[Type.values.length]; int x = 0; for(Type t : Type.values) uris[x++] = key.getInsertableSSK(key.siteName+PREFIX+get(t)).getInsertURI(); return uris; } /** Return the URL's to fetch hint data from */ public ClientSSK[] getRequestURIs(USK key) { ClientSSK[] uris = new ClientSSK[Type.values.length]; int x = 0; for(Type t : Type.values) uris[x++] = key.getSSK(key.siteName+PREFIX+get(t)); return uris; } }