package org.camunda.bpm.extension.osgi.itest.scripting;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Hashtable;

import javax.sql.DataSource;

import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngineException;
import org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.extension.osgi.engine.ProcessEngineFactory;
import org.camunda.bpm.extension.osgi.engine.ProcessEngineFactoryWithELResolver;
import org.camunda.bpm.extension.osgi.itest.OSGiTestEnvironment;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.CoreOptions;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.OptionUtils;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerMethod;
import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;

@RunWith(PaxExam.class)
@ExamReactorStrategy(PerMethod.class)
public class ScriptEngineBundleTrackerCustomizerIntegrationTest extends OSGiTestEnvironment {

  @Configuration
  @Override
  public Option[] createConfiguration() {
    return OptionUtils.combine(super.createConfiguration(), CoreOptions.provision(createTestBundle()));
  }

  protected ProcessEngine processEngine;

  @Before
  public void setUp() {
    createProcessEngine();
  }

  @After
  public void tearDown() {
    processEngine.close();
  }

  private void createProcessEngine() {
    StandaloneProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
    configuration.setDatabaseSchemaUpdate("create-drop").setDataSource(createDatasource()).setJobExecutorActivate(false);
    ProcessEngineFactory processEngineFactory = new ProcessEngineFactoryWithELResolver();
    processEngineFactory.setProcessEngineConfiguration(configuration);
    processEngineFactory.setBundle(getBundle("org.camunda.bpm.extension.osgi"));
    try {
      processEngineFactory.init();
      processEngine = processEngineFactory.getObject();
      ctx.registerService(ProcessEngine.class.getName(), processEngine, new Hashtable<String, String>());
    } catch (Exception e) {
      fail(e.toString());
    }
  }

  private InputStream createTestBundle() {
    try {
      return TinyBundles
          .bundle()
          .add("META-INF/services/javax.script.ScriptEngineFactory",
              new FileInputStream(new File("src/test/resources/scripting/javax.script.ScriptEngineFactory")))
          .add(TestScriptEngineFactory.class)
          .add(org.camunda.bpm.extension.osgi.Constants.BUNDLE_PROCESS_DEFINTIONS_DEFAULT + "testScriptProcess.bpmn",
              new FileInputStream(new File("src/test/resources/scripting/testScriptProcess.bpmn"))).set(Constants.DYNAMICIMPORT_PACKAGE, "*")
          .set(Constants.BUNDLE_SYMBOLICNAME, "org.camunda.bpm.osgi.example").build();
    } catch (FileNotFoundException fnfe) {
      fail(fnfe.toString());
      return null;
    }
  }

  @Test
  public void scriptEngineHasBeenRegistered() throws BundleException {
    ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey("Process_1");
    assertThat(instance.isEnded(), is(true));
  }

  /**
   * The Engine should throw a {@link ProcessEngineException} when trying to
   * execute the script because the bundle with the ScriptEngine has been
   * uninstalled.
   */
  @Test(expected = ProcessEngineException.class)
  public void scriptEngineHasUnregisteredAfterBundleUninstall() throws BundleException {
    Bundle testBundle = getBundle("org.camunda.bpm.osgi.example");
    testBundle.uninstall();
    processEngine.getRuntimeService().startProcessInstanceByKey("Process_1");
  }
}

@@ -327,38 +327,8 @@
 e;%0A%0A
-import javax.sql.DataSource;%0A%0A
 impo
@@ -771,44 +771,8 @@
 nt;%0A
-import org.h2.jdbcx.JdbcDataSource;%0A
 impo

fix imports