You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2010/09/01 02:01:53 UTC

svn commit: r991402 - in /tapestry/tapestry5/trunk: tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ tapestry-core/src/main/java/org/apache/tapestry5/internal/util/ tapestry-core/src/main/java/org/apache/tapestry5/test/ tapestry-core...

Author: hlship
Date: Wed Sep  1 00:01:53 2010
New Revision: 991402

URL: http://svn.apache.org/viewvc?rev=991402&view=rev
Log:
TAP5-1188: Refactory URLChangeTracker from tapestry-core to tapestry-ioc

Added:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java   (contents, props changed)
      - copied, changed from r991401, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/URLChangeTracker.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/URLChangeTrackerTest.java   (contents, props changed)
      - copied, changed from r991401, tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/util/URLChangeTrackerTest.java
Removed:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/URLChangeTracker.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/util/URLChangeTrackerTest.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ResourceCacheImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java Wed Sep  1 00:01:53 2010
@@ -29,13 +29,13 @@ import javassist.NotFoundException;
 import javassist.Translator;
 
 import org.apache.tapestry5.internal.event.InvalidationEventHubImpl;
-import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.internal.services.ClassFactoryClassPool;
 import org.apache.tapestry5.ioc.internal.services.ClassFactoryImpl;
 import org.apache.tapestry5.ioc.internal.services.CtClassSource;
 import org.apache.tapestry5.ioc.internal.services.CtClassSourceImpl;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.services.ClassFabUtils;
 import org.apache.tapestry5.ioc.services.ClassFactory;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImpl.java Wed Sep  1 00:01:53 2010
@@ -21,11 +21,11 @@ import java.util.Locale;
 
 import org.apache.tapestry5.SymbolConstants;
 import org.apache.tapestry5.func.Worker;
-import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.annotations.Symbol;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.services.InvalidationEventHub;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java Wed Sep  1 00:01:53 2010
@@ -19,11 +19,11 @@ import org.apache.tapestry5.internal.eve
 import org.apache.tapestry5.internal.parser.ComponentTemplate;
 import org.apache.tapestry5.internal.parser.TemplateToken;
 import org.apache.tapestry5.internal.util.MultiKey;
-import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.services.InvalidationEventHub;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MessagesSourceImpl.java Wed Sep  1 00:01:53 2010
@@ -21,11 +21,11 @@ import java.util.Map;
 
 import org.apache.tapestry5.internal.event.InvalidationEventHubImpl;
 import org.apache.tapestry5.internal.util.MultiKey;
-import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.LocalizedNameGenerator;
+import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
 import org.apache.tapestry5.services.messages.PropertiesFileParser;
 
 /**

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ResourceCacheImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ResourceCacheImpl.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ResourceCacheImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ResourceCacheImpl.java Wed Sep  1 00:01:53 2010
@@ -15,9 +15,9 @@
 package org.apache.tapestry5.internal.services;
 
 import org.apache.tapestry5.internal.event.InvalidationEventHubImpl;
-import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.services.ResourceDigestGenerator;
 import org.apache.tapestry5.services.UpdateListener;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java Wed Sep  1 00:01:53 2010
@@ -14,11 +14,11 @@
 
 package org.apache.tapestry5.internal.services;
 
-import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.MessageFormatter;
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.services.UpdateListener;
 import org.apache.tapestry5.services.ValidationMessagesSource;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java Wed Sep  1 00:01:53 2010
@@ -14,14 +14,10 @@
 
 package org.apache.tapestry5.test;
 
-import static java.lang.Thread.sleep;
 import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newList;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.util.Arrays;
@@ -317,30 +313,6 @@ public abstract class TapestryTestCase e
         return newMock(Validator.class);
     }
 
-    /**
-     * Writes a change to a file.
-     */
-    protected final void touch(File f) throws Exception
-    {
-        long startModified = f.lastModified();
-
-        while (true)
-        {
-            OutputStream o = new FileOutputStream(f);
-            o.write(0);
-            o.close();
-
-            long newModified = f.lastModified();
-
-            if (newModified != startModified)
-                return;
-
-            // Sleep 1/20 second and try again
-
-            sleep(50);
-        }
-    }
-
     /** @deprecated May be removed in Tapestry 5.3 */
     protected final void train_addField(ClassTransformation transformation, int modifiers, String type,
             String suggestedName, String actualName)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentMessagesSourceImplTest.java Wed Sep  1 00:01:53 2010
