// ********************************************************************** // // <copyright> // // BBN Technologies, a Verizon Company // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/time/TimerRateHolder.java,v $ // $RCSfile: TimerRateHolder.java,v $ // $Revision: 1.1 $ // $Date: 2007/09/25 17:30:35 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.time; import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Properties; import java.util.Vector; import com.bbn.openmap.Layer; import com.bbn.openmap.PropertyConsumer; import com.bbn.openmap.util.Debug; import com.bbn.openmap.util.PropUtils; /** * A convenience class that keeps track of a relationship between * real-time changes and scenario-time changes. */ public class TimerRateHolder implements PropertyConsumer, Serializable { /** * The string used for the default pace baseline ("00:00:00"). * Needs to match the pace format. */ public final static String DEFAULT_PACE_BASELINE_VALUE = "00:00:00"; /** * The string used for the default pace format ("HH:mm:ss"). */ public final static String DEFAULT_PACE_FORMAT = "HH:mm:ss"; /** * Property used to describe a list of properties for * TimerRateHolders (timerRates) */ public final static String TimerRatesProperty = "timerRates"; /** * PaceFormatProperty represents the property used for describing * the pace format (paceFormat). */ public final static String PaceFormatProperty = "paceFormat"; /** * PaceBaselineProperty represents the property used for * baselining the pace value (paceBaseline). */ public final static String PaceBaselineProperty = "paceBaseline"; /** * Clock that describes how often the pace value is applied to the * time value (clockIntervalMillis). */ public final static String ClockIntervalProperty = "clockIntervalMillis"; /** The property used for the pace setting (pace). */ public final static String PaceProperty = "pace"; /** * Display label for this Timer rate. */ protected String label; /** * The number of milliseconds that the timer should wait between * updates. */ protected long clockInterval; /** * The pace is the amount of time that should pass, in simulation * time, when the timer gets updated. If the clock is updating * every second, and you have the pace set for 1 hour, then the * situation controlled by the application's clock will be updated * 1 hour every second. */ protected long pace; /** * The format used in the properties to note the pace. Kept in * order to write out the format if that's needed. */ protected SimpleDateFormat paceFormat; /** * The baseline used to normalize the pace setting. Defaults to * "OO:OO:OO". */ protected String paceZero; /** * Flag that denotes whether the TimerRateHolder has be * successfully set. */ protected boolean valid = false; /** * The prefix used to set the properties, saved in case the * properties are retrieved. */ protected String propPrefix; /** * Create a TimerRateHolder with the default pace format and value * (00:00:00). */ public TimerRateHolder() { paceFormat = new SimpleDateFormat(DEFAULT_PACE_FORMAT); paceZero = DEFAULT_PACE_BASELINE_VALUE; } /** * Create a TimerRateHolder with a date format, and a baseline * time. The default baseline time is "00:00:00", so if you need * to change that, use this constructor. The pace for this * TimerRateHolder should be a relative amount of time, and that * relativity, taking into account the locale offset to GMT, is * given by the baseline time. The baseline time should match the * format given. */ public TimerRateHolder(SimpleDateFormat simpleDateFormat, String dpz) { paceFormat = simpleDateFormat; paceZero = dpz; } public void setLabel(String lab) { label = lab; } public String getLabel() { return label; } public void setPace(long pace) { this.pace = pace; } public long getPace() { return pace; } public void setClockInterval(long cli) { clockInterval = cli; } public long getClockInterval() { return clockInterval; } public String toString() { return "TimePanel.TimerRateHolder [" + label + ", clock:" + clockInterval + ", pace:" + pace + "] (" + valid + ")"; } public void setProperties(Properties props) { setProperties(null, props); } public void setProperties(String prefix, Properties props) { propPrefix = prefix; prefix = PropUtils.getScopedPropertyPrefix(prefix); try { label = props.getProperty(prefix + Layer.PrettyNameProperty); clockInterval = PropUtils.longFromProperties(props, prefix + ClockIntervalProperty, -1L); String paceString = props.getProperty(prefix + PaceProperty); pace = paceFormat.parse(paceString).getTime() - paceFormat.parse(paceZero).getTime(); valid = true; } catch (NullPointerException npe) { Debug.error("TimerRateHolder caught NPE: " + npe.getMessage()); } catch (ParseException pe) { Debug.error("TimerRateHolder parse exception: " + pe.getMessage()); } } public Properties getProperties(Properties props) { return props; } public Properties getPropertyInfo(Properties props) { return props; } public String getPropertyPrefix() { return propPrefix; } public void setPropertyPrefix(String p) { propPrefix = p; } public static List<TimerRateHolder> getTimerRateHolders(String prefix, Properties properties) { List<TimerRateHolder> timerRateHolders = new LinkedList<TimerRateHolder>(); prefix = PropUtils.getScopedPropertyPrefix(prefix); String paceFormatString = properties.getProperty(prefix + PaceFormatProperty, DEFAULT_PACE_FORMAT); String paceBaselineString = properties.getProperty(prefix + PaceBaselineProperty, DEFAULT_PACE_BASELINE_VALUE); SimpleDateFormat paceFormat = new SimpleDateFormat(paceFormatString); if (Debug.debugging("timerrateholder")) { Debug.output("TimerRateHolder timer rate pace pattern: " + paceFormatString); } String timerRatesString = properties.getProperty(prefix + TimerRatesProperty); if (timerRatesString != null) { if (Debug.debugging("timerrateholder")) { Debug.output("TimerRateHolder reading timer rates: " + timerRatesString); } Vector<String> rates = PropUtils.parseSpacedMarkers(timerRatesString); Iterator<String> it = rates.iterator(); while (it.hasNext()) { String ratePrefix = (String) it.next(); TimerRateHolder trh = new TimerRateHolder(paceFormat, paceBaselineString); trh.setProperties(prefix + ratePrefix, properties); if (trh.valid) { timerRateHolders.add(trh); if (Debug.debugging("timerrateholder")) { Debug.output("TimerRateHolder adding " + trh); } } else { if (Debug.debugging("timerrateholder")) { Debug.output("TimerRateHolder NOT adding " + ratePrefix); } } } } return timerRateHolders; } }