/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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 org.wso2.carbon.governance.api.util;
import org.apache.commons.lang.StringUtils;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class CheckpointTimeUtils {
/**
* Duration seconds format.
* This will produce a two digit number for seconds followed with character 's'.
* Example 08s.
*/
private static final String durationSecondsFormat = "%02ds";
/**
* Duration minutes and seconds format.
* This will provide a two digit number for minutes followed by character 'm' and a two digit number for seconds
* followed with character 's'.
* Example: 01m:23s.
*/
private static final String durationMinutesSecondsFormat = "%02dm:%02ds";
/**
* Duration hours, minutes and seconds format. This will provide a two digit number for hours followed by
* character 'h', a two digit number for minutes followed with character 'm' and a two digit number for seconds
* followed with character 's'.
* Example 07h:12m:09s.
*/
private static final String durationHoursMinutesSecondsFormat = "%02dh:%02dm:%02ds";
/**
* Duration days, hours, minutes and seconds format.
* This will produce a number for days followed with character 'd', a two digit number for hours followed by
* character 'h', a two digit number for minutes followed with character 'm' and a two digit number for seconds
* followed with character 's'.
*/
private static final String durationDaysHoursMinutesSecondsFormat = "%dd:%02dh:%02dm:%02ds";
/**
* This method used to check whether a duration is between a specific boundary.
*
* @param duration lifecycle current state duration timestamp.
* @param minTime boundary lower value.
* @param maxTime boundary upper value.
* @return true when duration is between the boundary.
*/
public static boolean isDurationBetweenTimestamps(long duration, String minTime, String maxTime) {
boolean result = false;
// Current duration in milly seconds
long durationInMillySeconds = TimeUnit.MILLISECONDS.convert(duration, TimeUnit.MILLISECONDS);
// Get checkpoint boundary values in milly seconds
long minBoundaryInMillySeconds = getMillySecondsByDuration(minTime);
// Get checkpoint boundary values in milly seconds
long maxBoundaryInMillySeconds = getMillySecondsByDuration(maxTime);
// Check the duration is between the boundaries
if (minBoundaryInMillySeconds < durationInMillySeconds && durationInMillySeconds < maxBoundaryInMillySeconds) {
result = true;
}
return result;
}
/**
* This method is used to get duration in milly seconds by passing the duration as a String.
* @param duration duration as a String.
* @return duration in milly seconds.
*/
public static long getMillySecondsByDuration(String duration) {
if (StringUtils.isEmpty(duration)) {
throw new IllegalArgumentException("Invalid arguments supplied as duration: " + duration);
}
String formattedDuration = duration.replaceAll("d", "").replaceAll("h", "").replaceAll("m", "")
.replaceAll("s", "");
String[] tokens = formattedDuration.split(":");
long secondsToMillySeconds = Long.parseLong(tokens[3]) * 1000;
long minutesToMillySeconds = Long.parseLong(tokens[2]) * 60 * 1000;
long hoursToMillySeconds = Long.parseLong(tokens[1]) * 60 * 60 * 1000;
long daysToMillySeconds = Long.parseLong(tokens[0]) * 24 * 60 * 60 * 1000;
return daysToMillySeconds + secondsToMillySeconds + minutesToMillySeconds + hoursToMillySeconds;
}
/**
* This method used to calculate time difference of two timestamps.
*
* @param timeStampOne latest timestamp.
* @param timeStampTwo earlier timestamp.
* @return timeDurationTimestamp timestamp difference from current time to current lifecycle last state changed
* time.
*/
public static long calculateTimeDifference(String timeStampOne, String timeStampTwo) {
if (StringUtils.isEmpty(timeStampOne) && StringUtils.isEmpty(timeStampTwo)) {
throw new IllegalArgumentException("Invalid arguments supplied as timestamp one: '" + timeStampOne + "' or"
+ " " + "timestamp two: '" + timeStampTwo + "' is not set");
}
return Timestamp.valueOf(timeStampOne).getTime() - Timestamp.valueOf(timeStampTwo).getTime();
}
/**
* This method used to calculate time difference between timestamp to present.
*
* @param timeStamp earlier timestamp.
* @return timeDurationTimestamp timestamp difference from current time to current lifecycle last state changed
* time.
*/
public static long calculateTimeDifferenceToPresent(String timeStamp) {
if (StringUtils.isEmpty(getCurrentTime()) && StringUtils.isEmpty(timeStamp)) {
throw new IllegalArgumentException(
"Invalid arguments supplied as timestamp two: '" + timeStamp + "' is not set");
}
return Timestamp.valueOf(getCurrentTime()).getTime() - Timestamp.valueOf(timeStamp).getTime();
}
/**
* This method is used to current time
*
* @return String current time in yyyy-MM-dd HH:mm:ss.SSS format.
*/
public static String getCurrentTime() {
Date currentTimeStamp = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return dateFormat.format(currentTimeStamp);
}
/**
* This method is used to format a timestamp to 'dd:hh:mm:ss'.
*
* @param duration timestamp duration.
* @return formatted time duration to 'dd:hh:mm:ss'.
*/
public static String formatTimeDuration(long duration) {
String timeDuration;
long days = TimeUnit.MILLISECONDS.toDays(duration);
long hours = TimeUnit.MILLISECONDS.toHours(duration) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS
.toDays(duration));
long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS
.toHours(duration));
long seconds = TimeUnit.MILLISECONDS.toSeconds(duration) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS
.toMinutes(duration));
// Setting the duration to a readable format.
if (days == 0 && hours == 0 && minutes == 0) {
timeDuration = String.format(durationSecondsFormat, seconds);
} else if (days == 0 && hours == 0) {
timeDuration = String.format(durationMinutesSecondsFormat, minutes, seconds);
} else if (days == 0) {
timeDuration = String.format(durationHoursMinutesSecondsFormat, hours, minutes, seconds);
} else {
timeDuration = String.format(durationDaysHoursMinutesSecondsFormat, days, hours, minutes, seconds);
}
return timeDuration;
}
}