001    /*
002     * $Id: DefaultGroovyStaticMethods.java,v 1.4 2005/07/08 17:49:29 dierk Exp $
003     *
004     * Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
005     *
006     * Redistribution and use of this software and associated documentation
007     * ("Software"), with or without modification, are permitted provided that the
008     * following conditions are met:
009     *  1. Redistributions of source code must retain copyright statements and
010     * notices. Redistributions must also contain a copy of this document.
011     *  2. Redistributions in binary form must reproduce the above copyright
012     * notice, this list of conditions and the following disclaimer in the
013     * documentation and/or other materials provided with the distribution.
014     *  3. The name "groovy" must not be used to endorse or promote products
015     * derived from this Software without prior written permission of The Codehaus.
016     * For written permission, please contact info@codehaus.org.
017     *  4. Products derived from this Software may not be called "groovy" nor may
018     * "groovy" appear in their names without prior written permission of The
019     * Codehaus. "groovy" is a registered trademark of The Codehaus.
020     *  5. Due credit should be given to The Codehaus - http://groovy.codehaus.org/
021     *
022     * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY
023     * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
024     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
025     * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR
026     * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
027     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
028     * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
029     * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
030     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
031     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
032     * DAMAGE.
033     *
034     */
035    package org.codehaus.groovy.runtime;
036    
037    import groovy.lang.Closure;
038    
039    import java.util.regex.Matcher;
040    
041    /**
042     * This class defines all the new static groovy methods which appear on normal JDK
043     * classes inside the Groovy environment. Static methods are used with the
044     * first parameter as the destination class.
045     *
046     * @author Guillaume Laforge
047     * @author Dierk Koenig
048     * @version $Revision: 1.4 $
049     */
050    public class DefaultGroovyStaticMethods {
051    
052        /**
053         * Start a Thread with the given closure as a Runnable instance.
054         *
055         * @param closure the Runnable closure
056         * @return the started thread
057         */
058        public static Thread start(Thread self, Closure closure) {
059            Thread thread = new Thread(closure);
060            thread.start();
061            return thread;
062        }
063    
064        /**
065         * Start a daemon Thread with the given closure as a Runnable instance.
066         *
067         * @param closure the Runnable closure
068         * @return the started thread
069         */
070        public static Thread startDaemon(Thread self, Closure closure) {
071            Thread thread = new Thread(closure);
072            thread.setDaemon(true);
073            thread.start();
074            return thread;
075        }
076    
077        /**
078         * Get the last hidden matcher that system used to do a match.
079         * 
080         * @param matcher
081         * @return the last regex matcher
082         */
083        public static Matcher getLastMatcher(Matcher matcher) {
084            return RegexSupport.getLastMatcher();
085        }
086    
087        /**
088         * Sleep for so many seconds, even if interrupted.
089         * @param object receiver
090         * @param seconds the number of seconds to sleep
091         */
092        public static void sleep(Object object, long seconds){
093            long millis = seconds * 1000;
094            sleepImpl(object, millis);
095        }
096    
097        protected static void sleepImpl(Object object, long millis) {
098            long start = System.currentTimeMillis();
099            try {
100                Thread.sleep(millis);
101            } catch (InterruptedException e) {
102                long slept = System.currentTimeMillis() - start;
103                long rest  = millis - slept;
104                if (rest > 0) sleepImpl(object, rest);    // recursion to sleep the rest
105            }
106        }
107    
108        /**
109         * Sleep for so many seconds
110         * @param object receiver
111         * @param seconds the number of seconds to sleep
112         * @param onInterrupt interrupt handler, InterruptedException is passed to the Closure
113         */
114        public static void sleep(Object object, long seconds, Closure onInterrupt){
115            try {
116                Thread.sleep(seconds * 1000);
117            } catch (InterruptedException e) {
118                onInterrupt.call(e);
119            }
120        }
121    }