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.10'
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", "jalviewjs", "jalviewjs-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 channelPropsFile = string("${channelDir}/${resource_dir}/${channel_props}")
106 overrideProperties(channelGradleProperties, false)
107 // local build environment properties
108 // can be "projectDir/local.properties"
109 overrideProperties("${projectDir}/local.properties", true)
110 // or "../projectDir_local.properties"
111 overrideProperties(projectDir.getParent() + "/" + projectDir.getName() + "_local.properties", true)
114 // Import releaseProps from the RELEASE file
115 // or a file specified via JALVIEW_RELEASE_FILE if defined
116 // Expect jalview.version and target release branch in jalview.release
117 def releaseProps = new Properties();
118 def releasePropFile = findProperty("JALVIEW_RELEASE_FILE");
119 def defaultReleasePropFile = "${jalviewDirAbsolutePath}/RELEASE";
121 (new File(releasePropFile!=null ? releasePropFile : defaultReleasePropFile)).withInputStream {
122 releaseProps.load(it)
124 } catch (Exception fileLoadError) {
125 throw new Error("Couldn't load release properties file "+(releasePropFile==null ? defaultReleasePropFile : "from custom location: releasePropFile"),fileLoadError);
128 // Set JALVIEW_VERSION if it is not already set
129 if (findProperty("JALVIEW_VERSION")==null || "".equals(JALVIEW_VERSION)) {
130 JALVIEW_VERSION = releaseProps.get("jalview.version")
133 // this property set when running Eclipse headlessly
134 j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild")
135 // this property set by Eclipse
136 eclipseApplicationProperty = string("eclipse.application")
137 // CHECK IF RUNNING FROM WITHIN ECLIPSE
138 def eclipseApplicationPropertyVal = System.properties[eclipseApplicationProperty]
139 IN_ECLIPSE = eclipseApplicationPropertyVal != null && eclipseApplicationPropertyVal.startsWith("org.eclipse.ui.")
140 // BUT WITHOUT THE HEADLESS BUILD PROPERTY SET
141 if (System.properties[j2sHeadlessBuildProperty].equals("true")) {
142 println("Setting IN_ECLIPSE to ${IN_ECLIPSE} as System.properties['${j2sHeadlessBuildProperty}'] == '${System.properties[j2sHeadlessBuildProperty]}'")
146 println("WITHIN ECLIPSE IDE")
148 println("HEADLESS BUILD")
151 J2S_ENABLED = (project.hasProperty('j2s.compiler.status') && project['j2s.compiler.status'] != null && project['j2s.compiler.status'] == "enable")
153 println("J2S ENABLED")
156 System.properties.sort { it.key }.each {
157 key, val -> println("SYSTEM PROPERTY ${key}='${val}'")
160 if (false && IN_ECLIPSE) {
161 jalviewDir = jalviewDirAbsolutePath
166 buildDate = new Date().format("yyyyMMdd")
169 bareSourceDir = string(source_dir)
170 sourceDir = string("${jalviewDir}/${bareSourceDir}")
171 resourceDir = string("${jalviewDir}/${resource_dir}")
172 bareTestSourceDir = string(test_source_dir)
173 testDir = string("${jalviewDir}/${bareTestSourceDir}")
175 classesDir = string("${jalviewDir}/${classes_dir}")
178 useClover = clover.equals("true")
179 cloverBuildDir = "${buildDir}/clover"
180 cloverInstrDir = file("${cloverBuildDir}/clover-instr")
181 cloverClassesDir = file("${cloverBuildDir}/clover-classes")
182 cloverReportDir = file("${buildDir}/reports/clover")
183 cloverTestInstrDir = file("${cloverBuildDir}/clover-test-instr")
184 cloverTestClassesDir = file("${cloverBuildDir}/clover-test-classes")
185 //cloverTestClassesDir = cloverClassesDir
186 cloverDb = string("${cloverBuildDir}/clover.db")
188 testSourceDir = useClover ? cloverTestInstrDir : testDir
189 testClassesDir = useClover ? cloverTestClassesDir : "${jalviewDir}/${test_output_dir}"
191 getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}")
193 buildProperties = null
195 // the following values might be overridden by the CHANNEL switch
196 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
197 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
198 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}")
199 getdownAppDistDir = getdown_app_dir_alt
200 getdownImagesDir = string("${jalviewDir}/${getdown_images_dir}")
201 getdownSetAppBaseProperty = false // whether to pass the appbase and appdistdir to the application
202 reportRsyncCommand = false
203 jvlChannelName = CHANNEL.toLowerCase()
204 install4jSuffix = CHANNEL.substring(0, 1).toUpperCase() + CHANNEL.substring(1).toLowerCase(); // BUILD -> Build
205 install4jDMGDSStore = "${install4j_images_dir}/${install4j_dmg_ds_store}"
206 install4jDMGBackgroundImage = "${install4j_images_dir}/${install4j_dmg_background}"
207 install4jInstallerName = "${jalview_name} Non-Release Installer"
208 install4jExecutableName = jalview_name.replaceAll("[^\\w]+", "_").toLowerCase()
209 install4jExtraScheme = "jalviewx"
210 install4jMacIconsFile = string("${install4j_images_dir}/${install4j_mac_icons_file}")
211 install4jWindowsIconsFile = string("${install4j_images_dir}/${install4j_windows_icons_file}")
212 install4jPngIconFile = string("${install4j_images_dir}/${install4j_png_icon_file}")
213 install4jBackground = string("${install4j_images_dir}/${install4j_background}")
217 // TODO: get bamboo build artifact URL for getdown artifacts
218 getdown_channel_base = bamboo_channelbase
219 getdownChannelName = string("${bamboo_planKey}/${JAVA_VERSION}")
220 getdownAppBase = string("${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}")
221 jvlChannelName += "_${getdownChannelName}"
222 // automatically add the test group Not-bamboo for exclusion
223 if ("".equals(testng_excluded_groups)) {
224 testng_excluded_groups = "Not-bamboo"
226 install4jExtraScheme = "jalviewb"
229 case [ "RELEASE", "JALVIEWJS-RELEASE" ]:
230 getdownAppDistDir = getdown_app_dir_release
231 reportRsyncCommand = true
233 install4jInstallerName = "${jalview_name} Installer"
237 getdownChannelName = CHANNEL.toLowerCase()+"/${JALVIEW_VERSION}"
238 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
239 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
240 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
241 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
243 package_dir = string("${ARCHIVEDIR}/${package_dir}")
244 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
247 reportRsyncCommand = true
248 install4jExtraScheme = "jalviewa"
252 getdownChannelName = string("archive/${JALVIEW_VERSION}")
253 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
254 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
255 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
256 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
258 package_dir = string("${ARCHIVEDIR}/${package_dir}")
259 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
262 reportRsyncCommand = true
263 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
264 install4jSuffix = "Archive"
265 install4jExtraScheme = "jalviewa"
269 reportRsyncCommand = true
270 getdownSetAppBaseProperty = true
271 // DEVELOP-RELEASE is usually associated with a Jalview release series so set the version
272 JALVIEW_VERSION=JALVIEW_VERSION+"-d${buildDate}"
274 install4jSuffix = "Develop"
275 install4jExtraScheme = "jalviewd"
276 install4jInstallerName = "${jalview_name} Develop Installer"
280 reportRsyncCommand = true
281 // Don't ignore transpile errors for release build
282 if (jalviewjs_ignore_transpile_errors.equals("true")) {
283 jalviewjs_ignore_transpile_errors = "false"
284 println("Setting jalviewjs_ignore_transpile_errors to 'false'")
286 JALVIEW_VERSION = JALVIEW_VERSION+"-test"
287 install4jSuffix = "Test"
288 install4jExtraScheme = "jalviewt"
289 install4jInstallerName = "${jalview_name} Test Installer"
292 case ~/^SCRATCH(|-[-\w]*)$/:
293 getdownChannelName = CHANNEL
294 JALVIEW_VERSION = JALVIEW_VERSION+"-"+CHANNEL
296 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
297 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
298 reportRsyncCommand = true
299 install4jSuffix = "Scratch"
303 if (!file("${LOCALDIR}").exists()) {
304 throw new GradleException("Must provide a LOCALDIR value to produce a local distribution")
306 getdownAppBase = file(file("${LOCALDIR}").getAbsolutePath()).toURI().toString()
307 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
309 JALVIEW_VERSION = "TEST"
310 install4jSuffix = "Test-Local"
311 install4jExtraScheme = "jalviewt"
312 install4jInstallerName = "${jalview_name} Test Installer"
315 case [ "LOCAL", "JALVIEWJS" ]:
316 JALVIEW_VERSION = "TEST"
317 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
318 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
319 install4jExtraScheme = "jalviewl"
322 default: // something wrong specified
323 throw new GradleException("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
327 // override getdownAppBase if requested
328 if (findProperty("getdown_appbase_override") != null) {
329 // revert to LOCAL if empty string
330 if (string(getdown_appbase_override) == "") {
331 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
332 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
333 } else if (string(getdown_appbase_override).startsWith("file://")) {
334 getdownAppBase = string(getdown_appbase_override)
335 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
337 getdownAppBase = string(getdown_appbase_override)
339 println("Overriding getdown appbase with '${getdownAppBase}'")
341 // sanitise file name for jalview launcher file for this channel
342 jvlChannelName = jvlChannelName.replaceAll("[^\\w\\-]+", "_")
343 // install4j application and folder names
344 if (install4jSuffix == "") {
345 install4jApplicationName = "${jalview_name}"
346 install4jBundleId = "${install4j_bundle_id}"
347 install4jWinApplicationId = install4j_release_win_application_id
349 install4jApplicationName = "${jalview_name} ${install4jSuffix}"
350 install4jBundleId = "${install4j_bundle_id}-" + install4jSuffix.toLowerCase()
351 // add int hash of install4jSuffix to the last part of the application_id
352 def id = install4j_release_win_application_id
353 def idsplitreverse = id.split("-").reverse()
354 idsplitreverse[0] = idsplitreverse[0].toInteger() + install4jSuffix.hashCode()
355 install4jWinApplicationId = idsplitreverse.reverse().join("-")
357 // sanitise folder and id names
358 // install4jApplicationFolder = e.g. "Jalview Build"
359 install4jApplicationFolder = install4jApplicationName
360 .replaceAll("[\"'~:/\\\\\\s]", "_") // replace all awkward filename chars " ' ~ : / \
361 .replaceAll("_+", "_") // collapse __
362 install4jInternalId = install4jApplicationName
364 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
365 .replaceAll("_+", "") // collapse __
366 //.replaceAll("_*-_*", "-") // collapse _-_
367 install4jUnixApplicationFolder = install4jApplicationName
369 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
370 .replaceAll("_+", "_") // collapse __
371 .replaceAll("_*-_*", "-") // collapse _-_
374 getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}")
375 //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
376 getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}")
377 getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}")
378 getdownFilesDir = string("${jalviewDir}/${getdown_files_dir}/${JAVA_VERSION}/")
379 getdownFilesInstallDir = string("${getdownFilesDir}/${getdown_install_dir}")
380 /* compile without modules -- using classpath libraries
381 modules_compileClasspath = fileTree(dir: "${jalviewDir}/${j11modDir}", include: ["*.jar"])
382 modules_runtimeClasspath = modules_compileClasspath
384 def details = versionDetails()
385 gitHash = details.gitHash
386 gitBranch = details.branchName
388 println("Using a ${CHANNEL} profile.")
390 additional_compiler_args = []
391 // configure classpath/args for j8/j11 compilation
392 if (JAVA_VERSION.equals("1.8")) {
393 JAVA_INTEGER_VERSION = string("8")
396 libDistDir = j8libDir
397 compile_source_compatibility = 1.8
398 compile_target_compatibility = 1.8
399 // these are getdown.txt properties defined dependent on the JAVA_VERSION
400 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java8_min_version"))
401 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java8_max_version"))
402 // this property is assigned below and expanded to multiple lines in the getdown task
403 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java8_txt_multi_java_location"))
404 // this property is for the Java library used in eclipse
405 eclipseJavaRuntimeName = string("JavaSE-1.8")
406 } else if (JAVA_VERSION.equals("11")) {
407 JAVA_INTEGER_VERSION = string("11")
409 libDistDir = j11libDir
410 compile_source_compatibility = 11
411 compile_target_compatibility = 11
412 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
413 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
414 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
415 eclipseJavaRuntimeName = string("JavaSE-11")
416 /* compile without modules -- using classpath libraries
417 additional_compiler_args += [
418 '--module-path', modules_compileClasspath.asPath,
419 '--add-modules', j11modules
422 } else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) {
423 JAVA_INTEGER_VERSION = JAVA_VERSION
425 libDistDir = j11libDir
426 compile_source_compatibility = JAVA_VERSION
427 compile_target_compatibility = JAVA_VERSION
428 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
429 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
430 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
431 eclipseJavaRuntimeName = string("JavaSE-11")
432 /* compile without modules -- using classpath libraries
433 additional_compiler_args += [
434 '--module-path', modules_compileClasspath.asPath,
435 '--add-modules', j11modules
439 throw new GradleException("JAVA_VERSION=${JAVA_VERSION} not currently supported by Jalview")
444 JAVA_MIN_VERSION = JAVA_VERSION
445 JAVA_MAX_VERSION = JAVA_VERSION
446 def jreInstallsDir = string(jre_installs_dir)
447 if (jreInstallsDir.startsWith("~/")) {
448 jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1)
450 macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre")
451 macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz")
452 windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
453 windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz")
454 linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
455 linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-linux-x64.tar.gz")
456 install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
457 install4jConfFileName = string("jalview-install4j-conf.install4j")
458 install4jConfFile = file("${install4jDir}/${install4jConfFileName}")
459 install4jHomeDir = install4j_home_dir
460 if (install4jHomeDir.startsWith("~/")) {
461 install4jHomeDir = System.getProperty("user.home") + install4jHomeDir.substring(1)
464 resourceBuildDir = string("${buildDir}/resources")
465 resourcesBuildDir = string("${resourceBuildDir}/resources_build")
466 helpBuildDir = string("${resourceBuildDir}/help_build")
467 docBuildDir = string("${resourceBuildDir}/doc_build")
469 if (buildProperties == null) {
470 buildProperties = string("${resourcesBuildDir}/${build_properties_file}")
472 buildingHTML = string("${jalviewDir}/${doc_dir}/building.html")
473 helpParentDir = string("${jalviewDir}/${help_parent_dir}")
474 helpSourceDir = string("${helpParentDir}/${help_dir}")
475 helpFile = string("${helpBuildDir}/${help_dir}/help.jhm")
478 relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
479 jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs")
480 jalviewjsSiteDir = string("${jalviewjsBuildDir}/${jalviewjs_site_dir}")
482 jalviewjsTransferSiteJsDir = string(jalviewjsSiteDir)
484 jalviewjsTransferSiteJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_js")
486 jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
487 jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
488 jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
489 jalviewjsJalviewCoreHtmlFile = string("")
490 jalviewjsJalviewCoreName = string(jalviewjs_core_name)
491 jalviewjsCoreClasslists = []
492 jalviewjsJalviewTemplateName = string(jalviewjs_name)
493 jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}")
494 jalviewjsJ2sAltSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_alt_settings}")
495 jalviewjsJ2sProps = null
496 jalviewjsJ2sPlugin = jalviewjs_j2s_plugin
498 eclipseWorkspace = null
499 eclipseBinary = string("")
500 eclipseVersion = string("")
510 outputDir = file(classesDir)
514 srcDirs = [ resourcesBuildDir, docBuildDir, helpBuildDir ]
517 compileClasspath = files(sourceSets.main.java.outputDir)
518 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
520 runtimeClasspath = compileClasspath
521 runtimeClasspath += files(sourceSets.main.resources.srcDirs)
526 srcDirs cloverInstrDir
527 outputDir = cloverClassesDir
531 srcDirs = sourceSets.main.resources.srcDirs
534 compileClasspath = files( sourceSets.clover.java.outputDir )
535 //compileClasspath += files( testClassesDir )
536 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
537 compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
538 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
540 runtimeClasspath = compileClasspath
545 srcDirs testSourceDir
546 outputDir = file(testClassesDir)
550 srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs
553 compileClasspath = files( sourceSets.test.java.outputDir )
554 compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath
555 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
557 runtimeClasspath = compileClasspath
558 runtimeClasspath += files(sourceSets.test.resources.srcDirs)
564 // eclipse project and settings files creation, also used by buildship
567 name = eclipse_project_name
569 natures 'org.eclipse.jdt.core.javanature',
570 'org.eclipse.jdt.groovy.core.groovyNature',
571 'org.eclipse.buildship.core.gradleprojectnature'
573 buildCommand 'org.eclipse.jdt.core.javabuilder'
574 buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
578 //defaultOutputDir = sourceSets.main.java.outputDir
579 configurations.each{ c->
580 if (c.isCanBeResolved()) {
581 minusConfigurations += [c]
585 plusConfigurations = [ ]
589 def removeTheseToo = []
590 HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
591 cp.entries.each { entry ->
592 // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test".
593 // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover
594 // we add the resources and help/help dirs in as libs afterwards (see below)
595 if (entry.kind == 'src') {
596 if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) {
597 removeTheseToo += entry
599 alreadyAddedSrcPath.putAt(entry.path, true)
604 cp.entries.removeAll(removeTheseToo)
606 //cp.entries += new Output("${eclipse_bin_dir}/main")
607 if (file(helpParentDir).isDirectory()) {
608 cp.entries += new Library(fileReference(helpParentDir))
610 if (file(resourceDir).isDirectory()) {
611 cp.entries += new Library(fileReference(resourceDir))
614 HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
616 sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
617 //don't want to add outputDir as eclipse is using its own output dir in bin/main
618 if (it.isDirectory() || ! it.exists()) {
619 // don't add dirs to classpath, especially if they don't exist
620 return false // groovy "continue" in .any closure
622 def itPath = it.toString()
623 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
624 // make relative path
625 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
627 if (alreadyAddedLibPath.get(itPath)) {
628 //println("Not adding duplicate entry "+itPath)
630 //println("Adding entry "+itPath)
631 cp.entries += new Library(fileReference(itPath))
632 alreadyAddedLibPath.put(itPath, true)
636 sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
637 //no longer want to add outputDir as eclipse is using its own output dir in bin/main
638 if (it.isDirectory() || ! it.exists()) {
639 // don't add dirs to classpath
640 return false // groovy "continue" in .any closure
643 def itPath = it.toString()
644 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
645 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
647 if (alreadyAddedLibPath.get(itPath)) {
650 def lib = new Library(fileReference(itPath))
651 lib.entryAttributes["test"] = "true"
653 alreadyAddedLibPath.put(itPath, true)
661 containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
666 // for the IDE, use java 11 compatibility
667 sourceCompatibility = compile_source_compatibility
668 targetCompatibility = compile_target_compatibility
669 javaRuntimeName = eclipseJavaRuntimeName
671 // add in jalview project specific properties/preferences into eclipse core preferences
673 withProperties { props ->
674 def jalview_prefs = new Properties()
675 def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}")
676 jalview_prefs.load(ins)
678 jalview_prefs.forEach { t, v ->
679 if (props.getAt(t) == null) {
683 // codestyle file -- overrides previous formatter prefs
684 def csFile = file("${jalviewDirAbsolutePath}/${eclipse_codestyle_file}")
685 if (csFile.exists()) {
686 XmlParser parser = new XmlParser()
687 def profiles = parser.parse(csFile)
688 def profile = profiles.'profile'.find { p -> (p.'@kind' == "CodeFormatterProfile" && p.'@name' == "Jalview") }
689 if (profile != null) {
690 profile.'setting'.each { s ->
692 def value = s.'@value'
693 if (id != null && value != null) {
694 props.putAt(id, value)
705 // Don't want these to be activated if in headless build
706 synchronizationTasks "eclipseSynchronizationTask"
707 //autoBuildTasks "eclipseAutoBuildTask"
713 /* hack to change eclipse prefs in .settings files other than org.eclipse.jdt.core.prefs */
714 // Class to allow updating arbitrary properties files
715 class PropertiesFile extends PropertiesPersistableConfigurationObject {
716 public PropertiesFile(PropertiesTransformer t) { super(t); }
717 @Override protected void load(Properties properties) { }
718 @Override protected void store(Properties properties) { }
719 @Override protected String getDefaultResourceName() { return ""; }
720 // This is necessary, because PropertiesPersistableConfigurationObject fails
721 // if no default properties file exists.
722 @Override public void loadDefaults() { load(new StringBufferInputStream("")); }
725 // Task to update arbitrary properties files (set outputFile)
726 class PropertiesFileTask extends PropertiesGeneratorTask<PropertiesFile> {
727 private final PropertiesFileContentMerger file;
728 public PropertiesFileTask() { file = new PropertiesFileContentMerger(getTransformer()); }
729 protected PropertiesFile create() { return new PropertiesFile(getTransformer()); }
730 protected void configure(PropertiesFile props) {
731 file.getBeforeMerged().execute(props); file.getWhenMerged().execute(props);
733 public void file(Closure closure) { ConfigureUtil.configure(closure, file); }
736 task eclipseUIPreferences(type: PropertiesFileTask) {
737 description = "Generate Eclipse additional settings"
738 def filename = "org.eclipse.jdt.ui.prefs"
739 outputFile = "$projectDir/.settings/${filename}" as File
742 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
747 task eclipseGroovyCorePreferences(type: PropertiesFileTask) {
748 description = "Generate Eclipse additional settings"
749 def filename = "org.eclipse.jdt.groovy.core.prefs"
750 outputFile = "$projectDir/.settings/${filename}" as File
753 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
758 task eclipseAllPreferences {
760 dependsOn eclipseUIPreferences
761 dependsOn eclipseGroovyCorePreferences
764 eclipseUIPreferences.mustRunAfter eclipseJdt
765 eclipseGroovyCorePreferences.mustRunAfter eclipseJdt
767 /* end of eclipse preferences hack */
775 delete cloverBuildDir
776 delete cloverReportDir
781 task cloverInstrJava(type: JavaExec) {
782 group = "Verification"
783 description = "Create clover instrumented source java files"
785 dependsOn cleanClover
787 inputs.files(sourceSets.main.allJava)
788 outputs.dir(cloverInstrDir)
790 //classpath = fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
791 classpath = sourceSets.clover.compileClasspath
792 main = "com.atlassian.clover.CloverInstr"
800 cloverInstrDir.getPath(),
802 def srcFiles = sourceSets.main.allJava.files
805 { file -> file.absolutePath }
808 args argsList.toArray()
811 delete cloverInstrDir
812 println("Clover: About to instrument "+srcFiles.size() +" files")
817 task cloverInstrTests(type: JavaExec) {
818 group = "Verification"
819 description = "Create clover instrumented source test files"
821 dependsOn cleanClover
823 inputs.files(testDir)
824 outputs.dir(cloverTestInstrDir)
826 classpath = sourceSets.clover.compileClasspath
827 main = "com.atlassian.clover.CloverInstr"
837 cloverTestInstrDir.getPath(),
839 args argsList.toArray()
842 delete cloverTestInstrDir
843 println("Clover: About to instrument test files")
849 group = "Verification"
850 description = "Create clover instrumented all source files"
852 dependsOn cloverInstrJava
853 dependsOn cloverInstrTests
857 cloverClasses.dependsOn cloverInstr
860 task cloverConsoleReport(type: JavaExec) {
861 group = "Verification"
862 description = "Creates clover console report"
865 file(cloverDb).exists()
868 inputs.dir cloverClassesDir
870 classpath = sourceSets.clover.runtimeClasspath
871 main = "com.atlassian.clover.reporters.console.ConsoleReporter"
873 if (cloverreport_mem.length() > 0) {
874 maxHeapSize = cloverreport_mem
876 if (cloverreport_jvmargs.length() > 0) {
877 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
887 args argsList.toArray()
891 task cloverHtmlReport(type: JavaExec) {
892 group = "Verification"
893 description = "Creates clover HTML report"
896 file(cloverDb).exists()
899 def cloverHtmlDir = cloverReportDir
900 inputs.dir cloverClassesDir
901 outputs.dir cloverHtmlDir
903 classpath = sourceSets.clover.runtimeClasspath
904 main = "com.atlassian.clover.reporters.html.HtmlReporter"
906 if (cloverreport_mem.length() > 0) {
907 maxHeapSize = cloverreport_mem
909 if (cloverreport_jvmargs.length() > 0) {
910 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
921 if (cloverreport_html_options.length() > 0) {
922 argsList += cloverreport_html_options.split(" ")
925 args argsList.toArray()
929 task cloverXmlReport(type: JavaExec) {
930 group = "Verification"
931 description = "Creates clover XML report"
934 file(cloverDb).exists()
937 def cloverXmlFile = "${cloverReportDir}/clover.xml"
938 inputs.dir cloverClassesDir
939 outputs.file cloverXmlFile
941 classpath = sourceSets.clover.runtimeClasspath
942 main = "com.atlassian.clover.reporters.xml.XMLReporter"
944 if (cloverreport_mem.length() > 0) {
945 maxHeapSize = cloverreport_mem
947 if (cloverreport_jvmargs.length() > 0) {
948 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
959 if (cloverreport_xml_options.length() > 0) {
960 argsList += cloverreport_xml_options.split(" ")
963 args argsList.toArray()
968 group = "Verification"
969 description = "Creates clover reports"
971 dependsOn cloverXmlReport
972 dependsOn cloverHtmlReport
979 sourceCompatibility = compile_source_compatibility
980 targetCompatibility = compile_target_compatibility
981 options.compilerArgs += additional_compiler_args
982 print ("Setting target compatibility to "+targetCompatibility+"\n")
984 //classpath += configurations.cloverRuntime
990 // JBP->BS should the print statement in doFirst refer to compile_target_compatibility ?
991 sourceCompatibility = compile_source_compatibility
992 targetCompatibility = compile_target_compatibility
993 options.compilerArgs = additional_compiler_args
994 options.encoding = "UTF-8"
996 print ("Setting target compatibility to "+compile_target_compatibility+"\n")
1003 sourceCompatibility = compile_source_compatibility
1004 targetCompatibility = compile_target_compatibility
1005 options.compilerArgs = additional_compiler_args
1007 print ("Setting target compatibility to "+targetCompatibility+"\n")
1014 delete sourceSets.main.java.outputDir
1020 dependsOn cleanClover
1022 delete sourceSets.test.java.outputDir
1027 // format is a string like date.format("dd MMMM yyyy")
1028 def getDate(format) {
1029 def date = new Date()
1030 return date.format(format)
1034 def convertMdToHtml (FileTree mdFiles, File cssFile) {
1035 MutableDataSet options = new MutableDataSet()
1037 def extensions = new ArrayList<>()
1038 extensions.add(AnchorLinkExtension.create())
1039 extensions.add(AutolinkExtension.create())
1040 extensions.add(StrikethroughExtension.create())
1041 extensions.add(TaskListExtension.create())
1042 extensions.add(TablesExtension.create())
1043 extensions.add(TocExtension.create())
1045 options.set(Parser.EXTENSIONS, extensions)
1047 // set GFM table parsing options
1048 options.set(TablesExtension.WITH_CAPTION, false)
1049 options.set(TablesExtension.COLUMN_SPANS, false)
1050 options.set(TablesExtension.MIN_HEADER_ROWS, 1)
1051 options.set(TablesExtension.MAX_HEADER_ROWS, 1)
1052 options.set(TablesExtension.APPEND_MISSING_COLUMNS, true)
1053 options.set(TablesExtension.DISCARD_EXTRA_COLUMNS, true)
1054 options.set(TablesExtension.HEADER_SEPARATOR_COLUMN_MATCH, true)
1056 options.set(AnchorLinkExtension.ANCHORLINKS_SET_ID, false)
1057 options.set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor")
1058 options.set(AnchorLinkExtension.ANCHORLINKS_SET_NAME, true)
1059 options.set(AnchorLinkExtension.ANCHORLINKS_TEXT_PREFIX, "<span class=\"octicon octicon-link\"></span>")
1061 Parser parser = Parser.builder(options).build()
1062 HtmlRenderer renderer = HtmlRenderer.builder(options).build()
1064 mdFiles.each { mdFile ->
1065 // add table of contents
1066 def mdText = "[TOC]\n"+mdFile.text
1068 // grab the first top-level title
1070 def titleRegex = /(?m)^#(\s+|([^#]))(.*)/
1071 def matcher = mdText =~ titleRegex
1072 if (matcher.size() > 0) {
1073 // matcher[0][2] is the first character of the title if there wasn't any whitespace after the #
1074 title = (matcher[0][2] != null ? matcher[0][2] : "")+matcher[0][3]
1076 // or use the filename if none found
1077 if (title == null) {
1078 title = mdFile.getName()
1081 Node document = parser.parse(mdText)
1082 String htmlBody = renderer.render(document)
1083 def htmlText = '''<html>
1084 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1085 <html xmlns="http://www.w3.org/1999/xhtml">
1087 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1088 <meta http-equiv="Content-Style-Type" content="text/css" />
1089 <meta name="generator" content="flexmark" />
1091 htmlText += ((title != null) ? " <title>${title}</title>" : '' )
1093 <style type="text/css">code{white-space: pre;}</style>
1095 htmlText += ((cssFile != null) ? cssFile.text : '')
1096 htmlText += '''</head>
1099 htmlText += htmlBody
1105 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1106 def htmlFile = file(htmlFilePath)
1107 println("Creating ${htmlFilePath}")
1108 htmlFile.text = htmlText
1113 task copyDocs(type: Copy) {
1114 def inputDir = "${jalviewDir}/${doc_dir}"
1115 def outputDir = "${docBuildDir}/${doc_dir}"
1119 include('**/*.html')
1121 filter(ReplaceTokens,
1125 'Version-Rel': JALVIEW_VERSION,
1126 'Year-Rel': getDate("yyyy")
1133 exclude('**/*.html')
1138 inputs.dir(inputDir)
1139 outputs.dir(outputDir)
1143 task convertMdFiles {
1145 def mdFiles = fileTree(dir: docBuildDir, include: "**/*.md")
1146 def cssFile = file("${jalviewDir}/${flexmark_css}")
1149 convertMdToHtml(mdFiles, cssFile)
1152 inputs.files(mdFiles)
1153 inputs.file(cssFile)
1156 mdFiles.each { mdFile ->
1157 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1158 htmlFiles.add(file(htmlFilePath))
1160 outputs.files(htmlFiles)
1164 task copyHelp(type: Copy) {
1165 def inputDir = helpSourceDir
1166 def outputDir = "${helpBuildDir}/${help_dir}"
1170 include('**/*.html')
1174 filter(ReplaceTokens,
1178 'Version-Rel': JALVIEW_VERSION,
1179 'Year-Rel': getDate("yyyy")
1186 exclude('**/*.html')
1193 inputs.dir(inputDir)
1194 outputs.files(helpFile)
1195 outputs.dir(outputDir)
1199 task copyResources(type: Copy) {
1201 description = "Copy (and make text substitutions in) the resources dir to the build area"
1203 def inputDir = resourceDir
1204 def outputDir = resourcesBuildDir
1208 include('**/*.html')
1210 filter(ReplaceTokens,
1214 'Version-Rel': JALVIEW_VERSION,
1215 'Year-Rel': getDate("yyyy")
1222 exclude('**/*.html')
1227 inputs.dir(inputDir)
1228 outputs.dir(outputDir)
1231 task copyChannelResources(type: Copy) {
1232 dependsOn copyResources
1234 description = "Copy the channel resources dir to the build resources area"
1236 def inputDir = "${channelDir}/${resource_dir}"
1237 def outputDir = resourcesBuildDir
1241 inputs.dir(inputDir)
1242 outputs.dir(outputDir)
1245 task createBuildProperties(type: WriteProperties) {
1246 dependsOn copyResources
1248 description = "Create the ${buildProperties} file"
1250 inputs.dir(sourceDir)
1251 inputs.dir(resourcesBuildDir)
1252 outputFile (buildProperties)
1253 // taking time specific comment out to allow better incremental builds
1254 comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
1255 //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
1256 property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
1257 property "VERSION", JALVIEW_VERSION
1258 property "INSTALLATION", INSTALLATION+" git-commit:"+gitHash+" ["+gitBranch+"]"
1259 if (getdownSetAppBaseProperty) {
1260 property "GETDOWNAPPBASE", getdownAppBase
1261 property "GETDOWNAPPDISTDIR", getdownAppDistDir
1263 outputs.file(outputFile)
1267 task buildIndices(type: JavaExec) {
1269 classpath = sourceSets.main.compileClasspath
1270 main = "com.sun.java.help.search.Indexer"
1271 workingDir = "${helpBuildDir}/${help_dir}"
1274 inputs.dir("${workingDir}/${argDir}")
1276 outputs.dir("${classesDir}/doc")
1277 outputs.dir("${classesDir}/help")
1278 outputs.file("${workingDir}/JavaHelpSearch/DOCS")
1279 outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB")
1280 outputs.file("${workingDir}/JavaHelpSearch/OFFSETS")
1281 outputs.file("${workingDir}/JavaHelpSearch/POSITIONS")
1282 outputs.file("${workingDir}/JavaHelpSearch/SCHEMA")
1283 outputs.file("${workingDir}/JavaHelpSearch/TMAP")
1286 task buildResources {
1287 dependsOn copyResources
1288 dependsOn copyChannelResources
1289 dependsOn createBuildProperties
1293 dependsOn buildResources
1296 dependsOn convertMdFiles
1297 dependsOn buildIndices
1301 compileJava.dependsOn prepare
1302 run.dependsOn compileJava
1303 //run.dependsOn prepare
1306 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
1311 dependsOn cloverClasses
1313 dependsOn compileJava //?
1317 includeGroups testng_groups
1318 excludeGroups testng_excluded_groups
1320 useDefaultListeners=true
1323 maxHeapSize = "1024m"
1325 workingDir = jalviewDir
1326 def testLaf = project.findProperty("test_laf")
1327 if (testLaf != null) {
1328 println("Setting Test LaF to '${testLaf}'")
1329 systemProperty "laf", testLaf
1331 def testHiDPIScale = project.findProperty("test_HiDPIScale")
1332 if (testHiDPIScale != null) {
1333 println("Setting Test HiDPI Scale to '${testHiDPIScale}'")
1334 systemProperty "sun.java2d.uiScale", testHiDPIScale
1336 sourceCompatibility = compile_source_compatibility
1337 targetCompatibility = compile_target_compatibility
1338 jvmArgs += additional_compiler_args
1342 println("Running tests " + (useClover?"WITH":"WITHOUT") + " clover")
1348 task compileLinkCheck(type: JavaCompile) {
1350 classpath = files("${jalviewDir}/${utils_dir}")
1351 destinationDir = file("${jalviewDir}/${utils_dir}")
1352 source = fileTree(dir: "${jalviewDir}/${utils_dir}", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
1354 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1355 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1356 outputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.class")
1357 outputs.file("${jalviewDir}/${utils_dir}/BufferedLineReader.class")
1361 task linkCheck(type: JavaExec) {
1363 dependsOn compileLinkCheck
1365 def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
1366 classpath = files("${jalviewDir}/${utils_dir}")
1367 main = "HelpLinksChecker"
1368 workingDir = jalviewDir
1369 args = [ "${helpBuildDir}/${help_dir}", "-nointernet" ]
1371 def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
1373 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
1376 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
1380 inputs.dir(helpBuildDir)
1381 outputs.file(helpLinksCheckerOutFile)
1385 // import the pubhtmlhelp target
1386 ant.properties.basedir = "${jalviewDir}"
1387 ant.properties.helpBuildDir = "${helpBuildDir}/${help_dir}"
1388 ant.importBuild "${utils_dir}/publishHelp.xml"
1391 task cleanPackageDir(type: Delete) {
1393 delete fileTree(dir: "${jalviewDir}/${package_dir}", include: "*.jar")
1403 attributes "Main-Class": main_class,
1404 "Permissions": "all-permissions",
1405 "Application-Name": install4jApplicationName,
1406 "Codebase": application_codebase,
1407 "Implementation-Version": JALVIEW_VERSION
1410 def outputDir = "${jalviewDir}/${package_dir}"
1411 destinationDirectory = file(outputDir)
1412 archiveFileName = rootProject.name+".jar"
1418 exclude "**/*.jar.*"
1420 inputs.dir(sourceSets.main.java.outputDir)
1421 sourceSets.main.resources.srcDirs.each{ dir ->
1424 outputs.file("${outputDir}/${archiveFileName}")
1428 task copyJars(type: Copy) {
1429 from fileTree(dir: classesDir, include: "**/*.jar").files
1430 into "${jalviewDir}/${package_dir}"
1434 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
1435 task syncJars(type: Sync) {
1437 from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
1438 into "${jalviewDir}/${package_dir}"
1440 include jar.archiveFileName.getOrNull()
1447 description = "Put all required libraries in dist"
1448 // order of "cleanPackageDir", "copyJars", "jar" important!
1449 jar.mustRunAfter cleanPackageDir
1450 syncJars.mustRunAfter cleanPackageDir
1451 dependsOn cleanPackageDir
1454 outputs.dir("${jalviewDir}/${package_dir}")
1459 dependsOn cleanPackageDir
1466 group = "distribution"
1467 description = "Create a single jar file with all dependency libraries merged. Can be run with java -jar"
1471 from ("${jalviewDir}/${libDistDir}") {
1475 attributes "Implementation-Version": JALVIEW_VERSION,
1476 "Application-Name": install4jApplicationName
1478 mainClassName = shadow_jar_main_class
1480 classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
1485 task getdownWebsite() {
1486 group = "distribution"
1487 description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
1492 def getdownWebsiteResourceFilenames = []
1493 def getdownTextString = ""
1494 def getdownResourceDir = getdownResourceDir
1495 def getdownResourceFilenames = []
1498 // clean the getdown website and files dir before creating getdown folders
1499 delete getdownWebsiteDir
1500 delete getdownFilesDir
1503 from buildProperties
1504 rename(file(buildProperties).getName(), getdown_build_properties)
1507 getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
1510 from channelPropsFile
1511 into getdownWebsiteDir
1513 getdownWebsiteResourceFilenames += file(channelPropsFile).getName()
1515 // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
1516 def props = project.properties.sort { it.key }
1517 if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
1518 props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
1520 if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) {
1521 props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion)
1523 if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
1524 props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
1526 if (getdownImagesDir != null && file(getdownImagesDir).exists()) {
1527 props.put("getdown_txt_ui.background_image", "${getdownImagesDir}/${getdown_background_image}")
1528 props.put("getdown_txt_ui.instant_background_image", "${getdownImagesDir}/${getdown_instant_background_image}")
1529 props.put("getdown_txt_ui.error_background", "${getdownImagesDir}/${getdown_error_background}")
1530 props.put("getdown_txt_ui.progress_image", "${getdownImagesDir}/${getdown_progress_image}")
1531 props.put("getdown_txt_ui.icon", "${getdownImagesDir}/${getdown_icon}")
1532 props.put("getdown_txt_ui.mac_dock_icon", "${getdownImagesDir}/${getdown_mac_dock_icon}")
1535 props.put("getdown_txt_title", jalview_name)
1536 props.put("getdown_txt_ui.name", install4jApplicationName)
1538 // start with appbase
1539 getdownTextString += "appbase = ${getdownAppBase}\n"
1540 props.each{ prop, val ->
1541 if (prop.startsWith("getdown_txt_") && val != null) {
1542 if (prop.startsWith("getdown_txt_multi_")) {
1543 def key = prop.substring(18)
1544 val.split(",").each{ v ->
1545 def line = "${key} = ${v}\n"
1546 getdownTextString += line
1549 // file values rationalised
1550 if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
1552 if (val.indexOf('/') == 0) {
1555 } else if (val.indexOf('/') > 0) {
1556 // relative path (relative to jalviewDir)
1557 r = file( "${jalviewDir}/${val}" )
1560 val = "${getdown_resource_dir}/" + r.getName()
1561 getdownWebsiteResourceFilenames += val
1562 getdownResourceFilenames += r.getPath()
1565 if (! prop.startsWith("getdown_txt_resource")) {
1566 def line = prop.substring(12) + " = ${val}\n"
1567 getdownTextString += line
1573 getdownWebsiteResourceFilenames.each{ filename ->
1574 getdownTextString += "resource = ${filename}\n"
1576 getdownResourceFilenames.each{ filename ->
1579 into getdownResourceDir
1584 fileTree(file(package_dir)).each{ f ->
1585 if (f.isDirectory()) {
1586 def files = fileTree(dir: f, include: ["*"]).getFiles()
1588 } else if (f.exists()) {
1592 codeFiles.sort().each{f ->
1593 def name = f.getName()
1594 def line = "code = ${getdownAppDistDir}/${name}\n"
1595 getdownTextString += line
1602 // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
1604 if (JAVA_VERSION.equals("11")) {
1605 def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
1606 j11libFiles.sort().each{f ->
1607 def name = f.getName()
1608 def line = "code = ${getdown_j11lib_dir}/${name}\n"
1609 getdownTextString += line
1612 into getdownJ11libDir
1618 // 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.
1619 //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
1620 getdownTextString += "resource = ${getdown_launcher_new}\n"
1621 getdownTextString += "class = ${main_class}\n"
1622 // Not setting these properties in general so that getdownappbase and getdowndistdir will default to release version in jalview.bin.Cache
1623 if (getdownSetAppBaseProperty) {
1624 getdownTextString += "jvmarg = -Dgetdowndistdir=${getdownAppDistDir}\n"
1625 getdownTextString += "jvmarg = -Dgetdownappbase=${getdownAppBase}\n"
1628 def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
1629 getdown_txt.write(getdownTextString)
1631 def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
1632 def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
1633 launchJvl.write("appbase=${getdownAppBase}")
1635 // files going into the getdown website dir: getdown-launcher.jar
1637 from getdownLauncher
1638 rename(file(getdownLauncher).getName(), getdown_launcher_new)
1639 into getdownWebsiteDir
1642 // files going into the getdown website dir: getdown-launcher(-local).jar
1644 from getdownLauncher
1645 if (file(getdownLauncher).getName() != getdown_launcher) {
1646 rename(file(getdownLauncher).getName(), getdown_launcher)
1648 into getdownWebsiteDir
1651 // files going into the getdown website dir: ./install dir and files
1652 if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
1655 from getdownLauncher
1656 from "${getdownAppDir}/${getdown_build_properties}"
1657 if (file(getdownLauncher).getName() != getdown_launcher) {
1658 rename(file(getdownLauncher).getName(), getdown_launcher)
1660 into getdownInstallDir
1663 // and make a copy in the getdown files dir (these are not downloaded by getdown)
1665 from getdownInstallDir
1666 into getdownFilesInstallDir
1670 // files going into the getdown files dir: getdown.txt, getdown-launcher.jar, channel-launch.jvl, build_properties
1674 from getdownLauncher
1675 from "${getdownWebsiteDir}/${getdown_build_properties}"
1676 if (file(getdownLauncher).getName() != getdown_launcher) {
1677 rename(file(getdownLauncher).getName(), getdown_launcher)
1679 into getdownFilesDir
1682 // and ./resources (not all downloaded by getdown)
1684 from getdownResourceDir
1685 into "${getdownFilesDir}/${getdown_resource_dir}"
1690 inputs.dir("${jalviewDir}/${package_dir}")
1692 outputs.dir(getdownWebsiteDir)
1693 outputs.dir(getdownFilesDir)
1697 // a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir
1698 task getdownDigestDir(type: JavaExec) {
1700 description "A task to run a getdown Digest on a dir with getdown.txt. Provide a DIGESTDIR property via -PDIGESTDIR=..."
1702 def digestDirPropertyName = "DIGESTDIR"
1704 classpath = files(getdownLauncher)
1705 def digestDir = findProperty(digestDirPropertyName)
1706 if (digestDir == null) {
1707 throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest")
1711 main = "com.threerings.getdown.tools.Digester"
1715 task getdownDigest(type: JavaExec) {
1716 group = "distribution"
1717 description = "Digest the getdown website folder"
1718 dependsOn getdownWebsite
1720 classpath = files(getdownLauncher)
1722 main = "com.threerings.getdown.tools.Digester"
1723 args getdownWebsiteDir
1724 inputs.dir(getdownWebsiteDir)
1725 outputs.file("${getdownWebsiteDir}/digest2.txt")
1730 group = "distribution"
1731 description = "Create the minimal and full getdown app folder for installers and website and create digest file"
1732 dependsOn getdownDigest
1734 if (reportRsyncCommand) {
1735 def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
1736 def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
1737 println "LIKELY RSYNC COMMAND:"
1738 println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
1739 if (RUNRSYNC == "true") {
1741 commandLine "mkdir", "-p", toDir
1744 commandLine "rsync", "-avh", "--delete", fromDir, toDir
1752 tasks.withType(JavaCompile) {
1753 options.encoding = 'UTF-8'
1759 delete getdownWebsiteDir
1760 delete getdownFilesDir
1766 if (file(install4jHomeDir).exists()) {
1768 } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) {
1769 install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
1770 } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) {
1771 install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app"
1773 installDir(file(install4jHomeDir))
1775 mediaTypes = Arrays.asList(install4j_media_types.split(","))
1779 task copyInstall4jTemplate {
1780 def install4jTemplateFile = file("${install4jDir}/${install4j_template}")
1781 def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}")
1782 inputs.file(install4jTemplateFile)
1783 inputs.file(install4jFileAssociationsFile)
1784 inputs.property("CHANNEL", { CHANNEL })
1785 outputs.file(install4jConfFile)
1788 def install4jConfigXml = new XmlParser().parse(install4jTemplateFile)
1790 // turn off code signing if no OSX_KEYPASS
1791 if (OSX_KEYPASS == "") {
1792 install4jConfigXml.'**'.codeSigning.each { codeSigning ->
1793 codeSigning.'@macEnabled' = "false"
1795 install4jConfigXml.'**'.windows.each { windows ->
1796 windows.'@runPostProcessor' = "false"
1800 // turn off checksum creation for LOCAL channel
1801 def e = install4jConfigXml.application[0]
1802 if (CHANNEL == "LOCAL") {
1803 e.'@createChecksums' = "false"
1805 e.'@createChecksums' = "true"
1808 // put file association actions where placeholder action is
1809 def install4jFileAssociationsText = install4jFileAssociationsFile.text
1810 def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
1811 install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true
1812 if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') {
1813 def parent = a.parent()
1815 fileAssociationActions.each { faa ->
1818 // don't need to continue in .any loop once replacements have been made
1823 // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else
1824 // NB we're deleting the /other/ one!
1825 // Also remove the examples subdir from non-release versions
1826 def customizedIdToDelete = "PROGRAM_GROUP_RELEASE"
1827 // 2.11.1.0 NOT releasing with the Examples folder in the Program Group
1828 if (false && CHANNEL=="RELEASE") { // remove 'false && ' to include Examples folder in RELEASE channel
1829 customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE"
1831 // remove the examples subdir from Full File Set
1832 def files = install4jConfigXml.files[0]
1833 def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" }
1834 def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' }
1835 def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' }
1836 def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" }
1837 dirEntry.parent().remove(dirEntry)
1839 install4jConfigXml.'**'.action.any { a ->
1840 if (a.'@customizedId' == customizedIdToDelete) {
1841 def parent = a.parent()
1847 // write install4j file
1848 install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
1855 delete install4jConfFile
1860 task installers(type: com.install4j.gradle.Install4jTask) {
1861 group = "distribution"
1862 description = "Create the install4j installers"
1864 dependsOn copyInstall4jTemplate
1866 projectFile = install4jConfFile
1868 // create an md5 for the input files to use as version for install4j conf file
1869 def digest = MessageDigest.getInstance("MD5")
1871 (file("${install4jDir}/${install4j_template}").text +
1872 file("${install4jDir}/${install4j_info_plist_file_associations}").text +
1873 file("${install4jDir}/${install4j_installer_file_associations}").text).bytes)
1874 def filesMd5 = new BigInteger(1, digest.digest()).toString(16)
1875 if (filesMd5.length() >= 8) {
1876 filesMd5 = filesMd5.substring(0,8)
1878 def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
1879 // make install4jBuildDir relative to jalviewDir
1880 def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
1883 'JALVIEW_NAME': jalview_name,
1884 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
1885 'JALVIEW_DIR': "../..",
1886 'OSX_KEYSTORE': OSX_KEYSTORE,
1887 'OSX_APPLEID': OSX_APPLEID,
1888 'OSX_ALTOOLPASS': OSX_ALTOOLPASS,
1889 'JSIGN_SH': JSIGN_SH,
1890 'JRE_DIR': getdown_app_dir_java,
1891 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
1892 'JALVIEW_VERSION': JALVIEW_VERSION,
1893 'JAVA_MIN_VERSION': JAVA_MIN_VERSION,
1894 'JAVA_MAX_VERSION': JAVA_MAX_VERSION,
1895 'JAVA_VERSION': JAVA_VERSION,
1896 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
1897 'VERSION': JALVIEW_VERSION,
1898 'MACOS_JAVA_VM_DIR': macosJavaVMDir,
1899 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
1900 'LINUX_JAVA_VM_DIR': linuxJavaVMDir,
1901 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
1902 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
1903 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz,
1904 'COPYRIGHT_MESSAGE': install4j_copyright_message,
1905 'BUNDLE_ID': install4jBundleId,
1906 'INTERNAL_ID': install4jInternalId,
1907 'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
1908 'MACOS_DMG_DS_STORE': install4jDMGDSStore,
1909 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
1910 'INSTALLER_NAME': install4jInstallerName,
1911 'INSTALL4J_UTILS_DIR': install4j_utils_dir,
1912 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
1913 'GETDOWN_FILES_DIR': getdown_files_dir,
1914 'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
1915 'GETDOWN_DIST_DIR': getdownAppDistDir,
1916 'GETDOWN_ALT_DIR': getdown_app_dir_alt,
1917 'GETDOWN_INSTALL_DIR': getdown_install_dir,
1918 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
1919 'BUILD_DIR': install4jBuildDir,
1920 'APPLICATION_CATEGORIES': install4j_application_categories,
1921 'APPLICATION_FOLDER': install4jApplicationFolder,
1922 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
1923 'EXECUTABLE_NAME': install4jExecutableName,
1924 'EXTRA_SCHEME': install4jExtraScheme,
1925 'MAC_ICONS_FILE': install4jMacIconsFile,
1926 'WINDOWS_ICONS_FILE': install4jWindowsIconsFile,
1927 'PNG_ICON_FILE': install4jPngIconFile,
1928 'BACKGROUND': install4jBackground,
1932 //println("INSTALL4J VARIABLES:")
1933 //variables.each{k,v->println("${k}=${v}")}
1935 destination = "${jalviewDir}/${install4jBuildDir}"
1936 buildSelected = true
1938 if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
1940 disableSigning = true
1941 disableNotarization = true
1945 macKeystorePassword = OSX_KEYPASS
1948 if (OSX_ALTOOLPASS) {
1949 appleIdPassword = OSX_ALTOOLPASS
1950 disableNotarization = false
1952 disableNotarization = true
1956 println("Using projectFile "+projectFile)
1957 if (!disableNotarization) { println("Will notarize OSX App DMG") }
1961 inputs.dir(getdownWebsiteDir)
1962 inputs.file(install4jConfFile)
1963 inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
1964 inputs.dir(macosJavaVMDir)
1965 inputs.dir(windowsJavaVMDir)
1966 outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
1972 eclipse().configFile(eclipse_codestyle_file)
1977 task sourceDist(type: Tar) {
1978 group "distribution"
1979 description "Create a source .tar.gz file for distribution"
1981 dependsOn createBuildProperties
1982 dependsOn convertMdFiles
1984 def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
1985 def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
1986 archiveFileName = outputFileName
1988 compression Compression.GZIP
2003 "**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales",
2005 "utils/InstallAnywhere",
2020 "gradle.properties",
2031 ".settings/org.eclipse.jdt.core.jalview.prefs",
2035 exclude (EXCLUDE_FILES)
2036 include (PROCESS_FILES)
2037 filter(ReplaceTokens,
2041 'Version-Rel': JALVIEW_VERSION,
2042 'Year-Rel': getDate("yyyy")
2047 exclude (EXCLUDE_FILES)
2048 exclude (PROCESS_FILES)
2049 exclude ("appletlib")
2050 exclude ("**/*locales")
2051 exclude ("*locales/**")
2052 exclude ("utils/InstallAnywhere")
2054 exclude (getdown_files_dir)
2055 exclude (getdown_website_dir)
2057 // exluding these as not using jars as modules yet
2058 exclude ("${j11modDir}/**/*.jar")
2061 include(INCLUDE_FILES)
2063 // from (jalviewDir) {
2064 // // explicit includes for stuff that seemed to not get included
2065 // include(fileTree("test/**/*."))
2066 // exclude(EXCLUDE_FILES)
2067 // exclude(PROCESS_FILES)
2070 from(file(buildProperties).getParent()) {
2071 include(file(buildProperties).getName())
2072 rename(file(buildProperties).getName(), "build_properties")
2074 line.replaceAll("^INSTALLATION=.*\$","INSTALLATION=Source Release"+" git-commit\\\\:"+gitHash+" ["+gitBranch+"]")
2083 dependsOn pubhtmlhelp
2085 inputs.dir("${helpBuildDir}/${help_dir}")
2086 outputs.dir("${buildDir}/distributions/${help_dir}")
2090 task j2sSetHeadlessBuild {
2097 task jalviewjsEnableAltFileProperty(type: WriteProperties) {
2099 description "Enable the alternative J2S Config file for headless build"
2101 outputFile = jalviewjsJ2sSettingsFileName
2102 def j2sPropsFile = file(jalviewjsJ2sSettingsFileName)
2103 def j2sProps = new Properties()
2104 if (j2sPropsFile.exists()) {
2106 def j2sPropsFileFIS = new FileInputStream(j2sPropsFile)
2107 j2sProps.load(j2sPropsFileFIS)
2108 j2sPropsFileFIS.close()
2110 j2sProps.each { prop, val ->
2113 } catch (Exception e) {
2114 println("Exception reading ${jalviewjsJ2sSettingsFileName}")
2118 if (! j2sProps.stringPropertyNames().contains(jalviewjs_j2s_alt_file_property_config)) {
2119 property(jalviewjs_j2s_alt_file_property_config, jalviewjs_j2s_alt_file_property)
2124 task jalviewjsSetEclipseWorkspace {
2125 def propKey = "jalviewjs_eclipse_workspace"
2127 if (project.hasProperty(propKey)) {
2128 propVal = project.getProperty(propKey)
2129 if (propVal.startsWith("~/")) {
2130 propVal = System.getProperty("user.home") + propVal.substring(1)
2133 def propsFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
2134 def propsFile = file(propsFileName)
2135 def eclipseWsDir = propVal
2136 def props = new Properties()
2138 def writeProps = true
2139 if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && propsFile.exists()) {
2140 def ins = new FileInputStream(propsFileName)
2143 if (props.getProperty(propKey, null) != null) {
2144 eclipseWsDir = props.getProperty(propKey)
2149 if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
2150 def tempDir = File.createTempDir()
2151 eclipseWsDir = tempDir.getAbsolutePath()
2154 eclipseWorkspace = file(eclipseWsDir)
2157 // do not run a headless transpile when we claim to be in Eclipse
2159 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2160 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2162 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2166 props.setProperty(propKey, eclipseWsDir)
2167 propsFile.parentFile.mkdirs()
2168 def bytes = new ByteArrayOutputStream()
2169 props.store(bytes, null)
2170 def propertiesString = bytes.toString()
2171 propsFile.text = propertiesString
2177 println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
2180 //inputs.property(propKey, eclipseWsDir) // eclipseWsDir only gets set once this task runs, so will be out-of-date
2181 outputs.file(propsFileName)
2182 outputs.upToDateWhen { eclipseWorkspace.exists() && propsFile.exists() }
2186 task jalviewjsEclipsePaths {
2189 def eclipseRoot = jalviewjs_eclipse_root
2190 if (eclipseRoot.startsWith("~/")) {
2191 eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
2193 if (OperatingSystem.current().isMacOsX()) {
2194 eclipseRoot += "/Eclipse.app"
2195 eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse"
2196 eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct"
2197 } else if (OperatingSystem.current().isWindows()) { // check these paths!!
2198 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2199 eclipseRoot += "/eclipse"
2201 eclipseBinary = "${eclipseRoot}/eclipse.exe"
2202 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2203 } else { // linux or unix
2204 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2205 eclipseRoot += "/eclipse"
2206 println("eclipseDir exists")
2208 eclipseBinary = "${eclipseRoot}/eclipse"
2209 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2212 eclipseVersion = "4.13" // default
2213 def assumedVersion = true
2214 if (file(eclipseProduct).exists()) {
2215 def fis = new FileInputStream(eclipseProduct)
2216 def props = new Properties()
2218 eclipseVersion = props.getProperty("version")
2220 assumedVersion = false
2223 def propKey = "eclipse_debug"
2224 eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true"))
2227 // do not run a headless transpile when we claim to be in Eclipse
2229 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2230 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2232 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2235 if (!assumedVersion) {
2236 println("ECLIPSE VERSION=${eclipseVersion}")
2242 task printProperties {
2244 description "Output to console all System.properties"
2246 System.properties.each { key, val -> System.out.println("Property: ${key}=${val}") }
2252 dependsOn eclipseProject
2253 dependsOn eclipseClasspath
2254 dependsOn eclipseJdt
2258 // this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir
2259 task jalviewjsEclipseCopyDropins(type: Copy) {
2260 dependsOn jalviewjsEclipsePaths
2262 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar")
2263 inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}")
2264 def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}"
2271 // this eclipse -clean doesn't actually work
2272 task jalviewjsCleanEclipse(type: Exec) {
2273 dependsOn eclipseSetup
2274 dependsOn jalviewjsEclipsePaths
2275 dependsOn jalviewjsEclipseCopyDropins
2277 executable(eclipseBinary)
2278 args(["-nosplash", "--launcher.suppressErrors", "-data", eclipseWorkspace.getPath(), "-clean", "-console", "-consoleLog"])
2284 def inputString = """exit
2287 def inputByteStream = new ByteArrayInputStream(inputString.getBytes())
2288 standardInput = inputByteStream
2291 /* not really working yet
2292 jalviewjsEclipseCopyDropins.finalizedBy jalviewjsCleanEclipse
2296 task jalviewjsTransferUnzipSwingJs {
2297 def file_zip = "${jalviewDir}/${jalviewjs_swingjs_zip}"
2301 from zipTree(file_zip)
2302 into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2306 inputs.file file_zip
2307 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2311 task jalviewjsTransferUnzipLib {
2312 def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
2315 zipFiles.each { file_zip ->
2317 from zipTree(file_zip)
2318 into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2323 inputs.files zipFiles
2324 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2328 task jalviewjsTransferUnzipAllLibs {
2329 dependsOn jalviewjsTransferUnzipSwingJs
2330 dependsOn jalviewjsTransferUnzipLib
2334 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
2336 description "Create the alternative j2s file from the j2s.* properties"
2338 jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
2339 def siteDirProperty = "j2s.site.directory"
2340 def setSiteDir = false
2341 jalviewjsJ2sProps.each { prop, val ->
2343 if (prop == siteDirProperty) {
2344 if (!(val.startsWith('/') || val.startsWith("file://") )) {
2345 val = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${val}"
2351 if (!setSiteDir) { // default site location, don't override specifically set property
2352 property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
2355 outputFile = jalviewjsJ2sAltSettingsFileName
2358 inputs.properties(jalviewjsJ2sProps)
2359 outputs.file(jalviewjsJ2sAltSettingsFileName)
2364 task jalviewjsEclipseSetup {
2365 dependsOn jalviewjsEclipseCopyDropins
2366 dependsOn jalviewjsSetEclipseWorkspace
2367 dependsOn jalviewjsCreateJ2sSettings
2371 task jalviewjsSyncAllLibs (type: Sync) {
2372 dependsOn jalviewjsTransferUnzipAllLibs
2373 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
2374 inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
2375 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2379 def outputFiles = []
2380 rename { filename ->
2381 outputFiles += "${outputDir}/${filename}"
2387 outputs.files outputFiles
2388 inputs.files inputFiles
2392 task jalviewjsSyncResources (type: Sync) {
2393 dependsOn buildResources
2395 def inputFiles = fileTree(dir: resourcesBuildDir)
2396 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2400 def outputFiles = []
2401 rename { filename ->
2402 outputFiles += "${outputDir}/${filename}"
2408 outputs.files outputFiles
2409 inputs.files inputFiles
2413 task jalviewjsSyncSiteResources (type: Sync) {
2414 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}")
2415 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2419 def outputFiles = []
2420 rename { filename ->
2421 outputFiles += "${outputDir}/${filename}"
2427 outputs.files outputFiles
2428 inputs.files inputFiles
2432 task jalviewjsSyncBuildProperties (type: Sync) {
2433 dependsOn createBuildProperties
2434 def inputFiles = [file(buildProperties)]
2435 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2439 def outputFiles = []
2440 rename { filename ->
2441 outputFiles += "${outputDir}/${filename}"
2447 outputs.files outputFiles
2448 inputs.files inputFiles
2452 task jalviewjsProjectImport(type: Exec) {
2453 dependsOn eclipseSetup
2454 dependsOn jalviewjsEclipsePaths
2455 dependsOn jalviewjsEclipseSetup
2458 // do not run a headless import when we claim to be in Eclipse
2460 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2461 throw new StopExecutionException("Not running headless import whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2463 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2467 //def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
2468 def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
2469 executable(eclipseBinary)
2470 args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
2474 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2476 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2477 args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
2480 inputs.file("${jalviewDir}/.project")
2481 outputs.upToDateWhen {
2482 file(projdir).exists()
2487 task jalviewjsTranspile(type: Exec) {
2488 dependsOn jalviewjsEclipseSetup
2489 dependsOn jalviewjsProjectImport
2490 dependsOn jalviewjsEclipsePaths
2492 dependsOn jalviewjsEnableAltFileProperty
2496 // do not run a headless transpile when we claim to be in Eclipse
2498 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2499 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2501 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2505 executable(eclipseBinary)
2506 args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipse_build_arg}", eclipse_project_name ])
2510 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2512 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2513 args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
2519 stdout = new ByteArrayOutputStream()
2520 stderr = new ByteArrayOutputStream()
2522 def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}"
2523 def logOutFile = file(logOutFileName)
2524 logOutFile.createNewFile()
2525 logOutFile.text = """ROOT: ${jalviewjs_eclipse_root}
2526 BINARY: ${eclipseBinary}
2527 VERSION: ${eclipseVersion}
2528 WORKSPACE: ${eclipseWorkspace}
2529 DEBUG: ${eclipseDebug}
2532 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2533 // combine stdout and stderr
2534 def logErrFOS = logOutFOS
2536 if (jalviewjs_j2s_to_console.equals("true")) {
2537 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2538 new org.apache.tools.ant.util.TeeOutputStream(
2542 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2543 new org.apache.tools.ant.util.TeeOutputStream(
2548 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2551 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2558 if (stdout.toString().contains("Error processing ")) {
2559 // j2s did not complete transpile
2560 //throw new TaskExecutionException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2561 if (jalviewjs_ignore_transpile_errors.equals("true")) {
2562 println("IGNORING TRANSPILE ERRORS")
2563 println("See eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2565 throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2570 inputs.dir("${jalviewDir}/${sourceDir}")
2571 outputs.dir("${jalviewDir}/${jalviewjsTransferSiteJsDir}")
2572 outputs.upToDateWhen( { file("${jalviewDir}/${jalviewjsTransferSiteJsDir}${jalviewjs_server_resource}").exists() } )
2576 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
2578 def stdout = new ByteArrayOutputStream()
2579 def stderr = new ByteArrayOutputStream()
2581 def coreFile = file(jsfile)
2583 msg = "Creating core for ${name}...\nGenerating ${jsfile}"
2585 logOutFile.createNewFile()
2586 logOutFile.append(msg+"\n")
2588 def coreTop = file(prefixFile)
2589 def coreBottom = file(suffixFile)
2590 coreFile.getParentFile().mkdirs()
2591 coreFile.createNewFile()
2592 coreFile.write( coreTop.getText("UTF-8") )
2596 def t = f.getText("UTF-8")
2597 t.replaceAll("Clazz\\.([^_])","Clazz_${1}")
2598 coreFile.append( t )
2600 msg = "...file '"+f.getPath()+"' does not exist, skipping"
2602 logOutFile.append(msg+"\n")
2605 coreFile.append( coreBottom.getText("UTF-8") )
2607 msg = "Generating ${zjsfile}"
2609 logOutFile.append(msg+"\n")
2610 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2611 def logErrFOS = logOutFOS
2614 classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
2615 main = "com.google.javascript.jscomp.CommandLineRunner"
2616 jvmArgs = [ "-Dfile.encoding=UTF-8" ]
2617 args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
2620 msg = "\nRunning '"+commandLine.join(' ')+"'\n"
2622 logOutFile.append(msg+"\n")
2624 if (logOutConsole) {
2625 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2626 new org.apache.tools.ant.util.TeeOutputStream(
2630 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2631 new org.apache.tools.ant.util.TeeOutputStream(
2636 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2639 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2646 logOutFile.append(msg+"\n")
2650 task jalviewjsBuildAllCores {
2652 description "Build the core js lib closures listed in the classlists dir"
2653 dependsOn jalviewjsTranspile
2654 dependsOn jalviewjsTransferUnzipSwingJs
2656 def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
2657 def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
2658 def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
2659 def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
2660 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
2661 def prefixFile = "${jsDir}/core/coretop2.js"
2662 def suffixFile = "${jsDir}/core/corebottom2.js"
2664 inputs.file prefixFile
2665 inputs.file suffixFile
2667 def classlistFiles = []
2668 // add the classlists found int the jalviewjs_classlists_dir
2669 fileTree(dir: "${jalviewDir}/${jalviewjs_classlists_dir}", include: "*.txt").each {
2671 def name = file.getName() - ".txt"
2678 // _jmol and _jalview cores. Add any other peculiar classlist.txt files here
2679 //classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jmol}"), 'name': "_jvjmol" ]
2680 classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jalview}"), 'name': jalviewjsJalviewCoreName ]
2682 jalviewjsCoreClasslists = []
2684 classlistFiles.each {
2687 def file = hash['file']
2688 if (! file.exists()) {
2689 //println("...classlist file '"+file.getPath()+"' does not exist, skipping")
2690 return false // this is a "continue" in groovy .each closure
2692 def name = hash['name']
2694 name = file.getName() - ".txt"
2702 def list = fileTree(dir: j2sDir, includes: filelist)
2704 def jsfile = "${outputDir}/core${name}.js"
2705 def zjsfile = "${outputDir}/core${name}.z.js"
2707 jalviewjsCoreClasslists += [
2716 outputs.file(jsfile)
2717 outputs.file(zjsfile)
2720 // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
2721 def stevesoftClasslistName = "_stevesoft"
2722 def stevesoftClasslist = [
2723 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
2724 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
2725 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
2726 'name': stevesoftClasslistName
2728 jalviewjsCoreClasslists += stevesoftClasslist
2729 inputs.files(stevesoftClasslist['list'])
2730 outputs.file(stevesoftClasslist['jsfile'])
2731 outputs.file(stevesoftClasslist['zjsfile'])
2734 def allClasslistName = "_all"
2735 def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
2736 allJsFiles += fileTree(
2740 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2741 "**/org/jmol/jvxl/readers/IsoIntersectFileReader.js",
2742 "**/org/jmol/export/JSExporter.js"
2745 allJsFiles += fileTree(
2749 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2750 "**/sun/misc/Unsafe.js",
2751 "**/swingjs/jquery/jquery-editable-select.js",
2752 "**/swingjs/jquery/j2sComboBox.js",
2753 "**/sun/misc/FloatingDecimal.js"
2756 def allClasslist = [
2757 'jsfile': "${outputDir}/core${allClasslistName}.js",
2758 'zjsfile': "${outputDir}/core${allClasslistName}.z.js",
2760 'name': allClasslistName
2762 // not including this version of "all" core at the moment
2763 //jalviewjsCoreClasslists += allClasslist
2764 inputs.files(allClasslist['list'])
2765 outputs.file(allClasslist['jsfile'])
2766 outputs.file(allClasslist['zjsfile'])
2769 def logOutFile = file("${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_closure_stdout}")
2770 logOutFile.getParentFile().mkdirs()
2771 logOutFile.createNewFile()
2772 logOutFile.write(getDate("yyyy-MM-dd HH:mm:ss")+" jalviewjsBuildAllCores\n----\n")
2774 jalviewjsCoreClasslists.each {
2775 jalviewjsCallCore(it.name, it.list, prefixFile, suffixFile, it.jsfile, it.zjsfile, logOutFile, jalviewjs_j2s_to_console.equals("true"))
2782 def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inputFile, String outputFile) {
2785 into file(outputFile).getParentFile()
2786 rename { filename ->
2787 if (filename.equals(inputFile.getName())) {
2788 return file(outputFile).getName()
2792 filter(ReplaceTokens,
2796 'MAIN': '"'+main_class+'"',
2798 'NAME': jalviewjsJalviewTemplateName+" [core ${coreName}]",
2799 'COREKEY': jalviewjs_core_key,
2800 'CORENAME': coreName
2807 task jalviewjsPublishCoreTemplates {
2808 dependsOn jalviewjsBuildAllCores
2809 def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
2810 def inputFile = file(inputFileName)
2811 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2813 def outputFiles = []
2814 jalviewjsCoreClasslists.each { cl ->
2815 def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html"
2816 cl['outputfile'] = outputFile
2817 outputFiles += outputFile
2821 jalviewjsCoreClasslists.each { cl ->
2822 jalviewjsPublishCoreTemplate(cl.name, jalviewjsJalviewTemplateName, inputFile, cl.outputfile)
2825 inputs.file(inputFile)
2826 outputs.files(outputFiles)
2830 task jalviewjsSyncCore (type: Sync) {
2831 dependsOn jalviewjsBuildAllCores
2832 dependsOn jalviewjsPublishCoreTemplates
2833 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
2834 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2838 def outputFiles = []
2839 rename { filename ->
2840 outputFiles += "${outputDir}/${filename}"
2846 outputs.files outputFiles
2847 inputs.files inputFiles
2851 // this Copy version of TransferSiteJs will delete anything else in the target dir
2852 task jalviewjsCopyTransferSiteJs(type: Copy) {
2853 dependsOn jalviewjsTranspile
2854 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2855 into "${jalviewDir}/${jalviewjsSiteDir}"
2859 // this Sync version of TransferSite is used by buildship to keep the website automatically up to date when a file changes
2860 task jalviewjsSyncTransferSiteJs(type: Sync) {
2861 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2863 into "${jalviewDir}/${jalviewjsSiteDir}"
2870 jalviewjsSyncAllLibs.mustRunAfter jalviewjsCopyTransferSiteJs
2871 jalviewjsSyncResources.mustRunAfter jalviewjsCopyTransferSiteJs
2872 jalviewjsSyncSiteResources.mustRunAfter jalviewjsCopyTransferSiteJs
2873 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsCopyTransferSiteJs
2875 jalviewjsSyncAllLibs.mustRunAfter jalviewjsSyncTransferSiteJs
2876 jalviewjsSyncResources.mustRunAfter jalviewjsSyncTransferSiteJs
2877 jalviewjsSyncSiteResources.mustRunAfter jalviewjsSyncTransferSiteJs
2878 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
2881 task jalviewjsPrepareSite {
2883 description "Prepares the website folder including unzipping files and copying resources"
2884 dependsOn jalviewjsSyncAllLibs
2885 dependsOn jalviewjsSyncResources
2886 dependsOn jalviewjsSyncSiteResources
2887 dependsOn jalviewjsSyncBuildProperties
2888 dependsOn jalviewjsSyncCore
2892 task jalviewjsBuildSite {
2894 description "Builds the whole website including transpiled code"
2895 dependsOn jalviewjsCopyTransferSiteJs
2896 dependsOn jalviewjsPrepareSite
2900 task cleanJalviewjsTransferSite {
2902 delete "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2903 delete "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2904 delete "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2905 delete "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2910 task cleanJalviewjsSite {
2911 dependsOn cleanJalviewjsTransferSite
2913 delete "${jalviewDir}/${jalviewjsSiteDir}"
2918 task jalviewjsSiteTar(type: Tar) {
2920 description "Creates a tar.gz file for the website"
2921 dependsOn jalviewjsBuildSite
2922 def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
2923 archiveFileName = outputFilename
2925 compression Compression.GZIP
2927 from "${jalviewDir}/${jalviewjsSiteDir}"
2928 into jalviewjs_site_dir // this is inside the tar file
2930 inputs.dir("${jalviewDir}/${jalviewjsSiteDir}")
2934 task jalviewjsServer {
2936 def filename = "jalviewjsTest.html"
2937 description "Starts a webserver on localhost to test the website. See ${filename} to access local site on most recently used port."
2938 def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
2941 SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory()
2942 def port = Integer.valueOf(jalviewjs_server_port)
2947 while(port < start+1000 && !running) {
2949 def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}")
2950 jalviewjsServer = factory.start(doc_root, port)
2952 url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource)
2953 println("SERVER STARTED with document root ${doc_root}.")
2954 println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).")
2955 println("For debug: "+url+"?j2sdebug")
2956 println("For verbose: "+url+"?j2sverbose")
2957 } catch (Exception e) {
2962 <p><a href="${url}">JalviewJS Test. <${url}></a></p>
2963 <p><a href="${url}?j2sdebug">JalviewJS Test with debug. <${url}?j2sdebug></a></p>
2964 <p><a href="${url}?j2sverbose">JalviewJS Test with verbose. <${url}?j2sdebug></a></p>
2966 jalviewjsCoreClasslists.each { cl ->
2967 def urlcore = jalviewjsServer.getResourceUrl(file(cl.outputfile).getName())
2969 <p><a href="${urlcore}">${jalviewjsJalviewTemplateName} [core ${cl.name}]. <${urlcore}></a></p>
2971 println("For core ${cl.name}: "+urlcore)
2974 file(htmlFile).text = htmlText
2977 outputs.file(htmlFile)
2978 outputs.upToDateWhen({false})
2982 task cleanJalviewjsAll {
2984 description "Delete all configuration and build artifacts to do with JalviewJS build"
2985 dependsOn cleanJalviewjsSite
2986 dependsOn jalviewjsEclipsePaths
2989 delete "${jalviewDir}/${jalviewjsBuildDir}"
2990 delete "${jalviewDir}/${eclipse_bin_dir}"
2991 if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
2992 delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
2994 delete jalviewjsJ2sAltSettingsFileName
2997 outputs.upToDateWhen( { false } )
3001 task jalviewjsIDE_checkJ2sPlugin {
3002 group "00 JalviewJS in Eclipse"
3003 description "Compare the swingjs/net.sf.j2s.core(-j11)?.jar file with the Eclipse IDE's plugin version (found in the 'dropins' dir)"
3006 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
3007 def j2sPluginFile = file(j2sPlugin)
3008 def eclipseHome = System.properties["eclipse.home.location"]
3009 if (eclipseHome == null || ! IN_ECLIPSE) {
3010 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. Skipping J2S Plugin Check.")
3012 def eclipseJ2sPluginDirs = [ "${eclipseHome}/dropins" ]
3013 def altPluginsDir = System.properties["org.eclipse.equinox.p2.reconciler.dropins.directory"]
3014 if (altPluginsDir != null && file(altPluginsDir).exists()) {
3015 eclipseJ2sPluginDirs += altPluginsDir
3017 def foundPlugin = false
3018 def j2sPluginFileName = j2sPluginFile.getName()
3019 def eclipseJ2sPlugin
3020 def eclipseJ2sPluginFile
3021 eclipseJ2sPluginDirs.any { dir ->
3022 eclipseJ2sPlugin = "${dir}/${j2sPluginFileName}"
3023 eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
3024 if (eclipseJ2sPluginFile.exists()) {
3030 def msg = "Eclipse J2S Plugin is not installed (could not find '${j2sPluginFileName}' in\n"+eclipseJ2sPluginDirs.join("\n")+"\n)\nTry running task jalviewjsIDE_copyJ2sPlugin"
3031 System.err.println(msg)
3032 throw new StopExecutionException(msg)
3035 def digest = MessageDigest.getInstance("MD5")
3037 digest.update(j2sPluginFile.text.bytes)
3038 def j2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
3040 digest.update(eclipseJ2sPluginFile.text.bytes)
3041 def eclipseJ2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
3043 if (j2sPluginMd5 != eclipseJ2sPluginMd5) {
3044 def msg = "WARNING! Eclipse J2S Plugin '${eclipseJ2sPlugin}' is different to this commit's version '${j2sPlugin}'"
3045 System.err.println(msg)
3046 throw new StopExecutionException(msg)
3048 def msg = "Eclipse J2S Plugin '${eclipseJ2sPlugin}' is the same as '${j2sPlugin}' (this is good)"
3054 task jalviewjsIDE_copyJ2sPlugin {
3055 group "00 JalviewJS in Eclipse"
3056 description "Copy the swingjs/net.sf.j2s.core(-j11)?.jar file into the Eclipse IDE's 'dropins' dir"
3059 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
3060 def j2sPluginFile = file(j2sPlugin)
3061 def eclipseHome = System.properties["eclipse.home.location"]
3062 if (eclipseHome == null || ! IN_ECLIPSE) {
3063 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. NOT copying J2S Plugin.")
3065 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
3066 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
3067 def msg = "WARNING! Copying this commit's j2s plugin '${j2sPlugin}' to Eclipse J2S Plugin '${eclipseJ2sPlugin}'\n* May require an Eclipse restart"
3068 System.err.println(msg)
3071 eclipseJ2sPluginFile.getParentFile().mkdirs()
3072 into eclipseJ2sPluginFile.getParent()
3078 task jalviewjsIDE_j2sFile {
3079 group "00 JalviewJS in Eclipse"
3080 description "Creates the .j2s file"
3081 dependsOn jalviewjsCreateJ2sSettings
3085 task jalviewjsIDE_SyncCore {
3086 group "00 JalviewJS in Eclipse"
3087 description "Build the core js lib closures listed in the classlists dir and publish core html from template"
3088 dependsOn jalviewjsSyncCore
3092 task jalviewjsIDE_SyncSiteAll {
3093 dependsOn jalviewjsSyncAllLibs
3094 dependsOn jalviewjsSyncResources
3095 dependsOn jalviewjsSyncSiteResources
3096 dependsOn jalviewjsSyncBuildProperties
3100 cleanJalviewjsTransferSite.mustRunAfter jalviewjsIDE_SyncSiteAll
3103 task jalviewjsIDE_PrepareSite {
3104 group "00 JalviewJS in Eclipse"
3105 description "Sync libs and resources to site dir, but not closure cores"
3107 dependsOn jalviewjsIDE_SyncSiteAll
3108 //dependsOn cleanJalviewjsTransferSite // not sure why this clean is here -- will slow down a re-run of this task
3112 task jalviewjsIDE_AssembleSite {
3113 group "00 JalviewJS in Eclipse"
3114 description "Assembles unzipped supporting zipfiles, resources, site resources and closure cores into the Eclipse transpiled site"
3115 dependsOn jalviewjsPrepareSite
3119 task jalviewjsIDE_SiteClean {
3120 group "00 JalviewJS in Eclipse"
3121 description "Deletes the Eclipse transpiled site"
3122 dependsOn cleanJalviewjsSite
3126 task jalviewjsIDE_Server {
3127 group "00 JalviewJS in Eclipse"
3128 description "Starts a webserver on localhost to test the website"
3129 dependsOn jalviewjsServer
3133 // buildship runs this at import or gradle refresh
3134 task eclipseSynchronizationTask {
3135 //dependsOn eclipseSetup
3136 dependsOn createBuildProperties
3138 dependsOn jalviewjsIDE_j2sFile
3139 dependsOn jalviewjsIDE_checkJ2sPlugin
3140 dependsOn jalviewjsIDE_PrepareSite
3145 // buildship runs this at build time or project refresh
3146 task eclipseAutoBuildTask {
3147 //dependsOn jalviewjsIDE_checkJ2sPlugin
3148 //dependsOn jalviewjsIDE_PrepareSite
3154 description "Build the site"
3155 dependsOn jalviewjsBuildSite