JAL-3210 JAL-3456 Mothballing work done on using goomph for jalviewjs build
[jalview.git] / build.gradle
index 62b4df5..5f514e8 100644 (file)
-import org.apache.tools.ant.filters.ReplaceTokens
 import org.gradle.internal.os.OperatingSystem
-import org.gradle.plugins.ide.eclipse.model.*
-import groovy.transform.ExternalizeMethods
+import org.gradle.plugins.ide.eclipse.model.Output
+import org.gradle.plugins.ide.eclipse.model.Library
+
+import com.diffplug.gradle.GoomphCacheLocations
+
+buildscript {
+}
 
 plugins {
   id 'java'
   id 'application'
   id 'eclipse'
+
+  id 'com.diffplug.gradle.oomph.ide' version '3.18.1'
+  id 'com.diffplug.gradle.equinoxlaunch' version '3.18.1'
+  id 'com.diffplug.gradle.eclipse.mavencentral' version '3.18.1'
+  id 'com.diffplug.gradle.p2.asmaven' version '3.18.1'
 }
 
+def jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
+def useIde = useGoomph.equals("true")
+
 repositories {
   jcenter()
   mavenCentral()
-  mavenLocal()
   flatDir {
     dirs gradlePluginsDir
   }
 }
 
+configurations {
+  jalviewjsIde
+}
+
+
+if (useIde) {
+
+  p2AsMaven {
+    group 'eclipseDeps', {
+      repoEclipse goomph_eclipse_repo_version
+      //slicingOption 'latestVersionOnly', 'true'
+      iu 'org.eclipse.update.configurator'
+
+
+      iu 'org.eclipse.jdt.apt.core'
+      iu 'org.eclipse.jdt.core'
+      iu 'org.eclipse.jdt.annotation'
+
+    }
+    group 'ecjDeps', {
+      repo 'https://download.eclipse.org/eclipse/updates/4.13/R-4.13-201909161045/'
+      iu 'org.eclipse.debug.core'
+      iu 'org.eclipse.jdt.apt.pluggable.core'
+      iu 'org.eclipse.jdt.apt.ui'
+      iu 'org.eclipse.jdt.compiler.apt'
+      iu 'org.eclipse.jdt.compiler.tool'
+      iu 'org.eclipse.jdt.core.manipulation'
+      iu 'org.eclipse.jdt.debug'
+      iu 'org.eclipse.jdt.debug.ui'
+      iu 'org.eclipse.jdt.doc.user'
+      iu 'org.eclipse.jdt.junit'
+      iu 'org.eclipse.jdt.junit.core'
+      iu 'org.eclipse.jdt.junit4.runtime'
+      iu 'org.eclipse.jdt.junit4.runtime'
+      iu 'org.eclipse.jdt.junit5.runtime'
+      iu 'org.eclipse.jdt.launching'
+      iu 'org.eclipse.jdt.ui'
+
+      iu 'org.eclipse.jdt.launching.macosx'
+      iu 'org.eclipse.jdt.launching.ui.macosx'
+    }
+    group 'eclipseOrbit', {
+      repo goomph_orbit_repo
+      slicingOption 'latestVersionOnly', 'true'
+      iu 'javax.el'
+      iu 'javax.servlet'
+      iu 'javax.servlet.jsp'
+      iu 'org.apache.ant'
+      iu 'org.apache.batik.constants'
+      iu 'org.apache.batik.css'
+      iu 'org.apache.batik.i18n'
+      iu 'org.apache.batik.util'
+      iu 'org.apache.commons.beanutils'
+      iu 'org.apache.commons.collections'
+      iu 'org.apache.commons.jxpath'
+      iu 'org.apache.commons.io'
+      iu 'org.apache.commons.logging'
+      iu 'org.apache.xmlgraphics'
+      iu 'org.jdom'
+      iu 'org.w3c.dom.events'
+      iu 'org.w3c.dom.smil'
+      iu 'org.w3c.dom.svg'
+    }
+  }
+
+} // if (useIde) {}
+
+dependencies {
+/*
+    source.addMaven('org.eclipse.platform:org.eclipse.osgi:3.14.0')
+    // ...
+    compile 'eclipseOrbit:org.apache.ant:1.10.5.v20190526-1402'
+    // ...
+    compile 'org.osgi:org.osgi.service.component:1.4.0'
+    // ...
+*/
+
+  jalviewjsIde name: 'net.sf.j2s.core-3.2.4'
+  jalviewjsIde name: 'com.seeq.eclipse.importprojects-1.4.0'
+
+}
+
+
+
+
+
+
+if (useIde) {
+
+  eclipseMavenCentral {
+    // TODO: How do I add these to the jalviewjsIde configuration and not the compile configuration?
+    release goomph_eclipse_repo_version, {
+
+      //def platformCode="cocoa.macosx.x86_64"
+      //compile 'org.eclipse.swt.'+platformCode
+      useNativesForRunningPlatform()
+      compile 'org.eclipse.swt'
+
+      compile 'org.eclipse.ant.core'
+      compile 'org.eclipse.compare.core'
+      compile 'org.eclipse.core.commands'
+      compile 'org.eclipse.core.contenttype'
+      compile 'org.eclipse.core.jobs'
+      compile 'org.eclipse.core.expressions'
+      compile 'org.eclipse.core.filesystem'
+      compile 'org.eclipse.core.resources'
+      compile 'org.eclipse.core.runtime'
+      compile 'org.eclipse.core.variables'
+      compile 'org.eclipse.equinox.common'
+      compile 'org.eclipse.equinox.ds'
+      compile 'org.eclipse.equinox.app'
+      compile 'org.eclipse.equinox.registry'
+      compile 'org.eclipse.equinox.preferences'
+      compile 'org.eclipse.jface'
+      compile 'org.eclipse.osgi'
+      compile 'org.eclipse.osgi.services'
+      compile 'org.eclipse.ui'
+      compile 'org.eclipse.ui.workbench'
+      compile 'org.eclipse.team.core'
+      compile 'org.eclipse.text'
+
+      compile 'org.eclipse.e4.core.commands'
+      compile 'org.eclipse.e4.core.contexts'
+      compile 'org.eclipse.e4.core.di'
+      compile 'org.eclipse.e4.core.di.annotations'
+      compile 'org.eclipse.e4.core.di.extensions.supplier'
+      compile 'org.eclipse.e4.core.services'
+      compile 'org.eclipse.e4.ui.bindings'
+      compile 'org.eclipse.e4.ui.model.workbench'
+      compile 'org.eclipse.e4.ui.workbench'
+      compile 'org.eclipse.e4.ui.workbench.swt'
+      compile 'org.eclipse.e4.ui.css.core'
+      compile 'org.eclipse.e4.ui.css.swt'
+      compile 'org.eclipse.e4.ui.css.swt.theme'
+      compile 'org.eclipse.e4.ui.services'
+      compile 'org.eclipse.e4.ui.di'
+
+      //compile 'org.eclipse.e4.core.di.internal.extensions'
+
+      // org.eclipse.update.configurator deliberately kept at 3.3.400 see https://github.com/diffplug/goomph/issues/69
+      // this module downloaded in equinoxLaunch configuration (to specify version)
+      //compile 'org.eclipse.update.configurator'
+
+
+    }
+  }
+
+} // if (useIde) {}
+
+
+
+
+
+
+
+
+
+
+
 mainClassName = launcherClass
 def classes = "$jalviewDir/$classesDir"
 
 // configure classpath/args for j8/j11 compilation
 
