/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * 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:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.core.framework.testrun;

import java.util.List;
import java.util.logging.Level;

import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
import org.eclipse.osee.framework.logging.BaseStatus;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.ote.core.OseeTestThread;
import org.eclipse.osee.ote.core.TestCase;
import org.eclipse.osee.ote.core.TestException;
import org.eclipse.osee.ote.core.TestScript;
import org.eclipse.osee.ote.core.environment.TestEnvironment;
import org.eclipse.osee.ote.core.framework.IMethodResult;
import org.eclipse.osee.ote.core.framework.MethodResultImpl;
import org.eclipse.osee.ote.core.framework.ResultBuilder;
import org.eclipse.osee.ote.core.framework.ReturnCode;
import org.eclipse.osee.ote.core.internal.Activator;
import org.eclipse.osee.ote.properties.OtePropertiesCore;

public class TestRunThread extends OseeTestThread {

   private final TestScript test;
   private final ITestRunListenerProvider listenerProvider;
   private final ITestRunListenerDataProvider dataProvider;
   private final IPropertyStore propertyStore;
   private volatile boolean abort = false;
   private final ResultBuilder rb = new ResultBuilder(false);

   public TestRunThread(IPropertyStore propertyStore, TestScript test, TestEnvironment env, ITestRunListenerProvider listenerProvider, ITestRunListenerDataProvider dataProvider) {
      super(test.getClass().getSimpleName(), env);
      this.test = test;
      this.listenerProvider = listenerProvider;
      this.dataProvider = dataProvider;
      this.propertyStore = propertyStore;
   }

   @Override
   protected void run() throws Exception {
      try {
         rb.append(listenerProvider.notifyPreRun(dataProvider.createOnPreRun(propertyStore, test)));
         if (rb.isReturnStatusOK()) {
            List<TestCase> testCases = test.getTestCases();
            for (int i = 0; i < testCases.size(); i++) {
               if (abort) {
                  Thread.interrupted();//clear the interrupted flag so that cleanup can occur without exception
                  addAbortResult(null);
                  i = testCases.size() - 1;//set to the last test case - TearDown
               }
               TestCase testCase = testCases.get(i);
               if (testCase == null) {
                  continue;
               }
               
               rb.append(listenerProvider.notifyPreTestCase(dataProvider.createOnPreTestCase(propertyStore, test,
                  testCase)));
               try {
                  testCase.baseDoTestCase(getEnvironment());
                  if (Thread.interrupted()) {
                     throw new InterruptedException("Thread probably aborted");
                  }
               } catch (Throwable ex) {
                  if (abort) {
                     addAbortResult(null);
                  } else {
                     abort = true;
                     this.test.setAborted(true);
                     MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
                     Throwable clientSideThrowable = ex;
                     if (!ex.getClass().getName().startsWith("java")) {
                        String msg = ex.getClass().getName();
                        if (ex.getMessage() != null && !ex.getMessage().isEmpty()) {
                           msg += ": "+ex.getMessage();
                        }
                        Throwable removeThisOnceWeGetRidOfSerializationOnAssociatedException = new Throwable(msg);
                        removeThisOnceWeGetRidOfSerializationOnAssociatedException.setStackTrace(ex.getStackTrace());
                        clientSideThrowable = removeThisOnceWeGetRidOfSerializationOnAssociatedException;
                     }
                     methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, clientSideThrowable));
                     rb.append(methodresult);
                     OseeLog.log(
                        Activator.class,
                        Level.SEVERE,
                        "Exception running Test Case [" + testCase != null ? testCase.getClass().getName() : "unknown (null test case)" + "]",
                        ex);
                  }
               } 
               rb.append(listenerProvider.notifyPostTestCase(dataProvider.createOnPostTestCase(propertyStore, test, testCase)));
            }
         }
      } finally {
         Thread.interrupted();//clear the interrupted flag so that cleanup can occur without exception
         rb.append(listenerProvider.notifyPostRun(dataProvider.createOnPostRun(propertyStore, test)));
         if (getEnvironment().getScriptCtrl().isLocked()) {
            getEnvironment().getScriptCtrl().unlock();
         }
      }
   }

   private void addAbortResult(Throwable th) {
      if (rb.isReturnStatusOK()) {
         MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
         if (th == null) {
            methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, "USER ABORTED"));
         } else {
            methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
         }
         rb.append(methodresult);
      }
   }

   public boolean abort() {
      abort = true;
      this.test.setAborted(true);
      if (Thread.currentThread() == this.getThread()) {
         throw new TestException("", Level.SEVERE);
      }
      if(OtePropertiesCore.abortMultipleInterrupt.getBooleanValue()){
    	  this.interrupt();
    	  try{
    		  this.join(1000*60);
    	  } catch (InterruptedException ex){
    	  }
      } else {
    	  int count = 0;
    	  do{
    		  this.interrupt();
    		  try{
    			  this.join(10);
    		  } catch (InterruptedException ex){
    		  }
    		  count++;
    	  } while (this.isAlive() && count < 200);
      }
      if (this.isAlive()) {
         OseeLog.reportStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE,
               "Waited 60s for test to abort but the thread did not die."));
         return false;
      }
      return true;
   }

   public boolean abort(Throwable th, boolean wait) {
      if (abort) {
         return true;
      }
      abort = true;
      this.test.setAborted(true);
      addAbortResult(th);
      if (Thread.currentThread() == this.getThread()) {
         throw new TestException("", Level.SEVERE);
      }
      this.interrupt();
      return true;
   }

   public IMethodResult getResult() {
      return rb.get();
   }

}