@@ -20,11 +20,11 @@ import java.util.Locale;
 
 import org.apache.tapestry5.internal.services.messages.PropertiesFileParserImpl;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
-import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.services.ClasspathURLConverterImpl;
 import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
+import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.services.messages.ComponentMessagesSource;

Copied: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java (from r991401, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/URLChangeTracker.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java?p2=tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/URLChangeTracker.java&r1=991401&r2=991402&rev=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/URLChangeTracker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java Wed Sep  1 00:01:53 2010
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -12,9 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.util;
+package org.apache.tapestry5.ioc.internal.util;
 
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.ClassFabUtils;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 
@@ -37,56 +36,63 @@ public class URLChangeTracker
     private final Map<File, Long> fileToTimestamp = CollectionFactory.newConcurrentMap();
 
     private final boolean granularitySeconds;
-    
-    private final ClasspathURLConverter classpathURLConverter; 
+
+    private final ClasspathURLConverter classpathURLConverter;
 
     /**
      * Creates a new URL change tracker with millisecond-level granularity.
      * 
-     * @param classpathURLConverter used to convert URLs from one protocol to another
+     * @param classpathURLConverter
+     *            used to convert URLs from one protocol to another
      */
     public URLChangeTracker(ClasspathURLConverter classpathURLConverter)
     {
         this(classpathURLConverter, false);
-        
+
     }
 
     /**
      * Creates a new URL change tracker, using either millisecond-level granularity or second-level granularity.
-     *
-     * @param classpathURLConverter used to convert URLs from one protocol to another
-     * @param granularitySeconds whether or not to use second granularity (as opposed to millisecond granularity)
+     * 
+     * @param classpathURLConverter
+     *            used to convert URLs from one protocol to another
+     * @param granularitySeconds
+     *            whether or not to use second granularity (as opposed to millisecond granularity)
      */
     public URLChangeTracker(ClasspathURLConverter classpathURLConverter, boolean granularitySeconds)
     {
         this.granularitySeconds = granularitySeconds;
-        
+
         this.classpathURLConverter = classpathURLConverter;
     }
 
     /**
      * Stores a new URL into the tracker, or returns the previous time stamp for a previously added URL. Filters out all
      * non-file URLs.
-     *
-     * @param url of the resource to add, or null if not known
+     * 
+     * @param url
+     *            of the resource to add, or null if not known
      * @return the current timestamp for the URL (possibly rounded off for granularity reasons), or 0 if the URL is
      *         null
      */
     public long add(URL url)
     {
-        if (url == null) return 0;
-        
+        if (url == null)
+            return 0;
+
         URL converted = classpathURLConverter.convert(url);
 
-        if (!converted.getProtocol().equals("file")) return timestampForNonFileURL(converted);
+        if (!converted.getProtocol().equals("file"))
+            return timestampForNonFileURL(converted);
 
         File resourceFile = ClassFabUtils.toFileFromFileProtocolURL(converted);
 
-        if (fileToTimestamp.containsKey(resourceFile)) return fileToTimestamp.get(resourceFile);
+        if (fileToTimestamp.containsKey(resourceFile))
+            return fileToTimestamp.get(resourceFile);
 
         long timestamp = readTimestamp(resourceFile);
 
-        // A quick and imperfect fix for TAPESTRY-1918.  When a file
+        // A quick and imperfect fix for TAPESTRY-1918. When a file
         // is added, add the directory containing the file as well.
 
         fileToTimestamp.put(resourceFile, timestamp);
@@ -99,7 +105,6 @@ public class URLChangeTracker
             fileToTimestamp.put(dir, dirTimestamp);
         }
 
-
         return timestamp;
     }
 
@@ -143,7 +148,8 @@ public class URLChangeTracker
             long newTimestamp = readTimestamp(entry.getKey());
             long current = entry.getValue();
 
-            if (current == newTimestamp) continue;
+            if (current == newTimestamp)
+                continue;
 
             result = true;
             entry.setValue(newTimestamp);
