JAL-3210 project name explicitly set. updated README_GRADLE_JALVIEWJS...md file....
[jalview.git] / build.gradle
index 9c57524..d575f18 100644 (file)
@@ -1,15 +1,13 @@
 import org.apache.tools.ant.filters.ReplaceTokens
-//import org.apache.tools.ant.filters.ReplaceRegexp
 import org.gradle.internal.os.OperatingSystem
-import org.gradle.plugins.ide.eclipse.model.*
-
+import org.gradle.plugins.ide.eclipse.model.Output
+import org.gradle.plugins.ide.eclipse.model.Library
 
 import groovy.transform.ExternalizeMethods
 
 buildscript {
   dependencies {
     classpath 'org.openclover:clover:4.3.1'
-    classpath 'org.apache.commons:commons-compress:1.18'
   }
 }
 
@@ -30,6 +28,10 @@ repositories {
   }
 }
 
+dependencies {
+  compile 'org.apache.commons:commons-compress:1.18'
+}
+
 mainClassName = launcherClass
 def cloverInstrDir = file("$buildDir/$cloverSourcesInstrDir")
 def classes = "$jalviewDir/$classesDir"
@@ -56,10 +58,14 @@ ext {
   reportRsyncCmd = false
   buildDist = true
   buildProperties = buildPropertiesFile
+  getdownLauncher = jalviewDir + '/' + getdown_lib_dir + '/' + getdown_launcher
   switch (CHANNEL) {
 
     case "BUILD":
     // TODO: get bamboo build artifact URL for getdown artifacts
+    getdown_channel_base = bamboo_channelbase
+    getdown_channel_name = bamboo_planKey + '/'+JAVA_VERSION
+    getdown_app_base = bamboo_channelbase + '/'+ bamboo_planKey + bamboo_getdown_channel_suffix + '/'+JAVA_VERSION
     getdown_app_dir = getdown_app_dir_alt
     buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
     break
@@ -103,6 +109,7 @@ ext {
       buildDist = false
     }
     reportRsyncCommand = true
+    getdownLauncher = jalviewDir + '/' + getdown_lib_dir + '/' + getdown_launcher_local
     break
 
     case "DEVELOP":
@@ -136,6 +143,7 @@ ext {
     getdown_app_base = file(getdownWebsiteDir).toURI().toString()
     getdown_app_dir = getdown_app_dir_alt
     buildProperties = jalviewDir + "/" + classesDir +"/" + buildPropertiesFile
+    getdownLauncher = jalviewDir + '/' + getdown_lib_dir + '/' + getdown_launcher_local
     break
 
     default: // something wrong specified
@@ -150,7 +158,6 @@ ext {
   //getdownJ11libDir = getdownWebsiteDir + '/' + getdown_j11lib_dir
   getdownResourceDir = getdownWebsiteDir + '/' + getdown_resource_dir
   getdownInstallDir = getdownWebsiteDir + '/' + getdown_install_dir
-  getdownLauncher = jalviewDir + '/' + getdown_launcher
   getdownFilesDir = jalviewDir + '/' + getdown_files_dir + '/' + JAVA_VERSION + '/'
   getdownFilesInstallDir = getdownFilesDir+"/"+getdown_install_dir
   /* compile without modules -- using classpath libraries
@@ -159,6 +166,8 @@ ext {
   */
   gitHash = ""
   gitBranch = ""
+
+  jalviewjsServer = ""
 }
 
 def JAVA_INTEGER_VERSION
@@ -236,6 +245,7 @@ sourceSets {
 
     runtimeClasspath = compileClasspath
   }
+
   clover {
     java {
       srcDirs = [ cloverInstrDir ]
@@ -272,8 +282,9 @@ sourceSets {
       compileClasspath += files(sourceSets.main.java.outputDir)
     }
 
-    compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"])
     compileClasspath += fileTree(dir: "$jalviewDir/$libDir", include: ["*.jar"])
+    compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir/testnglibs", include: ["**/*.jar"])
+    compileClasspath += fileTree(dir: "$jalviewDir/$utilsDir/testlibs", include: ["**/*.jar"])
 
     runtimeClasspath = compileClasspath
   }
@@ -294,7 +305,7 @@ configurations {
 
 eclipse {
   project {
-    name = "Jalview with gradle build"
+    name = eclipse_project_name
 
     natures 'org.eclipse.jdt.core.javanature',
     'org.eclipse.jdt.groovy.core.groovyNature',
@@ -307,83 +318,88 @@ eclipse {
   classpath {
     //defaultOutputDir = sourceSets.main.java.outputDir
     def removeThese = []
-    configurations.each{ if (it.isCanBeResolved()) {
-      removeThese += it
+    configurations.each{
+      if (it.isCanBeResolved()) {
+        removeThese += it
+      }
     }
-  }
 
-  minusConfigurations += removeThese
-  plusConfigurations = [ ]
-  file {
-
-    whenMerged { cp ->
-      def removeTheseToo = []
-      HashMap<String, Boolean> addedSrcPath = new HashMap<>();
-      cp.entries.each { entry ->
-        if (entry.kind == 'src') {
-          if (addedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) {
-            removeTheseToo += entry
-          } else {
-            addedSrcPath.putAt(entry.path, true)
+    minusConfigurations += removeThese
+    plusConfigurations = [ ]
+    file {
+
+      whenMerged { cp ->
+        def removeTheseToo = []
+        HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
+        cp.entries.each { entry ->
+          if (entry.kind == 'src') {
+            if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == "src" || entry.path == "test")) {
+              removeTheseToo += entry
+            } else {
+              alreadyAddedSrcPath.putAt(entry.path, true)
+            }
           }
         }
-      }
-      cp.entries.removeAll(removeTheseToo)
-
-      print ("CP="+cp.inspect())
+        cp.entries.removeAll(removeTheseToo)
 
-      cp.entries += new Output("bin/main")
-      cp.entries += new Library(fileReference(helpParentDir))
-      cp.entries += new Library(fileReference(resourceDir))
-
-      HashMap<String, Boolean> addedLibPath = new HashMap<>();
-
-      // changing from sourcesets.main.classpath to specific Java version lib
-      //sourceSets.main.compileClasspath.each{
-      fileTree("$jalviewDir/$libDistDir").include("**/*.jar").include("*.jar").each {
-        //don't want to add outputDir as eclipse is using its own output dir in bin/main
-        if (it.isDirectory() || ! it.exists()) {
-          // don't add dirs to classpath
-          return
+        if (file(eclipse_bin_dir+"/main").isDirectory()) {
+          cp.entries += new Output(eclipse_bin_dir+"/main")
         }
-        def itPath = it.toString()
-        if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
-          itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
+        if (file(helpParentDir).isDirectory()) {
+          cp.entries += new Library(fileReference(helpParentDir))
         }
-        if (addedLibPath.get(itPath)) {
-          //println("Not adding duplicate entry "+itPath)
-        } else {
-          //println("Adding entry "+itPath)
-          cp.entries += new Library(fileReference(itPath))
-          addedLibPath.put(itPath, true)
+        if (file(resourceDir).isDirectory()) {
+          cp.entries += new Library(fileReference(resourceDir))
         }
-      }
 
-      // changing from sourcesets.main.classpath to specific Java version lib
-      //sourceSets.test.compileClasspath.each{
-      fileTree(dir: "$jalviewDir/$utilsDir", include: ["**/*.jar"]).each {
-        //if ((it.isDirectory() || ! it.exists()) && ! (it.equals(sourceSets.main.java.outputDir))) {
-        //no longer want to add outputDir as eclipse is using its own output dir in bin/main
-        if (it.isDirectory() || ! it.exists()) {
-          // don't add dirs to classpath
-          return false // groovy "break" in .each loop
-        }
-        def itPath = it.toString()
-        if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
-          itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
-        }
-        if (addedLibPath.get(itPath)) {
-          // don't duplicate
-        } else {
-          def lib = new Library(fileReference(itPath))
-          // this doesn't work... yet.  Adding test=true attribute using withXml below
-          //def attrs = new Node(null, 'attributes', ["test":"true"])
-          //lib.appendNode(attrs) //
-          cp.entries += lib
-          addedLibPath.put(itPath, true)
+        HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
+
+        sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.each {
+          //don't want to add outputDir as eclipse is using its own output dir in bin/main
+          if (it.isDirectory() || ! it.exists()) {
+            // don't add dirs to classpath
+            return
+          }
+          def itPath = it.toString()
+          if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
+            // make relative path
+            itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
+          }
+          if (alreadyAddedLibPath.get(itPath)) {
+            //println("Not adding duplicate entry "+itPath)
+          } else {
+            //println("Adding entry "+itPath)
+            cp.entries += new Library(fileReference(itPath))
+            alreadyAddedLibPath.put(itPath, true)
+          }
         }
+
+        //fileTree(dir: "$jalviewDir/$utilsDir", include: ["test*/*.jar"]).each {
+        sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.each {
+          //no longer want to add outputDir as eclipse is using its own output dir in bin/main
+          if (it.isDirectory() || ! it.exists()) {
+            // don't add dirs to classpath
+            return false // groovy "break" in .each closure
+          }
+          def itPath = it.toString()
+          if (itPath.startsWith(jalviewDirAbsolutePath+"/")) {
+            itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
+          }
+          if (alreadyAddedLibPath.get(itPath)) {
+            // don't duplicate
+          } else {
+            def lib = new Library(fileReference(itPath))
+            /* this doesn't work... yet.  Adding test=true attribute using withXml below
+            def attrs = new Node(null, 'attributes')
+            attrs.appendNode('attribute', ["name":"test","value":"true"])
+            lib.appendNode(attrs)
+            /**/
+            cp.entries += lib
+            alreadyAddedLibPath.put(itPath, true)
+          }
         }
-      }
+
+      } // whenMerged
 
       // withXml changes ignored by buildship, these add the "test=true" attribute
       withXml {
@@ -415,9 +431,12 @@ eclipse {
           }
         }
       } // withXML
+
+
     } // file
 
     containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
+
   } // classpath
 
   jdt {
@@ -426,6 +445,7 @@ eclipse {
     targetCompatibility = compile_target_compatibility
     javaRuntimeName = eclipse_java_runtime_name
 
+    // add in jalview project specific properties/preferences into eclipse core preferences
     file {
       withProperties { props ->
         def jalview_prefs = new Properties()
@@ -439,10 +459,9 @@ eclipse {
         }
       }
     }
-  }
 
-  //synchronizationTasks eclipseClasspath
-  //autoBuildTasks eclipseClasspath
+  } // jdt
+
 }
 
 task cloverInstr() {
@@ -636,7 +655,7 @@ task copyHelp(type: Copy) {
     exclude '**/*.gif'
       exclude '**/*.jpg'
       exclude '**/*.png'
-      filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION])
+      filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION,'Year-Rel': getDate("yyyy")])
   }
   from(inputDir) {
     include '**/*.gif'
@@ -962,6 +981,9 @@ task getdownWebsite() {
 
     copy {
       from getdownLauncher
+      if (file(getdownLauncher).getName() != getdown_launcher) {
+        rename(file(getdownLauncher).getName(), getdown_launcher)
+      }
       into project.ext.getdownWebsiteDir
     }
 
@@ -970,6 +992,9 @@ task getdownWebsite() {
         from getdown_txt
         from getdownLauncher
         from getdownWebsiteDir+"/"+getdown_build_properties
+        if (file(getdownLauncher).getName() != getdown_launcher) {
+          rename(file(getdownLauncher).getName(), getdown_launcher)
+        }
         into getdownInstallDir
       }
 
@@ -984,6 +1009,9 @@ task getdownWebsite() {
       from launch_jvl
       from getdownLauncher
       from getdownWebsiteDir+"/"+getdown_build_properties
+      if (file(getdownLauncher).getName() != getdown_launcher) {
+        rename(file(getdownLauncher).getName(), getdown_launcher)
+      }
       into getdownFilesDir
     }
 
@@ -1004,7 +1032,9 @@ task getdownDigest(type: JavaExec) {
   group = "distribution"
   description = "Digest the getdown website folder"
   dependsOn getdownWebsite
-  classpath = files(jalviewDir + '/' + getdown_core, jalviewDir+'/'+getdown_launcher)
+  doFirst {
+    classpath = files(getdownWebsiteDir + '/' + getdown_launcher)
+  }
   main = "com.threerings.getdown.tools.Digester"
   args project.ext.getdownWebsiteDir
   inputs.dir(project.ext.getdownWebsiteDir)
@@ -1157,57 +1187,71 @@ clean {
 task sourceDist (type: Tar) {
   
   def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
-  archiveFileName = project.name + "_" + VERSION_UNDERSCORES + ".tar.gz"
+  def outputFileName = project.name + "_" + VERSION_UNDERSCORES + ".tar.gz"
+  // cater for buildship < 3.1 [3.0.1 is max version in eclipse 2018-09]
+  try {
+    archiveFileName = outputFileName
+  } catch (Exception e) {
+    archiveName = outputFileName
+  }
   
   compression Compression.GZIP
   
-  from jalviewDir
   into project.name
-   
-  exclude (".*")
-  exclude ("**/.*")
-  exclude ("*.class")
-  exclude ("**/*.class")
-  include (eclipse_extra_jdt_prefs_file)
-  include ("AUTHORS")
-  include ("CITATION")
-  include ("FEATURETODO")
-  include ("JAVA-11-README")
-  include ("FEATURETODO")
-  include ("LICENSE")
-  include ("README")
-  include ("RELEASE")
-  include ("THIRDPARTYLIBS")
-  include ("build.gradle")
-  include ("gradle.properties")
-  include ("$sourceDir/*.java")
-  include ("$sourceDir/**/*.java")
-  include ("$sourceDir/**/*.cdr")
-  include ("$j8libDir/**/*.jar")
-  include ("$j11libDir/**/*.jar")
-  include ("$resourceDir/**/*")
-  include ("$helpDir/**/*")
-  include ("$schemaDir/**/*")
-  include ("$utilsDir/**/*")
-  include ("$docDir/**/*")
-  include ("$examplesDir/**/*")
-  include ("getdown/**/*")
-  //include ("jalview-jalopy.xml")
-  //include ("JalviewApplet.jpx")
-  //include ("JalviewX.jpx")
-  //include ("nbbuild.xml")
-  //include ("nbproject/genfiles.properties")
-  //include ("nbproject/project.properties")
-  //include ("nbproject/project.xml")
-  
+
+  def EXCLUDE_FILES=["build/*","bin/*","test-output/","test-reports","tests","clover*/*"
+  ,".*"
+  ,"benchmarking/*"
+  ,"**/.*"
+  ,"*.class"
+  ,"**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales"
+  ,"*locales/**",
+  ,"utils/InstallAnywhere"] 
+  def PROCESS_FILES=[   "AUTHORS",
+  "CITATION",
+  "FEATURETODO",
+  "JAVA-11-README",
+  "FEATURETODO",
+  "LICENSE",
+  "**/README",
+  "RELEASE",
+  "THIRDPARTYLIBS","TESTNG",
+  "build.gradle",
+  "gradle.properties",
+  "**/*.java",
+  "**/*.html",
+  "**/*.xml",
+  "**/*.gradle",
+  "**/*.groovy",
+  "**/*.properties",
+  "**/*.perl",
+  "**/*.sh"]
+
+  from(jalviewDir) {
+    exclude (EXCLUDE_FILES)
+    include (PROCESS_FILES)
+    filter(ReplaceTokens, beginToken: '$$', endToken: '$$', tokens: ['Version-Rel': JALVIEW_VERSION,'Year-Rel': getDate("yyyy")])
+  }
+  from(jalviewDir) {
+    exclude (EXCLUDE_FILES)
+    exclude (PROCESS_FILES)
   exclude ("appletlib")
   exclude ("**/*locales")
   exclude ("*locales/**")
   exclude ("utils/InstallAnywhere")
-  exclude (getdown_files_dir)
+
+    exclude (getdown_files_dir)
   exclude (getdown_website_dir)
 
+  // exluding these as not using jars as modules yet
+  exclude ("$j11modDir/**/*.jar")
+}
+//  from (jalviewDir) {
+//    // explicit includes for stuff that seemed to not get included
+//    include(fileTree("test/**/*."))
+//    exclude(EXCLUDE_FILES)
+//    exclude(PROCESS_FILES)
+//  }
 }
 
 task helppages  {
@@ -1215,5 +1259,368 @@ task helppages  {
   dependsOn pubhtmlhelp
   
   inputs.dir("$classes/$helpDir")
-  outputs.file("build/distribution/help/helpTOC.html")
-}
\ No newline at end of file
+  outputs.dir("$helpOutputDir")
+}
+
+def jalviewjsBuildDir
+def jalviewjsSiteDir
+def jalviewjsTransferSiteDir
+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
+  }
+  jalviewjsTransferSiteDir = jalviewjsBuildDir + "/tmp/site"
+}
+
+def eclipseWorkspace
+task jalviewjsSetEclipseWorkspace {
+  def propKey = "jalviewjs_eclipse_workspace"
+  def propsFileName = "${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
+  def props = new Properties()
+  def eclipseWsDir
+  def propVal = null
+  if (project.hasProperty(propKey)) {
+    propVal = project.getProperty(propKey)
+    eclipseWsDir = propVal
+  }
+  if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && file(propsFileName).exists()) {
+    def ins = new FileInputStream(propsFileName)
+    props.load(ins)
+    ins.close()
+    if (props.getProperty(propKey, null) != null) {
+      eclipseWsDir = props.getProperty(propKey)
+    }
+  }
+
+  if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
+    def tempDir = File.createTempDir()
+    eclipseWsDir = tempDir.getAbsolutePath()
+    props.setProperty(propKey, eclipseWsDir)
+    def propsFile = file(propsFileName)
+    propsFile.parentFile.mkdirs()
+    propsFile.createNewFile() // doesn't affect existing file
+    def outs = new FileOutputStream(propsFile, false)
+    props.store(outs, null)
+    outs.close()
+  }
+
+  eclipseWorkspace = file(eclipseWsDir)
+    
+  println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
+
+  inputs.property(propKey, propVal)
+  outputs.file(propsFileName)
+}
+
+
+task jalviewjsUnzipFiles {
+  dependsOn jalviewjsSitePath
+
+  def zipFiles = fileTree(dir: jalviewjs_utils_dir+"/"+jalviewjs_libjs_dir).include("*.zip")
+  zipFiles += jalviewjs_utils_dir+"/"+jalviewjs_swingjs_zip
+
+  doLast {
+    zipFiles.each { file_zip -> 
+      copy {
+        from zipTree(file_zip)
+        into jalviewjsSiteDir
+      }
+    }
+  }
+
+  inputs.files zipFiles
+  outputs.dir jalviewjsSiteDir
+}
+
+def eclipseDropinsDir
+def eclipseBinary
+def eclipseVersion
+def fromDropinsDir
+task jalviewjsEclipsePaths {
+  def eclipseRoot
+  def eclipseProduct
+  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"
+    eclipseProduct = eclipseRoot+"/Contents/Eclipse/.eclipseproduct"
+  } else if (OperatingSystem.current().isWindows()) { // check these paths!!
+    if (file(eclipseRoot+"/eclipse").isDirectory() && file(eclipseRoot+"/eclipse/.eclipseproduct").exists()) {
+      eclipseRoot += "/eclipse"
+    }
+    eclipseDropinsDir = eclipseRoot+"/dropins"
+    eclipseBinary = eclipseRoot+"/eclipse"
+    eclipseProduct = eclipseRoot+"/.eclipseproduct"
+  } else { // linux or unix
+    if (file(eclipseRoot+"/eclipse").isDirectory() && file(eclipseRoot+"/eclipse/.eclipseproduct").exists()) {
+      eclipseRoot += "/eclipse"
+    }
+    eclipseDropinsDir = eclipseRoot+"/dropins"
+    eclipseBinary = eclipseRoot+"/eclipse"
+    eclipseProduct = eclipseRoot+"/.eclipseproduct"
+  }
+
+  def fis = new FileInputStream(eclipseProduct)
+  def props = new Properties()
+  props.load(fis)
+  eclipseVersion = props.getProperty("version")
+  fis.close()
+  println("ECLIPSE_VERSION=${eclipseVersion}")
+  String[] v = eclipseVersion.split("\\.")
+  def v0 = Integer.valueOf(v[0])
+  def v1 = Integer.valueOf(v[1])
+  if (v0 < 4 || ( v0 == 4 && v1 < 13 )) {
+    fromDropinsDir = "eclipse/dropins_4.12"
+  } else {
+    fromDropinsDir = "eclipse/dropins_4.13"
+  } 
+}
+
+task jalviewjsEclipseCopyDropins {
+  dependsOn jalviewjsEclipsePaths
+  def inputFiles = fileTree(dir: jalviewjs_utils_dir+"/"+fromDropinsDir, include: "*.jar")
+  def outputDir = eclipseDropinsDir
+
+  inputs.files inputFiles
+  inputFiles.each { file ->
+    outputs.file(outputDir+"/"+file.name)
+  }
+
+  doLast {
+    def outputFiles = []
+    inputFiles.each { file ->
+      copy {
+        from file
+        into outputDir
+      }
+    }
+  }
+}
+
+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 = jalviewjsTransferSiteDir+"/"+val
+        }
+        setSiteDir = true
+      }
+      property(prop,val)
+    }
+    if (!setSiteDir) {
+      property(siteDirProperty,jalviewjsTransferSiteDir)
+    }
+  }
+  outputs.file(outputFile)
+}
+
+task jalviewjsEclipseSetup {
+  dependsOn jalviewjsEclipseCopyDropins
+  dependsOn jalviewjsSetEclipseWorkspace
+  dependsOn jalviewjsCreateJ2sSettings
+}
+
+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 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 cleanJalviewjs {
+  //delete jalviewjsBuildDir
+  //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 eclipseProject
+  dependsOn eclipseClasspath
+  dependsOn eclipseJdt
+  dependsOn jalviewjsEclipsePaths
+  dependsOn jalviewjsEclipseSetup
+  executable(eclipseBinary)
+  args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
+
+  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 jalviewjsEclipseSetup 
+  dependsOn jalviewjsProjectImport
+  dependsOn jalviewjsEclipsePaths
+  executable(eclipseBinary)
+  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()
+
+    def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_stdout}"
+    def logOutFile = file(logOutFileName)
+    logOutFile.createNewFile()
+    def logOutFOS = new FileOutputStream(logOutFile, false)
+    //def logErrFileName = "${jalviewjsBuildDir}/${jalviewjs_j2s_stderr}"
+    //def logErrFile = file(logFileName)
+    //logErrFile.createNewFile()
+    //def logErrFOS = new FileErrputStream(logErrFile, false)
+    // combine stdout and stderr
+    def logErrFOS = logOutFOS
+    if (jalviewjs_j2s_to_console.equals("true")) {
+      standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
+        new org.apache.tools.ant.util.TeeOutputStream(
+          logOutFOS,
+          stdout),
+        standardOutput)
+      errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
+        new org.apache.tools.ant.util.TeeOutputStream(
+          logErrFOS,
+          stderr),
+        errorOutput)
+    } else {
+      standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
+        logOutFOS,
+        stdout)
+      errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
+        logErrFOS,
+        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 file '${jalviewjsBuildDir}/${jalviewjs_j2s_stdout}'")
+    }
+  }
+
+  inputs.dir(sourceDir)
+  outputs.dir(eclipse_bin_dir+"/main")
+  outputs.dir(jalviewjsTransferSiteDir)
+
+}
+
+task jalviewjsCopyTransferSite(type: Copy) {
+  dependsOn jalviewjsTranspile
+  from jalviewjsTransferSiteDir
+  into jalviewjsSiteDir
+}
+
+jalviewjsUnzipFiles.mustRunAfter jalviewjsCopyTransferSite
+jalviewjsCopyResources.mustRunAfter jalviewjsCopyTransferSite
+jalviewjsCopySiteResources.mustRunAfter jalviewjsCopyTransferSite
+
+task jalviewjsPrepareSite {
+  group "JalviewJS"
+  description "Prepares the website folder including unzipping files and copying resources"
+  dependsOn jalviewjsSitePath
+  dependsOn jalviewjsUnzipFiles
+  dependsOn jalviewjsCopyResources
+  dependsOn jalviewjsCopySiteResources
+}
+
+task jalviewjsBuildSite {
+  group "JalviewJS"
+  description "Builds the whole website including transpiled code"
+  dependsOn jalviewjsCopyTransferSite
+  dependsOn jalviewjsPrepareSite
+}
+
+task jalviewjsSiteTar(type: Tar) {
+  group "JalviewJS"
+  description "Creates a tar.gz file for the website"
+  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)
+}
+
+task jalviewjsServer {
+  group "JalviewJS"
+  description "Starts a webserver on localhost to test the website"
+  dependsOn jalviewjsSitePath
+  doLast {
+
+    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}.")
+        println("Go to "+jalviewjsServer.getResourceUrl(jalviewjs_server_resource)+" . Run  gradle --stop  to stop (kills all gradle daemons).")
+        println("For debug: "+jalviewjsServer.getResourceUrl(jalviewjs_server_resource)+"?j2sdebug")
+      } catch (Exception e) {
+        port++;
+      }
+    }
+
+  }
+
+}
+
+task jalviewjs {
+  group "JalviewJS"
+  description "Build the site"
+  dependsOn jalviewjsBuildSite
+}
+
+