-def jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
 def libDir
 def libDistDir
 def compile_source_compatibility
@@ -34,6 +203,8 @@ ext {
 
   gitHash = ""
   gitBranch = ""
+
+  jalviewjsServer = ""
 }
 
 def JAVA_INTEGER_VERSION
@@ -78,6 +249,7 @@ if (JAVA_VERSION.equals("1.8")) {
   throw new GradleException("JAVA_VERSION=$JAVA_VERSION not currently supported by Jalview")
 }
 
+
 sourceSets {
 
   main {
@@ -135,9 +307,15 @@ eclipse {
         }
         cp.entries.removeAll(removeTheseToo)
 
-        cp.entries += new Output("bin/main")
-        cp.entries += new Library(fileReference(helpParentDir))
-        cp.entries += new Library(fileReference(resourceDir))
+       if (file(eclipse_bin_dir+"/main").isDirectory()) {
+               cp.entries += new Output(eclipse_bin_dir+"/main")
+       }
+       if (file(helpParentDir).isDirectory()) {
+               cp.entries += new Library(fileReference(helpParentDir))
+       }
+       if (file(resourceDir).isDirectory()) {
+               cp.entries += new Library(fileReference(resourceDir))
+       }
 
         HashMap<String, Boolean> addedLibPath = new HashMap<>();
 
@@ -195,6 +373,7 @@ eclipse {
   //autoBuildTasks eclipseClasspath
 } // eclipse
 
+/*
 compileJava {
 
   doFirst {
@@ -209,9 +388,222 @@ compileJava {
 clean {
   delete sourceSets.main.java.outputDir
 }
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def eclipseWorkspace
+task jalviewjsSetEclipseWorkspace {
+  def eclipseWsDir = useIde?goomph_workspace:jalviewjs_eclipse_workspace
+  eclipseWorkspace = file(eclipseWsDir)
+  if (!eclipseWorkspace.exists()) {
+    eclipseWorkspace = file("${buildDir}/tmp/eclipse-workspace")
+    //eclipseWorkspace.deleteOnExit()
+  } else if (useIde) {
+    com.diffplug.gradle.GoomphCacheLocations.override_workspaces = file(eclipseWorkspace.getAbsolutePath())
+    eclipseWorkspace = oomphIde.workspaceRegistry.workspaceDir(project, file(oomphIde.ideDir))
+  }
+  println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
+}
+
+
+if (useIde) {
+
+oomphIde {
+  repoEclipse goomph_eclipse_version
+  jdt {
+    /*
+    installedJre {
+      //markDefault = true
+      //executionEnvironments = [ eclipse.jdt.javaRuntimeName ]
+    }
+    */
+    //compilerComplianceLevel( JAVA_INTEGER_VERSION )
+  }
+
+  repo "https://download.eclipse.org/releases/${goomph_eclipse_version_name}/"
+  feature goomph_eclipse_jee_feature, goomph_eclipse_jee_version
+
+  //iu 'org.eclipse.osgi'
+
+  thirdParty {
+    buildship {
+      repo goomph_repo_buildship
+      feature goomph_feature_buildship
+    }
+
+  }
+
+  workspaceProp '.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs', {
+    it.put('org.eclipse.jdt.launching.PREF_VM_XML', goomph_PREF_VM_XML)
+  }
+
+
+  // CLI ARGS HERE!
+}
+
+equinoxLaunch {
+  ideJalviewjsBuildSetup {
+
+    source.addConfiguration(configurations.compile)
+    source.addConfiguration(configurations.jalviewjsIde)
+
+    source.addMaven('eclipseOrbit:org.apache.ant:1.10.5.v20190526-1402')
+    source.addMaven('eclipseOrbit:javax.servlet:3.1.0.v201410161800')
+    source.addMaven('eclipseOrbit:javax.servlet.jsp:2.2.0.v201112011158')
+    source.addMaven('eclipseOrbit:javax.el:2.2.0.v201303151357')
+    source.addMaven('eclipseOrbit:org.apache.batik.constants:1.11.0.v20190515-0436')
+    source.addMaven('eclipseOrbit:org.apache.batik.css:1.11.0.v20190515-0436')
+    source.addMaven('eclipseOrbit:org.apache.batik.i18n:1.11.0.v20190515-0436')
+    source.addMaven('eclipseOrbit:org.apache.batik.util:1.11.0.v20190515-0436')
+    source.addMaven('eclipseOrbit:org.apache.commons.beanutils:1.8.0.v201205091237')
+    source.addMaven('eclipseOrbit:org.apache.commons.collections:3.2.2.v201511171945')
+    source.addMaven('eclipseOrbit:org.apache.xmlgraphics:2.3.0.v20190515-0436')
+    source.addMaven('eclipseOrbit:org.apache.commons.jxpath:1.3.0.v200911051830')
+    source.addMaven('eclipseOrbit:org.apache.commons.io:2.6.0.v20190123-2029')
+    source.addMaven('eclipseOrbit:org.apache.commons.logging:1.2.0.v20180409-1502')
+    source.addMaven('eclipseOrbit:org.jdom:1.1.1.v201101151400')
+    source.addMaven('eclipseOrbit:org.w3c.dom.svg:1.1.0.v201011041433')
+    source.addMaven('eclipseOrbit:org.w3c.dom.smil:1.0.1.v200903091627')
+    source.addMaven('eclipseOrbit:org.w3c.dom.events:3.0.0.draft20060413_v201105210656')
+
+    source.addMaven('org.eclipse.birt.runtime:com.ibm.icu:56.1.0.v201601250100')
+    source.addMaven('javax.inject:com.springsource.javax.inject:1.0.0')
+    source.addMaven('org.apache.felix:org.apache.felix.scr:2.1.16')
+    source.addMaven('org.osgi:org.osgi.framework:1.9.0')
+    source.addMaven('org.osgi:org.osgi.service.component:1.4.0')
+    source.addMaven('org.osgi:org.osgi.service.event:1.4.0')
+    source.addMaven('org.osgi:org.osgi.util.promise:1.1.1')
+    source.addMaven('org.osgi:org.osgi.util.function:1.1.0')
+    //source.addMaven('org.eclipse.jdt:org.eclipse.jdt.apt.core:3.6.500')
+    //source.addMaven('org.eclipse.jdt:org.eclipse.jdt.core:3.19.0')
+    //source.addMaven('org.eclipse.jdt:org.eclipse.jdt.annotation:2.2.300')
+
+    source.addMaven('ecjDeps:org.eclipse.debug.core:3.14.0.v20190812-1404')
+    source.addMaven('ecjDeps:org.eclipse.jdt.annotation:2.2.300.v20190328-1431')
+    source.addMaven('ecjDeps:org.eclipse.jdt.apt.core:3.6.500.v20190703-0914')
+    source.addMaven('ecjDeps:org.eclipse.jdt.core:3.19.0.v20190903-0936')
+    source.addMaven('ecjDeps:org.eclipse.jdt.apt.pluggable.core:1.2.400.v20190626-1334')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.apt.ui:3.6.300.v20190727-1243')
+    source.addMaven('ecjDeps:org.eclipse.jdt.compiler.apt:1.3.700.v20190704-1731')
+    source.addMaven('ecjDeps:org.eclipse.jdt.compiler.tool:1.2.600.v20190322-0450')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.core.manipulation:1.12.100.v20190904-0645')
+    source.addMaven('ecjDeps:org.eclipse.jdt.debug:3.13.100.v20190902-1050')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.debug.ui:3.10.400.v20190815-2202')
+    source.addMaven('ecjDeps:org.eclipse.jdt.doc.user:3.15.400.v20190904-0724')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.junit:3.11.500.v20190809-1613')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.junit.core:3.10.400.v20190625-1910')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.junit4.runtime:1.1.1000.v20190510-0840')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.junit4.runtime:1.1.1000.v20190510-0840')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.junit5.runtime:1.0.600.v20190610-0439')
+    source.addMaven('ecjDeps:org.eclipse.jdt.launching:3.15.0.v20190826-1639')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.ui:3.19.0.v20190827-1733')
+
+    //source.addMaven('ecjDeps:org.eclipse.jdt.launching.macosx:3.4.300.v20190510-0639')
+    //source.addMaven('ecjDeps:org.eclipse.jdt.launching.ui.macosx:1.2.300.v20190510-0639')
+
+    //source.addMaven('')
+
+    // org.eclipse.update.configurator deliberately kept at 3.3.400 see https://github.com/diffplug/goomph/issues/69
+    source.addMaven('org.eclipse.platform:org.eclipse.update.configurator:3.3.400')
+
+
+    launchTask 'ideJalviewjsImport', {
+      it.args = ["-consoleLog", "-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath ]
+    }
+
+    launchTask 'ideJalviewjsBuild', {
+
+      oomphIde.workspaceProp '.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs', {
+        it.put('org.eclipse.jdt.launching.PREF_VM_XML', goomph_PREF_VM_XML)
+      }
+
+      def args = ["-consoleLog", "-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace.getPath(), "-"+jalviewjs_eclipseBuildArg, eclipse_project_name ]
+      println("ARGS="+args)
+
+      it.args = args
+
+    }
+  }
+}
+
+/*
+task ideCopyDropins (type: Copy) {
+  dependsOn ideSetupP2
+
+  def inputFiles = fileTree(jalviewjs_utils_dir+"/"+jalviewjs_eclipse_dropins_dir)
+  def outputDir = oomphIde.ideDir + "/" + com.diffplug.gradle.FileMisc.macContentsEclipse() + "/dropins"
+
+  from inputFiles
+  into outputDir
+  def outputFiles = []
+  rename { filename ->
+    outputFiles += outputDir+"/"+filename
+    println("COPYING ${filename} to ${outputFiles}")
+    null
+  }
+  outputs.files outputFiles
+  inputs.files inputFiles
+
+}
+*/
+
+ideSetupWorkspace.dependsOn jalviewjsSetEclipseWorkspace
+ideSetupWorkspace.outputs.upToDateWhen {file(eclipseWorkspace).exists()}
+
+task ideSetup {
+  dependsOn ideSetupP2
+  dependsOn ideSetupWorkspace
+}
+
+} // if (useIde) {}
+
+
+
+
+
+
+
+
+
+
+
+
+
+def jalviewjsBuildDir
+def jalviewjsSiteDir
+task jalviewjsSitePath {
+  if (jalviewjs_site_dir.startsWith("/")) {
+    jalviewjsSiteDir = jalviewjs_site_dir
+  } else {
+    def relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
+    jalviewjsBuildDir = "${relativeBuildDir}/jalviewjs"
+    jalviewjsSiteDir = jalviewjsBuildDir + "/" + jalviewjs_site_dir
+  }
+}
+
 
