JAL-3210 Improvements to how incremental build and gradle artefacts play with j2s
[jalview.git] / build.gradle
index fc183a5..9aef0ff 100644 (file)
@@ -2,17 +2,81 @@ 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.eclipse.osgi.*
+import com.diffplug.gradle.GoomphCacheLocations
+
+/*
+buildscript {
+  repositories {
+    repos
+    mavenCentral()
+    jcenter()
+  }
+  dependencies {
+    //eclipseDeps.each { compile "p2:${it}:+" }
+    //classpath 'org.eclipse.platform:org.eclipse.osgi:3.15.0'
+    //compile group: 'org.eclipse.platform', name: 'org.eclipse.osgi', version: '3.15.0'
+    //classpath 'biz.aQute.bnd:biz.aQute.bnd.gradle:4.4.0'
+  }
+}
+*/
 
 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.p2.asmaven' version '3.18.1'
+
+  //id 'org.eclipse.osgi' version '3.15.0'
+  //id 'osgi'
+}
+
+
+/*
+def eclipseDeps = [
+    // The dependencies we actually use
+    'org.eclipse.jdt.core',
+    'org.eclipse.text',
+
+    // Their transitives
+    'org.eclipse.core.contenttype',
+    'org.eclipse.core.jobs',
+    'org.eclipse.core.runtime',
+    'org.eclipse.core.resources',
+    'org.eclipse.equinox.common',
+    'org.eclipse.equinox.preferences',
+    //'org.eclipse.osgi'
+]
+*/
+
+/*
+p2AsMaven {
+  group 'p2', {
+    repoEclipse goomph_eclipse_version
+    eclipseDeps.each { p2.addIU(it) }
+    eclipseDeps.each { p2.addIU(it + '.source') }
+  }
+}
+*/
+
+
+/*
+dependencies {
+  //eclipseDeps.each { compile "p2:${it}:+" }
+  //implementation 'org.eclipse.platform:org.eclipse.osgi:3.15.0'
+  //compile 'org.eclipse.platform:org.eclipse.osgi:3.15.0'
+  //classpath 'biz.aQute.bnd:biz.aQute.bnd.gradle:4.4.0'
 }
+*/
+
+
 
 repositories {
   jcenter()
   mavenCentral()
-  mavenLocal()
   flatDir {
     dirs gradlePluginsDir
   }
@@ -34,6 +98,8 @@ ext {
 
   gitHash = ""
   gitBranch = ""
+
+  jalviewjsServer = ""
 }
 
 def JAVA_INTEGER_VERSION
@@ -135,9 +201,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<>();
 
@@ -212,7 +284,121 @@ clean {
 }
 */
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+GoomphCacheLocations.override_workspaces = file(jalviewDirAbsolutePath+"/"+goomph_workspace)
+oomphIde {
+  repoEclipse goomph_eclipse_version
+  jdt {
+    /*
+    installedJre {
+      //markDefault = true
+      //executionEnvironments = [ eclipse.jdt.javaRuntimeName ]
+    }
+    */
+    //compilerComplianceLevel( JAVA_INTEGER_VERSION )
+  }
+  //repo 'http://download.eclipse.org/buildship/updates/e45/milestones/3.x/'
+  repo goomph_repo_buildship
+       feature goomph_feature_buildship
+}
+
+equinoxLaunch {
+  headlessAppSetup {
+
+    launchTask 'ideJalviewjsBuild', {
+      //it.args = ["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", tempEclipseWorkspace, "-"+jalviewjs_eclipseBuildArg, eclipse_project_name ]
+      it.args = ["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-"+jalviewjs_eclipseBuildArg, eclipse_project_name ]
+    }
+  }
+}
+
+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
+
+}
+
+ide.dependsOn eclipseProject
+ide.dependsOn eclipseClasspath
+ide.dependsOn eclipseJdt
+ide.dependsOn ideCopyDropins
+ideJalviewjsBuild.dependsOn ideSetupWorkspace
+ideJalviewjsBuild.dependsOn ideCopyDropins
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+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
+  }
+}
+
+def tempEclipseWorkspace
+task jalviewjsSetTempEclipseWorkspace {
+  tempEclipseWorkspace = file(jalviewjs_eclipse_workspace)
+  if (!tempEclipseWorkspace.exists()) {
+    tempEclipseWorkspace = file("${buildDir}/tmp/eclipse-workspace")
+    //tempEclipseWorkspace.deleteOnExit()
+  }
+  println("ECLIPSE WORKSPACE: "+tempEclipseWorkspace.getPath())
+}
+
 task jalviewjsUnzipFiles {
+  dependsOn jalviewjsSitePath
+
   def zipFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_libjs_dir).include("*.zip")
   zipFiles += jalviewjs_utils_dir+"/"+jalviewjs_swingjs_zip
 
@@ -220,31 +406,32 @@ task jalviewjsUnzipFiles {
     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
+def eclipseBinary
 task jalviewjsEclipsePaths {
+  def eclipseRoot = jalviewjs_eclipse_root
+  if (eclipseRoot.startsWith("~")) {
+    eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
+  }
        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"
+    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 = jalviewjs_eclipse_root+"/dropins"
-               eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
-               eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
+               eclipseDropinsDir = eclipseRoot+"/dropins"
+               eclipseBinary = eclipseRoot+"/eclipse"
        }
 }
 
