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 }