+task jalviewjsUnzipFiles {
+  dependsOn jalviewjsSitePath
 
-task jalviewjs_unzipFiles {
   def zipFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_libjs_dir).include("*.zip")
   zipFiles += jalviewjs_utils_dir+"/"+jalviewjs_swingjs_zip
 
@@ -219,122 +611,318 @@ task jalviewjs_unzipFiles {
     zipFiles.each { file_zip -> 
       copy {
         from zipTree(file_zip)
-        into jalviewjs_site_dir
+        into jalviewjsSiteDir
       }
     }
   }
 
   inputs.files zipFiles
-  outputs.dir jalviewjs_site_dir
+  outputs.dir jalviewjsSiteDir
 }
 
-def eclipseBinary
 def eclipseDropinsDir
-def eclipsePluginsDir
-task jalviewjs_eclipsePaths {
-       if (OperatingSystem.current().isMacOsX()) {
-               eclipseDropinsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/dropins"
-               eclipsePluginsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/plugins"
-               eclipseBinary = jalviewjs_eclipse_root+"/Contents/MacOS/eclipse"
-       } else if (OperatingSystem.current().isWindows()) { // check this!
-               eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
-               eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
-               eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
-       } else { // linux or unix
-               eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
-               eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
-               eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
-       }
+def eclipseBinary
+task jalviewjsEclipsePaths {
+  def eclipseRoot
+  if (useIde) {
+    eclipseRoot = oomphIde.ideDir
+    eclipseDropinsDir = eclipseRoot+"/"+com.diffplug.gradle.FileMisc.macContentsEclipse()+"/dropins"
+    eclipseBinary = eclipseRoot+"/"+com.diffplug.common.swt.os.OS.getNative().winMacLinux("", "Contents/MacOS", "")+"/eclipse"
+  } else {
+    eclipseRoot = jalviewjs_eclipse_root
+    if (eclipseRoot.startsWith("~")) {
+      eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
+    }
+    if (OperatingSystem.current().isMacOsX()) {
+      eclipseRoot += "/Eclipse.app"
+      eclipseDropinsDir = eclipseRoot+"/Contents/Eclipse/dropins"
+      eclipseBinary = eclipseRoot+"/Contents/MacOS/eclipse"
+    } else if (OperatingSystem.current().isWindows()) { // check these paths!!
+      eclipseDropinsDir = eclipseRoot+"/dropins"
+      eclipseBinary = eclipseRoot+"/eclipse"
+    } else { // linux or unix
+      eclipseDropinsDir = eclipseRoot+"/dropins"
+      eclipseBinary = eclipseRoot+"/eclipse"
+    }
+  }
+  //println("ECLIPSE_ROOT=${eclipseRoot}")
+  //println("ECLIPSE_BINARY=${eclipseBinary}")
 }
 
-task jalviewjs_eclipse_copy_dropins (type: Copy) {
-  dependsOn jalviewjs_eclipsePaths
-  def inputFiles = fileTree(jalviewjs_utils_dir+"/"+jalviewjs_eclipse_dropins_dir)
+//task jalviewjsEclipseCopyDropins (type: Copy) {
+task jalviewjsEclipseCopyDropins {
+  dependsOn jalviewjsEclipsePaths
+  def inputFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_eclipse_dropins_dir, include: "*.jar")
   def outputDir = eclipseDropinsDir
-  from inputFiles
-  into outputDir
-  inputs.files inputFiles
-  //outputs.dir outputDir
-}
-
-task jalviewjs_eclipse_copy_plugins (type: Copy) {
-  dependsOn jalviewjs_eclipsePaths
-  def inputFiles = fileTree(jalviewjs_utils_dir+"/"+jalviewjs_eclipse_plugins_dir)
-  def outputDir = eclipsePluginsDir
-  from inputFiles
-  into outputDir
-  //inputs.files inputFiles
-  //outputs.dir outputDir
-}
 
-def tempEclipseWorkspace = ""
+  inputs.files inputFiles
+  inputFiles.each { file ->
+    outputs.file(outputDir+"/"+file.name)
+  }
 
-task jalviewjs_setTempEclipseWorkspace {
-  tempEclipseWorkspace = file(jalviewjs_eclipse_workspace)
-  if (!tempEclipseWorkspace.exists()) {
-    tempEclipseWorkspace = File.createTempDir()
-    //tempEclipseWorkspace.deleteOnExit()
+  doLast {
+    def outputFiles = []
+    inputFiles.each { file ->
+      copy {
+        from file
+        into outputDir
+      }
+    }
   }
 }
 
-task jalviewjs_eclipse_setup {
-  dependsOn jalviewjs_eclipse_copy_dropins
-  dependsOn jalviewjs_eclipse_copy_plugins
-  dependsOn jalviewjs_setTempEclipseWorkspace
+task jalviewjsEclipseSetup {
+  dependsOn jalviewjsEclipseCopyDropins
+  dependsOn jalviewjsSetEclipseWorkspace
 }
 
-task jalviewjs_createJ2sSettings(type: WriteProperties) {
+
+task jalviewjsCreateJ2sSettings(type: WriteProperties) {
+  dependsOn jalviewjsSitePath
   outputFile (jalviewDir+"/"+jalviewjs_j2s_settings)
   def props = project.properties.sort { it.key }
+  def siteDirProperty = "j2s.site.directory"
+  def setSiteDir = false
   props.each { prop, val ->
-       if (prop.startsWith("j2s.") && val != null) {
-               property(prop,val)
-       }
+    if (prop.startsWith("j2s.") && val != null) {
+      if (prop == siteDirProperty) {
+        if (!(val.startsWith("/") || val.startsWith("file://") )) {
+          val = jalviewjsSiteDir+"/"+val
+        }
+        setSiteDir = true
+      }
+      property(prop,val)
+    }
+    if (!setSiteDir) {
+      property(siteDirProperty,"${jalviewjsSiteDir}")
+    }
   }
   outputs.file(outputFile)
 }
 
-task jalviewjs_copyResources (type: Copy) {
-  from fileTree(dir: jalviewjs_resource_dir)
-  into jalviewjs_site_dir+"/"+jalviewjs_j2s_subdir
+task jalviewjsCopyResources (type: Copy) {
+  dependsOn jalviewjsSitePath
+  def inputFiles = fileTree(dir: jalviewjs_resource_dir)
+  def outputDir = jalviewjsSiteDir+"/"+jalviewjs_j2s_subdir
+
+  from inputFiles
+  into outputDir
+  def outputFiles = []
+  rename { filename ->
+    outputFiles += outputDir+"/"+filename
+    null
+  }
+  outputs.files outputFiles
+  inputs.files inputFiles
 }
 
-task jalviewjs_copySiteResources (type: Copy) {
-  from fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_site_resource_dir)
-  into jalviewjs_site_dir
+task jalviewjsCopySiteResources (type: Copy) {
+  dependsOn jalviewjsSitePath
+  def inputFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_site_resource_dir)
+  def outputDir = jalviewjsSiteDir
+
+  from inputFiles
+  into outputDir
+  def outputFiles = []
+  rename { filename ->
+    outputFiles += outputDir+"/"+filename
+    null
+  }
+  outputs.files outputFiles
+  inputs.files inputFiles
 }
 
-task cleanJalviewjsSite {
-  //delete jalviewjs_site_dir
+task cleanJalviewjs {
+  dependsOn jalviewjsSitePath
+  /*
+  delete jalviewDir+"/"+jalviewjsSiteDir
+  delete jalviewDir+"/"+eclipse_bin_dir
+  delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
+  delete jalviewDir+"/"+jalviewjs_j2s_settings
+  */
 }
 
 task jalviewjsProjectImport(type: Exec) {
   // work out how to do this!
-  //dependsOn eclipse
-  dependsOn jalviewjs_eclipsePaths
-  dependsOn jalviewjs_eclipse_setup
+  dependsOn eclipseProject
+  dependsOn eclipseClasspath
+  dependsOn eclipseJdt
+  dependsOn jalviewjsEclipsePaths
+  dependsOn jalviewjsEclipseSetup
   executable(eclipseBinary)
-  args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", tempEclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
+  args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
 
-  def tempdir = tempEclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
-  outputs.dir(tempdir)
+  def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
+  inputs.file(jalviewDir+"/.project")
+  outputs.dir(projdir)
+  outputs.upToDateWhen { file(projdir).exists() }
 }
 
+
+
+
+
+
+
+
 task jalviewjsTranspile(type: Exec) {
+  dependsOn jalviewjsCreateJ2sSettings 
   dependsOn jalviewjsProjectImport
-  dependsOn jalviewjs_eclipsePaths
+  dependsOn jalviewjsEclipsePaths
   executable(eclipseBinary)
-  args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", tempEclipseWorkspace, "-"+jalviewjs_eclipseBuildArg, eclipse_project_name ])
+  args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-"+jalviewjs_eclipseBuildArg, eclipse_project_name ])
+
+  def stdout
+  def stderr
+  doFirst {
+    stdout = new ByteArrayOutputStream()
+    stderr = new ByteArrayOutputStream()
+    standardOutput = new org.apache.tools.ant.util.TeeOutputStream(new FileOutputStream("${jalviewjsBuildDir}/${jalviewjs_j2s_stdout}"), stdout);
+    errorOutput = new org.apache.tools.ant.util.TeeOutputStream(new FileOutputStream("${jalviewjsBuildDir}/${jalviewjs_j2s_stderr}"), stderr);
+  }
+  doLast {
+    if (stdout.toString().contains("Error processing ")) {
+      // j2s did not complete transpile
+      throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log files '${jalviewjsBuildDir}/${jalviewjs_j2s_stdout}' and '${jalviewjsBuildDir}/${jalviewjs_j2s_stderr}'\n")
+    }
+  }
+
+  inputs.dir(sourceDir)
+  outputs.dir(eclipse_bin_dir+"/main")
+  outputs.files(
+    fileTree(
+      dir: jalviewjsSiteDir+"/"+jalviewjs_j2s_subdir,
+      includes: [ "**/*.js" ],
+      excludes: [
+        //jalviewjsSiteDir+"/"+jalviewjs_j2s_subdir+"/intervalstore/**",
+        //jalviewjsSiteDir+"/"+jalviewjs_j2s_subdir+"/org/json/**",
+        "intervalstore/**",
+        "org/json/**",
+      ]
+    ).files
+  )
+  outputs.file(jalviewjsSiteDir+jalviewjs_server_resource)
+
 }
 
+
+
+
+
+
+jalviewjsUnzipFiles.mustRunAfter jalviewjsTranspile
+jalviewjsTranspile.mustRunAfter jalviewjsCopyResources
+jalviewjsTranspile.mustRunAfter jalviewjsCopySiteResources
+
 task jalviewjsBuildSite {
-  dependsOn jalviewjs_unzipFiles
-  dependsOn jalviewjs_copyResources
-  dependsOn jalviewjs_copySiteResources
+  dependsOn jalviewjsSitePath
+  dependsOn jalviewjsUnzipFiles
+  dependsOn jalviewjsCopyResources
+  dependsOn jalviewjsCopySiteResources
   dependsOn jalviewjsTranspile
 }
 
+task jalviewjsSiteTar(type: Tar) {
+  dependsOn jalviewjsBuildSite
+  def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
+  try {
+    archiveFileName = outputFilename
+  } catch (Exception e) {
+    archiveName = outputFilename
+  }
+
+  compression Compression.GZIP
+
+  from jalviewjsSiteDir
+  into jalviewjs_site_dir // this is inside the tar file
+
+  inputs.dir(jalviewjsSiteDir)
+}
+
+def jalviewjsServer = null
+task jalviewjsServerStart {
+  dependsOn jalviewjsSitePath
+  doLast {
+
+    if (jalviewjsServer != null) {
+      println("SERVER ALREADY RUNNING. Go to "+jalviewjsServer.getResourceUrl(jalviewjs_server_resource)+" . Run  gradle jalviewjsServerStop  to stop.")
+    } else {
+
+      SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory()
+      def port = Integer.valueOf(jalviewjs_server_port)
+      def start = port
+      def running = false
+      while(port < start+1000 && !running) {
+        try {
+          def doc_root = new File(jalviewDirAbsolutePath +"/"+ jalviewjsSiteDir)
+          jalviewjsServer = factory.start(doc_root, port)
+          running = true
+          println("SERVER STARTED with document root ${doc_root}.\nGo to "+jalviewjsServer.getResourceUrl(jalviewjs_server_resource)+" . Run  gradle --stop  to stop (kills all gradle daemons).")
+          //println("Ctrl-c to stop.");java.lang.Thread.sleep(Integer.valueOf(jalviewjs_server_wait)*1000);
+        } catch (Exception e) {
+          port++;
+        }
+      }
+
+    }
+
+  }
+
+}
+
+/* server persists in gradle daemon but reference is not accessible across builds
+task jalviewjsServerStop {
+  doLast {
+
+    if (jalviewjsServer != null) {
+
+      println("SERVER ON PORT "+jalviewjsServer.getPort()+" STOPPING. Run  gradle jalviewjsServerStart  to start again.")
+      jalviewjsServer.stop()
+
+    } else {
+      println("SERVER NOT RUNNING. Run  gradle jalviewjsServerStart  to start.")
+    }
+
+  }
+}
+*/
+
+task ideBuildSite {
+  dependsOn jalviewjsSitePath
+  dependsOn jalviewjsUnzipFiles
+  dependsOn jalviewjsCopyResources
+  dependsOn jalviewjsCopySiteResources
+  // see project.afterEvaluate
+  //dependsOn ideJalviewjsBuild
+}
+
+
+
+
 task jalviewjs {
-  dependsOn jalviewjs_createJ2sSettings 
   dependsOn jalviewjsBuildSite
 }
+
+
+project.afterEvaluate {
+
+  if (useIde) {
+    tasks.findByName('ideJalviewjsImport').dependsOn eclipseProject
+    tasks.findByName('ideJalviewjsImport').dependsOn eclipseClasspath
+    tasks.findByName('ideJalviewjsImport').dependsOn eclipseJdt
+    tasks.findByName('ideJalviewjsImport').dependsOn jalviewjsSetEclipseWorkspace
+
+    tasks.findByName('ideJalviewjsBuild').dependsOn tasks.findByName('ideJalviewjsImport')
+    tasks.findByName('ideJalviewjsBuild').dependsOn tasks.findByName('jalviewjsCreateJ2sSettings')
+
+    tasks.findByName('ide').dependsOn eclipseProject
+    tasks.findByName('ide').dependsOn eclipseClasspath
+    tasks.findByName('ide').dependsOn eclipseJdt
+
+    ideBuildSite.dependsOn tasks.findByName('ideJalviewjsBuild')
+  }
+
+}
+
+
+