/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.gui.common.time.converter; import java.text.DecimalFormat; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; /** * @author Joseph Marques */ public class ShortDurationConverter implements Converter { private static final long MILLIS_IN_SECOND = 1000L; private static final long MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; private static final long MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; private static final long MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; private static final long SECONDS_IN_MINUTE = 60L; private static final long SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE; private static final long MINUTES_IN_HOUR = 60L; private static final long HOURS_IN_DAY = 24L; private static final long MINS_IN_DAY = 60 * HOURS_IN_DAY; private static final long SECS_IN_DAY = 60 * MINS_IN_DAY; private static final DecimalFormat twoDigitFormatter = new DecimalFormat("0.00"); public Object getAsObject(FacesContext context, UIComponent component, String value) { throw new UnsupportedOperationException("The " + ShortDurationConverter.class.getSimpleName() + " does not support getAsObject(FacesContext, UIComponent, String"); } public String getAsString(FacesContext context, UIComponent component, Object value) { if (value == null) { return "0"; // visual indicator of issue } long millis = 0; if (value instanceof Long) { millis = (Long) value; } else if (value instanceof Double) { millis = ((Double) value).longValue(); } else { throw new IllegalArgumentException("The " + ShortDurationConverter.class.getSimpleName() + " converter does not support rendering objects of type " + value.getClass().getSimpleName()); } int days = (int) (millis / MILLIS_IN_DAY); millis %= MILLIS_IN_DAY; int hours = (int) (millis / MILLIS_IN_HOUR); millis %= MILLIS_IN_HOUR; int mins = (int) (millis / MILLIS_IN_MINUTE); millis %= MILLIS_IN_MINUTE; int secs = (int) (millis / MILLIS_IN_SECOND); millis %= MILLIS_IN_SECOND; double result; String suffix; if (days > 0) { double fractionalDays = ((double) hours / HOURS_IN_DAY) + ((double) mins / MINS_IN_DAY) + ((double) secs / SECS_IN_DAY) + ((double) millis / MILLIS_IN_DAY); result = hours + fractionalDays; // totalDays suffix = "d"; } else if (hours > 0) { double fractionalHrs = ((double) mins / MINUTES_IN_HOUR) + ((double) secs / SECONDS_IN_HOUR) + ((double) millis / MILLIS_IN_HOUR); result = hours + fractionalHrs; // totalHrs suffix = "h"; } else if (mins > 0) { double fractionalMins = ((double) secs / SECONDS_IN_MINUTE) + ((double) millis / MILLIS_IN_MINUTE); result = mins + fractionalMins; // totalMins suffix = "m"; } else if (secs > 0) { double fractionalSecs = ((double) millis / MILLIS_IN_SECOND); result = secs + fractionalSecs; // totalSecs suffix = "s"; } else { result = millis; suffix = "ms"; } return twoDigitFormatter.format(result) + suffix; } }