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)
104: sleepImpl(object, rest); // recursion to sleep the rest
105: }
106: }
107:
108: /**
109: * Sleep for so many milliseconds
110: * @param object receiver
111: * @param milliseconds the number of milliseconds to sleep
112: * @param onInterrupt interrupt handler, InterruptedException is passed to the Closure
113: */
114: public static void sleep(Object object, long milliseconds,
115: Closure onInterrupt) {
116: try {
117: Thread.sleep(milliseconds);
118: } catch (InterruptedException e) {
119: onInterrupt.call(e);
120: }
121: }
122: }
|