1 /* Convention for properties. Read from gradle.properties, use lower_case_underlines for property names.
2 * For properties set within build.gradle, use camelCaseNoSpace.
4 import org.apache.tools.ant.filters.ReplaceTokens
5 import org.gradle.internal.os.OperatingSystem
6 import org.gradle.plugins.ide.internal.generator.PropertiesPersistableConfigurationObject
7 import org.gradle.api.internal.PropertiesTransformer
8 import org.gradle.util.ConfigureUtil
9 import org.gradle.plugins.ide.eclipse.model.Output
10 import org.gradle.plugins.ide.eclipse.model.Library
11 import java.security.MessageDigest
12 import groovy.transform.ExternalizeMethods
13 import groovy.util.XmlParser
14 import groovy.xml.XmlUtil
15 import com.vladsch.flexmark.util.ast.Node
16 import com.vladsch.flexmark.html.HtmlRenderer
17 import com.vladsch.flexmark.parser.Parser
18 import com.vladsch.flexmark.util.data.MutableDataSet
19 import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension
20 import com.vladsch.flexmark.ext.tables.TablesExtension
21 import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension
22 import com.vladsch.flexmark.ext.autolink.AutolinkExtension
23 import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension
24 import com.vladsch.flexmark.ext.toc.TocExtension
32 classpath "com.vladsch.flexmark:flexmark-all:0.62.0"
41 id "com.diffplug.gradle.spotless" version "3.28.0"
42 id 'com.github.johnrengelman.shadow' version '4.0.3'
43 id 'com.install4j.gradle' version '8.0.4'
44 id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree
45 id 'com.palantir.git-version' version '0.12.3'
55 // in ext the values are cast to Object. Ensure string values are cast as String (and not GStringImpl) for later use
56 def string(Object o) {
57 return o == null ? "" : o.toString()
60 def overrideProperties(String propsFileName, boolean output = false) {
61 if (propsFileName == null) {
64 def propsFile = file(propsFileName)
65 if (propsFile != null && propsFile.exists()) {
66 println("Using properties from file '${propsFileName}'")
68 def p = new Properties()
69 def localPropsFIS = new FileInputStream(propsFile)
75 if (project.hasProperty(key)) {
76 oldval = project.findProperty(key)
77 project.setProperty(key, val)
79 println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'")
82 ext.setProperty(key, val)
84 println("Setting ext property '${key}' with ${file(propsFile).getName()}s value '${val}'")
88 } catch (Exception e) {
89 println("Exception reading local.properties")
96 jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
97 jalviewDirRelativePath = jalviewDir
99 getdownChannelName = CHANNEL.toLowerCase()
100 // default to "default". Currently only has different cosmetics for "develop", "release", "default"
101 propertiesChannelName = ["develop", "release", "test-release"].contains(getdownChannelName) ? getdownChannelName : "default"
102 // Import channel_properties
103 channelDir = string("${jalviewDir}/${channel_properties_dir}/${propertiesChannelName}")
104 channelGradleProperties = string("${channelDir}/channel_gradle.properties")
105 overrideProperties(channelGradleProperties, false)
106 // local build environment properties
107 // can be "projectDir/local.properties"
108 overrideProperties("${projectDir}/local.properties", true)
109 // or "../projectDir_local.properties"
110 overrideProperties(projectDir.getParent() + "/" + projectDir.getName() + "_local.properties", true)
113 // Import releaseProps from the RELEASE file
114 // or a file specified via JALVIEW_RELEASE_FILE if defined
115 // Expect jalview.version and target release branch in jalview.release
116 def releaseProps = new Properties();
117 def releasePropFile = findProperty("JALVIEW_RELEASE_FILE");
118 def defaultReleasePropFile = "${jalviewDirAbsolutePath}/RELEASE";
120 (new File(releasePropFile!=null ? releasePropFile : defaultReleasePropFile)).withInputStream {
121 releaseProps.load(it)
123 } catch (Exception fileLoadError) {
124 throw new Error("Couldn't load release properties file "+(releasePropFile==null ? defaultReleasePropFile : "from custom location: releasePropFile"),fileLoadError);
127 // Set JALVIEW_VERSION if it is not already set
128 if (findProperty("JALVIEW_VERSION")==null || "".equals(JALVIEW_VERSION)) {
129 JALVIEW_VERSION = releaseProps.get("jalview.version")
132 // this property set when running Eclipse headlessly
133 j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild")
134 // this property set by Eclipse
135 eclipseApplicationProperty = string("eclipse.application")
136 // CHECK IF RUNNING FROM WITHIN ECLIPSE
137 def eclipseApplicationPropertyVal = System.properties[eclipseApplicationProperty]
138 IN_ECLIPSE = eclipseApplicationPropertyVal != null && eclipseApplicationPropertyVal.startsWith("org.eclipse.ui.")
139 // BUT WITHOUT THE HEADLESS BUILD PROPERTY SET
140 if (System.properties[j2sHeadlessBuildProperty].equals("true")) {
141 println("Setting IN_ECLIPSE to ${IN_ECLIPSE} as System.properties['${j2sHeadlessBuildProperty}'] == '${System.properties[j2sHeadlessBuildProperty]}'")
145 println("WITHIN ECLIPSE IDE")
147 println("HEADLESS BUILD")
150 J2S_ENABLED = (project.hasProperty('j2s.compiler.status') && project['j2s.compiler.status'] != null && project['j2s.compiler.status'] == "enable")
152 println("J2S ENABLED")
155 System.properties.sort { it.key }.each {
156 key, val -> println("SYSTEM PROPERTY ${key}='${val}'")
159 if (false && IN_ECLIPSE) {
160 jalviewDir = jalviewDirAbsolutePath
165 bareSourceDir = string(source_dir)
166 sourceDir = string("${jalviewDir}/${bareSourceDir}")
167 resourceDir = string("${jalviewDir}/${resource_dir}")
168 bareTestSourceDir = string(test_source_dir)
169 testDir = string("${jalviewDir}/${bareTestSourceDir}")
171 classesDir = string("${jalviewDir}/${classes_dir}")
174 useClover = clover.equals("true")
175 cloverBuildDir = "${buildDir}/clover"
176 cloverInstrDir = file("${cloverBuildDir}/clover-instr")
177 cloverClassesDir = file("${cloverBuildDir}/clover-classes")
178 cloverReportDir = file("${buildDir}/reports/clover")
179 cloverTestInstrDir = file("${cloverBuildDir}/clover-test-instr")
180 cloverTestClassesDir = file("${cloverBuildDir}/clover-test-classes")
181 //cloverTestClassesDir = cloverClassesDir
182 cloverDb = string("${cloverBuildDir}/clover.db")
184 testSourceDir = useClover ? cloverTestInstrDir : testDir
185 testClassesDir = useClover ? cloverTestClassesDir : "${jalviewDir}/${test_output_dir}"
187 getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}")
189 buildProperties = null
191 // the following values might be overridden by the CHANNEL switch
192 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
193 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
194 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}")
195 getdownAppDistDir = getdown_app_dir_alt
196 getdownImagesDir = string("${jalviewDir}/${getdown_images_dir}")
197 reportRsyncCommand = false
198 jvlChannelName = CHANNEL.toLowerCase()
199 install4jSuffix = CHANNEL.substring(0, 1).toUpperCase() + CHANNEL.substring(1).toLowerCase(); // BUILD -> Build
200 install4jDMGDSStore = "${install4j_images_dir}/${install4j_dmg_ds_store}"
201 install4jDMGBackgroundImage = "${install4j_images_dir}/${install4j_dmg_background}"
202 install4jInstallerName = "${jalview_name} Non-Release Installer"
203 install4jExecutableName = jalview_name.replaceAll("[^\\w]+", "_").toLowerCase()
204 install4jExtraScheme = "jalviewx"
205 install4jMacIconsFile = string("${install4j_images_dir}/${install4j_mac_icons_file}")
206 install4jWindowsIconsFile = string("${install4j_images_dir}/${install4j_windows_icons_file}")
207 install4jPngIconFile = string("${install4j_images_dir}/${install4j_png_icon_file}")
208 install4jBackground = string("${install4j_images_dir}/${install4j_background}")
212 // TODO: get bamboo build artifact URL for getdown artifacts
213 getdown_channel_base = bamboo_channelbase
214 getdownChannelName = string("${bamboo_planKey}/${JAVA_VERSION}")
215 getdownAppBase = string("${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}")
216 jvlChannelName += "_${getdownChannelName}"
217 // automatically add the test group Not-bamboo for exclusion
218 if ("".equals(testng_excluded_groups)) {
219 testng_excluded_groups = "Not-bamboo"
221 install4jExtraScheme = "jalviewb"
225 getdownAppDistDir = getdown_app_dir_release
226 reportRsyncCommand = true
228 install4jInstallerName = "${jalview_name} Installer"
232 getdownChannelName = CHANNEL.toLowerCase()+"/${JALVIEW_VERSION}"
233 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
234 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
235 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
236 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
238 package_dir = string("${ARCHIVEDIR}/${package_dir}")
239 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
242 reportRsyncCommand = true
243 install4jExtraScheme = "jalviewa"
247 getdownChannelName = string("archive/${JALVIEW_VERSION}")
248 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
249 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
250 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
251 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
253 package_dir = string("${ARCHIVEDIR}/${package_dir}")
254 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
257 reportRsyncCommand = true
258 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
259 install4jSuffix = "Archive"
260 install4jExtraScheme = "jalviewa"
264 reportRsyncCommand = true
266 // DEVELOP-RELEASE is usually associated with a Jalview release series so set the version
267 JALVIEW_VERSION=JALVIEW_VERSION+"-develop"
269 install4jSuffix = "Develop"
270 install4jExtraScheme = "jalviewd"
271 install4jInstallerName = "${jalview_name} Develop Installer"
275 reportRsyncCommand = true
276 // Don't ignore transpile errors for release build
277 if (jalviewjs_ignore_transpile_errors.equals("true")) {
278 jalviewjs_ignore_transpile_errors = "false"
279 println("Setting jalviewjs_ignore_transpile_errors to 'false'")
281 JALVIEW_VERSION = JALVIEW_VERSION+"-test"
282 install4jSuffix = "Test"
283 install4jExtraScheme = "jalviewt"
284 install4jInstallerName = "${jalview_name} Test Installer"
287 case ~/^SCRATCH(|-[-\w]*)$/:
288 getdownChannelName = CHANNEL
289 JALVIEW_VERSION = JALVIEW_VERSION+"-"+CHANNEL
291 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
292 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
293 reportRsyncCommand = true
294 install4jSuffix = "Scratch"
298 if (!file("${LOCALDIR}").exists()) {
299 throw new GradleException("Must provide a LOCALDIR value to produce a local distribution")
301 getdownAppBase = file(file("${LOCALDIR}").getAbsolutePath()).toURI().toString()
302 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
304 JALVIEW_VERSION = "TEST"
305 install4jSuffix = "Test-Local"
306 install4jExtraScheme = "jalviewt"
307 install4jInstallerName = "${jalview_name} Test Installer"
311 JALVIEW_VERSION = "TEST"
312 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
313 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
314 install4jExtraScheme = "jalviewl"
317 default: // something wrong specified
318 throw new GradleException("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
322 // override getdownAppBase if requested
323 if (findProperty("getdown_appbase_override") != null) {
324 // revert to LOCAL if empty string
325 if (string(getdown_appbase_override) == "") {
326 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
327 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
329 getdownAppBase = string(getdown_appbase_override)
331 println("Overriding getdown appbase with '${getdownAppBase}'")
333 // sanitise file name for jalview launcher file for this channel
334 jvlChannelName = jvlChannelName.replaceAll("[^\\w\\-]+", "_")
335 // install4j application and folder names
336 if (install4jSuffix == "") {
337 install4jApplicationName = "${jalview_name}"
338 install4jBundleId = "${install4j_bundle_id}"
339 install4jWinApplicationId = install4j_release_win_application_id
341 install4jApplicationName = "${jalview_name} ${install4jSuffix}"
342 install4jBundleId = "${install4j_bundle_id}-" + install4jSuffix.toLowerCase()
343 // add int hash of install4jSuffix to the last part of the application_id
344 def id = install4j_release_win_application_id
345 def idsplitreverse = id.split("-").reverse()
346 idsplitreverse[0] = idsplitreverse[0].toInteger() + install4jSuffix.hashCode()
347 install4jWinApplicationId = idsplitreverse.reverse().join("-")
349 // sanitise folder and id names
350 // install4jApplicationFolder = e.g. "Jalview Build"
351 install4jApplicationFolder = install4jApplicationName
352 .replaceAll("[\"'~:/\\\\\\s]", "_") // replace all awkward filename chars " ' ~ : / \
353 .replaceAll("_+", "_") // collapse __
354 install4jInternalId = install4jApplicationName
356 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
357 .replaceAll("_+", "") // collapse __
358 //.replaceAll("_*-_*", "-") // collapse _-_
359 install4jUnixApplicationFolder = install4jApplicationName
361 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
362 .replaceAll("_+", "_") // collapse __
363 .replaceAll("_*-_*", "-") // collapse _-_
366 getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}")
367 //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
368 getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}")
369 getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}")
370 getdownFilesDir = string("${jalviewDir}/${getdown_files_dir}/${JAVA_VERSION}/")
371 getdownFilesInstallDir = string("${getdownFilesDir}/${getdown_install_dir}")
372 /* compile without modules -- using classpath libraries
373 modules_compileClasspath = fileTree(dir: "${jalviewDir}/${j11modDir}", include: ["*.jar"])
374 modules_runtimeClasspath = modules_compileClasspath
376 def details = versionDetails()
377 gitHash = details.gitHash
378 gitBranch = details.branchName
380 println("Using a ${CHANNEL} profile.")
382 additional_compiler_args = []
383 // configure classpath/args for j8/j11 compilation
384 if (JAVA_VERSION.equals("1.8")) {
385 JAVA_INTEGER_VERSION = string("8")
388 libDistDir = j8libDir
389 compile_source_compatibility = 1.8
390 compile_target_compatibility = 1.8
391 // these are getdown.txt properties defined dependent on the JAVA_VERSION
392 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java8_min_version"))
393 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java8_max_version"))
394 // this property is assigned below and expanded to multiple lines in the getdown task
395 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java8_txt_multi_java_location"))
396 // this property is for the Java library used in eclipse
397 eclipseJavaRuntimeName = string("JavaSE-1.8")
398 } else if (JAVA_VERSION.equals("11")) {
399 JAVA_INTEGER_VERSION = string("11")
401 libDistDir = j11libDir
402 compile_source_compatibility = 11
403 compile_target_compatibility = 11
404 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
405 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
406 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
407 eclipseJavaRuntimeName = string("JavaSE-11")
408 /* compile without modules -- using classpath libraries
409 additional_compiler_args += [
410 '--module-path', modules_compileClasspath.asPath,
411 '--add-modules', j11modules
414 } else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) {
415 JAVA_INTEGER_VERSION = JAVA_VERSION
417 libDistDir = j11libDir
418 compile_source_compatibility = JAVA_VERSION
419 compile_target_compatibility = JAVA_VERSION
420 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
421 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
422 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
423 eclipseJavaRuntimeName = string("JavaSE-11")
424 /* compile without modules -- using classpath libraries
425 additional_compiler_args += [
426 '--module-path', modules_compileClasspath.asPath,
427 '--add-modules', j11modules
431 throw new GradleException("JAVA_VERSION=${JAVA_VERSION} not currently supported by Jalview")
436 JAVA_MIN_VERSION = JAVA_VERSION
437 JAVA_MAX_VERSION = JAVA_VERSION
438 def jreInstallsDir = string(jre_installs_dir)
439 if (jreInstallsDir.startsWith("~/")) {
440 jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1)
442 macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre")
443 macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz")
444 windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
445 windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz")
446 linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
447 linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-linux-x64.tar.gz")
448 install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
449 install4jConfFileName = string("jalview-install4j-conf.install4j")
450 install4jConfFile = file("${install4jDir}/${install4jConfFileName}")
451 install4jHomeDir = install4j_home_dir
452 if (install4jHomeDir.startsWith("~/")) {
453 install4jHomeDir = System.getProperty("user.home") + install4jHomeDir.substring(1)
456 resourceBuildDir = string("${buildDir}/resources")
457 resourcesBuildDir = string("${resourceBuildDir}/resources_build")
458 helpBuildDir = string("${resourceBuildDir}/help_build")
459 docBuildDir = string("${resourceBuildDir}/doc_build")
461 if (buildProperties == null) {
462 buildProperties = string("${resourcesBuildDir}/${build_properties_file}")
464 buildingHTML = string("${jalviewDir}/${doc_dir}/building.html")
465 helpParentDir = string("${jalviewDir}/${help_parent_dir}")
466 helpSourceDir = string("${helpParentDir}/${help_dir}")
467 helpFile = string("${helpBuildDir}/${help_dir}/help.jhm")
470 relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
471 jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs")
472 jalviewjsSiteDir = string("${jalviewjsBuildDir}/${jalviewjs_site_dir}")
474 jalviewjsTransferSiteJsDir = string(jalviewjsSiteDir)
476 jalviewjsTransferSiteJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_js")
478 jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
479 jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
480 jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
481 jalviewjsJalviewCoreHtmlFile = string("")
482 jalviewjsJalviewCoreName = string(jalviewjs_core_name)
483 jalviewjsCoreClasslists = []
484 jalviewjsJalviewTemplateName = string(jalviewjs_name)
485 jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}")
486 jalviewjsJ2sProps = null
487 jalviewjsJ2sPlugin = jalviewjs_j2s_plugin
489 eclipseWorkspace = null
490 eclipseBinary = string("")
491 eclipseVersion = string("")
501 outputDir = file(classesDir)
505 srcDirs = [ resourcesBuildDir, docBuildDir, helpBuildDir ]
508 compileClasspath = files(sourceSets.main.java.outputDir)
509 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
511 runtimeClasspath = compileClasspath
512 runtimeClasspath += files(sourceSets.main.resources.srcDirs)
517 srcDirs cloverInstrDir
518 outputDir = cloverClassesDir
522 srcDirs = sourceSets.main.resources.srcDirs
525 compileClasspath = files( sourceSets.clover.java.outputDir )
526 //compileClasspath += files( testClassesDir )
527 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
528 compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
529 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
531 runtimeClasspath = compileClasspath
536 srcDirs testSourceDir
537 outputDir = file(testClassesDir)
541 srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs
544 compileClasspath = files( sourceSets.test.java.outputDir )
545 compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath
546 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
548 runtimeClasspath = compileClasspath
549 runtimeClasspath += files(sourceSets.test.resources.srcDirs)
555 // eclipse project and settings files creation, also used by buildship
558 name = eclipse_project_name
560 natures 'org.eclipse.jdt.core.javanature',
561 'org.eclipse.jdt.groovy.core.groovyNature',
562 'org.eclipse.buildship.core.gradleprojectnature'
564 buildCommand 'org.eclipse.jdt.core.javabuilder'
565 buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
569 //defaultOutputDir = sourceSets.main.java.outputDir
570 configurations.each{ c->
571 if (c.isCanBeResolved()) {
572 minusConfigurations += [c]
576 plusConfigurations = [ ]
580 def removeTheseToo = []
581 HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
582 cp.entries.each { entry ->
583 // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test".
584 // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover
585 // we add the resources and help/help dirs in as libs afterwards (see below)
586 if (entry.kind == 'src') {
587 if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) {
588 removeTheseToo += entry
590 alreadyAddedSrcPath.putAt(entry.path, true)
595 cp.entries.removeAll(removeTheseToo)
597 //cp.entries += new Output("${eclipse_bin_dir}/main")
598 if (file(helpParentDir).isDirectory()) {
599 cp.entries += new Library(fileReference(helpParentDir))
601 if (file(resourceDir).isDirectory()) {
602 cp.entries += new Library(fileReference(resourceDir))
605 HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
607 sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
608 //don't want to add outputDir as eclipse is using its own output dir in bin/main
609 if (it.isDirectory() || ! it.exists()) {
610 // don't add dirs to classpath, especially if they don't exist
611 return false // groovy "continue" in .any closure
613 def itPath = it.toString()
614 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
615 // make relative path
616 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
618 if (alreadyAddedLibPath.get(itPath)) {
619 //println("Not adding duplicate entry "+itPath)
621 //println("Adding entry "+itPath)
622 cp.entries += new Library(fileReference(itPath))
623 alreadyAddedLibPath.put(itPath, true)
627 sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
628 //no longer want to add outputDir as eclipse is using its own output dir in bin/main
629 if (it.isDirectory() || ! it.exists()) {
630 // don't add dirs to classpath
631 return false // groovy "continue" in .any closure
634 def itPath = it.toString()
635 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
636 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
638 if (alreadyAddedLibPath.get(itPath)) {
641 def lib = new Library(fileReference(itPath))
642 lib.entryAttributes["test"] = "true"
644 alreadyAddedLibPath.put(itPath, true)
652 containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
657 // for the IDE, use java 11 compatibility
658 sourceCompatibility = compile_source_compatibility
659 targetCompatibility = compile_target_compatibility
660 javaRuntimeName = eclipseJavaRuntimeName
662 // add in jalview project specific properties/preferences into eclipse core preferences
664 withProperties { props ->
665 def jalview_prefs = new Properties()
666 def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}")
667 jalview_prefs.load(ins)
669 jalview_prefs.forEach { t, v ->
670 if (props.getAt(t) == null) {
674 // codestyle file -- overrides previous formatter prefs
675 def csFile = file("${jalviewDirAbsolutePath}/${eclipse_codestyle_file}")
676 if (csFile.exists()) {
677 XmlParser parser = new XmlParser()
678 def profiles = parser.parse(csFile)
679 def profile = profiles.'profile'.find { p -> (p.'@kind' == "CodeFormatterProfile" && p.'@name' == "Jalview") }
680 if (profile != null) {
681 profile.'setting'.each { s ->
683 def value = s.'@value'
684 if (id != null && value != null) {
685 props.putAt(id, value)
696 // Don't want these to be activated if in headless build
697 synchronizationTasks "eclipseSynchronizationTask"
698 //autoBuildTasks "eclipseAutoBuildTask"
704 /* hack to change eclipse prefs in .settings files other than org.eclipse.jdt.core.prefs */
705 // Class to allow updating arbitrary properties files
706 class PropertiesFile extends PropertiesPersistableConfigurationObject {
707 public PropertiesFile(PropertiesTransformer t) { super(t); }
708 @Override protected void load(Properties properties) { }
709 @Override protected void store(Properties properties) { }
710 @Override protected String getDefaultResourceName() { return ""; }
711 // This is necessary, because PropertiesPersistableConfigurationObject fails
712 // if no default properties file exists.
713 @Override public void loadDefaults() { load(new StringBufferInputStream("")); }
716 // Task to update arbitrary properties files (set outputFile)
717 class PropertiesFileTask extends PropertiesGeneratorTask<PropertiesFile> {
718 private final PropertiesFileContentMerger file;
719 public PropertiesFileTask() { file = new PropertiesFileContentMerger(getTransformer()); }
720 protected PropertiesFile create() { return new PropertiesFile(getTransformer()); }
721 protected void configure(PropertiesFile props) {
722 file.getBeforeMerged().execute(props); file.getWhenMerged().execute(props);
724 public void file(Closure closure) { ConfigureUtil.configure(closure, file); }
727 task eclipseUIPreferences(type: PropertiesFileTask) {
728 description = "Generate Eclipse additional settings"
729 def filename = "org.eclipse.jdt.ui.prefs"
730 outputFile = "$projectDir/.settings/${filename}" as File
733 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
738 task eclipseGroovyCorePreferences(type: PropertiesFileTask) {
739 description = "Generate Eclipse additional settings"
740 def filename = "org.eclipse.jdt.groovy.core.prefs"
741 outputFile = "$projectDir/.settings/${filename}" as File
744 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
749 task eclipseAllPreferences {
751 dependsOn eclipseUIPreferences
752 dependsOn eclipseGroovyCorePreferences
755 eclipseUIPreferences.mustRunAfter eclipseJdt
756 eclipseGroovyCorePreferences.mustRunAfter eclipseJdt
758 /* end of eclipse preferences hack */
766 delete cloverBuildDir
767 delete cloverReportDir
772 task cloverInstrJava(type: JavaExec) {
773 group = "Verification"
774 description = "Create clover instrumented source java files"
776 dependsOn cleanClover
778 inputs.files(sourceSets.main.allJava)
779 outputs.dir(cloverInstrDir)
781 //classpath = fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
782 classpath = sourceSets.clover.compileClasspath
783 main = "com.atlassian.clover.CloverInstr"
791 cloverInstrDir.getPath(),
793 def srcFiles = sourceSets.main.allJava.files
796 { file -> file.absolutePath }
799 args argsList.toArray()
802 delete cloverInstrDir
803 println("Clover: About to instrument "+srcFiles.size() +" files")
808 task cloverInstrTests(type: JavaExec) {
809 group = "Verification"
810 description = "Create clover instrumented source test files"
812 dependsOn cleanClover
814 inputs.files(testDir)
815 outputs.dir(cloverTestInstrDir)
817 classpath = sourceSets.clover.compileClasspath
818 main = "com.atlassian.clover.CloverInstr"
828 cloverTestInstrDir.getPath(),
830 args argsList.toArray()
833 delete cloverTestInstrDir
834 println("Clover: About to instrument test files")
840 group = "Verification"
841 description = "Create clover instrumented all source files"
843 dependsOn cloverInstrJava
844 dependsOn cloverInstrTests
848 cloverClasses.dependsOn cloverInstr
851 task cloverConsoleReport(type: JavaExec) {
852 group = "Verification"
853 description = "Creates clover console report"
856 file(cloverDb).exists()
859 inputs.dir cloverClassesDir
861 classpath = sourceSets.clover.runtimeClasspath
862 main = "com.atlassian.clover.reporters.console.ConsoleReporter"
864 if (cloverreport_mem.length() > 0) {
865 maxHeapSize = cloverreport_mem
867 if (cloverreport_jvmargs.length() > 0) {
868 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
878 args argsList.toArray()
882 task cloverHtmlReport(type: JavaExec) {
883 group = "Verification"
884 description = "Creates clover HTML report"
887 file(cloverDb).exists()
890 def cloverHtmlDir = cloverReportDir
891 inputs.dir cloverClassesDir
892 outputs.dir cloverHtmlDir
894 classpath = sourceSets.clover.runtimeClasspath
895 main = "com.atlassian.clover.reporters.html.HtmlReporter"
897 if (cloverreport_mem.length() > 0) {
898 maxHeapSize = cloverreport_mem
900 if (cloverreport_jvmargs.length() > 0) {
901 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
912 if (cloverreport_html_options.length() > 0) {
913 argsList += cloverreport_html_options.split(" ")
916 args argsList.toArray()
920 task cloverXmlReport(type: JavaExec) {
921 group = "Verification"
922 description = "Creates clover XML report"
925 file(cloverDb).exists()
928 def cloverXmlFile = "${cloverReportDir}/clover.xml"
929 inputs.dir cloverClassesDir
930 outputs.file cloverXmlFile
932 classpath = sourceSets.clover.runtimeClasspath
933 main = "com.atlassian.clover.reporters.xml.XMLReporter"
935 if (cloverreport_mem.length() > 0) {
936 maxHeapSize = cloverreport_mem
938 if (cloverreport_jvmargs.length() > 0) {
939 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
950 if (cloverreport_xml_options.length() > 0) {
951 argsList += cloverreport_xml_options.split(" ")
954 args argsList.toArray()
959 group = "Verification"
960 description = "Creates clover reports"
962 dependsOn cloverXmlReport
963 dependsOn cloverHtmlReport
970 sourceCompatibility = compile_source_compatibility
971 targetCompatibility = compile_target_compatibility
972 options.compilerArgs += additional_compiler_args
973 print ("Setting target compatibility to "+targetCompatibility+"\n")
975 //classpath += configurations.cloverRuntime
981 // JBP->BS should the print statement in doFirst refer to compile_target_compatibility ?
982 sourceCompatibility = compile_source_compatibility
983 targetCompatibility = compile_target_compatibility
984 options.compilerArgs = additional_compiler_args
985 options.encoding = "UTF-8"
987 print ("Setting target compatibility to "+compile_target_compatibility+"\n")
994 sourceCompatibility = compile_source_compatibility
995 targetCompatibility = compile_target_compatibility
996 options.compilerArgs = additional_compiler_args
998 print ("Setting target compatibility to "+targetCompatibility+"\n")
1005 delete sourceSets.main.java.outputDir
1011 dependsOn cleanClover
1013 delete sourceSets.test.java.outputDir
1018 // format is a string like date.format("dd MMMM yyyy")
1019 def getDate(format) {
1020 def date = new Date()
1021 return date.format(format)
1025 def convertMdToHtml (FileTree mdFiles, File cssFile) {
1026 MutableDataSet options = new MutableDataSet()
1028 def extensions = new ArrayList<>()
1029 extensions.add(AnchorLinkExtension.create())
1030 extensions.add(AutolinkExtension.create())
1031 extensions.add(StrikethroughExtension.create())
1032 extensions.add(TaskListExtension.create())
1033 extensions.add(TablesExtension.create())
1034 extensions.add(TocExtension.create())
1036 options.set(Parser.EXTENSIONS, extensions)
1038 // set GFM table parsing options
1039 options.set(TablesExtension.WITH_CAPTION, false)
1040 options.set(TablesExtension.COLUMN_SPANS, false)
1041 options.set(TablesExtension.MIN_HEADER_ROWS, 1)
1042 options.set(TablesExtension.MAX_HEADER_ROWS, 1)
1043 options.set(TablesExtension.APPEND_MISSING_COLUMNS, true)
1044 options.set(TablesExtension.DISCARD_EXTRA_COLUMNS, true)
1045 options.set(TablesExtension.HEADER_SEPARATOR_COLUMN_MATCH, true)
1047 options.set(AnchorLinkExtension.ANCHORLINKS_SET_ID, false)
1048 options.set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor")
1049 options.set(AnchorLinkExtension.ANCHORLINKS_SET_NAME, true)
1050 options.set(AnchorLinkExtension.ANCHORLINKS_TEXT_PREFIX, "<span class=\"octicon octicon-link\"></span>")
1052 Parser parser = Parser.builder(options).build()
1053 HtmlRenderer renderer = HtmlRenderer.builder(options).build()
1055 mdFiles.each { mdFile ->
1056 // add table of contents
1057 def mdText = "[TOC]\n"+mdFile.text
1059 // grab the first top-level title
1061 def titleRegex = /(?m)^#(\s+|([^#]))(.*)/
1062 def matcher = mdText =~ titleRegex
1063 if (matcher.size() > 0) {
1064 // matcher[0][2] is the first character of the title if there wasn't any whitespace after the #
1065 title = (matcher[0][2] != null ? matcher[0][2] : "")+matcher[0][3]
1067 // or use the filename if none found
1068 if (title == null) {
1069 title = mdFile.getName()
1072 Node document = parser.parse(mdText)
1073 String htmlBody = renderer.render(document)
1074 def htmlText = '''<html>
1075 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1076 <html xmlns="http://www.w3.org/1999/xhtml">
1078 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1079 <meta http-equiv="Content-Style-Type" content="text/css" />
1080 <meta name="generator" content="flexmark" />
1082 htmlText += ((title != null) ? " <title>${title}</title>" : '' )
1084 <style type="text/css">code{white-space: pre;}</style>
1086 htmlText += ((cssFile != null) ? cssFile.text : '')
1087 htmlText += '''</head>
1090 htmlText += htmlBody
1096 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1097 def htmlFile = file(htmlFilePath)
1098 println("Creating ${htmlFilePath}")
1099 htmlFile.text = htmlText
1104 task copyDocs(type: Copy) {
1105 def inputDir = "${jalviewDir}/${doc_dir}"
1106 def outputDir = "${docBuildDir}/${doc_dir}"
1110 include('**/*.html')
1112 filter(ReplaceTokens,
1116 'Version-Rel': JALVIEW_VERSION,
1117 'Year-Rel': getDate("yyyy")
1124 exclude('**/*.html')
1129 inputs.dir(inputDir)
1130 outputs.dir(outputDir)
1134 task convertMdFiles {
1136 def mdFiles = fileTree(dir: docBuildDir, include: "**/*.md")
1137 def cssFile = file("${jalviewDir}/${flexmark_css}")
1140 convertMdToHtml(mdFiles, cssFile)
1143 inputs.files(mdFiles)
1144 inputs.file(cssFile)
1147 mdFiles.each { mdFile ->
1148 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1149 htmlFiles.add(file(htmlFilePath))
1151 outputs.files(htmlFiles)
1155 task copyHelp(type: Copy) {
1156 def inputDir = helpSourceDir
1157 def outputDir = "${helpBuildDir}/${help_dir}"
1161 include('**/*.html')
1165 filter(ReplaceTokens,
1169 'Version-Rel': JALVIEW_VERSION,
1170 'Year-Rel': getDate("yyyy")
1177 exclude('**/*.html')
1184 inputs.dir(inputDir)
1185 outputs.files(helpFile)
1186 outputs.dir(outputDir)
1190 task copyResources(type: Copy) {
1192 description = "Copy (and make text substitutions in) the resources dir to the build area"
1194 def inputDir = resourceDir
1195 def outputDir = resourcesBuildDir
1199 include('**/*.html')
1201 filter(ReplaceTokens,
1205 'Version-Rel': JALVIEW_VERSION,
1206 'Year-Rel': getDate("yyyy")
1213 exclude('**/*.html')
1218 inputs.dir(inputDir)
1219 outputs.dir(outputDir)
1222 task copyChannelResources(type: Copy) {
1223 dependsOn copyResources
1225 description = "Copy the channel resources dir to the build resources area"
1227 def inputDir = "${channelDir}/${resource_dir}"
1228 def outputDir = resourcesBuildDir
1232 inputs.dir(inputDir)
1233 outputs.dir(outputDir)
1236 task createBuildProperties(type: WriteProperties) {
1237 dependsOn copyResources
1239 description = "Create the ${buildProperties} file"
1241 inputs.dir(sourceDir)
1242 inputs.dir(resourcesBuildDir)
1243 outputFile (buildProperties)
1244 // taking time specific comment out to allow better incremental builds
1245 comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
1246 //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
1247 property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
1248 property "VERSION", JALVIEW_VERSION
1249 property "INSTALLATION", INSTALLATION+" git-commit:"+gitHash+" ["+gitBranch+"]"
1250 outputs.file(outputFile)
1254 task buildIndices(type: JavaExec) {
1256 classpath = sourceSets.main.compileClasspath
1257 main = "com.sun.java.help.search.Indexer"
1258 workingDir = "${helpBuildDir}/${help_dir}"
1261 inputs.dir("${workingDir}/${argDir}")
1263 outputs.dir("${classesDir}/doc")
1264 outputs.dir("${classesDir}/help")
1265 outputs.file("${workingDir}/JavaHelpSearch/DOCS")
1266 outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB")
1267 outputs.file("${workingDir}/JavaHelpSearch/OFFSETS")
1268 outputs.file("${workingDir}/JavaHelpSearch/POSITIONS")
1269 outputs.file("${workingDir}/JavaHelpSearch/SCHEMA")
1270 outputs.file("${workingDir}/JavaHelpSearch/TMAP")
1274 dependsOn copyResources
1277 dependsOn createBuildProperties
1278 dependsOn copyChannelResources
1279 dependsOn convertMdFiles
1280 dependsOn buildIndices
1284 compileJava.dependsOn prepare
1285 run.dependsOn compileJava
1286 //run.dependsOn prepare
1289 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
1294 dependsOn cloverClasses
1296 dependsOn compileJava //?
1300 includeGroups testng_groups
1301 excludeGroups testng_excluded_groups
1303 useDefaultListeners=true
1306 maxHeapSize = "1024m"
1308 workingDir = jalviewDir
1309 def testLaf = project.findProperty("test_laf")
1310 if (testLaf != null) {
1311 println("Setting Test LaF to '${testLaf}'")
1312 systemProperty "laf", testLaf
1314 def testHiDPIScale = project.findProperty("test_HiDPIScale")
1315 if (testHiDPIScale != null) {
1316 println("Setting Test HiDPI Scale to '${testHiDPIScale}'")
1317 systemProperty "sun.java2d.uiScale", testHiDPIScale
1319 sourceCompatibility = compile_source_compatibility
1320 targetCompatibility = compile_target_compatibility
1321 jvmArgs += additional_compiler_args
1325 println("Running tests " + (useClover?"WITH":"WITHOUT") + " clover")
1331 task compileLinkCheck(type: JavaCompile) {
1333 classpath = files("${jalviewDir}/${utils_dir}")
1334 destinationDir = file("${jalviewDir}/${utils_dir}")
1335 source = fileTree(dir: "${jalviewDir}/${utils_dir}", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
1337 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1338 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1339 outputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.class")
1340 outputs.file("${jalviewDir}/${utils_dir}/BufferedLineReader.class")
1344 task linkCheck(type: JavaExec) {
1346 dependsOn compileLinkCheck
1348 def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
1349 classpath = files("${jalviewDir}/${utils_dir}")
1350 main = "HelpLinksChecker"
1351 workingDir = jalviewDir
1352 args = [ "${helpBuildDir}/${help_dir}", "-nointernet" ]
1354 def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
1356 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
1359 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
1363 inputs.dir(helpBuildDir)
1364 outputs.file(helpLinksCheckerOutFile)
1368 // import the pubhtmlhelp target
1369 ant.properties.basedir = "${jalviewDir}"
1370 ant.properties.helpBuildDir = "${helpBuildDir}/${help_dir}"
1371 ant.importBuild "${utils_dir}/publishHelp.xml"
1374 task cleanPackageDir(type: Delete) {
1376 delete fileTree(dir: "${jalviewDir}/${package_dir}", include: "*.jar")
1386 attributes "Main-Class": main_class,
1387 "Permissions": "all-permissions",
1388 "Application-Name": install4jApplicationName,
1389 "Codebase": application_codebase,
1390 "Implementation-Version": JALVIEW_VERSION
1393 def outputDir = "${jalviewDir}/${package_dir}"
1394 destinationDirectory = file(outputDir)
1395 archiveFileName = rootProject.name+".jar"
1401 exclude "**/*.jar.*"
1403 inputs.dir(sourceSets.main.java.outputDir)
1404 sourceSets.main.resources.srcDirs.each{ dir ->
1407 outputs.file("${outputDir}/${archiveFileName}")
1411 task copyJars(type: Copy) {
1412 from fileTree(dir: classesDir, include: "**/*.jar").files
1413 into "${jalviewDir}/${package_dir}"
1417 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
1418 task syncJars(type: Sync) {
1420 from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
1421 into "${jalviewDir}/${package_dir}"
1423 include jar.archiveFileName.getOrNull()
1430 description = "Put all required libraries in dist"
1431 // order of "cleanPackageDir", "copyJars", "jar" important!
1432 jar.mustRunAfter cleanPackageDir
1433 syncJars.mustRunAfter cleanPackageDir
1434 dependsOn cleanPackageDir
1437 outputs.dir("${jalviewDir}/${package_dir}")
1442 dependsOn cleanPackageDir
1449 group = "distribution"
1450 description = "Create a single jar file with all dependency libraries merged. Can be run with java -jar"
1454 from ("${jalviewDir}/${libDistDir}") {
1458 attributes "Implementation-Version": JALVIEW_VERSION,
1459 "Application-Name": install4jApplicationName
1461 mainClassName = shadow_jar_main_class
1463 classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
1468 task getdownWebsite() {
1469 group = "distribution"
1470 description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
1475 def getdownWebsiteResourceFilenames = []
1476 def getdownTextString = ""
1477 def getdownResourceDir = getdownResourceDir
1478 def getdownResourceFilenames = []
1481 // clean the getdown website and files dir before creating getdown folders
1482 delete getdownWebsiteDir
1483 delete getdownFilesDir
1486 from buildProperties
1487 rename(build_properties_file, getdown_build_properties)
1490 getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
1492 // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
1493 def props = project.properties.sort { it.key }
1494 if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
1495 props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
1497 if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) {
1498 props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion)
1500 if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
1501 props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
1503 if (getdownImagesDir != null && file(getdownImagesDir).exists()) {
1504 props.put("getdown_txt_ui.background_image", "${getdownImagesDir}/${getdown_background_image}")
1505 props.put("getdown_txt_ui.instant_background_image", "${getdownImagesDir}/${getdown_instant_background_image}")
1506 props.put("getdown_txt_ui.error_background", "${getdownImagesDir}/${getdown_error_background}")
1507 props.put("getdown_txt_ui.progress_image", "${getdownImagesDir}/${getdown_progress_image}")
1508 props.put("getdown_txt_ui.icon", "${getdownImagesDir}/${getdown_icon}")
1509 props.put("getdown_txt_ui.mac_dock_icon", "${getdownImagesDir}/${getdown_mac_dock_icon}")
1512 props.put("getdown_txt_title", jalview_name)
1513 props.put("getdown_txt_ui.name", install4jApplicationName)
1515 // start with appbase
1516 getdownTextString += "appbase = ${getdownAppBase}\n"
1517 props.each{ prop, val ->
1518 if (prop.startsWith("getdown_txt_") && val != null) {
1519 if (prop.startsWith("getdown_txt_multi_")) {
1520 def key = prop.substring(18)
1521 val.split(",").each{ v ->
1522 def line = "${key} = ${v}\n"
1523 getdownTextString += line
1526 // file values rationalised
1527 if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
1529 if (val.indexOf('/') == 0) {
1532 } else if (val.indexOf('/') > 0) {
1533 // relative path (relative to jalviewDir)
1534 r = file( "${jalviewDir}/${val}" )
1537 val = "${getdown_resource_dir}/" + r.getName()
1538 getdownWebsiteResourceFilenames += val
1539 getdownResourceFilenames += r.getPath()
1542 if (! prop.startsWith("getdown_txt_resource")) {
1543 def line = prop.substring(12) + " = ${val}\n"
1544 getdownTextString += line
1550 getdownWebsiteResourceFilenames.each{ filename ->
1551 getdownTextString += "resource = ${filename}\n"
1553 getdownResourceFilenames.each{ filename ->
1556 into getdownResourceDir
1561 fileTree(file(package_dir)).each{ f ->
1562 if (f.isDirectory()) {
1563 def files = fileTree(dir: f, include: ["*"]).getFiles()
1565 } else if (f.exists()) {
1569 codeFiles.sort().each{f ->
1570 def name = f.getName()
1571 def line = "code = ${getdownAppDistDir}/${name}\n"
1572 getdownTextString += line
1579 // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
1581 if (JAVA_VERSION.equals("11")) {
1582 def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
1583 j11libFiles.sort().each{f ->
1584 def name = f.getName()
1585 def line = "code = ${getdown_j11lib_dir}/${name}\n"
1586 getdownTextString += line
1589 into getdownJ11libDir
1595 // getdown-launcher.jar should not be in main application class path so the main application can move it when updated. Listed as a resource so it gets updated.
1596 //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
1597 getdownTextString += "resource = ${getdown_launcher_new}\n"
1598 getdownTextString += "class = ${main_class}\n"
1600 def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
1601 getdown_txt.write(getdownTextString)
1603 def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
1604 def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
1605 launchJvl.write("appbase=${getdownAppBase}")
1608 from getdownLauncher
1609 rename(file(getdownLauncher).getName(), getdown_launcher_new)
1610 into getdownWebsiteDir
1614 from getdownLauncher
1615 if (file(getdownLauncher).getName() != getdown_launcher) {
1616 rename(file(getdownLauncher).getName(), getdown_launcher)
1618 into getdownWebsiteDir
1621 if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
1624 from getdownLauncher
1625 from "${getdownWebsiteDir}/${getdown_build_properties}"
1626 if (file(getdownLauncher).getName() != getdown_launcher) {
1627 rename(file(getdownLauncher).getName(), getdown_launcher)
1629 into getdownInstallDir
1633 from getdownInstallDir
1634 into getdownFilesInstallDir
1641 from getdownLauncher
1642 from "${getdownWebsiteDir}/${getdown_build_properties}"
1643 if (file(getdownLauncher).getName() != getdown_launcher) {
1644 rename(file(getdownLauncher).getName(), getdown_launcher)
1646 into getdownFilesDir
1650 from getdownResourceDir
1651 into "${getdownFilesDir}/${getdown_resource_dir}"
1656 inputs.dir("${jalviewDir}/${package_dir}")
1658 outputs.dir(getdownWebsiteDir)
1659 outputs.dir(getdownFilesDir)
1663 // a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir
1664 task getdownDigestDir(type: JavaExec) {
1666 description "A task to run a getdown Digest on a dir with getdown.txt. Provide a DIGESTDIR property via -PDIGESTDIR=..."
1668 def digestDirPropertyName = "DIGESTDIR"
1670 classpath = files(getdownLauncher)
1671 def digestDir = findProperty(digestDirPropertyName)
1672 if (digestDir == null) {
1673 throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest")
1677 main = "com.threerings.getdown.tools.Digester"
1681 task getdownDigest(type: JavaExec) {
1682 group = "distribution"
1683 description = "Digest the getdown website folder"
1684 dependsOn getdownWebsite
1686 classpath = files(getdownLauncher)
1688 main = "com.threerings.getdown.tools.Digester"
1689 args getdownWebsiteDir
1690 inputs.dir(getdownWebsiteDir)
1691 outputs.file("${getdownWebsiteDir}/digest2.txt")
1696 group = "distribution"
1697 description = "Create the minimal and full getdown app folder for installers and website and create digest file"
1698 dependsOn getdownDigest
1700 if (reportRsyncCommand) {
1701 def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
1702 def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
1703 println "LIKELY RSYNC COMMAND:"
1704 println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
1705 if (RUNRSYNC == "true") {
1707 commandLine "mkdir", "-p", toDir
1710 commandLine "rsync", "-avh", "--delete", fromDir, toDir
1718 tasks.withType(JavaCompile) {
1719 options.encoding = 'UTF-8'
1725 delete getdownWebsiteDir
1726 delete getdownFilesDir
1732 if (file(install4jHomeDir).exists()) {
1734 } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) {
1735 install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
1736 } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) {
1737 install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app"
1739 installDir(file(install4jHomeDir))
1741 mediaTypes = Arrays.asList(install4j_media_types.split(","))
1745 task copyInstall4jTemplate {
1746 def install4jTemplateFile = file("${install4jDir}/${install4j_template}")
1747 def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}")
1748 inputs.file(install4jTemplateFile)
1749 inputs.file(install4jFileAssociationsFile)
1750 inputs.property("CHANNEL", { CHANNEL })
1751 outputs.file(install4jConfFile)
1754 def install4jConfigXml = new XmlParser().parse(install4jTemplateFile)
1756 // turn off code signing if no OSX_KEYPASS
1757 if (OSX_KEYPASS == "") {
1758 install4jConfigXml.'**'.codeSigning.each { codeSigning ->
1759 codeSigning.'@macEnabled' = "false"
1761 install4jConfigXml.'**'.windows.each { windows ->
1762 windows.'@runPostProcessor' = "false"
1766 // turn off checksum creation for LOCAL channel
1767 def e = install4jConfigXml.application[0]
1768 if (CHANNEL == "LOCAL") {
1769 e.'@createChecksums' = "false"
1771 e.'@createChecksums' = "true"
1774 // put file association actions where placeholder action is
1775 def install4jFileAssociationsText = install4jFileAssociationsFile.text
1776 def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
1777 install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true
1778 if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') {
1779 def parent = a.parent()
1781 fileAssociationActions.each { faa ->
1784 // don't need to continue in .any loop once replacements have been made
1789 // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else
1790 // NB we're deleting the /other/ one!
1791 // Also remove the examples subdir from non-release versions
1792 def customizedIdToDelete = "PROGRAM_GROUP_RELEASE"
1793 // 2.11.1.0 NOT releasing with the Examples folder in the Program Group
1794 if (false && CHANNEL=="RELEASE") { // remove 'false && ' to include Examples folder in RELEASE channel
1795 customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE"
1797 // remove the examples subdir from Full File Set
1798 def files = install4jConfigXml.files[0]
1799 def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" }
1800 def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' }
1801 def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' }
1802 def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" }
1803 dirEntry.parent().remove(dirEntry)
1805 install4jConfigXml.'**'.action.any { a ->
1806 if (a.'@customizedId' == customizedIdToDelete) {
1807 def parent = a.parent()
1813 // remove the "Uninstall Old Jalview (optional)" symlink from DMG for non-release DS_Stores
1814 if (! (CHANNEL == "RELEASE" || CHANNEL == "TEST-RELEASE" ) ) {
1815 def symlink = install4jConfigXml.'**'.topLevelFiles.symlink.find { sl -> sl.'@name' == "Uninstall Old Jalview (optional).app" }
1816 symlink.parent().remove(symlink)
1819 // write install4j file
1820 install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
1827 delete install4jConfFile
1832 task installers(type: com.install4j.gradle.Install4jTask) {
1833 group = "distribution"
1834 description = "Create the install4j installers"
1836 dependsOn copyInstall4jTemplate
1838 projectFile = install4jConfFile
1840 // create an md5 for the input files to use as version for install4j conf file
1841 def digest = MessageDigest.getInstance("MD5")
1843 (file("${install4jDir}/${install4j_template}").text +
1844 file("${install4jDir}/${install4j_info_plist_file_associations}").text +
1845 file("${install4jDir}/${install4j_installer_file_associations}").text).bytes)
1846 def filesMd5 = new BigInteger(1, digest.digest()).toString(16)
1847 if (filesMd5.length() >= 8) {
1848 filesMd5 = filesMd5.substring(0,8)
1850 def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
1851 // make install4jBuildDir relative to jalviewDir
1852 def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
1855 'JALVIEW_NAME': jalview_name,
1856 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
1857 'JALVIEW_DIR': "../..",
1858 'OSX_KEYSTORE': OSX_KEYSTORE,
1859 'JSIGN_SH': JSIGN_SH,
1860 'JRE_DIR': getdown_app_dir_java,
1861 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
1862 'JALVIEW_VERSION': JALVIEW_VERSION,
1863 'JAVA_MIN_VERSION': JAVA_MIN_VERSION,
1864 'JAVA_MAX_VERSION': JAVA_MAX_VERSION,
1865 'JAVA_VERSION': JAVA_VERSION,
1866 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
1867 'VERSION': JALVIEW_VERSION,
1868 'MACOS_JAVA_VM_DIR': macosJavaVMDir,
1869 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
1870 'LINUX_JAVA_VM_DIR': linuxJavaVMDir,
1871 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
1872 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
1873 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz,
1874 'COPYRIGHT_MESSAGE': install4j_copyright_message,
1875 'BUNDLE_ID': install4jBundleId,
1876 'INTERNAL_ID': install4jInternalId,
1877 'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
1878 'MACOS_DMG_DS_STORE': install4jDMGDSStore,
1879 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
1880 'INSTALLER_NAME': install4jInstallerName,
1881 'INSTALL4J_UTILS_DIR': install4j_utils_dir,
1882 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
1883 'GETDOWN_FILES_DIR': getdown_files_dir,
1884 'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
1885 'GETDOWN_DIST_DIR': getdownAppDistDir,
1886 'GETDOWN_ALT_DIR': getdown_app_dir_alt,
1887 'GETDOWN_INSTALL_DIR': getdown_install_dir,
1888 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
1889 'BUILD_DIR': install4jBuildDir,
1890 'APPLICATION_CATEGORIES': install4j_application_categories,
1891 'APPLICATION_FOLDER': install4jApplicationFolder,
1892 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
1893 'EXECUTABLE_NAME': install4jExecutableName,
1894 'EXTRA_SCHEME': install4jExtraScheme,
1895 'MAC_ICONS_FILE': install4jMacIconsFile,
1896 'WINDOWS_ICONS_FILE': install4jWindowsIconsFile,
1897 'PNG_ICON_FILE': install4jPngIconFile,
1898 'BACKGROUND': install4jBackground,
1902 //println("INSTALL4J VARIABLES:")
1903 //variables.each{k,v->println("${k}=${v}")}
1905 destination = "${jalviewDir}/${install4jBuildDir}"
1906 buildSelected = true
1908 if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
1910 disableSigning = true
1914 macKeystorePassword = OSX_KEYPASS
1918 println("Using projectFile "+projectFile)
1921 inputs.dir(getdownWebsiteDir)
1922 inputs.file(install4jConfFile)
1923 inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
1924 inputs.dir(macosJavaVMDir)
1925 inputs.dir(windowsJavaVMDir)
1926 outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
1932 eclipse().configFile(eclipse_codestyle_file)
1937 task sourceDist(type: Tar) {
1938 group "distribution"
1939 description "Create a source .tar.gz file for distribution"
1941 dependsOn convertMdFiles
1943 def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
1944 def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
1945 archiveFileName = outputFileName
1947 compression Compression.GZIP
1962 "**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales",
1964 "utils/InstallAnywhere",
1979 "gradle.properties",
1990 ".settings/org.eclipse.jdt.core.jalview.prefs",
1994 exclude (EXCLUDE_FILES)
1995 include (PROCESS_FILES)
1996 filter(ReplaceTokens,
2000 'Version-Rel': JALVIEW_VERSION,
2001 'Year-Rel': getDate("yyyy")
2006 exclude (EXCLUDE_FILES)
2007 exclude (PROCESS_FILES)
2008 exclude ("appletlib")
2009 exclude ("**/*locales")
2010 exclude ("*locales/**")
2011 exclude ("utils/InstallAnywhere")
2013 exclude (getdown_files_dir)
2014 exclude (getdown_website_dir)
2016 // exluding these as not using jars as modules yet
2017 exclude ("${j11modDir}/**/*.jar")
2020 include(INCLUDE_FILES)
2022 // from (jalviewDir) {
2023 // // explicit includes for stuff that seemed to not get included
2024 // include(fileTree("test/**/*."))
2025 // exclude(EXCLUDE_FILES)
2026 // exclude(PROCESS_FILES)
2033 dependsOn pubhtmlhelp
2035 inputs.dir("${helpBuildDir}/${help_dir}")
2036 outputs.dir("${buildDir}/distributions/${help_dir}")
2040 task j2sSetHeadlessBuild {
2047 task jalviewjsSetEclipseWorkspace {
2048 def propKey = "jalviewjs_eclipse_workspace"
2050 if (project.hasProperty(propKey)) {
2051 propVal = project.getProperty(propKey)
2052 if (propVal.startsWith("~/")) {
2053 propVal = System.getProperty("user.home") + propVal.substring(1)
2056 def propsFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
2057 def propsFile = file(propsFileName)
2058 def eclipseWsDir = propVal
2059 def props = new Properties()
2061 def writeProps = true
2062 if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && propsFile.exists()) {
2063 def ins = new FileInputStream(propsFileName)
2066 if (props.getProperty(propKey, null) != null) {
2067 eclipseWsDir = props.getProperty(propKey)
2072 if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
2073 def tempDir = File.createTempDir()
2074 eclipseWsDir = tempDir.getAbsolutePath()
2077 eclipseWorkspace = file(eclipseWsDir)
2080 // do not run a headless transpile when we claim to be in Eclipse
2082 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2083 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2085 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2089 props.setProperty(propKey, eclipseWsDir)
2090 propsFile.parentFile.mkdirs()
2091 def bytes = new ByteArrayOutputStream()
2092 props.store(bytes, null)
2093 def propertiesString = bytes.toString()
2094 propsFile.text = propertiesString
2100 println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
2103 //inputs.property(propKey, eclipseWsDir) // eclipseWsDir only gets set once this task runs, so will be out-of-date
2104 outputs.file(propsFileName)
2105 outputs.upToDateWhen { eclipseWorkspace.exists() && propsFile.exists() }
2109 task jalviewjsEclipsePaths {
2112 def eclipseRoot = jalviewjs_eclipse_root
2113 if (eclipseRoot.startsWith("~/")) {
2114 eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
2116 if (OperatingSystem.current().isMacOsX()) {
2117 eclipseRoot += "/Eclipse.app"
2118 eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse"
2119 eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct"
2120 } else if (OperatingSystem.current().isWindows()) { // check these paths!!
2121 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2122 eclipseRoot += "/eclipse"
2124 eclipseBinary = "${eclipseRoot}/eclipse.exe"
2125 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2126 } else { // linux or unix
2127 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2128 eclipseRoot += "/eclipse"
2129 println("eclipseDir exists")
2131 eclipseBinary = "${eclipseRoot}/eclipse"
2132 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2135 eclipseVersion = "4.13" // default
2136 def assumedVersion = true
2137 if (file(eclipseProduct).exists()) {
2138 def fis = new FileInputStream(eclipseProduct)
2139 def props = new Properties()
2141 eclipseVersion = props.getProperty("version")
2143 assumedVersion = false
2146 def propKey = "eclipse_debug"
2147 eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true"))
2150 // do not run a headless transpile when we claim to be in Eclipse
2152 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2153 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2155 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2158 if (!assumedVersion) {
2159 println("ECLIPSE VERSION=${eclipseVersion}")
2165 task printProperties {
2167 description "Output to console all System.properties"
2169 System.properties.each { key, val -> System.out.println("Property: ${key}=${val}") }
2175 dependsOn eclipseProject
2176 dependsOn eclipseClasspath
2177 dependsOn eclipseJdt
2181 // this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir
2182 task jalviewjsEclipseCopyDropins(type: Copy) {
2183 dependsOn jalviewjsEclipsePaths
2185 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar")
2186 inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}")
2187 def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}"
2194 // this eclipse -clean doesn't actually work
2195 task jalviewjsCleanEclipse(type: Exec) {
2196 dependsOn eclipseSetup
2197 dependsOn jalviewjsEclipsePaths
2198 dependsOn jalviewjsEclipseCopyDropins
2200 executable(eclipseBinary)
2201 args(["-nosplash", "--launcher.suppressErrors", "-data", eclipseWorkspace.getPath(), "-clean", "-console", "-consoleLog"])
2207 def inputString = """exit
2210 def inputByteStream = new ByteArrayInputStream(inputString.getBytes())
2211 standardInput = inputByteStream
2214 /* not really working yet
2215 jalviewjsEclipseCopyDropins.finalizedBy jalviewjsCleanEclipse
2219 task jalviewjsTransferUnzipSwingJs {
2220 def file_zip = "${jalviewDir}/${jalviewjs_swingjs_zip}"
2224 from zipTree(file_zip)
2225 into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2229 inputs.file file_zip
2230 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2234 task jalviewjsTransferUnzipLib {
2235 def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
2238 zipFiles.each { file_zip ->
2240 from zipTree(file_zip)
2241 into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2246 inputs.files zipFiles
2247 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2251 task jalviewjsTransferUnzipAllLibs {
2252 dependsOn jalviewjsTransferUnzipSwingJs
2253 dependsOn jalviewjsTransferUnzipLib
2257 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
2259 description "Create the .j2s file from the j2s.* properties"
2261 jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
2262 def siteDirProperty = "j2s.site.directory"
2263 def setSiteDir = false
2264 jalviewjsJ2sProps.each { prop, val ->
2266 if (prop == siteDirProperty) {
2267 if (!(val.startsWith('/') || val.startsWith("file://") )) {
2268 val = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${val}"
2274 if (!setSiteDir) { // default site location, don't override specifically set property
2275 property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
2278 outputFile = jalviewjsJ2sSettingsFileName
2281 inputs.properties(jalviewjsJ2sProps)
2282 outputs.file(jalviewjsJ2sSettingsFileName)
2287 task jalviewjsEclipseSetup {
2288 dependsOn jalviewjsEclipseCopyDropins
2289 dependsOn jalviewjsSetEclipseWorkspace
2290 dependsOn jalviewjsCreateJ2sSettings
2294 task jalviewjsSyncAllLibs (type: Sync) {
2295 dependsOn jalviewjsTransferUnzipAllLibs
2296 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
2297 inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
2298 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2302 def outputFiles = []
2303 rename { filename ->
2304 outputFiles += "${outputDir}/${filename}"
2310 outputs.files outputFiles
2311 inputs.files inputFiles
2315 task jalviewjsSyncResources (type: Sync) {
2316 def inputFiles = fileTree(dir: resourceDir)
2317 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2321 def outputFiles = []
2322 rename { filename ->
2323 outputFiles += "${outputDir}/${filename}"
2329 outputs.files outputFiles
2330 inputs.files inputFiles
2334 task jalviewjsSyncSiteResources (type: Sync) {
2335 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}")
2336 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2340 def outputFiles = []
2341 rename { filename ->
2342 outputFiles += "${outputDir}/${filename}"
2348 outputs.files outputFiles
2349 inputs.files inputFiles
2353 task jalviewjsSyncBuildProperties (type: Sync) {
2354 dependsOn createBuildProperties
2355 def inputFiles = [file(buildProperties)]
2356 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2360 def outputFiles = []
2361 rename { filename ->
2362 outputFiles += "${outputDir}/${filename}"
2368 outputs.files outputFiles
2369 inputs.files inputFiles
2373 task jalviewjsProjectImport(type: Exec) {
2374 dependsOn eclipseSetup
2375 dependsOn jalviewjsEclipsePaths
2376 dependsOn jalviewjsEclipseSetup
2379 // do not run a headless import when we claim to be in Eclipse
2381 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2382 throw new StopExecutionException("Not running headless import whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2384 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2388 //def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
2389 def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
2390 executable(eclipseBinary)
2391 args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
2395 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2397 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2400 inputs.file("${jalviewDir}/.project")
2401 outputs.upToDateWhen {
2402 file(projdir).exists()
2407 task jalviewjsTranspile(type: Exec) {
2408 dependsOn jalviewjsEclipseSetup
2409 dependsOn jalviewjsProjectImport
2410 dependsOn jalviewjsEclipsePaths
2413 // do not run a headless transpile when we claim to be in Eclipse
2415 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2416 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2418 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2422 executable(eclipseBinary)
2423 args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipse_build_arg}", eclipse_project_name ])
2427 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2429 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2435 stdout = new ByteArrayOutputStream()
2436 stderr = new ByteArrayOutputStream()
2438 def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}"
2439 def logOutFile = file(logOutFileName)
2440 logOutFile.createNewFile()
2441 logOutFile.text = """ROOT: ${jalviewjs_eclipse_root}
2442 BINARY: ${eclipseBinary}
2443 VERSION: ${eclipseVersion}
2444 WORKSPACE: ${eclipseWorkspace}
2445 DEBUG: ${eclipseDebug}
2448 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2449 // combine stdout and stderr
2450 def logErrFOS = logOutFOS
2452 if (jalviewjs_j2s_to_console.equals("true")) {
2453 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2454 new org.apache.tools.ant.util.TeeOutputStream(
2458 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2459 new org.apache.tools.ant.util.TeeOutputStream(
2464 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2467 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2474 if (stdout.toString().contains("Error processing ")) {
2475 // j2s did not complete transpile
2476 //throw new TaskExecutionException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2477 if (jalviewjs_ignore_transpile_errors.equals("true")) {
2478 println("IGNORING TRANSPILE ERRORS")
2479 println("See eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2481 throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2486 inputs.dir("${jalviewDir}/${sourceDir}")
2487 outputs.dir("${jalviewDir}/${jalviewjsTransferSiteJsDir}")
2488 outputs.upToDateWhen( { file("${jalviewDir}/${jalviewjsTransferSiteJsDir}${jalviewjs_server_resource}").exists() } )
2492 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
2494 def stdout = new ByteArrayOutputStream()
2495 def stderr = new ByteArrayOutputStream()
2497 def coreFile = file(jsfile)
2499 msg = "Creating core for ${name}...\nGenerating ${jsfile}"
2501 logOutFile.createNewFile()
2502 logOutFile.append(msg+"\n")
2504 def coreTop = file(prefixFile)
2505 def coreBottom = file(suffixFile)
2506 coreFile.getParentFile().mkdirs()
2507 coreFile.createNewFile()
2508 coreFile.write( coreTop.getText("UTF-8") )
2512 def t = f.getText("UTF-8")
2513 t.replaceAll("Clazz\\.([^_])","Clazz_${1}")
2514 coreFile.append( t )
2516 msg = "...file '"+f.getPath()+"' does not exist, skipping"
2518 logOutFile.append(msg+"\n")
2521 coreFile.append( coreBottom.getText("UTF-8") )
2523 msg = "Generating ${zjsfile}"
2525 logOutFile.append(msg+"\n")
2526 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2527 def logErrFOS = logOutFOS
2530 classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
2531 main = "com.google.javascript.jscomp.CommandLineRunner"
2532 jvmArgs = [ "-Dfile.encoding=UTF-8" ]
2533 args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
2536 msg = "\nRunning '"+commandLine.join(' ')+"'\n"
2538 logOutFile.append(msg+"\n")
2540 if (logOutConsole) {
2541 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2542 new org.apache.tools.ant.util.TeeOutputStream(
2546 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2547 new org.apache.tools.ant.util.TeeOutputStream(
2552 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2555 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2562 logOutFile.append(msg+"\n")
2566 task jalviewjsBuildAllCores {
2568 description "Build the core js lib closures listed in the classlists dir"
2569 dependsOn jalviewjsTranspile
2570 dependsOn jalviewjsTransferUnzipSwingJs
2572 def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
2573 def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
2574 def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
2575 def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
2576 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
2577 def prefixFile = "${jsDir}/core/coretop2.js"
2578 def suffixFile = "${jsDir}/core/corebottom2.js"
2580 inputs.file prefixFile
2581 inputs.file suffixFile
2583 def classlistFiles = []
2584 // add the classlists found int the jalviewjs_classlists_dir
2585 fileTree(dir: "${jalviewDir}/${jalviewjs_classlists_dir}", include: "*.txt").each {
2587 def name = file.getName() - ".txt"
2594 // _jmol and _jalview cores. Add any other peculiar classlist.txt files here
2595 //classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jmol}"), 'name': "_jvjmol" ]
2596 classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jalview}"), 'name': jalviewjsJalviewCoreName ]
2598 jalviewjsCoreClasslists = []
2600 classlistFiles.each {
2603 def file = hash['file']
2604 if (! file.exists()) {
2605 //println("...classlist file '"+file.getPath()+"' does not exist, skipping")
2606 return false // this is a "continue" in groovy .each closure
2608 def name = hash['name']
2610 name = file.getName() - ".txt"
2618 def list = fileTree(dir: j2sDir, includes: filelist)
2620 def jsfile = "${outputDir}/core${name}.js"
2621 def zjsfile = "${outputDir}/core${name}.z.js"
2623 jalviewjsCoreClasslists += [
2632 outputs.file(jsfile)
2633 outputs.file(zjsfile)
2636 // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
2637 def stevesoftClasslistName = "_stevesoft"
2638 def stevesoftClasslist = [
2639 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
2640 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
2641 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
2642 'name': stevesoftClasslistName
2644 jalviewjsCoreClasslists += stevesoftClasslist
2645 inputs.files(stevesoftClasslist['list'])
2646 outputs.file(stevesoftClasslist['jsfile'])
2647 outputs.file(stevesoftClasslist['zjsfile'])
2650 def allClasslistName = "_all"
2651 def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
2652 allJsFiles += fileTree(
2656 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2657 "**/org/jmol/jvxl/readers/IsoIntersectFileReader.js",
2658 "**/org/jmol/export/JSExporter.js"
2661 allJsFiles += fileTree(
2665 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2666 "**/sun/misc/Unsafe.js",
2667 "**/swingjs/jquery/jquery-editable-select.js",
2668 "**/swingjs/jquery/j2sComboBox.js",
2669 "**/sun/misc/FloatingDecimal.js"
2672 def allClasslist = [
2673 'jsfile': "${outputDir}/core${allClasslistName}.js",
2674 'zjsfile': "${outputDir}/core${allClasslistName}.z.js",
2676 'name': allClasslistName
2678 // not including this version of "all" core at the moment
2679 //jalviewjsCoreClasslists += allClasslist
2680 inputs.files(allClasslist['list'])
2681 outputs.file(allClasslist['jsfile'])
2682 outputs.file(allClasslist['zjsfile'])
2685 def logOutFile = file("${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_closure_stdout}")
2686 logOutFile.getParentFile().mkdirs()
2687 logOutFile.createNewFile()
2688 logOutFile.write(getDate("yyyy-MM-dd HH:mm:ss")+" jalviewjsBuildAllCores\n----\n")
2690 jalviewjsCoreClasslists.each {
2691 jalviewjsCallCore(it.name, it.list, prefixFile, suffixFile, it.jsfile, it.zjsfile, logOutFile, jalviewjs_j2s_to_console.equals("true"))
2698 def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inputFile, String outputFile) {
2701 into file(outputFile).getParentFile()
2702 rename { filename ->
2703 if (filename.equals(inputFile.getName())) {
2704 return file(outputFile).getName()
2708 filter(ReplaceTokens,
2712 'MAIN': '"'+main_class+'"',
2714 'NAME': jalviewjsJalviewTemplateName+" [core ${coreName}]",
2715 'COREKEY': jalviewjs_core_key,
2716 'CORENAME': coreName
2723 task jalviewjsPublishCoreTemplates {
2724 dependsOn jalviewjsBuildAllCores
2725 def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
2726 def inputFile = file(inputFileName)
2727 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2729 def outputFiles = []
2730 jalviewjsCoreClasslists.each { cl ->
2731 def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html"
2732 cl['outputfile'] = outputFile
2733 outputFiles += outputFile
2737 jalviewjsCoreClasslists.each { cl ->
2738 jalviewjsPublishCoreTemplate(cl.name, jalviewjsJalviewTemplateName, inputFile, cl.outputfile)
2741 inputs.file(inputFile)
2742 outputs.files(outputFiles)
2746 task jalviewjsSyncCore (type: Sync) {
2747 dependsOn jalviewjsBuildAllCores
2748 dependsOn jalviewjsPublishCoreTemplates
2749 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
2750 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2754 def outputFiles = []
2755 rename { filename ->
2756 outputFiles += "${outputDir}/${filename}"
2762 outputs.files outputFiles
2763 inputs.files inputFiles
2767 // this Copy version of TransferSiteJs will delete anything else in the target dir
2768 task jalviewjsCopyTransferSiteJs(type: Copy) {
2769 dependsOn jalviewjsTranspile
2770 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2771 into "${jalviewDir}/${jalviewjsSiteDir}"
2775 // this Sync version of TransferSite is used by buildship to keep the website automatically up to date when a file changes
2776 task jalviewjsSyncTransferSiteJs(type: Sync) {
2777 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2779 into "${jalviewDir}/${jalviewjsSiteDir}"
2786 jalviewjsSyncAllLibs.mustRunAfter jalviewjsCopyTransferSiteJs
2787 jalviewjsSyncResources.mustRunAfter jalviewjsCopyTransferSiteJs
2788 jalviewjsSyncSiteResources.mustRunAfter jalviewjsCopyTransferSiteJs
2789 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsCopyTransferSiteJs
2791 jalviewjsSyncAllLibs.mustRunAfter jalviewjsSyncTransferSiteJs
2792 jalviewjsSyncResources.mustRunAfter jalviewjsSyncTransferSiteJs
2793 jalviewjsSyncSiteResources.mustRunAfter jalviewjsSyncTransferSiteJs
2794 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
2797 task jalviewjsPrepareSite {
2799 description "Prepares the website folder including unzipping files and copying resources"
2800 dependsOn jalviewjsSyncAllLibs
2801 dependsOn jalviewjsSyncResources
2802 dependsOn jalviewjsSyncSiteResources
2803 dependsOn jalviewjsSyncBuildProperties
2804 dependsOn jalviewjsSyncCore
2808 task jalviewjsBuildSite {
2810 description "Builds the whole website including transpiled code"
2811 dependsOn jalviewjsCopyTransferSiteJs
2812 dependsOn jalviewjsPrepareSite
2816 task cleanJalviewjsTransferSite {
2818 delete "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2819 delete "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2820 delete "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2821 delete "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2826 task cleanJalviewjsSite {
2827 dependsOn cleanJalviewjsTransferSite
2829 delete "${jalviewDir}/${jalviewjsSiteDir}"
2834 task jalviewjsSiteTar(type: Tar) {
2836 description "Creates a tar.gz file for the website"
2837 dependsOn jalviewjsBuildSite
2838 def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
2839 archiveFileName = outputFilename
2841 compression Compression.GZIP
2843 from "${jalviewDir}/${jalviewjsSiteDir}"
2844 into jalviewjs_site_dir // this is inside the tar file
2846 inputs.dir("${jalviewDir}/${jalviewjsSiteDir}")
2850 task jalviewjsServer {
2852 def filename = "jalviewjsTest.html"
2853 description "Starts a webserver on localhost to test the website. See ${filename} to access local site on most recently used port."
2854 def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
2857 SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory()
2858 def port = Integer.valueOf(jalviewjs_server_port)
2863 while(port < start+1000 && !running) {
2865 def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}")
2866 jalviewjsServer = factory.start(doc_root, port)
2868 url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource)
2869 println("SERVER STARTED with document root ${doc_root}.")
2870 println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).")
2871 println("For debug: "+url+"?j2sdebug")
2872 println("For verbose: "+url+"?j2sverbose")
2873 } catch (Exception e) {
2878 <p><a href="${url}">JalviewJS Test. <${url}></a></p>
2879 <p><a href="${url}?j2sdebug">JalviewJS Test with debug. <${url}?j2sdebug></a></p>
2880 <p><a href="${url}?j2sverbose">JalviewJS Test with verbose. <${url}?j2sdebug></a></p>
2882 jalviewjsCoreClasslists.each { cl ->
2883 def urlcore = jalviewjsServer.getResourceUrl(file(cl.outputfile).getName())
2885 <p><a href="${urlcore}">${jalviewjsJalviewTemplateName} [core ${cl.name}]. <${urlcore}></a></p>
2887 println("For core ${cl.name}: "+urlcore)
2890 file(htmlFile).text = htmlText
2893 outputs.file(htmlFile)
2894 outputs.upToDateWhen({false})
2898 task cleanJalviewjsAll {
2900 description "Delete all configuration and build artifacts to do with JalviewJS build"
2901 dependsOn cleanJalviewjsSite
2902 dependsOn jalviewjsEclipsePaths
2905 delete "${jalviewDir}/${jalviewjsBuildDir}"
2906 delete "${jalviewDir}/${eclipse_bin_dir}"
2907 if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
2908 delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
2910 delete "${jalviewDir}/${jalviewjs_j2s_settings}"
2913 outputs.upToDateWhen( { false } )
2917 task jalviewjsIDE_checkJ2sPlugin {
2918 group "00 JalviewJS in Eclipse"
2919 description "Compare the swingjs/net.sf.j2s.core(-j11)?.jar file with the Eclipse IDE's plugin version (found in the 'dropins' dir)"
2922 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2923 def j2sPluginFile = file(j2sPlugin)
2924 def eclipseHome = System.properties["eclipse.home.location"]
2925 if (eclipseHome == null || ! IN_ECLIPSE) {
2926 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. Skipping J2S Plugin Check.")
2928 def eclipseJ2sPluginDirs = [ "${eclipseHome}/dropins" ]
2929 def altPluginsDir = System.properties["org.eclipse.equinox.p2.reconciler.dropins.directory"]
2930 if (altPluginsDir != null && file(altPluginsDir).exists()) {
2931 eclipseJ2sPluginDirs += altPluginsDir
2933 def foundPlugin = false
2934 def j2sPluginFileName = j2sPluginFile.getName()
2935 def eclipseJ2sPlugin
2936 def eclipseJ2sPluginFile
2937 eclipseJ2sPluginDirs.any { dir ->
2938 eclipseJ2sPlugin = "${dir}/${j2sPluginFileName}"
2939 eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2940 if (eclipseJ2sPluginFile.exists()) {
2946 def msg = "Eclipse J2S Plugin is not installed (could not find '${j2sPluginFileName}' in\n"+eclipseJ2sPluginDirs.join("\n")+"\n)\nTry running task jalviewjsIDE_copyJ2sPlugin"
2947 System.err.println(msg)
2948 throw new StopExecutionException(msg)
2951 def digest = MessageDigest.getInstance("MD5")
2953 digest.update(j2sPluginFile.text.bytes)
2954 def j2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2956 digest.update(eclipseJ2sPluginFile.text.bytes)
2957 def eclipseJ2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2959 if (j2sPluginMd5 != eclipseJ2sPluginMd5) {
2960 def msg = "WARNING! Eclipse J2S Plugin '${eclipseJ2sPlugin}' is different to this commit's version '${j2sPlugin}'"
2961 System.err.println(msg)
2962 throw new StopExecutionException(msg)
2964 def msg = "Eclipse J2S Plugin '${eclipseJ2sPlugin}' is the same as '${j2sPlugin}' (this is good)"
2970 task jalviewjsIDE_copyJ2sPlugin {
2971 group "00 JalviewJS in Eclipse"
2972 description "Copy the swingjs/net.sf.j2s.core(-j11)?.jar file into the Eclipse IDE's 'dropins' dir"
2975 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2976 def j2sPluginFile = file(j2sPlugin)
2977 def eclipseHome = System.properties["eclipse.home.location"]
2978 if (eclipseHome == null || ! IN_ECLIPSE) {
2979 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. NOT copying J2S Plugin.")
2981 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
2982 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2983 def msg = "WARNING! Copying this commit's j2s plugin '${j2sPlugin}' to Eclipse J2S Plugin '${eclipseJ2sPlugin}'\n* May require an Eclipse restart"
2984 System.err.println(msg)
2987 eclipseJ2sPluginFile.getParentFile().mkdirs()
2988 into eclipseJ2sPluginFile.getParent()
2994 task jalviewjsIDE_j2sFile {
2995 group "00 JalviewJS in Eclipse"
2996 description "Creates the .j2s file"
2997 dependsOn jalviewjsCreateJ2sSettings
3001 task jalviewjsIDE_SyncCore {
3002 group "00 JalviewJS in Eclipse"
3003 description "Build the core js lib closures listed in the classlists dir and publish core html from template"
3004 dependsOn jalviewjsSyncCore
3008 task jalviewjsIDE_SyncSiteAll {
3009 dependsOn jalviewjsSyncAllLibs
3010 dependsOn jalviewjsSyncResources
3011 dependsOn jalviewjsSyncSiteResources
3012 dependsOn jalviewjsSyncBuildProperties
3016 cleanJalviewjsTransferSite.mustRunAfter jalviewjsIDE_SyncSiteAll
3019 task jalviewjsIDE_PrepareSite {
3020 group "00 JalviewJS in Eclipse"
3021 description "Sync libs and resources to site dir, but not closure cores"
3023 dependsOn jalviewjsIDE_SyncSiteAll
3024 //dependsOn cleanJalviewjsTransferSite // not sure why this clean is here -- will slow down a re-run of this task
3028 task jalviewjsIDE_AssembleSite {
3029 group "00 JalviewJS in Eclipse"
3030 description "Assembles unzipped supporting zipfiles, resources, site resources and closure cores into the Eclipse transpiled site"
3031 dependsOn jalviewjsPrepareSite
3035 task jalviewjsIDE_SiteClean {
3036 group "00 JalviewJS in Eclipse"
3037 description "Deletes the Eclipse transpiled site"
3038 dependsOn cleanJalviewjsSite
3042 task jalviewjsIDE_Server {
3043 group "00 JalviewJS in Eclipse"
3044 description "Starts a webserver on localhost to test the website"
3045 dependsOn jalviewjsServer
3049 // buildship runs this at import or gradle refresh
3050 task eclipseSynchronizationTask {
3051 //dependsOn eclipseSetup
3052 dependsOn createBuildProperties
3054 dependsOn jalviewjsIDE_j2sFile
3055 dependsOn jalviewjsIDE_checkJ2sPlugin
3056 dependsOn jalviewjsIDE_PrepareSite
3061 // buildship runs this at build time or project refresh
3062 task eclipseAutoBuildTask {
3063 //dependsOn jalviewjsIDE_checkJ2sPlugin
3064 //dependsOn jalviewjsIDE_PrepareSite
3070 description "Build the site"
3071 dependsOn jalviewjsBuildSite