| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package com.datatorrent.lib.util; |
| |
| import java.text.DateFormat; |
| import java.text.SimpleDateFormat; |
| import java.util.Calendar; |
| import java.util.Date; |
| import java.util.TimeZone; |
| |
| /** |
| * <p>TimeBucketKey class.</p> |
| * |
| * @since 0.3.2 |
| */ |
| public class TimeBucketKey |
| { |
| |
| private static final int TIMESPEC_MINUTE = 1; |
| private static final int TIMESPEC_HOUR = 2; |
| private static final int TIMESPEC_DAY = 4; |
| private static final int TIMESPEC_WEEK = 8; |
| private static final int TIMESPEC_MONTH = 16; |
| private static final int TIMESPEC_YEAR = 32; |
| |
| public static final int TIMESPEC_YEAR_SPEC = TIMESPEC_YEAR; |
| public static final int TIMESPEC_MONTH_SPEC = TIMESPEC_YEAR_SPEC | TIMESPEC_MONTH; |
| public static final int TIMESPEC_WEEK_SPEC = TIMESPEC_YEAR_SPEC | TIMESPEC_WEEK; |
| public static final int TIMESPEC_DAY_SPEC = TIMESPEC_MONTH_SPEC | TIMESPEC_DAY; |
| public static final int TIMESPEC_HOUR_SPEC = TIMESPEC_DAY_SPEC | TIMESPEC_HOUR; |
| public static final int TIMESPEC_MINUTE_SPEC = TIMESPEC_HOUR_SPEC | TIMESPEC_MINUTE; |
| |
| private static DateFormat yearDateFormat = new SimpleDateFormat("'Y|'yyyy"); |
| private static DateFormat monthDateFormat = new SimpleDateFormat("'M|'yyyyMM"); |
| private static DateFormat weekDateFormat = new SimpleDateFormat("'W|'yyyyww"); |
| private static DateFormat dayDateFormat = new SimpleDateFormat("'D|'yyyyMMdd"); |
| private static DateFormat hourDateFormat = new SimpleDateFormat("'h|'yyyyMMddHH"); |
| private static DateFormat minuteDateFormat = new SimpleDateFormat("'m|'yyyyMMddHHmm"); |
| |
| private static final long MILLIS_IN_MIN = 60 * 1000; |
| private static final long MILLIS_IN_HOUR = 60 * 60 * 1000; |
| private static final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000; |
| private static final long MILLIS_IN_WEEK = 7 * 24 * 60 * 60 * 1000; |
| |
| static { |
| // TODO - Fix this |
| TimeZone tz = TimeZone.getTimeZone("GMT"); |
| yearDateFormat.setTimeZone(tz); |
| monthDateFormat.setTimeZone(tz); |
| weekDateFormat.setTimeZone(tz); |
| dayDateFormat.setTimeZone(tz); |
| hourDateFormat.setTimeZone(tz); |
| minuteDateFormat.setTimeZone(tz); |
| } |
| |
| private Calendar time; |
| private int timeSpec; |
| |
| public TimeBucketKey() |
| { |
| } |
| |
| public TimeBucketKey(Calendar time, int timeSpec) |
| { |
| this.time = time; |
| this.timeSpec = timeSpec; |
| } |
| |
| public Calendar getTime() |
| { |
| return time; |
| } |
| |
| public void setTime(Calendar time) |
| { |
| this.time = time; |
| } |
| |
| public int getTimeSpec() |
| { |
| return timeSpec; |
| } |
| |
| public void setTimeSpec(int timeSpec) |
| { |
| this.timeSpec = timeSpec; |
| } |
| |
| @Override |
| public int hashCode() |
| { |
| int hashcode = 0; |
| if ((timeSpec & TIMESPEC_YEAR) != 0) { |
| // Reducing year space by discounting previous years |
| int year = time.get(Calendar.YEAR); |
| hashcode += ((year - 2000) << 22); |
| } |
| if ((timeSpec & TIMESPEC_MONTH) != 0) { |
| // Sharing same space with week |
| hashcode += (time.get(Calendar.MONTH) << 16); |
| } |
| if ((timeSpec & TIMESPEC_WEEK) != 0) { |
| hashcode += (time.get(Calendar.WEEK_OF_YEAR) << 16); |
| } |
| if ((timeSpec & TIMESPEC_DAY) != 0) { |
| hashcode += (time.get(Calendar.DAY_OF_MONTH) << 11); |
| } |
| if ((timeSpec & TIMESPEC_HOUR) != 0) { |
| hashcode += (time.get(Calendar.HOUR_OF_DAY) << 6); |
| } |
| if ((timeSpec & TIMESPEC_MINUTE) != 0) { |
| hashcode += time.get(Calendar.MINUTE); |
| } |
| return hashcode; |
| } |
| |
| @Override |
| public boolean equals(Object obj) |
| { |
| boolean equal = false; |
| if (obj instanceof TimeBucketKey) { |
| TimeBucketKey ckey = (TimeBucketKey)obj; |
| if (timeSpec == TIMESPEC_MINUTE_SPEC) { |
| equal = ((time.getTimeInMillis() / MILLIS_IN_MIN) == (ckey.getTime().getTimeInMillis() / MILLIS_IN_MIN)); |
| } else if (timeSpec == TIMESPEC_HOUR_SPEC) { |
| equal = ((time.getTimeInMillis() / MILLIS_IN_HOUR) == (ckey.getTime().getTimeInMillis() / MILLIS_IN_HOUR)); |
| } else if (timeSpec == TIMESPEC_DAY_SPEC) { |
| equal = ((time.getTimeInMillis() / MILLIS_IN_DAY) == (ckey.getTime().getTimeInMillis() / MILLIS_IN_DAY)); |
| } else if (timeSpec == TIMESPEC_WEEK_SPEC) { |
| equal = ((time.getTimeInMillis() / MILLIS_IN_WEEK) == (ckey.getTime().getTimeInMillis() / MILLIS_IN_WEEK)); |
| } else { |
| boolean chkEqual = true; |
| if ((timeSpec & TIMESPEC_YEAR) != 0) { |
| if (time.get(Calendar.YEAR) != ckey.getTime().get(Calendar.YEAR)) { |
| chkEqual = false; |
| } |
| } |
| if (chkEqual && ((timeSpec & TIMESPEC_MONTH) != 0)) { |
| if (time.get(Calendar.MONTH) != ckey.getTime().get(Calendar.MONTH)) { |
| chkEqual = false; |
| } |
| } |
| equal = chkEqual; |
| } |
| } |
| return equal; |
| } |
| |
| @Override |
| public String toString() |
| { |
| Date date = time.getTime(); |
| if (timeSpec == TIMESPEC_YEAR_SPEC) { |
| return yearDateFormat.format(date); |
| } else if (timeSpec == TIMESPEC_MONTH_SPEC) { |
| return monthDateFormat.format(date); |
| } else if (timeSpec == TIMESPEC_WEEK_SPEC) { |
| return weekDateFormat.format(date); |
| } else if (timeSpec == TIMESPEC_DAY_SPEC) { |
| return dayDateFormat.format(date); |
| } else if (timeSpec == TIMESPEC_HOUR_SPEC) { |
| return hourDateFormat.format(date); |
| } else if (timeSpec == TIMESPEC_MINUTE_SPEC) { |
| return minuteDateFormat.format(date); |
| } |
| return null; |
| } |
| |
| } |