From: <bra...@us...> - 2010-04-10 02:41:38
|
Revision: 3032 http://archive-access.svn.sourceforge.net/archive-access/?rev=3032&view=rev Author: bradtofel Date: 2010-04-10 02:41:32 +0000 (Sat, 10 Apr 2010) Log Message: ----------- INITIAL REV: Code which simplifies partitioning Date-related types into partitions of human-logical sizes, Day, Hour, Two Weeks, Year, etc. Users must provide a class which maps their instance-specific type to a Date, and which adds their type to a partition. Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/ElementPartitionMap.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partition.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/PartitionSize.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partitioner.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/DayPartitionSize.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/HourPartitionSize.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/MonthPartitionSize.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoMonthPartitionSize.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoYearPartitionSize.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/WeekPartitionSize.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/YearPartitionSize.java Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/ElementPartitionMap.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/ElementPartitionMap.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/ElementPartitionMap.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,59 @@ +/* ElementPartitionMap + * + * $Id$: + * + * Created on Apr 8, 2010. + * + * Copyright (C) 2006 Internet Archive. + * + * This file is part of Wayback. + * + * Wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * Wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with Wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package org.archive.wayback.util.partition; + +import java.util.Date; + +/** + * @author brad + * @param <T> Specific Class which can be mapped to a Date, and added to a + * Partition + * + */ +public interface ElementPartitionMap<T> { + /** + * Convert an element to a Date ex: + * + * return element.getDate(); + * + * @param element the element to convert + * @return the Date for the element + */ + public Date elementToDate(T element); + + /** + * Add the element to a partition, possible modifying the Partition in some + * way. ex: + * + * partition.add(element); + * partition.addTotal(1); + * + * @param element to be added + * @param partition to which the element should be added + */ + public void addElementToPartition(T element, Partition<T> partition); + +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/ElementPartitionMap.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partition.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partition.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partition.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,126 @@ +package org.archive.wayback.util.partition; + +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +/** + * A class which holds elements of some type for a particular Date range. + * + * This class also has two additional application-usable fields: + + * containsClosest: boolean - tracks whether this Partition holds the + * "closest" element of interest to an application + * + * total: int - independent counter for total internal application-level + * elements, useful when nesting partitions, to track the sum-of-totals + * of interior partitions + * + * @author brad + * + * @param <T> Generic type which this partition holds. + */ +public class Partition<T> { + + private Date start = null; + private Date end = null; + private List<T> list = null; + private boolean containsClosest = false; + private int total = 0; + + /** + * Create a Partition for holding elements between the two argument Date + * objects. + * @param start Date representing the start of elements held in this + * Partition, inclusive. + * @param end Date representing the end of elements held in this Partition, + * exclusive. + */ + public Partition(Date start, Date end) { + this.start = start; + this.end = new Date(end.getTime()-1); + list = new ArrayList<T>(); + total = 0; + } + + /** + * Checks if a date is within this partition + * @param d Date to check + * @return boolean true if d is >= start, and < end + */ + public boolean containsDate(Date d) { + return (start.compareTo(d) <= 0) && + (end.compareTo(d) > 0); + } + + /** + * @return the start Date for this Partition. + */ + public Date getStart() { + return start; + } + + /** + * @return the end Date for this Partition. + */ + public Date getEnd() { + return end; + } + + /** + * @return number of elements held in this Partition. + */ + public int count() { + return list.size(); + } + + /** + * @param o element to be added to this partition. + */ + public void add(T o) { + list.add(o); + } + + /** + * @return an Iterator of elements held in this Partition. + */ + public Iterator<T> iterator() { + return list.iterator(); + } + + /** + * @return a List of the elements held in this Partition. + */ + public List<T> list() { + return list; + } + + /** + * @return the containsClosest + */ + public boolean isContainsClosest() { + return containsClosest; + } + + /** + * @param containsClosest the containsClosest to set + */ + public void setContainsClosest(boolean containsClosest) { + this.containsClosest = containsClosest; + } + + /** + * Add and int to the Total count for this partition. + * @param numberToAdd number to add + */ + public void addTotal(int numberToAdd) { + total += numberToAdd; + } + /** + * @return the Total count for this partition. + */ + public int getTotal() { + return total; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partition.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/PartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/PartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/PartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,137 @@ +package org.archive.wayback.util.partition; + +import java.util.Calendar; + +/** + * A class which simplifies partitioning Dates based on human logical time + * intervals: Day, Week, TwoYear. + * + * Implementing classes provide methods to align Calendars at the start of the + * nearest Day, Month, Week, etc. + * + * In addition, implementors provide methods to create new Calendars based on + * their specific alignment size. + * + * @author brad + * + */ +public interface PartitionSize { + + /** + * number of milliseconds in a second.. + */ + public final static long MS_IN_SEC = 1000; + /** + * seconds in a non-leap-second hour + */ + public final static long SEC_IN_HOUR = 3600; + /** + * hours in a day: 24 + */ + public final static long HOUR_IN_DAY = 24; + /** + * days in a 7 day week... what color was his white horse? + */ + public final static long DAY_IN_WEEK = 7; + /** + * approximate days in one month, that is, 30 days + */ + public final static long DAY_IN_MONTH = 30; + /** + * days in one year, assuming a non-leap year + */ + public final static long DAY_IN_YEAR = 365; + + /** + * milliseconds in 1 hour (approximate: no leap second accounted for) + */ + public final static long MS_IN_HOUR = MS_IN_SEC * SEC_IN_HOUR; + /** + * milliseconds in 1 day (approximate: no leap second accounted for) + */ + public final static long MS_IN_DAY = MS_IN_HOUR * HOUR_IN_DAY; + /** + * milliseconds in 7 days (approximate: no leap second accounted for) + */ + public final static long MS_IN_WEEK = MS_IN_DAY * DAY_IN_WEEK; + /** + * milliseconds in one month (approximate: no leap day/sec accounted for, + * and assumes 30 days in a month) + */ + public final static long MS_IN_MONTH = MS_IN_DAY * DAY_IN_MONTH; + /** + * milliseconds in two months (approximate: no leap day/sec accounted for, + * and assumes 30 day months) + */ + public final static long MS_IN_TWO_MONTH = MS_IN_MONTH * 2; + /** + * milliseconds in one year (approximate: no leap day/sec accounted for) + */ + public final static long MS_IN_YEAR = MS_IN_DAY * DAY_IN_YEAR; + /** + * milliseconds in two years (approximate: no leap day/sec accounted for) + */ + public final static long MS_IN_TWO_YEAR = MS_IN_YEAR * 2; + + /** + * + */ + public final static String HOUR_NAME = "hour"; + /** + * + */ + public final static String DAY_NAME = "day"; + /** + * + */ + public final static String WEEK_NAME = "week"; + /** + * + */ + public final static String MONTH_NAME = "month"; + /** + * + */ + public final static String TWO_MONTH_NAME = "twomonth"; + /** + * + */ + public final static String YEAR_NAME = "year"; + /** + * + */ + public final static String TWO_YEAR_NAME = "twoyear"; + + /** + * Align the calendar argument to the start of the interval covered by + * this size. Calling this method on a DayPartitionSize will align the + * Calendar to the beginning of the Day in which the Calendar's Date object + * falls within. + * @param in Calendar object which has internal Date set + */ + public void alignStart(Calendar in); + + /** + * Create a new Calendar object, aligned relative to the Calendar argument, + * either forward or backward some number of partitions. + * @param start the returned Calendar will be aligned one day, week, month, + * etc. ahead or behind of this Calendar argument. + * @param offset the relative distance to move the returned calendar + * relative to the argument Calendar. + * @return a new Calendar aligned relative to the start Calendar. + */ + public Calendar increment(Calendar start, int offset); + + /** + * @return the estimated number of milliseconds covered by this + * PartitionSize. Note that this is estimated because of different number of + * days in a month, leap days, leap seconds, etc. + */ + public long intervalMS(); + + /** + * @return the name of this PartitionSize. Likely useful for localized + * lookup of human readable text from a properties file. + */ + public String name(); +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/PartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partitioner.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partitioner.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partitioner.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,313 @@ +package org.archive.wayback.util.partition; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.TimeZone; + +import org.apache.log4j.Logger; +import org.archive.wayback.util.partition.size.DayPartitionSize; +import org.archive.wayback.util.partition.size.HourPartitionSize; +import org.archive.wayback.util.partition.size.MonthPartitionSize; +import org.archive.wayback.util.partition.size.TwoMonthPartitionSize; +import org.archive.wayback.util.partition.size.TwoYearPartitionSize; +import org.archive.wayback.util.partition.size.WeekPartitionSize; +import org.archive.wayback.util.partition.size.YearPartitionSize; + +/** + * Class which divides a set of date-related objects into sub-sets by time + * ranges. + * + * This class provides methods for: + * + * 1) determining the smallest PartitionSize that can be used to cover a time + * range, using at most a set number of partitions + * 2) creating a List of Partition objects covering a span of time, each having + * a specified size + * 3) efficiently populating an iterator of date-related objects into List of + * Partition objects + * + * @author brad + * + * @param <T> generic class type to use with this Partitioner + */ +public class Partitioner<T> { + + private static final TimeZone TZ_UTC = TimeZone.getTimeZone("UTC"); + private static final Logger LOGGER = Logger.getLogger( + Partitioner.class.getName()); + + private ElementPartitionMap<T> map = null; + + /** + * PartitionSize based on Hour intervals + */ + public static PartitionSize hourSize = new HourPartitionSize(); + /** + * PartitionSize based on Day intervals + */ + public static PartitionSize daySize = new DayPartitionSize(); + /** + * PartitionSize based on Week intervals + */ + public static PartitionSize weekSize = new WeekPartitionSize(); + /** + * PartitionSize based on Month intervals + */ + public static PartitionSize monthSize = new MonthPartitionSize(); + /** + * PartitionSize based on Two Month intervals + */ + public static PartitionSize twoMonthSize = new TwoMonthPartitionSize(); + /** + * PartitionSize based on Year intervals + */ + public static PartitionSize yearSize = new YearPartitionSize(); + /** + * PartitionSize based on Two Year intervals + */ + public static PartitionSize twoYearSize = new TwoYearPartitionSize(); + + private static PartitionSize[] sizes = { + hourSize, + daySize, + weekSize, + monthSize, + twoMonthSize, + yearSize, + twoYearSize + }; + + /** + * @param map that converts from the Generic type used in this instance + * to a Date, and adds a Generic type used to a Partition + */ + public Partitioner(ElementPartitionMap<T> map) { + this.map = map; + } + /** + * Get a PartitionSize object by it's name + * @param name of the PartitionSize + * @return PartitionSize matching the name, or a TwoYearPartionSize if name + * is unknown + */ + public static PartitionSize getSize(String name) { + for(PartitionSize pa : sizes) { + if(pa.name().equals(name)) { + return pa; + } + } + return twoYearSize; + } + + /** + * Attempt to find the smallest PartitionSize implementation which, spanning + * the range first and last specified, produces at most maxP partitions. + * @param first Date of beginning of time range + * @param last Date of end of time range + * @param maxP maximum number of Partitions to use + * @return a PartitionSize object which will divide the range into at most + * maxP Partitions + */ + public PartitionSize getSize(Date first, Date last, int maxP) { + long diffMS = last.getTime() - first.getTime(); + for(PartitionSize pa : sizes) { + long maxMS = maxP * pa.intervalMS(); + if(maxMS > diffMS) { + return pa; + } + } + return twoYearSize; + } + + private void logDates(String message, Date date1, Date date2) { + SimpleDateFormat f = new SimpleDateFormat("H:mm:ss:SSS MMM d, yyyy"); + f.setTimeZone(TZ_UTC); + String pd1 = f.format(date1); + String pd2 = f.format(date2); + LOGGER.info(message + ":" + pd1 + " - " + pd2); + } + + /** + * Create a List of Partition objects of the specified size, which span the + * date range specified. + * + * @param size of Partitions to create + * @param start Date of beginning of time range to cover + * @param end Date of end of time range to cover + * @return List of Partitions spanning start and end, sized size, in date- + * ascending order. + */ + public List<Partition<T>> getRange(PartitionSize size, Date start, + Date end) { +// logDates("Constructing partitions Size(" + size.name() + ")",start,end); +// Date origStart = new Date(start.getTime()); + List<Partition<T>> partitions = new ArrayList<Partition<T>>(); + Calendar cStart = Calendar.getInstance(TZ_UTC); + cStart.setTime(start); + size.alignStart(cStart); +// logDates("AlignedStart("+size.name()+")",origStart,cStart.getTime()); + Calendar cEnd = size.increment(cStart, 1); +// logDates("AlignedEnd("+size.name()+")",cStart.getTime(),cEnd.getTime()); + while(cStart.getTime().compareTo(end) < 0) { + partitions.add(new Partition<T>(cStart.getTime(), cEnd.getTime())); + cStart = cEnd; + cEnd = size.increment(cStart, 1); +// logDates("Incremented("+size.name()+")", +// cStart.getTime(),cEnd.getTime()); + } + return partitions; + } + + /** + * Add elements from itr into the appropriate partitions. Assumes that + * all elements fit in one of the argument Partitions, that the partitions + * are in ascending order by time, and that elements returned from the + * Iterator are in ascending time order. + * + * @param partitions to populate with objects + * @param itr ascending Iterator of objects to place into the partitions + */ + public void populate(List<Partition<T>> partitions, + Iterator<T> itr) { + int idx = 0; + int size = partitions.size(); + T element = null; + while(idx < size) { + Partition<T> partition = partitions.get(idx); + if(element == null) { + if(itr.hasNext()) { + element = itr.next(); + } else { + // all done + break; + } + } + // will current result fit in the current partition? + while(partition.containsDate(map.elementToDate(element))) { + map.addElementToPartition(element, partition); + element = null; + if(itr.hasNext()) { + element = itr.next(); + } else { + break; + } + } + idx++; + } + if(itr.hasNext()) { + // eew... Likely bad usage. is this an error? + LOGGER.warn("Not all elements fit in partitions!"); + } + } + + /** + * Debugging method + * @param partitions to dump + */ + public void dumpPartitions(List<Partition<T>> partitions) { + int i = 0; + for(Partition<T> partition : partitions) { + i++; + logDates("Partition("+i+")", + partition.getStart(), partition.getEnd()); + } + } + + /* + * + * SOME UNFINISHED/UNTESTED CODE WHICH MAY BE OF INTEREST IN THE FUTURE + * FOLLOWS. NONE IS USED FOR NOW: + * + */ + +// /** +// * Create a List of Partitions centered at center, extending back in time +// * to start, and forward to end. If more than count partitions are required, +// * then the edge partitions will be grown until the range is extended to +// * start and end, with the edge partitions being non-standard size. +// * +// * @param center +// * @param start +// * @param end +// * @param count +// * @return +// */ +// public List<Partition<T>> getCentered(PartitionSize size, Date center, +// Date start, Date end, int count) { +// +// List<Partition<T>> partitions = new ArrayList<Partition<T>>(); +// Calendar cStart = Calendar.getInstance(TimeZone.getTimeZone("GMT")); +// cStart.setTime(center); +// size.alignStart(cStart); +// Calendar cEnd = size.increment(cStart, 1); +// +// partitions.add(new Partition<T>(cStart.getTime(),cEnd.getTime())); +// +// int numSides = (count - 1) / 2; +// // first add those backwards: +// Partition<T> cur = null; +// for(int i=1; i <= numSides; i++) { +// cEnd = cStart; +// cStart = size.increment(cStart, -1); +// Date curStart = cStart.getTime(); +// if(i == numSides) { +// // first partition, maybe make longer: +// if(curStart.after(start)) { +// curStart = new Date(start.getTime() - 1000); +// } +// } +// cur = new Partition<T>(curStart, cEnd.getTime()); +// partitions.add(0,cur); +// } +// +// // re-align center, and increment: +// cStart.setTime(center); +// size.alignStart(cStart); +// cStart = size.increment(cStart, 1); +// cEnd = size.increment(cStart, 1); +// +// for(int i=1; i <= numSides; i++) { +// Date curEnd = cEnd.getTime(); +// if(i == numSides) { +// // last partition, maybe make longer: +// if(curEnd.before(end)) { +// // end is exclusive, so make 1 MS more: +// curEnd = end; +// } +// } +// cur = new Partition<T>(cStart.getTime(),curEnd); +// partitions.add(cur); +// cStart = cEnd; +// cEnd = size.increment(cStart, 1); +// } +// return partitions; +// } + +// public List<Partition<T>> partitionRange(Date start, Date end, String name) { + // +// PartitionSize size = getSize(name); +// return getRange(size, start, end); +// } +// public List<Partition<T>> partitionCentered(Date center, Date start, +// Date end, int count, String name) { + // +// PartitionSize size = getSize(name); +// return getCentered(size, center, start, end, count); +// } +// public List<Partition<T>> partitionRange(Date start, Date end, int max) { + // +// PartitionSize size = getSize(start, end, max); +// return getRange(size, start, end); +// } +// public List<Partition<T>> partitionCentered(Date center, Date start, +// Date end, int count) { + // +// PartitionSize size = getSize(start,end,count); +// return getCentered(size, center, start, end, count); +// } + +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/Partitioner.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/DayPartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/DayPartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/DayPartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,37 @@ +package org.archive.wayback.util.partition.size; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.archive.wayback.util.partition.PartitionSize; + +/** + * PartitionSize which aligns on one Day partitions + * @author brad + * + */ +public class DayPartitionSize implements PartitionSize { + + public String name() { + return PartitionSize.DAY_NAME; + } + + public long intervalMS() { + return MS_IN_DAY; + } + + public void alignStart(Calendar in) { + in.set(Calendar.HOUR_OF_DAY,0); + in.set(Calendar.MINUTE,0); + in.set(Calendar.SECOND,0); + in.set(Calendar.MILLISECOND, 0); + } + + public Calendar increment(Calendar start, int offset) { + + Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + end.setTime(start.getTime()); + end.add(Calendar.DAY_OF_YEAR,1 * offset); + return end; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/DayPartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/HourPartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/HourPartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/HourPartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,36 @@ +package org.archive.wayback.util.partition.size; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.archive.wayback.util.partition.PartitionSize; + +/** + * PartitionSize which aligns on one Hour partitions + * @author brad + * + */ +public class HourPartitionSize implements PartitionSize { + + public String name() { + return PartitionSize.HOUR_NAME; + } + + public long intervalMS() { + return MS_IN_HOUR; + } + + public void alignStart(Calendar in) { + in.set(Calendar.MINUTE,0); + in.set(Calendar.SECOND,0); + in.set(Calendar.MILLISECOND, 0); + } + + public Calendar increment(Calendar start, int offset) { + + Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + end.setTime(start.getTime()); + end.add(Calendar.HOUR_OF_DAY,1 * offset); + return end; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/HourPartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/MonthPartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/MonthPartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/MonthPartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,37 @@ +package org.archive.wayback.util.partition.size; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.archive.wayback.util.partition.PartitionSize; + +/** + * PartitionSize which aligns on one Month partitions + * @author brad + * + */ +public class MonthPartitionSize implements PartitionSize { + + public String name() { + return PartitionSize.MONTH_NAME; + } + + public long intervalMS() { + return MS_IN_MONTH; + } + + public void alignStart(Calendar in) { + in.set(Calendar.DAY_OF_MONTH,1); + in.set(Calendar.HOUR_OF_DAY,0); + in.set(Calendar.MINUTE,0); + in.set(Calendar.SECOND,0); + in.set(Calendar.MILLISECOND, 0); + } + + public Calendar increment(Calendar start, int offset) { + Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + end.setTime(start.getTime()); + end.add(Calendar.MONTH,1 * offset); + return end; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/MonthPartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoMonthPartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoMonthPartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoMonthPartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,38 @@ +package org.archive.wayback.util.partition.size; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.archive.wayback.util.partition.PartitionSize; + +/** + * PartitionSize which aligns on two Month partitions + * @author brad + * + */ +public class TwoMonthPartitionSize implements PartitionSize { + + public String name() { + return PartitionSize.TWO_MONTH_NAME; + } + + public long intervalMS() { + return MS_IN_TWO_MONTH; + } + + public void alignStart(Calendar in) { + in.set(Calendar.DAY_OF_MONTH,1); + in.set(Calendar.HOUR_OF_DAY,0); + in.set(Calendar.MINUTE,0); + in.set(Calendar.SECOND,0); + in.set(Calendar.MILLISECOND, 0); + } + + public Calendar increment(Calendar start, int offset) { + + Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + end.setTime(start.getTime()); + end.add(Calendar.MONTH,2 * offset); + return end; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoMonthPartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoYearPartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoYearPartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoYearPartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,38 @@ +package org.archive.wayback.util.partition.size; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.archive.wayback.util.partition.PartitionSize; + +/** + * PartitionSize which aligns on two Year partitions + * @author brad + * + */ +public class TwoYearPartitionSize implements PartitionSize { + + public String name() { + return PartitionSize.TWO_YEAR_NAME; + } + + public long intervalMS() { + return MS_IN_TWO_YEAR; + } + + public void alignStart(Calendar in) { + in.set(Calendar.DAY_OF_YEAR,1); + in.set(Calendar.HOUR_OF_DAY,0); + in.set(Calendar.MINUTE,0); + in.set(Calendar.SECOND,0); + in.set(Calendar.MILLISECOND, 0); + } + + public Calendar increment(Calendar start, int offset) { + + Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + end.setTime(start.getTime()); + end.add(Calendar.YEAR,2 * offset); + return end; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/TwoYearPartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/WeekPartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/WeekPartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/WeekPartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,36 @@ +package org.archive.wayback.util.partition.size; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.archive.wayback.util.partition.PartitionSize; + +/** + * PartitionSize which aligns on one Week partitions + * @author brad + * + */ +public class WeekPartitionSize implements PartitionSize { + + public String name() { + return PartitionSize.WEEK_NAME; + } + + public long intervalMS() { + return MS_IN_WEEK; + } + + public void alignStart(Calendar in) { + in.set(Calendar.HOUR_OF_DAY,1); + in.set(Calendar.MINUTE,1); + in.set(Calendar.SECOND,1); + in.set(Calendar.MILLISECOND, 0); + } + + public Calendar increment(Calendar start, int offset) { + Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + end.setTime(start.getTime()); + end.add(Calendar.DAY_OF_YEAR,7 * offset); + return end; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/WeekPartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/YearPartitionSize.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/YearPartitionSize.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/YearPartitionSize.java 2010-04-10 02:41:32 UTC (rev 3032) @@ -0,0 +1,37 @@ +package org.archive.wayback.util.partition.size; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.archive.wayback.util.partition.PartitionSize; + +/** + * PartitionSize which aligns on one Year partitions + * @author brad + * + */ +public class YearPartitionSize implements PartitionSize { + + public String name() { + return YEAR_NAME; + } + + public long intervalMS() { + return MS_IN_YEAR; + } + + public void alignStart(Calendar in) { + in.set(Calendar.DAY_OF_YEAR,1); + in.set(Calendar.HOUR_OF_DAY,0); + in.set(Calendar.MINUTE,0); + in.set(Calendar.SECOND,0); + in.set(Calendar.MILLISECOND, 0); + } + + public Calendar increment(Calendar start, int offset) { + Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + end.setTime(start.getTime()); + end.add(Calendar.YEAR,1 * offset); + return end; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/util/partition/size/YearPartitionSize.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |