package com.workshare.msnos.soup.time; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SystemTime { private static final Logger log = LoggerFactory.getLogger(SystemTime.class); public interface TimeSource { long millis(); void sleep(long millis) throws InterruptedException; } public static final TimeSource NTP_TIMESOURCE = new NTPCachedTimeSource(new NTPClient()); public static final TimeSource SYS_TIMESOURCE = new TimeSource(){ @Override public long millis() { return System.currentTimeMillis(); } @Override public void sleep(long millis) throws InterruptedException { Thread.sleep(millis); }}; private static final TimeSource DEFAULT_TIMESOURCE; static { if (Boolean.getBoolean("com.ws.nsnos.time.local")) { DEFAULT_TIMESOURCE = SYS_TIMESOURCE; log.warn("Using local system timesource"); } else { DEFAULT_TIMESOURCE = NTP_TIMESOURCE; log.info("Using NTP powered timesource"); } // boot DEFAULT_TIMESOURCE.millis(); } private static TimeSource source = DEFAULT_TIMESOURCE; public static void sleep(long millis) throws InterruptedException { source.sleep(millis); } public static long asMillis() { return source.millis(); } public static void setTimeSource(TimeSource source) { SystemTime.source = source; } public static void reset() { setTimeSource(DEFAULT_TIMESOURCE); } }