/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.framework.ui;

import org.eclipse.persistence.testing.framework.*;

public class SynchronizedTestExecutor extends Thread {
    protected junit.framework.Test test;
    protected TestExecutor executor;
    protected SynchronizedTester tester;
    protected boolean shouldRunSetupOnly;

    public SynchronizedTestExecutor(TestExecutor executor, junit.framework.Test test, SynchronizedTester tool) {
        this.executor = executor;
        this.test = test;
        this.tester = tool;
        this.shouldRunSetupOnly = false;
    }

    /**
     * Return the executor.
     */
    public TestExecutor getExecutor() {
        return executor;
    }

    /**
     * Return the testEntity.
     */
    public junit.framework.Test getTest() {
        return test;
    }

    public SynchronizedTester getTester() {
        return tester;
    }

    /**
     * PUBLIC:
     * The class implements Runnable interface thats why run method must be implemented.
     */
    @Override
    public void run() {
        if (getTest() == null) {
            throw new TestErrorException("There is now test entity to run.");
        }

        try {
            if (shouldRunSetupOnly()) {
                ((TestCollection)getTest()).setupEntity();
            } else {
                getExecutor().runTest(getTest());
            }
        } catch (Throwable exception) {
            getTester().notifyException(exception);
        } finally {
            getTester().finishedTest();
        }
    }

    /**
     * Set the executor.
     */
    protected void setExecutor(TestExecutor executor) {
        this.executor = executor;
    }

    public void setShouldRunSetupOnly(boolean shouldRunSetupOnly) {
        this.shouldRunSetupOnly = shouldRunSetupOnly;
    }

    /**
     * set the testEntity.
     */
    public void setTest(junit.framework.Test test) {
        this.test = test;
    }

    protected void setTester(SynchronizedTester tester) {
        this.tester = tester;
    }

    public boolean shouldRunSetupOnly() {
        return shouldRunSetupOnly;
    }

    /**
     * Stop the execution of the currently executing test
     */
    public void stopExecution() {
        getExecutor().stopExecution();
    }
}
