001    /*
002     * $Id: DefaultGroovyStaticMethods.java 2726 2005-08-20 19:51:14Z glaforge $
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: 2726 $
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 milliseconds, even if interrupted.
089         * @param object receiver
090         * @param milliseconds the number of milliseconds to sleep
091         */
092        public static void sleep(Object object, long milliseconds){
093            sleepImpl(object, milliseconds);
094        }
095    
096        protected static void sleepImpl(Object object, long millis) {
097            long start = System.currentTimeMillis();
098            try {
099                Thread.sleep(millis);
100            } catch (InterruptedException e) {
101                long slept = System.currentTimeMillis() - start;
102                long rest  = millis - slept;
103                if (rest > 0) sleepImpl(object, rest);    // recursion to sleep the rest
104            }
105        }
106    
107        /**
108         * Sleep for so many milliseconds
109         * @param object receiver
110         * @param milliseconds the number of milliseconds to sleep
111         * @param onInterrupt interrupt handler, InterruptedException is passed to the Closure
112         */
113        public static void sleep(Object object, long milliseconds, Closure onInterrupt){
114            try {
115                Thread.sleep(milliseconds);
116            } catch (InterruptedException e) {
117                onInterrupt.call(e);
118            }
119        }
120    }