diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ClientElement.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ClientElement.java
index 7b1b58189..ea9853c2d 100644
--- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ClientElement.java
+++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ClientElement.java
@@ -105,10 +105,10 @@ public final class ClientElement extends ProjectComponent {
private CommandlineJava cmd = new CommandlineJava();
/** the parent task */
- private JUnitTask parent;
+ private RJUnitTask parent;
/** create a new client */
- public ClientElement(JUnitTask value) {
+ public ClientElement(RJUnitTask value) {
parent = value;
cmd.setClassname("org.apache.tools.ant.taskdefs.optional.junit.remote.TestRunner");
}
diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
index a89a528d0..09ca0fb35 100644
--- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
+++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
@@ -77,7 +77,7 @@ import org.apache.tools.ant.types.EnumeratedAttribute;
*
* @author Stephane Bailliez
*
- * @see JUnitTask
+ * @see RJUnitTask
* @see Formatter
*/
public class FormatterElement {
diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/RJUnitTask.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/RJUnitTask.java
new file mode 100644
index 000000000..df688637e
--- /dev/null
+++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/RJUnitTask.java
@@ -0,0 +1,170 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.tools.ant.taskdefs.optional.junit;
+
+import org.apache.avalon.excalibur.i18n.ResourceManager;
+import org.apache.avalon.excalibur.i18n.Resources;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+/**
+ * The core JUnit task.
+ *
+ * @author Stephane Bailliez
+ */
+public class RJUnitTask extends Task {
+
+ private final static Resources RES =
+ ResourceManager.getPackageResources(RJUnitTask.class);
+
+ /** port to run the server on */
+ private int port = -1;
+
+ /** timeout period in ms */
+ private long timeout = -1;
+
+ /** client configuraiton element */
+ private ClientElement client = null;
+
+ /** server configuration element */
+ private ServerElement server = null;
+
+// task implementation
+
+ public void execute() throws BuildException {
+ if (client == null && server == null) {
+ throw new BuildException("Invalid state: need to be server, client or both");
+ }
+
+ // 1) server and client
+ if (server != null && client != null) {
+ ServerWorker worker = new ServerWorker();
+ worker.start();
+ client.execute();
+ Exception caught = null;
+ try {
+ worker.join();
+ caught = worker.getException();
+ } catch (InterruptedException e){
+ caught = e;
+ }
+ if (caught != null){
+ throw new BuildException(caught);
+ }
+ return;
+ }
+
+ // 2) server only (waiting for client)
+ if (server != null && client == null) {
+ server.execute();
+ return;
+ }
+
+ // 3) client only (connecting to server)
+ if (server == null && client != null) {
+ client.execute();
+ return;
+ }
+ }
+
+// Ant bean accessors
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public void setTimeout(long timeout) {
+ this.timeout = timeout;
+ }
+
+ /**
+ * create a new client in charge of running tests and sending
+ * the results to the server that collect them.
+ */
+ public ClientElement createClient() {
+ if (client == null) {
+ client = new ClientElement(this);
+ }
+ return client;
+ }
+
+ /**
+ * create a new client in charge of running tests and sending
+ * the results to the server that collect them.
+ */
+ public ServerElement createServer() {
+ if (server == null) {
+ server = new ServerElement(this);
+ }
+ return server;
+ }
+
+
+ /** the worker to run the server on */
+ class ServerWorker extends Thread {
+ private Exception caught = null;
+
+ public void run() {
+ try {
+ server.execute();
+ } catch (Exception e) {
+ caught = e;
+ }
+ }
+
+ public Exception getException() {
+ return caught;
+ }
+ }
+}
diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ServerElement.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ServerElement.java
index ad79e9c74..11478e31e 100644
--- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ServerElement.java
+++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/junit/ServerElement.java
@@ -88,10 +88,10 @@ public final class ServerElement extends ProjectComponent {
private boolean haltOnError = false;
/** the parent task */
- private JUnitTask parent;
+ private RJUnitTask parent;
/** create a new server */
- public ServerElement(JUnitTask value) {
+ public ServerElement(RJUnitTask value) {
parent = value;
}