|
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.
|