### Eclipse Workspace Patch 1.0
#P org.eclipse.jdt.core.tests.model
Index: src/org/eclipse/jdt/core/tests/model/SearchParticipantTests.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/SearchParticipantTests.java,v
retrieving revision 1.1
diff -u -r1.1 SearchParticipantTests.java
--- src/org/eclipse/jdt/core/tests/model/SearchParticipantTests.java 8 Jun 2004 15:03:43 -0000 1.1
+++ src/org/eclipse/jdt/core/tests/model/SearchParticipantTests.java 30 Mar 2007 10:50:00 -0000
@@ -15,10 +15,8 @@
import junit.framework.Test;
import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.search.*;
+import org.eclipse.jdt.core.tests.util.Util;
/**
* Tests the search participant supprt.
@@ -96,7 +94,7 @@
assertTrue("Should have requested to index document", document.indexingRequested);
} finally {
deleteProject("P");
- getIndexLocation().toFile().delete();
+ Util.delete(getIndexLocation().toFile());
}
}
@@ -114,7 +112,7 @@
assertTrue("Should have requested to index document", document.indexingRequested);
} finally {
deleteProject("P");
- getIndexLocation().toFile().delete();
+ Util.delete(getIndexLocation().toFile());
}
}
Index: src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java,v
retrieving revision 1.45.2.2
diff -u -r1.45.2.2 JavaProjectTests.java
--- src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java 25 Aug 2004 15:50:48 -0000 1.45.2.2
+++ src/org/eclipse/jdt/core/tests/model/JavaProjectTests.java 30 Mar 2007 10:49:59 -0000
@@ -770,13 +770,7 @@
System.out.println((System.currentTimeMillis() - start)+ "ms for "+roots.length+" roots");
} finally {
if (libDir != null) {
- String[] libJars = libDir.list();
- if (libJars != null) {
- for (int i = 0, length = libJars.length; i < length; i++) {
- new File(libDir, libJars[i]).delete();
- }
- }
- libDir.delete();
+ org.eclipse.jdt.core.tests.util.Util.delete(libDir);
}
this.deleteProject("P");
JavaCore.removeClasspathVariable("MyVar", null);
@@ -808,13 +802,7 @@
assertEquals("unexpected root raw entry:", classpath[0], rawEntry); // ensure first entry is associated to the root
} finally {
if (libDir != null) {
- String[] libJars = libDir.list();
- if (libJars != null) {
- for (int i = 0, length = libJars.length; i < length; i++) {
- new File(libDir, libJars[i]).delete();
- }
- }
- libDir.delete();
+ org.eclipse.jdt.core.tests.util.Util.delete(libDir);
}
this.deleteProject("P");
JavaCore.removeClasspathVariable("MyVar", null);
Index: src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java,v
retrieving revision 1.90.2.4
diff -u -r1.90.2.4 JavaSearchTests.java
--- src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java 31 Jan 2005 11:32:04 -0000 1.90.2.4
+++ src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java 30 Mar 2007 10:50:00 -0000
@@ -22,6 +22,7 @@
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.core.search.*;
+import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.core.JavaElement;
import org.eclipse.jdt.internal.core.JavaModelStatus;
@@ -961,7 +962,7 @@
resultCollector);
} finally {
- externalJar.delete();
+ Util.delete(externalJar);
project.setRawClasspath(classpath, null);
}
Index: src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java,v
retrieving revision 1.80.2.1
diff -u -r1.80.2.1 AbstractJavaModelTests.java
--- src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java 31 Jan 2005 11:32:04 -0000 1.80.2.1
+++ src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java 30 Mar 2007 10:49:59 -0000
@@ -604,29 +604,12 @@
return project;
}
public void deleteFile(File file) {
- file = file.getAbsoluteFile();
- if (!file.exists())
- return;
- if (file.isDirectory()) {
- String[] files = file.list();
- //file.list() can return null
- if (files != null) {
- for (int i = 0; i < files.length; ++i) {
- deleteFile(new File(file, files[i]));
- }
- }
- }
- boolean success = file.delete();
- int retryCount = 60; // wait 1 minute at most
- while (!success && --retryCount >= 0) {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
+ int retryCount = 0;
+ while (++retryCount <= 60) { // wait 1 minute at most
+ if (org.eclipse.jdt.core.tests.util.Util.delete(file)) {
+ break;
}
- success = file.delete();
}
- if (success) return;
- System.err.println("Failed to delete " + file.getPath());
}
protected void deleteProject(String projectName) throws CoreException {
IProject project = this.getProject(projectName);
#P org.eclipse.jdt.core
Index: batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties,v
retrieving revision 1.328.2.6
diff -u -r1.328.2.6 messages.properties
--- batch/org/eclipse/jdt/internal/compiler/batch/messages.properties 28 Jan 2005 16:11:32 -0000 1.328.2.6
+++ batch/org/eclipse/jdt/internal/compiler/batch/messages.properties 30 Mar 2007 10:50:03 -0000
@@ -12,7 +12,7 @@
### compiler
compiler.name = Eclipse Java Compiler
-compiler.version = 0.454_R30x
+compiler.version = 0.454a_R30x
compiler.copyright = Copyright IBM Corp 2000, 2005. All rights reserved.
### scanning
Index: buildnotes_jdt-core.html
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/buildnotes_jdt-core.html,v
retrieving revision 1.3135.2.49
diff -u -r1.3135.2.49 buildnotes_jdt-core.html
--- buildnotes_jdt-core.html 2 Feb 2005 11:58:03 -0000 1.3135.2.49
+++ buildnotes_jdt-core.html 30 Mar 2007 10:50:03 -0000
@@ -35,6 +35,20 @@
+
+
+Eclipse Platform Build Notes
+Java Development Tooling Core
+Eclipse SDK 3.0.2 Build - March 30, 2007
+
Project org.eclipse.jdt.core v_454a_R30x
+(cvs).
+
+What's new in this drop
+
+Problem Reports Fixed
+166977
+[vista] Unexpected errors while running JDT/Core tests
+
Eclipse Platform Build Notes
#P org.eclipse.jdt.core.tests
Index: Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/NegativeTest.java
===================================================================
RCS file: /home/cvs/numbat/org.eclipse.jdt.core.tests/Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/NegativeTest.java,v
retrieving revision 1.230.2.2
diff -u -r1.230.2.2 NegativeTest.java
--- Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/NegativeTest.java 8 Jul 2004 16:05:27 -0000 1.230.2.2
+++ Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/NegativeTest.java 30 Mar 2007 10:49:44 -0000
@@ -6,6 +6,7 @@
import junit.framework.Test;
import org.eclipse.jdt.core.tests.compiler.regression.AbstractRegressionTest;
+import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
public class NegativeTest extends AbstractRegressionTest {
@@ -15230,7 +15231,7 @@
},
"SUCCESS");
// delete binary file SecretClass (i.e. simulate removing it from classpath for subsequent compile)
- new File(OUTPUT_DIR, "plugin3" + File.separator + "SecretClass.class").delete();
+ Util.delete(new File(OUTPUT_DIR, "plugin3" + File.separator + "SecretClass.class"));
this.runNegativeTest(
new String[] {
@@ -15273,7 +15274,7 @@
},
"SUCCESS");
// delete binary file SecretClass (i.e. simulate removing it from classpath for subsequent compile)
- new File(OUTPUT_DIR, "plugin3" + File.separator + "SecretClass.class").delete();
+ Util.delete(new File(OUTPUT_DIR, "plugin3" + File.separator + "SecretClass.class"));
this.runNegativeTest(
new String[] {
@@ -15321,7 +15322,7 @@
},
"SUCCESS");
// delete binary file SecretClass (i.e. simulate removing it from classpath for subsequent compile)
- new File(OUTPUT_DIR, "plugin3" + File.separator + "SecretClass.class").delete();
+ Util.delete(new File(OUTPUT_DIR, "plugin3" + File.separator + "SecretClass.class"));
this.runNegativeTest(
new String[] {
@@ -15516,7 +15517,7 @@
false,
null);
// discard LoopB.class and replace it with copy LoopB1.class so as to create cycle in binaries
- new File(OUTPUT_DIR, "p" + File.separator + "LoopB.class").delete();
+ Util.delete(new File(OUTPUT_DIR, "p" + File.separator + "LoopB.class"));
new File(OUTPUT_DIR, "p" + File.separator + "LoopB1.class").renameTo(new File(OUTPUT_DIR, "p" + File.separator + "LoopB.class"));
this.runNegativeTest(
Index: Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/JavaModelRegressionTestSetup.java
===================================================================
RCS file: /home/cvs/numbat/org.eclipse.jdt.core.tests/Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/JavaModelRegressionTestSetup.java,v
retrieving revision 1.29
diff -u -r1.29 JavaModelRegressionTestSetup.java
--- Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/JavaModelRegressionTestSetup.java 24 May 2004 15:02:43 -0000 1.29
+++ Eclipse Java Tests Model/src/org/eclipse/jdt/tests/core/JavaModelRegressionTestSetup.java 30 Mar 2007 10:49:44 -0000
@@ -22,6 +22,7 @@
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.tests.util.Util;
public class JavaModelRegressionTestSetup extends TestSetup {
public static JavaModelRegressionTestSetup CURRENT_TEST_SETUP = null;
@@ -226,9 +227,7 @@
if (CURRENT_TEST_SETUP == this) {
RegressionTestSuite.fgJavaModel.close();
RegressionTestSuite.fgJavaModel = null;
- new java.io.File(LOCAL_JDK + File.separator + "classes.zip").delete();
- new java.io.File(LOCAL_JDK + File.separator + "src.zip").delete();
- new java.io.File(LOCAL_JDK).delete();
+ Util.delete(new File(LOCAL_JDK));
}
}
}
Index: .options
===================================================================
RCS file: .options
diff -N .options
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ .options 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,8 @@
+# Turn on debug tracing for org.eclipse.jdt.core.tests plugin
+org.eclipse.jdt.core.tests/debug=true
+
+# Reports deletion activity
+org.eclipse.jdt.core.tests/debug/delete=false
+
+# Maximum time in ms waiting for delete operation succeed
+org.eclipse.jdt.core.tests/debug/delete/wait=10000
Index: Eclipse Java Tests Runner/org/eclipse/jdt/core/tests/JDTCoreTestsPlugin.java
===================================================================
RCS file: Eclipse Java Tests Runner/org/eclipse/jdt/core/tests/JDTCoreTestsPlugin.java
diff -N Eclipse Java Tests Runner/org/eclipse/jdt/core/tests/JDTCoreTestsPlugin.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ Eclipse Java Tests Runner/org/eclipse/jdt/core/tests/JDTCoreTestsPlugin.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.jdt.core.tests.util.Util;
+import org.osgi.framework.BundleContext;
+
+public class JDTCoreTestsPlugin extends Plugin {
+
+// The shared plugin instance.
+private static JDTCoreTestsPlugin JDT_CORE_TESTS_PLUGIN;
+
+/**
+ * The plug-in identifier of the JDT/Core tests support
+ * (value "org.eclipse.jdt.core.tests"
).
+ */
+public static final String PLUGIN_ID = "org.eclipse.jdt.core.tests" ; //$NON-NLS-1$
+
+private static final String DELETE_DEBUG = PLUGIN_ID + "/debug/delete" ; //$NON-NLS-1$
+private static final String DELETE_MAX_WAIT = PLUGIN_ID + "/debug/delete/wait" ; //$NON-NLS-1$
+
+/**
+ * The constructor.
+ */
+public JDTCoreTestsPlugin() {
+ JDT_CORE_TESTS_PLUGIN = this;
+}
+
+/**
+ * This method is called upon plug-in activation
+ */
+public void start(BundleContext context) throws Exception {
+ super.start(context);
+ configurePluginDebugOptions();
+}
+
+/**
+ * This method is called when the plug-in is stopped
+ */
+public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ JDT_CORE_TESTS_PLUGIN = null;
+}
+
+/**
+ * Returns the shared instance.
+ */
+public static JDTCoreTestsPlugin getDefault() {
+ return JDT_CORE_TESTS_PLUGIN;
+}
+
+/**
+ * Configure the plugin with respect to option settings defined in ".options" file
+ */
+void configurePluginDebugOptions(){
+ if(isDebugging()){
+ String option = Platform.getDebugOption(DELETE_DEBUG);
+ if(option != null) {
+ Util.DELETE_DEBUG = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ }
+ option = Platform.getDebugOption(DELETE_MAX_WAIT);
+ if(option != null) {
+ int wait = Integer.parseInt(option);
+ if (wait > 1000 && wait <= 60000) { // between 1 and 60 seconds, else use default value (10s)
+ Util.DELETE_MAX_WAIT = wait;
+ }
+ }
+ }
+}
+}
#P org.eclipse.jdt.core.tests.compiler
Index: src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java,v
retrieving revision 1.7
diff -u -r1.7 ClassFileComparatorTest.java
--- src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java 13 Jan 2004 15:48:53 -0000 1.7
+++ src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileComparatorTest.java 30 Mar 2007 10:50:11 -0000
@@ -39,7 +39,7 @@
if (fileNames != null) {
for (int i = 0, max = fileNames.length; i < max; i++) {
if (fileNames[i].indexOf(className) != -1) {
- new File(SOURCE_DIRECTORY + File.separator + fileNames[i]).delete();
+ Util.delete(SOURCE_DIRECTORY + File.separator + fileNames[i]);
}
}
}
@@ -49,7 +49,7 @@
if (fileNames != null) {
for (int i = 0, max = fileNames.length; i < max; i++) {
if (fileNames[i].indexOf(className) != -1) {
- new File(EVAL_DIRECTORY + File.separator + fileNames[i]).delete();
+ Util.delete(EVAL_DIRECTORY + File.separator + fileNames[i]);
}
}
}
Index: src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Attic/ClassFileReaderTest.java,v
retrieving revision 1.23
diff -u -r1.23 ClassFileReaderTest.java
--- src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest.java 13 Apr 2004 18:09:02 -0000 1.23
+++ src/org/eclipse/jdt/core/tests/compiler/regression/ClassFileReaderTest.java 30 Mar 2007 10:50:12 -0000
@@ -102,7 +102,7 @@
if (fileNames != null) {
for (int i = 0, max = fileNames.length; i < max; i++) {
if (fileNames[i].indexOf(className) != -1) {
- new File(SOURCE_DIRECTORY + File.separator + fileNames[i]).delete();
+ Util.delete(SOURCE_DIRECTORY + File.separator + fileNames[i]);
}
}
}
@@ -112,7 +112,7 @@
if (fileNames != null) {
for (int i = 0, max = fileNames.length; i < max; i++) {
if (fileNames[i].indexOf(className) != -1) {
- new File(EVAL_DIRECTORY + File.separator + fileNames[i]).delete();
+ Util.delete(EVAL_DIRECTORY + File.separator + fileNames[i]);
}
}
}
Index: src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java,v
retrieving revision 1.37
diff -u -r1.37 AbstractRegressionTest.java
--- src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java 6 May 2004 08:42:04 -0000 1.37
+++ src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java 30 Mar 2007 10:50:11 -0000
@@ -496,7 +496,6 @@
File outputDir = new File(OUTPUT_DIR);
if (outputDir.exists()) {
Util.flushDirectoryContent(outputDir);
- outputDir.delete();
}
}
}
\ No newline at end of file
Index: src/org/eclipse/jdt/core/tests/compiler/regression/LookupTest.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LookupTest.java,v
retrieving revision 1.19.2.1
diff -u -r1.19.2.1 LookupTest.java
--- src/org/eclipse/jdt/core/tests/compiler/regression/LookupTest.java 8 Jul 2004 22:20:33 -0000 1.19.2.1
+++ src/org/eclipse/jdt/core/tests/compiler/regression/LookupTest.java 30 Mar 2007 10:50:12 -0000
@@ -13,6 +13,7 @@
import java.io.File;
import java.util.Hashtable;
+import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import junit.framework.Test;
@@ -1514,7 +1515,7 @@
},
"SUCCESS");
// delete binary file Dumbo$Clyde (i.e. simulate removing it from classpath for subsequent compile)
- new File(OUTPUT_DIR, "p" + File.separator + "Dumbo$Clyde.class").delete();
+ Util.delete(new File(OUTPUT_DIR, "p" + File.separator + "Dumbo$Clyde.class"));
this.runConformTest(
new String[] {
Index: plugin.xml
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/Attic/plugin.xml,v
retrieving revision 1.9.4.1
diff -u -r1.9.4.1 plugin.xml
--- plugin.xml 12 Oct 2004 10:44:29 -0000 1.9.4.1
+++ plugin.xml 30 Mar 2007 10:50:11 -0000
@@ -15,7 +15,8 @@
-
+
+
Index: src/org/eclipse/jdt/core/tests/eval/DebugEvaluationTest.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/DebugEvaluationTest.java,v
retrieving revision 1.20
diff -u -r1.20 DebugEvaluationTest.java
--- src/org/eclipse/jdt/core/tests/eval/DebugEvaluationTest.java 24 May 2004 15:02:27 -0000 1.20
+++ src/org/eclipse/jdt/core/tests/eval/DebugEvaluationTest.java 30 Mar 2007 10:50:12 -0000
@@ -124,12 +124,8 @@
}
public void removeTempClass(String className) {
resetEnv(); // needed to reinitialize the caches
- File sourceFile = new File(SOURCE_DIRECTORY + File.separator + className + ".java");
- sourceFile.delete();
-
- File binaryFile = new File(EvaluationSetup.EVAL_DIRECTORY + File.separator + LocalVMLauncher.REGULAR_CLASSPATH_DIRECTORY + File.separator + className + ".class");
-
- binaryFile.delete();
+ Util.delete(SOURCE_DIRECTORY + File.separator + className + ".java");
+ Util.delete(EvaluationSetup.EVAL_DIRECTORY + File.separator + LocalVMLauncher.REGULAR_CLASSPATH_DIRECTORY + File.separator + className + ".class");
}
/*public static Test suite(Class evaluationTestClass) {
junit.framework.TestSuite suite = new junit.framework.TestSuite();
Index: src/org/eclipse/jdt/core/tests/util/Util.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/Util.java,v
retrieving revision 1.23
diff -u -r1.23 Util.java
--- src/org/eclipse/jdt/core/tests/util/Util.java 24 May 2004 15:02:27 -0000 1.23
+++ src/org/eclipse/jdt/core/tests/util/Util.java 30 Mar 2007 10:50:13 -0000
@@ -10,13 +10,21 @@
*******************************************************************************/
package org.eclipse.jdt.core.tests.util;
-import java.io.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
import java.net.ServerSocket;
import java.util.Locale;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.tests.compiler.regression.Requestor;
import org.eclipse.jdt.internal.compiler.Compiler;
import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
@@ -26,7 +34,99 @@
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
public class Util {
- public static String OUTPUT_DIRECTORY = "comptest";
+// Trace for delete operation
+/*
+ * Maximum time wasted repeating delete operations while running JDT/Core tests.
+ */
+private static int DELETE_MAX_TIME = 0;
+/**
+ * Trace deletion operations while running JDT/Core tests.
+ */
+public static boolean DELETE_DEBUG = false;
+/**
+ * Maximum of time in ms to wait in deletion operation while running JDT/Core tests.
+ * Default is 10 seconds. This number cannot exceed 1 minute (ie. 60000).
+ *
+ * To avoid too many loops while waiting, the ten first ones are done waiting
+ * 10ms before repeating, the ten loops after are done waiting 100ms and
+ * the other loops are done waiting 1s...
+ */
+public static int DELETE_MAX_WAIT = 10000;
+
+// Output directory initialization
+/**
+ * Initially, output directory was located in System.getProperty("user.home")+"\comptest".
+ * To allow user to run several compiler tests at the same time, main output directory
+ * is now located in a sub-directory of "comptest" which name is "run."+System.currentMilliseconds
.
+ *
+ * @see #DELAY_BEFORE_CLEAN_PREVIOUS
+ */
+private final static String OUTPUT_DIRECTORY;
+/**
+ * Let user specify the delay in hours before output directories are removed from file system
+ * while starting a new test run. Default value is 2 hours.
+ *
+ * Note that this value may be a float and so have time less than one hour.
+ * If value is 0 or negative, then all previous run directories will be removed...
+ *
+ * @see #OUTPUT_DIRECTORY
+ */
+private final static String DELAY_BEFORE_CLEAN_PREVIOUS = System.getProperty("delay");
+/*
+ * Static initializer to clean directories created while running previous test suites.
+ */
+static {
+ // Get delay for cleaning sub-directories
+ long millisecondsPerHour = 1000L * 3600L;
+ long delay = millisecondsPerHour * 2; // default is to keep previous run directories for 2 hours
+ try {
+ if (DELAY_BEFORE_CLEAN_PREVIOUS != null) {
+ float hours = Float.parseFloat(DELAY_BEFORE_CLEAN_PREVIOUS);
+ delay = (int) (millisecondsPerHour * hours);
+ }
+ }
+ catch (NumberFormatException nfe) {
+ // use default
+ }
+
+ // Get output directory root from system properties
+ String container = System.getProperty("jdt.test.output_directory");
+ if (container == null){
+ container = System.getProperty("user.home");
+ }
+ if (container == null) {
+ container = "."; // use current directory
+ }
+
+ // Get file for root directory
+ if (Character.isLowerCase(container.charAt(0)) && container.charAt(1) == ':') {
+ container = Character.toUpperCase(container.charAt(0)) + container.substring(1);
+ }
+ File dir = new File(new File(container), "comptest");
+
+ // If root directory already exists, clean it
+ if (dir.exists()) {
+ long now = System.currentTimeMillis();
+ if ((now - dir.lastModified()) > delay) {
+ // remove all directory content
+ flushDirectoryContent(dir);
+ } else {
+ // remove only old sub-dirs
+ File[] testDirs = dir.listFiles();
+ for (int i=0,l=testDirs.length; i delay) {
+ delete(testDirs[i]);
+ }
+ }
+ }
+ }
+ }
+
+ // Computed test run directory name based on current time
+ File dateDir = new File(dir, "run."+System.currentTimeMillis());
+ OUTPUT_DIRECTORY = dateDir.getPath();
+}
public static CompilationUnit[] compilationUnits(String[] testFiles) {
int length = testFiles.length / 2;
@@ -124,8 +224,10 @@
try {
in = new FileInputStream(source);
File destFile = new File(dest, source.getName());
- if (destFile.exists() && !destFile.delete()) {
- throw new IOException(destFile + " is in use");
+ if (destFile.exists()) {
+ if (!delete(destFile)) {
+ throw new IOException(destFile + " is in use");
+ }
}
out = new FileOutputStream(destFile);
int bufferLength = 1024;
@@ -163,6 +265,54 @@
zip(classesDir, jarPath);
}
/**
+ * Delete a file or directory and insure that the file is no longer present
+ * on file system. In case of directory, delete all the hierarchy underneath.
+ *
+ * @param file The file or directory to delete
+ * @return true iff the file was really delete, false otherwise
+ */
+public static boolean delete(File file) {
+ // flush all directory content
+ if (file.isDirectory()) {
+ flushDirectoryContent(file);
+ }
+ // remove file
+ file.delete();
+ if (isFileDeleted(file)) {
+ return true;
+ }
+ return waitUntilFileDeleted(file);
+}
+/**
+ * Delete a file or directory and insure that the file is no longer present
+ * on file system. In case of directory, delete all the hierarchy underneath.
+ *
+ * @param resource The resource to delete
+ * @return true iff the file was really delete, false otherwise
+ */
+public static boolean delete(IResource resource) {
+ try {
+ resource.delete(true, null);
+ if (isResourceDeleted(resource)) {
+ return true;
+ }
+ }
+ catch (CoreException e) {
+ // skip
+ }
+ return waitUntilResourceDeleted(resource);
+}
+/**
+ * Delete a file or directory and insure that the file is no longer present
+ * on file system. In case of directory, delete all the hierarchy underneath.
+ *
+ * @param path The path of the file or directory to delete
+ * @return true iff the file was really delete, false otherwise
+ */
+public static boolean delete(String path) {
+ return delete(new File(path));
+}
+/**
* Generate a display string from the given String.
* @param indent number of tabs are added at the begining of each line.
*
@@ -362,16 +512,10 @@
* no-op if not a directory.
*/
public static void flushDirectoryContent(File dir) {
- if (dir.isDirectory()) {
- String[] files = dir.list();
- if (files == null) return;
- for (int i = 0, max = files.length; i < max; i++) {
- File current = new File(dir, files[i]);
- if (current.isDirectory()) {
- flushDirectoryContent(current);
- }
- current.delete();
- }
+ File[] files = dir.listFiles();
+ if (files == null) return;
+ for (int i = 0, max = files.length; i < max; i++) {
+ delete(files[i]);
}
}
/**
@@ -428,11 +572,82 @@
* Example of use: [org.eclipse.jdt.core.tests.util.Util.getOutputDirectory()]
*/
public static String getOutputDirectory() {
- String container = System.getProperty("user.home");
- if (container == null){
- return null;
+ return OUTPUT_DIRECTORY;
+}
+/**
+ * Returns the parent's child file matching the given file or null if not found.
+ *
+ * @param file The searched file in parent
+ * @return The parent's child matching the given file or null if not found.
+ */
+private static File getParentChildFile(File file) {
+ File parent = file.getParentFile();
+ if (parent == null || !parent.exists()) return null;
+ File[] files = parent.listFiles();
+ int length = files==null ? 0 : files.length;
+ if (length > 0) {
+ for (int i=0; i 0) {
+ for (int i=0; i
+ * read {@link File#canRead()}
+ * write {@link File#canWrite()}
+ * exists {@link File#exists()}
+ * is file {@link File#isFile()}
+ * is directory {@link File#isDirectory()}
+ * is hidden {@link File#isHidden()}
+ *
+ * May recurse several level in parents hierarchy.
+ * May also display children, but then will not recusre in parent
+ * hierarchy to avoid infinite loop...
+ *
+ * @param file The file to display information
+ * @param indent Number of tab to print before the information
+ * @param recurse Display also information on recurse
th parents in hierarchy.
+ * If negative then display children information instead.
+ */
+private static void printFileInfo(File file, int indent, int recurse) {
+ String tab = "";
+ for (int i=0; i 0) {
+ boolean children = recurse < 0;
+ System.out.print(tab+" + children: ");
+ if (children) System.out.println();
+ for (int i=0; i0) System.out.print(", ");
+ System.out.print(files[i].getName());
+ if (files[i].isDirectory()) System.out.print("[dir]");
+ else if (files[i].isFile()) System.out.print("[file]");
+ else System.out.print("[?]");
+ }
+ }
+ if (!children) System.out.println();
+ }
+ if (recurse > 0) {
+ File parent = file.getParentFile();
+ if (parent != null) printFileInfo(parent, indent+1, recurse-1);
+ }
+}
+/**
+ * Print stack trace with only JDT/Core elements.
+ *
+ * @param exception Exception of the stack trace. May be null, then a fake exception is used.
+ * @param indent Number of tab to display before the stack elements to display.
+ */
+private static void printJdtCoreStackTrace(Exception exception, int indent) {
+ String tab = "";
+ for (int i=0; i "+testElement);
+ }
+ } else {
+ exception.printStackTrace(System.out);
+ }
+}
+/**
* Makes the given path a path using native path separators as returned by File.getPath()
* and trimming any extra slash.
*/
@@ -466,6 +807,157 @@
nativePath.substring(0, nativePath.length() - 1) :
nativePath;
}
+/**
+ * Wait until the file is _really_ deleted on file system.
+ *
+ * @param file Deleted file
+ * @return true if the file was finally deleted, false otherwise
+ */
+private static boolean waitUntilFileDeleted(File file) {
+ if (DELETE_DEBUG) {
+ System.out.println();
+ System.out.println("WARNING in test: "+getTestName());
+ System.out.println(" - problems occured while deleting "+file);
+ printJdtCoreStackTrace(null, 1);
+ printFileInfo(file.getParentFile(), 1, -1); // display parent with its children
+ System.out.print(" - wait for ("+DELETE_MAX_WAIT+"ms max): ");
+ }
+ int count = 0;
+ int delay = 10; // ms
+ int maxRetry = DELETE_MAX_WAIT / delay;
+ int time = 0;
+ while (count < maxRetry) {
+ try {
+ count++;
+ Thread.sleep(delay);
+ time += delay;
+ if (time > DELETE_MAX_TIME) DELETE_MAX_TIME = time;
+ if (DELETE_DEBUG) System.out.print('.');
+ if (file.exists()) {
+ if (file.delete()) {
+ // SUCCESS
+ if (DELETE_DEBUG) {
+ System.out.println();
+ System.out.println(" => file really removed after "+time+"ms (max="+DELETE_MAX_TIME+"ms)");
+ System.out.println();
+ }
+ return true;
+ }
+ }
+ if (isFileDeleted(file)) {
+ // SUCCESS
+ if (DELETE_DEBUG) {
+ System.out.println();
+ System.out.println(" => file disappeared after "+time+"ms (max="+DELETE_MAX_TIME+"ms)");
+ System.out.println();
+ }
+ return true;
+ }
+ // Increment waiting delay exponentially
+ if (count >= 10 && delay <= 100) {
+ count = 1;
+ delay *= 10;
+ maxRetry = DELETE_MAX_WAIT / delay;
+ if ((DELETE_MAX_WAIT%delay) != 0) {
+ maxRetry++;
+ }
+ }
+ }
+ catch (InterruptedException ie) {
+ break; // end loop
+ }
+ }
+ if (!DELETE_DEBUG) {
+ System.out.println();
+ System.out.println("WARNING in test: "+getTestName());
+ System.out.println(" - problems occured while deleting "+file);
+ printJdtCoreStackTrace(null, 1);
+ printFileInfo(file.getParentFile(), 1, -1); // display parent with its children
+ }
+ System.out.println();
+ System.out.println(" !!! ERROR: "+file+" was never deleted even after having waited "+DELETE_MAX_TIME+"ms!!!");
+ System.out.println();
+ return false;
+}
+/**
+ * Wait until a resource is _really_ deleted on file system.
+ *
+ * @param resource Deleted resource
+ * @return true if the file was finally deleted, false otherwise
+ */
+private static boolean waitUntilResourceDeleted(IResource resource) {
+ File file = resource.getLocation().toFile();
+ if (DELETE_DEBUG) {
+ System.out.println();
+ System.out.println("WARNING in test: "+getTestName());
+ System.out.println(" - problems occured while deleting resource "+resource);
+ printJdtCoreStackTrace(null, 1);
+ printFileInfo(file.getParentFile(), 1, -1); // display parent with its children
+ System.out.print(" - wait for ("+DELETE_MAX_WAIT+"ms max): ");
+ }
+ int count = 0;
+ int delay = 10; // ms
+ int maxRetry = DELETE_MAX_WAIT / delay;
+ int time = 0;
+ while (count < maxRetry) {
+ try {
+ count++;
+ Thread.sleep(delay);
+ time += delay;
+ if (time > DELETE_MAX_TIME) DELETE_MAX_TIME = time;
+ if (DELETE_DEBUG) System.out.print('.');
+ if (resource.isAccessible()) {
+ try {
+ resource.delete(true, null);
+ if (isResourceDeleted(resource) && isFileDeleted(file)) {
+ // SUCCESS
+ if (DELETE_DEBUG) {
+ System.out.println();
+ System.out.println(" => resource really removed after "+time+"ms (max="+DELETE_MAX_TIME+"ms)");
+ System.out.println();
+ }
+ return true;
+ }
+ }
+ catch (CoreException e) {
+ // skip
+ }
+ }
+ if (isResourceDeleted(resource) && isFileDeleted(file)) {
+ // SUCCESS
+ if (DELETE_DEBUG) {
+ System.out.println();
+ System.out.println(" => resource disappeared after "+time+"ms (max="+DELETE_MAX_TIME+"ms)");
+ System.out.println();
+ }
+ return true;
+ }
+ // Increment waiting delay exponentially
+ if (count >= 10 && delay <= 100) {
+ count = 1;
+ delay *= 10;
+ maxRetry = DELETE_MAX_WAIT / delay;
+ if ((DELETE_MAX_WAIT%delay) != 0) {
+ maxRetry++;
+ }
+ }
+ }
+ catch (InterruptedException ie) {
+ break; // end loop
+ }
+ }
+ if (!DELETE_DEBUG) {
+ System.out.println();
+ System.out.println("WARNING in test: "+getTestName());
+ System.out.println(" - problems occured while deleting resource "+resource);
+ printJdtCoreStackTrace(null, 1);
+ printFileInfo(file.getParentFile(), 1, -1); // display parent with its children
+ }
+ System.out.println();
+ System.out.println(" !!! ERROR: "+resource+" was never deleted even after having waited "+DELETE_MAX_TIME+"ms!!!");
+ System.out.println();
+ return false;
+}
public static void writeToFile(String contents, String destinationFilePath) {
File destFile = new File(destinationFilePath);
FileOutputStream output = null;
@@ -489,7 +981,9 @@
public static void zip(File rootDir, String zipPath) throws IOException {
ZipOutputStream zip = null;
try {
- zip = new ZipOutputStream(new FileOutputStream(zipPath));
+ File zipFile = new File(zipPath);
+ if (zipFile.exists()) delete(zipFile);
+ zip = new ZipOutputStream(new FileOutputStream(zipFile));
zip(rootDir, zip, rootDir.getPath().length()+1); // 1 for last slash
} finally {
if (zip != null) {
@@ -498,20 +992,19 @@
}
}
private static void zip(File dir, ZipOutputStream zip, int rootPathLength) throws IOException {
- String[] list = dir.list();
- if (list != null) {
- for (int i = 0, length = list.length; i < length; i++) {
- String name = list[i];
- File file = new File(dir, name);
- if (file.isDirectory()) {
- zip(file, zip, rootPathLength);
- } else {
+ File[] files = dir.listFiles();
+ if (files != null) {
+ for (int i = 0, length = files.length; i < length; i++) {
+ File file = files[i];
+ if (file.isFile()) {
String path = file.getPath();
path = path.substring(rootPathLength);
ZipEntry entry = new ZipEntry(path.replace('\\', '/'));
zip.putNextEntry(entry);
zip.write(org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(file));
zip.closeEntry();
+ } else {
+ zip(file, zip, rootPathLength);
}
}
}
Index: src/org/eclipse/jdt/core/tests/runtime/LocalVirtualMachine.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/runtime/LocalVirtualMachine.java,v
retrieving revision 1.7
diff -u -r1.7 LocalVirtualMachine.java
--- src/org/eclipse/jdt/core/tests/runtime/LocalVirtualMachine.java 24 May 2004 15:02:27 -0000 1.7
+++ src/org/eclipse/jdt/core/tests/runtime/LocalVirtualMachine.java 30 Mar 2007 10:50:12 -0000
@@ -12,6 +12,8 @@
import java.io.*;
+import org.eclipse.jdt.core.tests.util.Util;
+
/**
* Wrapper around the external process that is running a local VM.
* This allows to kill this process when we exit this vm.
@@ -46,11 +48,11 @@
this.process.destroy();
}
}
-/**
+/*
* Cleans up the given directory by removing all the files it contains as well
* but leaving the directory.
* @throws TargetException if the target path could not be cleaned up
- */
+ *
private void cleanupDirectory(File directory) throws TargetException {
if (!directory.exists()) {
return;
@@ -70,6 +72,7 @@
}
}
}
+*/
/**
* Cleans up this context's target path by removing all the files it contains
* but leaving the directory.
@@ -79,11 +82,11 @@
if (this.evalTargetPath == null) return;
String targetPath = this.evalTargetPath;
if (LocalVMLauncher.TARGET_HAS_FILE_SYSTEM) {
- cleanupDirectory(new File(targetPath, LocalVMLauncher.REGULAR_CLASSPATH_DIRECTORY));
- cleanupDirectory(new File(targetPath, LocalVMLauncher.BOOT_CLASSPATH_DIRECTORY));
+ Util.delete(new File(targetPath, LocalVMLauncher.REGULAR_CLASSPATH_DIRECTORY));
+ Util.delete(new File(targetPath, LocalVMLauncher.BOOT_CLASSPATH_DIRECTORY));
File file = new File(targetPath, RuntimeConstants.SUPPORT_ZIP_FILE_NAME);
- // workaround pb with Process.exitValue() that returns the process has exited, but it has not free the file yet
+ /* workaround pb with Process.exitValue() that returns the process has exited, but it has not free the file yet
int count = 10;
for (int i = 0; i < count; i++) {
if (file.delete()) {
@@ -94,11 +97,12 @@
} catch (InterruptedException e) {
}
}
- if (file.exists()) {
+ */
+ if (!Util.delete(file)) {
throw new TargetException("Could not delete " + file.getPath());
}
} else {
- cleanupDirectory(new File(targetPath));
+ Util.delete(targetPath);
}
}
/**