@@ -157,7 +163,8 @@ public class URLChangeTracker
      */
     private long readTimestamp(File file)
     {
-        if (!file.exists()) return FILE_DOES_NOT_EXIST_TIMESTAMP;
+        if (!file.exists())
+            return FILE_DOES_NOT_EXIST_TIMESTAMP;
 
         return applyGranularity(file.lastModified());
     }
@@ -169,7 +176,8 @@ public class URLChangeTracker
         // are only accurate to one second. The extra level of detail creates false positives
         // for changes, and undermines HTTP response caching in the client.
 
-        if (granularitySeconds) return timestamp - (timestamp % 1000);
+        if (granularitySeconds)
+            return timestamp - (timestamp % 1000);
 
         return timestamp;
     }

Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java Wed Sep  1 00:01:53 2010
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,9 +22,13 @@ import org.apache.tapestry5.ioc.def.Modu
 import org.apache.tapestry5.ioc.def.ServiceDef;
 import org.apache.tapestry5.ioc.services.*;
 
+import static java.lang.Thread.sleep;
 import static org.easymock.EasyMock.isA;
 import org.slf4j.Logger;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.net.URL;
@@ -52,11 +56,12 @@ public class IOCTestCase extends TestBas
     {
         for (Method method : clazz.getMethods())
         {
-            if (method.getName().equals(methodName)) return method;
+            if (method.getName().equals(methodName))
+                return method;
         }
 
-        throw new IllegalArgumentException(
-                String.format("Class %s does not provide a method named '%s'.", clazz.getName(), methodName));
+        throw new IllegalArgumentException(String.format("Class %s does not provide a method named '%s'.",
+                clazz.getName(), methodName));
     }
 
     protected final Method findMethod(Object subject, String methodName)
@@ -295,7 +300,7 @@ public class IOCTestCase extends TestBas
     }
 
     protected final <T> void train_getService(ObjectLocator locator, String serviceId, Class<T> serviceInterface,
-                                              T service)
+            T service)
     {
         expect(locator.getService(serviceId, serviceInterface)).andReturn(service);
     }
@@ -341,7 +346,7 @@ public class IOCTestCase extends TestBas
     }
 
     protected final <T> void train_provide(ObjectProvider provider, Class<T> objectType,
-                                           AnnotationProvider annotationProvider, ObjectLocator locator, T object)
+            AnnotationProvider annotationProvider, ObjectLocator locator, T object)
     {
         expect(provider.provide(objectType, annotationProvider, locator)).andReturn(object);
     }
@@ -352,7 +357,7 @@ public class IOCTestCase extends TestBas
     }
 
     protected final <T extends Annotation> void train_getAnnotation(AnnotationProvider annotationProvider,
-                                                                    Class<T> annotationClass, T annotation)
+            Class<T> annotationClass, T annotation)
     {
         expect(annotationProvider.getAnnotation(annotationClass)).andReturn(annotation);
     }
@@ -429,4 +434,30 @@ public class IOCTestCase extends TestBas
     {
         expect(symbolSource.valueForSymbol(symbolName)).andReturn(value).atLeastOnce();
     }
