/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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 org.dashbuilder.dataset.date;
import java.util.Date;
import org.dashbuilder.dataset.group.DateIntervalType;
/**
* Class for the definition of time quantitys, both positive and negative. For example:
* <ul>
* <li><i>10second</i></li>
* <li><i>-1year</i></li>
* <li><i>+2quarter</i></li>
* </ul>
* </p>
*/
public class TimeAmount {
private long quantity = 0;
private DateIntervalType type = DateIntervalType.DAY;
public TimeAmount() {
this(0, DateIntervalType.YEAR);
}
public TimeAmount(long quantity, DateIntervalType sizeType) {
this.quantity = quantity;
this.type = sizeType;
}
public long getQuantity() {
return quantity;
}
public void setQuantity(long quantity) {
this.quantity = quantity;
}
public DateIntervalType getType() {
return type;
}
public void setType(DateIntervalType type) {
this.type = type;
}
public long toMillis() {
return quantity * DateIntervalType.getDurationInMillis(type);
}
public String toString() {
return quantity + " " + type.name().toLowerCase();
}
public TimeAmount cloneInstance() {
TimeAmount clone = new TimeAmount();
clone.quantity = quantity;
clone.type = type;
return clone;
}
public void adjustDate(Date d) {
if (DateIntervalType.MILLENIUM.equals(type)) {
d.setYear(d.getYear() + (int) quantity*1000);
}
if (DateIntervalType.CENTURY.equals(type)) {
d.setYear(d.getYear() + (int) quantity*100);
}
if (DateIntervalType.DECADE.equals(type)) {
d.setYear(d.getYear() + (int) quantity*10);
}
if (DateIntervalType.YEAR.equals(type)) {
d.setYear(d.getYear() + (int) quantity);
}
if (DateIntervalType.QUARTER.equals(type)) {
d.setMonth(d.getMonth() + (int) quantity*3);
}
if (DateIntervalType.MONTH.equals(type)) {
d.setMonth(d.getMonth() + (int) quantity);
}
if (DateIntervalType.WEEK.equals(type)) {
d.setDate(d.getDate() + (int) quantity*7);
}
if (DateIntervalType.DAY.equals(type)) {
d.setDate(d.getDate() + (int) quantity);
}
if (DateIntervalType.HOUR.equals(type)) {
d.setHours(d.getHours() + (int) quantity);
}
if (DateIntervalType.MINUTE.equals(type)) {
d.setMinutes(d.getMinutes() + (int) quantity);
}
if (DateIntervalType.SECOND.equals(type)) {
d.setSeconds(d.getSeconds() + (int) quantity);
}
}
/**
* Parses a time amount expression. For example: "10second", "-1year", ...
* @return A TimeAmount instance.
* @throws IllegalArgumentException If the expression is not valid
*/
public static TimeAmount parse(String timeAmount) {
if (timeAmount == null || timeAmount.length() == 0) {
throw new IllegalArgumentException("Empty time amount expression");
}
String number = "";
String expr = timeAmount.trim();
boolean isNegative = expr.startsWith("-");
boolean isPositive = expr.startsWith("+");
int i = isNegative || isPositive ? 1 : 0;
for (; i<expr.length(); i++) {
char ch = expr.charAt(i);
if (Character.isDigit(ch)) number += ch;
else break;
}
String type = expr.substring(i).trim();
DateIntervalType intervalType = DateIntervalType.getByName(type);
if (number.length() == 0) {
throw new IllegalArgumentException("Missing quantity (ex '-10year'): "+ timeAmount);
}
if (intervalType == null) {
throw new IllegalArgumentException("Invalid interval type (ex '-10year'): "+ timeAmount);
}
return new TimeAmount(Long.parseLong(number) * (isNegative ? -1 : 1), intervalType);
}
}