001    /*
002     * $Id: TimeStatus.java 3203 2010-07-02 15:54:32Z kredel $
003     */
004    
005    package edu.jas.kern;
006    
007    import java.util.concurrent.Callable;
008    
009    
010    /**
011     * Run-time status, 
012     * defines global status and handling for run time limits.
013     * @author Heinz Kredel
014     */
015    
016    public class TimeStatus {
017    
018    
019        /**
020         * Global status flag.
021         */
022        private static boolean allowTime = false;
023    
024    
025        /**
026         * Global run-time limit in milliseconds.
027         */
028        private static long limitTime = Long.MAX_VALUE;
029    
030    
031        /**
032         * Global run-time limit in milliseconds.
033         */
034        private static long startTime = System.currentTimeMillis();
035    
036    
037        /**
038         * Call back method.
039         * true means continue, false means throw exception.
040         */
041        private static Callable<Boolean> callBack = null;
042    
043    
044        /**
045         * No public constructor.
046         */
047        protected TimeStatus() {
048        }
049    
050    
051        /**
052         * isActive.
053         * @return true, if run-time interruption is active, else false.
054         */
055        public static boolean isActive() {
056            return allowTime;
057        }
058    
059    
060        /**
061         * setAllow,
062         * set run-time interruption to allowed status.
063         */
064        public static void setActive() {
065            allowTime = true;
066        }
067    
068    
069        /**
070         * setNotActive,
071         * set run-time interruption to not active status.
072         */
073        public static void setNotActive() {
074            allowTime = false;
075        }
076    
077    
078        /**
079         * setLimit,
080         * set run-time limit in milliseconds.
081         */
082        public static void setLimit(long t) {
083            limitTime = t;
084        }
085    
086    
087        /**
088         * Restart timer,
089         * set run-time to current time.
090         */
091        public static void restart() {
092            startTime = System.currentTimeMillis();
093        }
094    
095    
096        /**
097         * set call back,
098         * set the Callabe object.
099         */
100        public static void setCallBack(Callable<Boolean> cb) {
101            callBack = cb;
102        }
103    
104    
105        /**
106         * Check for exceeded time,
107         * test if time has exceeded and throw an exception if so.
108         * @param msg the message to be send with the exception.
109         */
110        public static void checkTime(String msg) {
111            if ( ! allowTime ) {
112                return;
113            }
114            if ( limitTime == Long.MAX_VALUE ) {
115                return;
116            }
117            long tt = (System.currentTimeMillis() - startTime - limitTime);
118            //System.out.println("tt  = " + tt);
119            if ( tt <= 0L ) {
120                return;
121            }
122            if ( callBack != null ) {
123                try {
124                    boolean t = callBack.call();
125                    if ( t ) {
126                        return;
127                    }
128                } catch ( Exception e ) {
129                }
130            }
131            if ( msg == null ) {
132                msg = "";
133            }
134            throw new TimeExceededException(msg + " over time = " + tt);
135        }
136    
137    }