+
+    /**
+     * Writes a change to a file. The contents of the file are lost. May repeatedly modify
+     * the file, and does not return until the last modified time for the file actually changes (how long that takes
+     * is JDK, OS and file system dependent).
+     */
+    protected final void touch(File f) throws Exception
+    {
+        long startModified = f.lastModified();
+
+        while (true)
+        {
+            OutputStream o = new FileOutputStream(f);
+            o.write(0);
+            o.close();
+
+            long newModified = f.lastModified();
+
+            if (newModified != startModified)
+                return;
+
+            // Sleep 1/20 second and try again
+
+            sleep(50);
+        }
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java?rev=991402&r1=991401&r2=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java Wed Sep  1 00:01:53 2010
@@ -24,6 +24,7 @@ import javassist.CtClass;
 import javassist.CtConstructor;
 import javassist.CtMethod;
 
+import org.apache.tapestry5.ioc.test.IOCTestCase;
 import org.apache.tapestry5.ioc.test.TestBase;
 import org.apache.tapestry5.services.UpdateListenerHub;
 import org.testng.annotations.BeforeClass;
@@ -36,7 +37,7 @@ import com.example.ReloadableService;
  * Test the ability to perform live class reloading of a service implementation.
  */
 @SuppressWarnings("unchecked")
-public class ReloadTest extends TestBase
+public class ReloadTest extends IOCTestCase
 {
     private static final String PACKAGE = "com.example";
 
@@ -48,6 +49,8 @@ public class ReloadTest extends TestBase
 
     public static boolean eagerLoadServiceWasInstantiated;
 
+    private File classFile;
+
     @BeforeClass
     public void setup() throws Exception
     {
@@ -63,6 +66,8 @@ public class ReloadTest extends TestBase
 
         classLoader = new URLClassLoader(new URL[]
         { classesURL }, Thread.currentThread().getContextClassLoader());
+
+        classFile = new File(classesDir, "com/example/ReloadableServiceImpl.class");
     }
 
     @Test
@@ -82,9 +87,7 @@ public class ReloadTest extends TestBase
 
         fireUpdateCheck(registry);
 
-        // Sleep long enough that the Java millisecond clock advances.
-
-        Thread.currentThread().sleep(1500);
+        touch(classFile);
 
         createImplementationClass("updated");
 
@@ -110,8 +113,6 @@ public class ReloadTest extends TestBase
 
         assertEquals(reloadable.getStatus(), "before delete");
 
-        File classFile = new File(classesDir, "com/example/ReloadableServiceImpl.class");
-
         assertTrue(classFile.exists(), "The class file must exist.");
 
         classFile.delete();
@@ -144,7 +145,7 @@ public class ReloadTest extends TestBase
 
         assertEquals(reloadable.getStatus(), "initial proxy");
 
-        Thread.currentThread().sleep(1500);
+        touch(classFile);
 
         createImplementationClass("updated proxy");
 
@@ -178,9 +179,9 @@ public class ReloadTest extends TestBase
 
         ReloadableService reloadable = registry.getService(ReloadableService.class);
 
-        createInvalidImplentationClass();
+        touch(classFile);
 
-        Thread.currentThread().sleep(1500);
+        createInvalidImplentationClass();
 
         fireUpdateCheck(registry);
 
@@ -243,7 +244,6 @@ public class ReloadTest extends TestBase
     @Test
     public void eager_load_service_with_proxy()
     {
-
         eagerLoadServiceWasInstantiated = false;
 
         Registry r = new RegistryBuilder().add(EagerProxyReloadModule.class).build();

Copied: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/URLChangeTrackerTest.java (from r991401, tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/util/URLChangeTrackerTest.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/URLChangeTrackerTest.java?p2=tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/URLChangeTrackerTest.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/util/URLChangeTrackerTest.java&r1=991401&r2=991402&rev=991402&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/util/URLChangeTrackerTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/URLChangeTrackerTest.java Wed Sep  1 00:01:53 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2010 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -12,20 +12,21 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.util;
+package org.apache.tapestry5.ioc.internal.util;
+
+import java.io.File;
+import java.net.URL;
 
 import org.apache.tapestry5.ioc.internal.services.ClasspathURLConverterImpl;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
-import org.apache.tapestry5.test.TapestryTestCase;
+import org.apache.tapestry5.ioc.test.IOCTestCase;
+import org.apache.tapestry5.ioc.test.TestBase;
 import org.testng.annotations.Test;
 
-import java.io.File;
-import java.net.URL;
-
-public class URLChangeTrackerTest extends TapestryTestCase
+public class URLChangeTrackerTest extends IOCTestCase
 {
     private final ClasspathURLConverter converter = new ClasspathURLConverterImpl();
-    
+
     @Test
     public void contains_change_when_empty()
     {
@@ -102,7 +103,8 @@ public class URLChangeTrackerTest extend
         {
             File.createTempFile("changetracker1", ".tmp");
 
-            if (dir.lastModified() != timestamp) break;
+            if (dir.lastModified() != timestamp)
+                break;
 
             // Sometime Java need a moment to catch up in terms of
             // file system changes. Sleep for a few milliseconds

Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/URLChangeTrackerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native