@@ -264,54 +451,39 @@ task jalviewjsEclipseCopyDropins (type: Copy) {
   inputs.files inputFiles
 }
 
-task jalviewjsEclipseCopyPlugins (type: Copy) {
-  dependsOn jalviewjsEclipsePaths
-  def inputFiles = fileTree(jalviewjs_utils_dir+"/"+jalviewjs_eclipse_plugins_dir)
-  def outputDir = eclipsePluginsDir
-
-  from inputFiles
-  into outputDir
-  def outputFiles = []
-  rename { filename ->
-    outputFiles += outputDir+"/"+filename
-    null
-  }
-  outputs.files outputFiles
-  inputs.files inputFiles
-}
-
-def tempEclipseWorkspace = ""
-
-task jalviewjsSetTempEclipseWorkspace {
-  tempEclipseWorkspace = file(jalviewjs_eclipse_workspace)
-  if (!tempEclipseWorkspace.exists()) {
-    tempEclipseWorkspace = File.createTempDir()
-    print("ECLIPSE WORKSPACE: "+tempEclipseWorkspace.getPath())
-    //tempEclipseWorkspace.deleteOnExit()
-  }
-}
-
 task jalviewjsEclipseSetup {
   dependsOn jalviewjsEclipseCopyDropins
-  dependsOn jalviewjsEclipseCopyPlugins
   dependsOn jalviewjsSetTempEclipseWorkspace
 }
 
 
 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) {
+      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 jalviewjsCopyResources (type: Copy) {
+  dependsOn jalviewjsSitePath
   def inputFiles = fileTree(dir: jalviewjs_resource_dir)
-  def outputDir = jalviewjs_site_dir+"/"+jalviewjs_j2s_subdir
+  def outputDir = jalviewjsSiteDir+"/"+jalviewjs_j2s_subdir
 
   from inputFiles
   into outputDir
@@ -325,8 +497,9 @@ task jalviewjsCopyResources (type: Copy) {
 }
 
 task jalviewjsCopySiteResources (type: Copy) {
+  dependsOn jalviewjsSitePath
   def inputFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_site_resource_dir)
-  def outputDir = jalviewjs_site_dir
+  def outputDir = jalviewjsSiteDir
 
   from inputFiles
   into outputDir
@@ -339,8 +512,14 @@ task jalviewjsCopySiteResources (type: Copy) {
   inputs.files inputFiles
 }
 
-task cleanJalviewjsSite {
-  delete jalviewjs_site_dir
+task cleanJalviewjs {
+  dependsOn jalviewjsSitePath
+  /*
+  delete jalviewDir+"/"+jalviewjsSiteDir
+  delete jalviewDir+"/"+eclipse_bin_dir
+  delete file(tempEclipseWorkspace.getAbsolutePath()+"/.metadata")
+  delete jalviewDir+"/"+jalviewjs_j2s_settings
+  */
 }
 
 task jalviewjsProjectImport(type: Exec) {
@@ -353,25 +532,138 @@ task jalviewjsProjectImport(type: Exec) {
   executable(eclipseBinary)
   args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", tempEclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
 
-  def tempdir = tempEclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
-  outputs.dir(tempdir)
+  def projdir = tempEclipseWorkspace.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 jalviewjsEclipsePaths
   executable(eclipseBinary)
   args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", tempEclipseWorkspace, "-"+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 TaskExecutionException("Error during transpilation:\n${stderr}\n")
+    }
+  }
+
+  inputs.dir(sourceDir)
+  outputs.dir(eclipse_bin_dir+"/main")
+  outputs.dir(jalviewjsSiteDir+"/"+jalviewjs_j2s_subdir)
+  outputs.file(jalviewjsSiteDir+jalviewjs_server_resource)
+  outputs.upToDateWhen { file(jalviewjsSiteDir+jalviewjs_server_resource).exists() }
+
 }
 
+
+
+
+
+
+
+
 task jalviewjsBuildSite {
+  dependsOn jalviewjsSitePath
   dependsOn jalviewjsUnzipFiles
   dependsOn jalviewjsCopyResources
   dependsOn jalviewjsCopySiteResources
   dependsOn jalviewjsTranspile
 }
 
+task jalviewjsSiteTar(type: Tar) {
+  dependsOn jalviewjsBuildSite
+  def outputFilename = "site.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)
+}
+
 task jalviewjs {
-  dependsOn jalviewjsCreateJ2sSettings 
   dependsOn jalviewjsBuildSite
 }
+
+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 jalviewjsServerStop  to stop.")
+          //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.")
+    }
+
+  }
+}
+*/
+
+project.afterEvaluate {
+  tasks.findByName('ideJalviewjsBuild').dependsOn eclipseProject
+  tasks.findByName('ideJalviewjsBuild').dependsOn eclipseClasspath
+  tasks.findByName('ideJalviewjsBuild').dependsOn eclipseJdt
+}
+
+
+