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 '9.0.6'
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'
56 // in ext the values are cast to Object. Ensure string values are cast as String (and not GStringImpl) for later use
57 def string(Object o) {
58 return o == null ? "" : o.toString()
61 def overrideProperties(String propsFileName, boolean output = false) {
62 if (propsFileName == null) {
65 def propsFile = file(propsFileName)
66 if (propsFile != null && propsFile.exists()) {
67 println("Using properties from file '${propsFileName}'")
69 def p = new Properties()
70 def localPropsFIS = new FileInputStream(propsFile)
76 if (project.hasProperty(key)) {
77 oldval = project.findProperty(key)
78 project.setProperty(key, val)
80 println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'")
83 ext.setProperty(key, val)
85 println("Setting ext property '${key}' with ${file(propsFile).getName()}s value '${val}'")
89 } catch (Exception e) {
90 println("Exception reading local.properties")
97 jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
98 jalviewDirRelativePath = jalviewDir
100 getdownChannelName = CHANNEL.toLowerCase()
101 // default to "default". Currently only has different cosmetics for "develop", "release", "default"
102 propertiesChannelName = ["develop", "release", "test-release", "jalviewjs", "jalviewjs-release" ].contains(getdownChannelName) ? getdownChannelName : "default"
103 // Import channel_properties
104 channelDir = string("${jalviewDir}/${channel_properties_dir}/${propertiesChannelName}")
105 channelGradleProperties = string("${channelDir}/channel_gradle.properties")
106 channelPropsFile = string("${channelDir}/${resource_dir}/${channel_props}")
107 overrideProperties(channelGradleProperties, false)
108 // local build environment properties
109 // can be "projectDir/local.properties"
110 overrideProperties("${projectDir}/local.properties", true)
111 // or "../projectDir_local.properties"
112 overrideProperties(projectDir.getParent() + "/" + projectDir.getName() + "_local.properties", true)
115 // Import releaseProps from the RELEASE file
116 // or a file specified via JALVIEW_RELEASE_FILE if defined
117 // Expect jalview.version and target release branch in jalview.release
118 def releaseProps = new Properties();
119 def releasePropFile = findProperty("JALVIEW_RELEASE_FILE");
120 def defaultReleasePropFile = "${jalviewDirAbsolutePath}/RELEASE";
122 (new File(releasePropFile!=null ? releasePropFile : defaultReleasePropFile)).withInputStream {
123 releaseProps.load(it)
125 } catch (Exception fileLoadError) {
126 throw new Error("Couldn't load release properties file "+(releasePropFile==null ? defaultReleasePropFile : "from custom location: releasePropFile"),fileLoadError);
129 // Set JALVIEW_VERSION if it is not already set
130 if (findProperty("JALVIEW_VERSION")==null || "".equals(JALVIEW_VERSION)) {
131 JALVIEW_VERSION = releaseProps.get("jalview.version")
134 // this property set when running Eclipse headlessly
135 j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild")
136 // this property set by Eclipse
137 eclipseApplicationProperty = string("eclipse.application")
138 // CHECK IF RUNNING FROM WITHIN ECLIPSE
139 def eclipseApplicationPropertyVal = System.properties[eclipseApplicationProperty]
140 IN_ECLIPSE = eclipseApplicationPropertyVal != null && eclipseApplicationPropertyVal.startsWith("org.eclipse.ui.")
141 // BUT WITHOUT THE HEADLESS BUILD PROPERTY SET
142 if (System.properties[j2sHeadlessBuildProperty].equals("true")) {
143 println("Setting IN_ECLIPSE to ${IN_ECLIPSE} as System.properties['${j2sHeadlessBuildProperty}'] == '${System.properties[j2sHeadlessBuildProperty]}'")
147 println("WITHIN ECLIPSE IDE")
149 println("HEADLESS BUILD")
152 J2S_ENABLED = (project.hasProperty('j2s.compiler.status') && project['j2s.compiler.status'] != null && project['j2s.compiler.status'] == "enable")
154 println("J2S ENABLED")
157 System.properties.sort { it.key }.each {
158 key, val -> println("SYSTEM PROPERTY ${key}='${val}'")
161 if (false && IN_ECLIPSE) {
162 jalviewDir = jalviewDirAbsolutePath
167 buildDate = new Date().format("yyyyMMdd")
170 bareSourceDir = string(source_dir)
171 sourceDir = string("${jalviewDir}/${bareSourceDir}")
172 resourceDir = string("${jalviewDir}/${resource_dir}")
173 bareTestSourceDir = string(test_source_dir)
174 testDir = string("${jalviewDir}/${bareTestSourceDir}")
176 classesDir = string("${jalviewDir}/${classes_dir}")
179 useClover = clover.equals("true")
180 cloverBuildDir = "${buildDir}/clover"
181 cloverInstrDir = file("${cloverBuildDir}/clover-instr")
182 cloverClassesDir = file("${cloverBuildDir}/clover-classes")
183 cloverReportDir = file("${buildDir}/reports/clover")
184 cloverTestInstrDir = file("${cloverBuildDir}/clover-test-instr")
185 cloverTestClassesDir = file("${cloverBuildDir}/clover-test-classes")
186 //cloverTestClassesDir = cloverClassesDir
187 cloverDb = string("${cloverBuildDir}/clover.db")
189 testSourceDir = useClover ? cloverTestInstrDir : testDir
190 testClassesDir = useClover ? cloverTestClassesDir : "${jalviewDir}/${test_output_dir}"
192 getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}")
194 buildProperties = null
196 // the following values might be overridden by the CHANNEL switch
197 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
198 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
199 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}")
200 getdownAppDistDir = getdown_app_dir_alt
201 getdownImagesDir = string("${jalviewDir}/${getdown_images_dir}")
202 getdownSetAppBaseProperty = false // whether to pass the appbase and appdistdir to the application
203 reportRsyncCommand = false
204 jvlChannelName = CHANNEL.toLowerCase()
205 install4jSuffix = CHANNEL.substring(0, 1).toUpperCase() + CHANNEL.substring(1).toLowerCase(); // BUILD -> Build
206 install4jDMGDSStore = "${install4j_images_dir}/${install4j_dmg_ds_store}"
207 install4jDMGBackgroundImage = "${install4j_images_dir}/${install4j_dmg_background}"
208 install4jInstallerName = "${jalview_name} Non-Release Installer"
209 install4jExecutableName = install4j_executable_name
210 install4jExtraScheme = "jalviewx"
211 install4jMacIconsFile = string("${install4j_images_dir}/${install4j_mac_icons_file}")
212 install4jWindowsIconsFile = string("${install4j_images_dir}/${install4j_windows_icons_file}")
213 install4jPngIconFile = string("${install4j_images_dir}/${install4j_png_icon_file}")
214 install4jBackground = string("${install4j_images_dir}/${install4j_background}")
218 // TODO: get bamboo build artifact URL for getdown artifacts
219 getdown_channel_base = bamboo_channelbase
220 getdownChannelName = string("${bamboo_planKey}/${JAVA_VERSION}")
221 getdownAppBase = string("${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}")
222 jvlChannelName += "_${getdownChannelName}"
223 // automatically add the test group Not-bamboo for exclusion
224 if ("".equals(testng_excluded_groups)) {
225 testng_excluded_groups = "Not-bamboo"
227 install4jExtraScheme = "jalviewb"
230 case [ "RELEASE", "JALVIEWJS-RELEASE" ]:
231 getdownAppDistDir = getdown_app_dir_release
232 reportRsyncCommand = true
234 install4jInstallerName = "${jalview_name} Installer"
238 getdownChannelName = CHANNEL.toLowerCase()+"/${JALVIEW_VERSION}"
239 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
240 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
241 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
242 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
244 package_dir = string("${ARCHIVEDIR}/${package_dir}")
245 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
248 reportRsyncCommand = true
249 install4jExtraScheme = "jalviewa"
253 getdownChannelName = string("archive/${JALVIEW_VERSION}")
254 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
255 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
256 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
257 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
259 package_dir = string("${ARCHIVEDIR}/${package_dir}")
260 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
263 reportRsyncCommand = true
264 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
265 install4jSuffix = "Archive"
266 install4jExtraScheme = "jalviewa"
270 reportRsyncCommand = true
271 getdownSetAppBaseProperty = true
272 // DEVELOP-RELEASE is usually associated with a Jalview release series so set the version
273 JALVIEW_VERSION=JALVIEW_VERSION+"-d${buildDate}"
275 install4jSuffix = "Develop"
276 install4jExtraScheme = "jalviewd"
277 install4jInstallerName = "${jalview_name} Develop Installer"
281 reportRsyncCommand = true
282 // Don't ignore transpile errors for release build
283 if (jalviewjs_ignore_transpile_errors.equals("true")) {
284 jalviewjs_ignore_transpile_errors = "false"
285 println("Setting jalviewjs_ignore_transpile_errors to 'false'")
287 JALVIEW_VERSION = JALVIEW_VERSION+"-test"
288 install4jSuffix = "Test"
289 install4jExtraScheme = "jalviewt"
290 install4jInstallerName = "${jalview_name} Test Installer"
293 case ~/^SCRATCH(|-[-\w]*)$/:
294 getdownChannelName = CHANNEL
295 JALVIEW_VERSION = JALVIEW_VERSION+"-"+CHANNEL
297 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
298 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
299 reportRsyncCommand = true
300 install4jSuffix = "Scratch"
304 if (!file("${LOCALDIR}").exists()) {
305 throw new GradleException("Must provide a LOCALDIR value to produce a local distribution")
307 getdownAppBase = file(file("${LOCALDIR}").getAbsolutePath()).toURI().toString()
308 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
310 JALVIEW_VERSION = "TEST"
311 install4jSuffix = "Test-Local"
312 install4jExtraScheme = "jalviewt"
313 install4jInstallerName = "${jalview_name} Test Installer"
316 case [ "LOCAL", "JALVIEWJS" ]:
317 JALVIEW_VERSION = "TEST"
318 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
319 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
320 install4jExtraScheme = "jalviewl"
323 default: // something wrong specified
324 throw new GradleException("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
328 // override getdownAppBase if requested
329 if (findProperty("getdown_appbase_override") != null) {
330 // revert to LOCAL if empty string
331 if (string(getdown_appbase_override) == "") {
332 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
333 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
334 } else if (string(getdown_appbase_override).startsWith("file://")) {
335 getdownAppBase = string(getdown_appbase_override)
336 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
338 getdownAppBase = string(getdown_appbase_override)
340 println("Overriding getdown appbase with '${getdownAppBase}'")
342 // sanitise file name for jalview launcher file for this channel
343 jvlChannelName = jvlChannelName.replaceAll("[^\\w\\-]+", "_")
344 // install4j application and folder names
345 if (install4jSuffix == "") {
346 install4jApplicationName = "${jalview_name}"
347 install4jBundleId = "${install4j_bundle_id}"
348 install4jWinApplicationId = install4j_release_win_application_id
350 install4jApplicationName = "${jalview_name} ${install4jSuffix}"
351 install4jBundleId = "${install4j_bundle_id}-" + install4jSuffix.toLowerCase()
352 // add int hash of install4jSuffix to the last part of the application_id
353 def id = install4j_release_win_application_id
354 def idsplitreverse = id.split("-").reverse()
355 idsplitreverse[0] = idsplitreverse[0].toInteger() + install4jSuffix.hashCode()
356 install4jWinApplicationId = idsplitreverse.reverse().join("-")
358 // sanitise folder and id names
359 // install4jApplicationFolder = e.g. "Jalview Build"
360 install4jApplicationFolder = install4jApplicationName
361 .replaceAll("[\"'~:/\\\\\\s]", "_") // replace all awkward filename chars " ' ~ : / \
362 .replaceAll("_+", "_") // collapse __
363 install4jInternalId = install4jApplicationName
365 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
366 .replaceAll("_+", "") // collapse __
367 //.replaceAll("_*-_*", "-") // collapse _-_
368 install4jUnixApplicationFolder = install4jApplicationName
370 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
371 .replaceAll("_+", "_") // collapse __
372 .replaceAll("_*-_*", "-") // collapse _-_
375 getdownWrapperLink = install4jUnixApplicationFolder // e.g. "jalview_local"
376 getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}")
377 //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
378 getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}")
379 getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}")
380 getdownFilesDir = string("${jalviewDir}/${getdown_files_dir}/${JAVA_VERSION}/")
381 getdownFilesInstallDir = string("${getdownFilesDir}/${getdown_install_dir}")
382 /* compile without modules -- using classpath libraries
383 modules_compileClasspath = fileTree(dir: "${jalviewDir}/${j11modDir}", include: ["*.jar"])
384 modules_runtimeClasspath = modules_compileClasspath
386 def details = versionDetails()
387 gitHash = details.gitHash
388 gitBranch = details.branchName
390 println("Using a ${CHANNEL} profile.")
392 additional_compiler_args = []
393 // configure classpath/args for j8/j11 compilation
394 if (JAVA_VERSION.equals("1.8")) {
395 JAVA_INTEGER_VERSION = string("8")
398 libDistDir = j8libDir
399 compile_source_compatibility = 1.8
400 compile_target_compatibility = 1.8
401 // these are getdown.txt properties defined dependent on the JAVA_VERSION
402 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java8_min_version"))
403 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java8_max_version"))
404 // this property is assigned below and expanded to multiple lines in the getdown task
405 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java8_txt_multi_java_location"))
406 // this property is for the Java library used in eclipse
407 eclipseJavaRuntimeName = string("JavaSE-1.8")
408 } else if (JAVA_VERSION.equals("11")) {
409 JAVA_INTEGER_VERSION = string("11")
411 libDistDir = j11libDir
412 compile_source_compatibility = 11
413 compile_target_compatibility = 11
414 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
415 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
416 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
417 eclipseJavaRuntimeName = string("JavaSE-11")
418 /* compile without modules -- using classpath libraries
419 additional_compiler_args += [
420 '--module-path', modules_compileClasspath.asPath,
421 '--add-modules', j11modules
424 } else if (JAVA_VERSION.equals("17")) {
425 JAVA_INTEGER_VERSION = string("17")
427 libDistDir = j17libDir
428 compile_source_compatibility = 17
429 compile_target_compatibility = 17
430 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
431 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
432 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
433 eclipseJavaRuntimeName = string("JavaSE-17")
434 /* compile without modules -- using classpath libraries
435 additional_compiler_args += [
436 '--module-path', modules_compileClasspath.asPath,
437 '--add-modules', j11modules
441 throw new GradleException("JAVA_VERSION=${JAVA_VERSION} not currently supported by Jalview")
446 JAVA_MIN_VERSION = JAVA_VERSION
447 JAVA_MAX_VERSION = JAVA_VERSION
448 def jreInstallsDir = string(jre_installs_dir)
449 if (jreInstallsDir.startsWith("~/")) {
450 jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1)
452 macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre")
453 windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
454 linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
455 macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_mac_x64.tar.gz")
456 windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_windows_x64.tar.gz")
457 linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre_${JAVA_INTEGER_VERSION}_linux_x64.tar.gz")
458 install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
459 install4jConfFileName = string("jalview-install4j-conf.install4j")
460 install4jConfFile = file("${install4jDir}/${install4jConfFileName}")
461 install4jHomeDir = install4j_home_dir
462 if (install4jHomeDir.startsWith("~/")) {
463 install4jHomeDir = System.getProperty("user.home") + install4jHomeDir.substring(1)
466 resourceBuildDir = string("${buildDir}/resources")
467 resourcesBuildDir = string("${resourceBuildDir}/resources_build")
468 helpBuildDir = string("${resourceBuildDir}/help_build")
469 docBuildDir = string("${resourceBuildDir}/doc_build")
471 if (buildProperties == null) {
472 buildProperties = string("${resourcesBuildDir}/${build_properties_file}")
474 buildingHTML = string("${jalviewDir}/${doc_dir}/building.html")
475 helpParentDir = string("${jalviewDir}/${help_parent_dir}")
476 helpSourceDir = string("${helpParentDir}/${help_dir}")
477 helpFile = string("${helpBuildDir}/${help_dir}/help.jhm")
480 relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
481 jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs")
482 jalviewjsSiteDir = string("${jalviewjsBuildDir}/${jalviewjs_site_dir}")
484 jalviewjsTransferSiteJsDir = string(jalviewjsSiteDir)
486 jalviewjsTransferSiteJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_js")
488 jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
489 jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
490 jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
491 jalviewjsJalviewCoreHtmlFile = string("")
492 jalviewjsJalviewCoreName = string(jalviewjs_core_name)
493 jalviewjsCoreClasslists = []
494 jalviewjsJalviewTemplateName = string(jalviewjs_name)
495 jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}")
496 jalviewjsJ2sAltSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_alt_settings}")
497 jalviewjsJ2sProps = null
498 jalviewjsJ2sPlugin = jalviewjs_j2s_plugin
500 eclipseWorkspace = null
501 eclipseBinary = string("")
502 eclipseVersion = string("")
512 outputDir = file(classesDir)
516 srcDirs = [ resourcesBuildDir, docBuildDir, helpBuildDir ]
519 compileClasspath = files(sourceSets.main.java.outputDir)
520 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
522 runtimeClasspath = compileClasspath
523 runtimeClasspath += files(sourceSets.main.resources.srcDirs)
528 srcDirs cloverInstrDir
529 outputDir = cloverClassesDir
533 srcDirs = sourceSets.main.resources.srcDirs
536 compileClasspath = files( sourceSets.clover.java.outputDir )
537 //compileClasspath += files( testClassesDir )
538 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
539 compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
540 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
542 runtimeClasspath = compileClasspath
547 srcDirs testSourceDir
548 outputDir = file(testClassesDir)
552 srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs
555 compileClasspath = files( sourceSets.test.java.outputDir )
556 compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath
557 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
559 runtimeClasspath = compileClasspath
560 runtimeClasspath += files(sourceSets.test.resources.srcDirs)
566 // eclipse project and settings files creation, also used by buildship
569 name = eclipse_project_name
571 natures 'org.eclipse.jdt.core.javanature',
572 'org.eclipse.jdt.groovy.core.groovyNature',
573 'org.eclipse.buildship.core.gradleprojectnature'
575 buildCommand 'org.eclipse.jdt.core.javabuilder'
576 buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
580 //defaultOutputDir = sourceSets.main.java.outputDir
581 configurations.each{ c->
582 if (c.isCanBeResolved()) {
583 minusConfigurations += [c]
587 plusConfigurations = [ ]
591 def removeTheseToo = []
592 HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
593 cp.entries.each { entry ->
594 // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test".
595 // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover
596 // we add the resources and help/help dirs in as libs afterwards (see below)
597 if (entry.kind == 'src') {
598 if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) {
599 removeTheseToo += entry
601 alreadyAddedSrcPath.putAt(entry.path, true)
606 cp.entries.removeAll(removeTheseToo)
608 //cp.entries += new Output("${eclipse_bin_dir}/main")
609 if (file(helpParentDir).isDirectory()) {
610 cp.entries += new Library(fileReference(helpParentDir))
612 if (file(resourceDir).isDirectory()) {
613 cp.entries += new Library(fileReference(resourceDir))
616 HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
618 sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
619 //don't want to add outputDir as eclipse is using its own output dir in bin/main
620 if (it.isDirectory() || ! it.exists()) {
621 // don't add dirs to classpath, especially if they don't exist
622 return false // groovy "continue" in .any closure
624 def itPath = it.toString()
625 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
626 // make relative path
627 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
629 if (alreadyAddedLibPath.get(itPath)) {
630 //println("Not adding duplicate entry "+itPath)
632 //println("Adding entry "+itPath)
633 cp.entries += new Library(fileReference(itPath))
634 alreadyAddedLibPath.put(itPath, true)
638 sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
639 //no longer want to add outputDir as eclipse is using its own output dir in bin/main
640 if (it.isDirectory() || ! it.exists()) {
641 // don't add dirs to classpath
642 return false // groovy "continue" in .any closure
645 def itPath = it.toString()
646 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
647 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
649 if (alreadyAddedLibPath.get(itPath)) {
652 def lib = new Library(fileReference(itPath))
653 lib.entryAttributes["test"] = "true"
655 alreadyAddedLibPath.put(itPath, true)
663 containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
668 // for the IDE, use java 11 compatibility
669 sourceCompatibility = compile_source_compatibility
670 targetCompatibility = compile_target_compatibility
671 javaRuntimeName = eclipseJavaRuntimeName
673 // add in jalview project specific properties/preferences into eclipse core preferences
675 withProperties { props ->
676 def jalview_prefs = new Properties()
677 def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}")
678 jalview_prefs.load(ins)
680 jalview_prefs.forEach { t, v ->
681 if (props.getAt(t) == null) {
685 // codestyle file -- overrides previous formatter prefs
686 def csFile = file("${jalviewDirAbsolutePath}/${eclipse_codestyle_file}")
687 if (csFile.exists()) {
688 XmlParser parser = new XmlParser()
689 def profiles = parser.parse(csFile)
690 def profile = profiles.'profile'.find { p -> (p.'@kind' == "CodeFormatterProfile" && p.'@name' == "Jalview") }
691 if (profile != null) {
692 profile.'setting'.each { s ->
694 def value = s.'@value'
695 if (id != null && value != null) {
696 props.putAt(id, value)
707 // Don't want these to be activated if in headless build
708 synchronizationTasks "eclipseSynchronizationTask"
709 //autoBuildTasks "eclipseAutoBuildTask"
715 /* hack to change eclipse prefs in .settings files other than org.eclipse.jdt.core.prefs */
716 // Class to allow updating arbitrary properties files
717 class PropertiesFile extends PropertiesPersistableConfigurationObject {
718 public PropertiesFile(PropertiesTransformer t) { super(t); }
719 @Override protected void load(Properties properties) { }
720 @Override protected void store(Properties properties) { }
721 @Override protected String getDefaultResourceName() { return ""; }
722 // This is necessary, because PropertiesPersistableConfigurationObject fails
723 // if no default properties file exists.
724 @Override public void loadDefaults() { load(new StringBufferInputStream("")); }
727 // Task to update arbitrary properties files (set outputFile)
728 class PropertiesFileTask extends PropertiesGeneratorTask<PropertiesFile> {
729 private final PropertiesFileContentMerger file;
730 public PropertiesFileTask() { file = new PropertiesFileContentMerger(getTransformer()); }
731 protected PropertiesFile create() { return new PropertiesFile(getTransformer()); }
732 protected void configure(PropertiesFile props) {
733 file.getBeforeMerged().execute(props); file.getWhenMerged().execute(props);
735 public void file(Closure closure) { ConfigureUtil.configure(closure, file); }
738 task eclipseUIPreferences(type: PropertiesFileTask) {
739 description = "Generate Eclipse additional settings"
740 def filename = "org.eclipse.jdt.ui.prefs"
741 outputFile = "$projectDir/.settings/${filename}" as File
744 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
749 task eclipseGroovyCorePreferences(type: PropertiesFileTask) {
750 description = "Generate Eclipse additional settings"
751 def filename = "org.eclipse.jdt.groovy.core.prefs"
752 outputFile = "$projectDir/.settings/${filename}" as File
755 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
760 task eclipseAllPreferences {
762 dependsOn eclipseUIPreferences
763 dependsOn eclipseGroovyCorePreferences
766 eclipseUIPreferences.mustRunAfter eclipseJdt
767 eclipseGroovyCorePreferences.mustRunAfter eclipseJdt
769 /* end of eclipse preferences hack */
777 delete cloverBuildDir
778 delete cloverReportDir
783 task cloverInstrJava(type: JavaExec) {
784 group = "Verification"
785 description = "Create clover instrumented source java files"
787 dependsOn cleanClover
789 inputs.files(sourceSets.main.allJava)
790 outputs.dir(cloverInstrDir)
792 //classpath = fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
793 classpath = sourceSets.clover.compileClasspath
794 main = "com.atlassian.clover.CloverInstr"
802 cloverInstrDir.getPath(),
804 def srcFiles = sourceSets.main.allJava.files
807 { file -> file.absolutePath }
810 args argsList.toArray()
813 delete cloverInstrDir
814 println("Clover: About to instrument "+srcFiles.size() +" files")
819 task cloverInstrTests(type: JavaExec) {
820 group = "Verification"
821 description = "Create clover instrumented source test files"
823 dependsOn cleanClover
825 inputs.files(testDir)
826 outputs.dir(cloverTestInstrDir)
828 classpath = sourceSets.clover.compileClasspath
829 main = "com.atlassian.clover.CloverInstr"
839 cloverTestInstrDir.getPath(),
841 args argsList.toArray()
844 delete cloverTestInstrDir
845 println("Clover: About to instrument test files")
851 group = "Verification"
852 description = "Create clover instrumented all source files"
854 dependsOn cloverInstrJava
855 dependsOn cloverInstrTests
859 cloverClasses.dependsOn cloverInstr
862 task cloverConsoleReport(type: JavaExec) {
863 group = "Verification"
864 description = "Creates clover console report"
867 file(cloverDb).exists()
870 inputs.dir cloverClassesDir
872 classpath = sourceSets.clover.runtimeClasspath
873 main = "com.atlassian.clover.reporters.console.ConsoleReporter"
875 if (cloverreport_mem.length() > 0) {
876 maxHeapSize = cloverreport_mem
878 if (cloverreport_jvmargs.length() > 0) {
879 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
889 args argsList.toArray()
893 task cloverHtmlReport(type: JavaExec) {
894 group = "Verification"
895 description = "Creates clover HTML report"
898 file(cloverDb).exists()
901 def cloverHtmlDir = cloverReportDir
902 inputs.dir cloverClassesDir
903 outputs.dir cloverHtmlDir
905 classpath = sourceSets.clover.runtimeClasspath
906 main = "com.atlassian.clover.reporters.html.HtmlReporter"
908 if (cloverreport_mem.length() > 0) {
909 maxHeapSize = cloverreport_mem
911 if (cloverreport_jvmargs.length() > 0) {
912 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
923 if (cloverreport_html_options.length() > 0) {
924 argsList += cloverreport_html_options.split(" ")
927 args argsList.toArray()
931 task cloverXmlReport(type: JavaExec) {
932 group = "Verification"
933 description = "Creates clover XML report"
936 file(cloverDb).exists()
939 def cloverXmlFile = "${cloverReportDir}/clover.xml"
940 inputs.dir cloverClassesDir
941 outputs.file cloverXmlFile
943 classpath = sourceSets.clover.runtimeClasspath
944 main = "com.atlassian.clover.reporters.xml.XMLReporter"
946 if (cloverreport_mem.length() > 0) {
947 maxHeapSize = cloverreport_mem
949 if (cloverreport_jvmargs.length() > 0) {
950 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
961 if (cloverreport_xml_options.length() > 0) {
962 argsList += cloverreport_xml_options.split(" ")
965 args argsList.toArray()
970 group = "Verification"
971 description = "Creates clover reports"
973 dependsOn cloverXmlReport
974 dependsOn cloverHtmlReport
981 sourceCompatibility = compile_source_compatibility
982 targetCompatibility = compile_target_compatibility
983 options.compilerArgs += additional_compiler_args
984 print ("Setting target compatibility to "+targetCompatibility+"\n")
986 //classpath += configurations.cloverRuntime
992 // JBP->BS should the print statement in doFirst refer to compile_target_compatibility ?
993 sourceCompatibility = compile_source_compatibility
994 targetCompatibility = compile_target_compatibility
995 options.compilerArgs = additional_compiler_args
996 options.encoding = "UTF-8"
998 print ("Setting target compatibility to "+compile_target_compatibility+"\n")
1005 sourceCompatibility = compile_source_compatibility
1006 targetCompatibility = compile_target_compatibility
1007 options.compilerArgs = additional_compiler_args
1009 print ("Setting target compatibility to "+targetCompatibility+"\n")
1016 delete sourceSets.main.java.outputDir
1022 dependsOn cleanClover
1024 delete sourceSets.test.java.outputDir
1029 // format is a string like date.format("dd MMMM yyyy")
1030 def getDate(format) {
1031 def date = new Date()
1032 return date.format(format)
1036 def convertMdToHtml (FileTree mdFiles, File cssFile) {
1037 MutableDataSet options = new MutableDataSet()
1039 def extensions = new ArrayList<>()
1040 extensions.add(AnchorLinkExtension.create())
1041 extensions.add(AutolinkExtension.create())
1042 extensions.add(StrikethroughExtension.create())
1043 extensions.add(TaskListExtension.create())
1044 extensions.add(TablesExtension.create())
1045 extensions.add(TocExtension.create())
1047 options.set(Parser.EXTENSIONS, extensions)
1049 // set GFM table parsing options
1050 options.set(TablesExtension.WITH_CAPTION, false)
1051 options.set(TablesExtension.COLUMN_SPANS, false)
1052 options.set(TablesExtension.MIN_HEADER_ROWS, 1)
1053 options.set(TablesExtension.MAX_HEADER_ROWS, 1)
1054 options.set(TablesExtension.APPEND_MISSING_COLUMNS, true)
1055 options.set(TablesExtension.DISCARD_EXTRA_COLUMNS, true)
1056 options.set(TablesExtension.HEADER_SEPARATOR_COLUMN_MATCH, true)
1058 options.set(AnchorLinkExtension.ANCHORLINKS_SET_ID, false)
1059 options.set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor")
1060 options.set(AnchorLinkExtension.ANCHORLINKS_SET_NAME, true)
1061 options.set(AnchorLinkExtension.ANCHORLINKS_TEXT_PREFIX, "<span class=\"octicon octicon-link\"></span>")
1063 Parser parser = Parser.builder(options).build()
1064 HtmlRenderer renderer = HtmlRenderer.builder(options).build()
1066 mdFiles.each { mdFile ->
1067 // add table of contents
1068 def mdText = "[TOC]\n"+mdFile.text
1070 // grab the first top-level title
1072 def titleRegex = /(?m)^#(\s+|([^#]))(.*)/
1073 def matcher = mdText =~ titleRegex
1074 if (matcher.size() > 0) {
1075 // matcher[0][2] is the first character of the title if there wasn't any whitespace after the #
1076 title = (matcher[0][2] != null ? matcher[0][2] : "")+matcher[0][3]
1078 // or use the filename if none found
1079 if (title == null) {
1080 title = mdFile.getName()
1083 Node document = parser.parse(mdText)
1084 String htmlBody = renderer.render(document)
1085 def htmlText = '''<html>
1086 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1087 <html xmlns="http://www.w3.org/1999/xhtml">
1089 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1090 <meta http-equiv="Content-Style-Type" content="text/css" />
1091 <meta name="generator" content="flexmark" />
1093 htmlText += ((title != null) ? " <title>${title}</title>" : '' )
1095 <style type="text/css">code{white-space: pre;}</style>
1097 htmlText += ((cssFile != null) ? cssFile.text : '')
1098 htmlText += '''</head>
1101 htmlText += htmlBody
1107 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1108 def htmlFile = file(htmlFilePath)
1109 println("Creating ${htmlFilePath}")
1110 htmlFile.text = htmlText
1115 task copyDocs(type: Copy) {
1116 def inputDir = "${jalviewDir}/${doc_dir}"
1117 def outputDir = "${docBuildDir}/${doc_dir}"
1121 include('**/*.html')
1123 filter(ReplaceTokens,
1127 'Version-Rel': JALVIEW_VERSION,
1128 'Year-Rel': getDate("yyyy")
1135 exclude('**/*.html')
1140 inputs.dir(inputDir)
1141 outputs.dir(outputDir)
1145 task convertMdFiles {
1147 def mdFiles = fileTree(dir: docBuildDir, include: "**/*.md")
1148 def cssFile = file("${jalviewDir}/${flexmark_css}")
1151 convertMdToHtml(mdFiles, cssFile)
1154 inputs.files(mdFiles)
1155 inputs.file(cssFile)
1158 mdFiles.each { mdFile ->
1159 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1160 htmlFiles.add(file(htmlFilePath))
1162 outputs.files(htmlFiles)
1166 task copyHelp(type: Copy) {
1167 def inputDir = helpSourceDir
1168 def outputDir = "${helpBuildDir}/${help_dir}"
1172 include('**/*.html')
1176 filter(ReplaceTokens,
1180 'Version-Rel': JALVIEW_VERSION,
1181 'Year-Rel': getDate("yyyy")
1188 exclude('**/*.html')
1195 inputs.dir(inputDir)
1196 outputs.files(helpFile)
1197 outputs.dir(outputDir)
1201 task copyResources(type: Copy) {
1203 description = "Copy (and make text substitutions in) the resources dir to the build area"
1205 def inputDir = resourceDir
1206 def outputDir = resourcesBuildDir
1210 include('**/*.html')
1212 filter(ReplaceTokens,
1216 'Version-Rel': JALVIEW_VERSION,
1217 'Year-Rel': getDate("yyyy")
1224 exclude('**/*.html')
1229 inputs.dir(inputDir)
1230 outputs.dir(outputDir)
1233 task copyChannelResources(type: Copy) {
1234 dependsOn copyResources
1236 description = "Copy the channel resources dir to the build resources area"
1238 def inputDir = "${channelDir}/${resource_dir}"
1239 def outputDir = resourcesBuildDir
1243 inputs.dir(inputDir)
1244 outputs.dir(outputDir)
1247 task createBuildProperties(type: WriteProperties) {
1248 dependsOn copyResources
1250 description = "Create the ${buildProperties} file"
1252 inputs.dir(sourceDir)
1253 inputs.dir(resourcesBuildDir)
1254 outputFile (buildProperties)
1255 // taking time specific comment out to allow better incremental builds
1256 comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
1257 //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
1258 property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
1259 property "VERSION", JALVIEW_VERSION
1260 property "INSTALLATION", INSTALLATION+" git-commit:"+gitHash+" ["+gitBranch+"]"
1261 if (getdownSetAppBaseProperty) {
1262 property "GETDOWNAPPBASE", getdownAppBase
1263 property "GETDOWNAPPDISTDIR", getdownAppDistDir
1265 outputs.file(outputFile)
1269 task buildIndices(type: JavaExec) {
1271 classpath = sourceSets.main.compileClasspath
1272 main = "com.sun.java.help.search.Indexer"
1273 workingDir = "${helpBuildDir}/${help_dir}"
1276 inputs.dir("${workingDir}/${argDir}")
1278 outputs.dir("${classesDir}/doc")
1279 outputs.dir("${classesDir}/help")
1280 outputs.file("${workingDir}/JavaHelpSearch/DOCS")
1281 outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB")
1282 outputs.file("${workingDir}/JavaHelpSearch/OFFSETS")
1283 outputs.file("${workingDir}/JavaHelpSearch/POSITIONS")
1284 outputs.file("${workingDir}/JavaHelpSearch/SCHEMA")
1285 outputs.file("${workingDir}/JavaHelpSearch/TMAP")
1288 task buildResources {
1289 dependsOn copyResources
1290 dependsOn copyChannelResources
1291 dependsOn createBuildProperties
1295 dependsOn buildResources
1298 dependsOn convertMdFiles
1299 dependsOn buildIndices
1303 compileJava.dependsOn prepare
1304 run.dependsOn compileJava
1305 //run.dependsOn prepare
1308 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
1313 dependsOn cloverClasses
1315 dependsOn compileJava //?
1319 includeGroups testng_groups
1320 excludeGroups testng_excluded_groups
1322 useDefaultListeners=true
1325 maxHeapSize = "1024m"
1327 workingDir = jalviewDir
1328 def testLaf = project.findProperty("test_laf")
1329 if (testLaf != null) {
1330 println("Setting Test LaF to '${testLaf}'")
1331 systemProperty "laf", testLaf
1333 def testHiDPIScale = project.findProperty("test_HiDPIScale")
1334 if (testHiDPIScale != null) {
1335 println("Setting Test HiDPI Scale to '${testHiDPIScale}'")
1336 systemProperty "sun.java2d.uiScale", testHiDPIScale
1338 sourceCompatibility = compile_source_compatibility
1339 targetCompatibility = compile_target_compatibility
1340 jvmArgs += additional_compiler_args
1344 println("Running tests " + (useClover?"WITH":"WITHOUT") + " clover")
1350 task compileLinkCheck(type: JavaCompile) {
1352 classpath = files("${jalviewDir}/${utils_dir}")
1353 destinationDir = file("${jalviewDir}/${utils_dir}")
1354 source = fileTree(dir: "${jalviewDir}/${utils_dir}", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
1356 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1357 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1358 outputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.class")
1359 outputs.file("${jalviewDir}/${utils_dir}/BufferedLineReader.class")
1363 task linkCheck(type: JavaExec) {
1365 dependsOn compileLinkCheck
1367 def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
1368 classpath = files("${jalviewDir}/${utils_dir}")
1369 main = "HelpLinksChecker"
1370 workingDir = jalviewDir
1371 args = [ "${helpBuildDir}/${help_dir}", "-nointernet" ]
1373 def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
1374 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
1377 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
1381 inputs.dir(helpBuildDir)
1382 outputs.file(helpLinksCheckerOutFile)
1386 // import the pubhtmlhelp target
1387 ant.properties.basedir = "${jalviewDir}"
1388 ant.properties.helpBuildDir = "${helpBuildDir}/${help_dir}"
1389 ant.importBuild "${utils_dir}/publishHelp.xml"
1392 task cleanPackageDir(type: Delete) {
1394 delete fileTree(dir: "${jalviewDir}/${package_dir}", include: "*.jar")
1404 attributes "Main-Class": main_class,
1405 "Permissions": "all-permissions",
1406 "Application-Name": install4jApplicationName,
1407 "Codebase": application_codebase,
1408 "Implementation-Version": JALVIEW_VERSION
1411 def outputDir = "${jalviewDir}/${package_dir}"
1412 destinationDirectory = file(outputDir)
1413 archiveFileName = rootProject.name+".jar"
1414 duplicatesStrategy "EXCLUDE"
1421 exclude "**/*.jar.*"
1423 inputs.dir(sourceSets.main.java.outputDir)
1424 sourceSets.main.resources.srcDirs.each{ dir ->
1427 outputs.file("${outputDir}/${archiveFileName}")
1431 task copyJars(type: Copy) {
1432 from fileTree(dir: classesDir, include: "**/*.jar").files
1433 into "${jalviewDir}/${package_dir}"
1437 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
1438 task syncJars(type: Sync) {
1440 from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
1441 into "${jalviewDir}/${package_dir}"
1443 include jar.archiveFileName.getOrNull()
1450 description = "Put all required libraries in dist"
1451 // order of "cleanPackageDir", "copyJars", "jar" important!
1452 jar.mustRunAfter cleanPackageDir
1453 syncJars.mustRunAfter cleanPackageDir
1454 dependsOn cleanPackageDir
1457 outputs.dir("${jalviewDir}/${package_dir}")
1462 dependsOn cleanPackageDir
1469 group = "distribution"
1470 description = "Create a single jar file with all dependency libraries merged. Can be run with java -jar"
1474 from ("${jalviewDir}/${libDistDir}") {
1478 attributes "Implementation-Version": JALVIEW_VERSION,
1479 "Application-Name": install4jApplicationName
1482 duplicatesStrategy "INCLUDE"
1484 mainClassName = shadow_jar_main_class
1486 classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
1491 task getdownWebsite() {
1492 group = "distribution"
1493 description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
1498 def getdownWebsiteResourceFilenames = []
1499 def getdownTextString = ""
1500 def getdownResourceDir = getdownResourceDir
1501 def getdownResourceFilenames = []
1504 // clean the getdown website and files dir before creating getdown folders
1505 delete getdownWebsiteDir
1506 delete getdownFilesDir
1509 from buildProperties
1510 rename(file(buildProperties).getName(), getdown_build_properties)
1513 getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
1516 from channelPropsFile
1517 into getdownWebsiteDir
1519 getdownWebsiteResourceFilenames += file(channelPropsFile).getName()
1521 // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
1522 def props = project.properties.sort { it.key }
1523 if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
1524 props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
1526 if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) {
1527 props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion)
1529 if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
1530 props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
1532 if (getdownImagesDir != null && file(getdownImagesDir).exists()) {
1533 props.put("getdown_txt_ui.background_image", "${getdownImagesDir}/${getdown_background_image}")
1534 props.put("getdown_txt_ui.instant_background_image", "${getdownImagesDir}/${getdown_instant_background_image}")
1535 props.put("getdown_txt_ui.error_background", "${getdownImagesDir}/${getdown_error_background}")
1536 props.put("getdown_txt_ui.progress_image", "${getdownImagesDir}/${getdown_progress_image}")
1537 props.put("getdown_txt_ui.icon", "${getdownImagesDir}/${getdown_icon}")
1538 props.put("getdown_txt_ui.mac_dock_icon", "${getdownImagesDir}/${getdown_mac_dock_icon}")
1541 props.put("getdown_txt_title", jalview_name)
1542 props.put("getdown_txt_ui.name", install4jApplicationName)
1544 // start with appbase
1545 getdownTextString += "appbase = ${getdownAppBase}\n"
1546 props.each{ prop, val ->
1547 if (prop.startsWith("getdown_txt_") && val != null) {
1548 if (prop.startsWith("getdown_txt_multi_")) {
1549 def key = prop.substring(18)
1550 val.split(",").each{ v ->
1551 def line = "${key} = ${v}\n"
1552 getdownTextString += line
1555 // file values rationalised
1556 if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
1558 if (val.indexOf('/') == 0) {
1561 } else if (val.indexOf('/') > 0) {
1562 // relative path (relative to jalviewDir)
1563 r = file( "${jalviewDir}/${val}" )
1566 val = "${getdown_resource_dir}/" + r.getName()
1567 getdownWebsiteResourceFilenames += val
1568 getdownResourceFilenames += r.getPath()
1571 if (! prop.startsWith("getdown_txt_resource")) {
1572 def line = prop.substring(12) + " = ${val}\n"
1573 getdownTextString += line
1579 getdownWebsiteResourceFilenames.each{ filename ->
1580 getdownTextString += "resource = ${filename}\n"
1582 getdownResourceFilenames.each{ filename ->
1585 into getdownResourceDir
1589 def getdownWrapperScripts = [ getdown_bash_wrapper_script, getdown_powershell_wrapper_script, getdown_batch_wrapper_script ]
1590 getdownWrapperScripts.each{ script ->
1591 def s = file( "${jalviewDir}/utils/getdown/${getdown_wrapper_script_dir}/${script}" )
1595 into "${getdownWebsiteDir}/${getdown_wrapper_script_dir}"
1597 getdownTextString += "resource = ${getdown_wrapper_script_dir}/${script}\n"
1602 fileTree(file(package_dir)).each{ f ->
1603 if (f.isDirectory()) {
1604 def files = fileTree(dir: f, include: ["*"]).getFiles()
1606 } else if (f.exists()) {
1610 def jalviewJar = jar.archiveFileName.getOrNull()
1611 // put jalview.jar first for CLASSPATH and .properties files reasons
1612 codeFiles.sort{a, b -> ( a.getName() == jalviewJar ? -1 : ( b.getName() == jalviewJar ? 1 : a <=> b ) ) }.each{f ->
1613 def name = f.getName()
1614 def line = "code = ${getdownAppDistDir}/${name}\n"
1615 getdownTextString += line
1622 // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
1624 if (JAVA_VERSION.equals("11")) {
1625 def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
1626 j11libFiles.sort().each{f ->
1627 def name = f.getName()
1628 def line = "code = ${getdown_j11lib_dir}/${name}\n"
1629 getdownTextString += line
1632 into getdownJ11libDir
1638 // 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.
1639 //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
1640 getdownTextString += "resource = ${getdown_launcher_new}\n"
1641 getdownTextString += "class = ${main_class}\n"
1642 // Not setting these properties in general so that getdownappbase and getdowndistdir will default to release version in jalview.bin.Cache
1643 if (getdownSetAppBaseProperty) {
1644 getdownTextString += "jvmarg = -Dgetdowndistdir=${getdownAppDistDir}\n"
1645 getdownTextString += "jvmarg = -Dgetdownappbase=${getdownAppBase}\n"
1648 def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
1649 getdown_txt.write(getdownTextString)
1651 def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
1652 def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
1653 launchJvl.write("appbase=${getdownAppBase}")
1655 // files going into the getdown website dir: getdown-launcher.jar
1657 from getdownLauncher
1658 rename(file(getdownLauncher).getName(), getdown_launcher_new)
1659 into getdownWebsiteDir
1662 // files going into the getdown website dir: getdown-launcher(-local).jar
1664 from getdownLauncher
1665 if (file(getdownLauncher).getName() != getdown_launcher) {
1666 rename(file(getdownLauncher).getName(), getdown_launcher)
1668 into getdownWebsiteDir
1671 // files going into the getdown website dir: ./install dir and files
1672 if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
1675 from getdownLauncher
1676 from "${getdownAppDir}/${getdown_build_properties}"
1677 if (file(getdownLauncher).getName() != getdown_launcher) {
1678 rename(file(getdownLauncher).getName(), getdown_launcher)
1680 into getdownInstallDir
1683 // and make a copy in the getdown files dir (these are not downloaded by getdown)
1685 from getdownInstallDir
1686 into getdownFilesInstallDir
1690 // files going into the getdown files dir: getdown.txt, getdown-launcher.jar, channel-launch.jvl, build_properties
1694 from getdownLauncher
1695 from "${getdownWebsiteDir}/${getdown_build_properties}"
1696 from "${getdownWebsiteDir}/${channel_props}"
1697 if (file(getdownLauncher).getName() != getdown_launcher) {
1698 rename(file(getdownLauncher).getName(), getdown_launcher)
1700 into getdownFilesDir
1703 // and ./resources (not all downloaded by getdown)
1705 from getdownResourceDir
1706 into "${getdownFilesDir}/${getdown_resource_dir}"
1711 inputs.dir("${jalviewDir}/${package_dir}")
1713 outputs.dir(getdownWebsiteDir)
1714 outputs.dir(getdownFilesDir)
1718 // a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir
1719 task getdownDigestDir(type: JavaExec) {
1721 description "A task to run a getdown Digest on a dir with getdown.txt. Provide a DIGESTDIR property via -PDIGESTDIR=..."
1723 def digestDirPropertyName = "DIGESTDIR"
1725 classpath = files(getdownLauncher)
1726 def digestDir = findProperty(digestDirPropertyName)
1727 if (digestDir == null) {
1728 throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest")
1732 main = "com.threerings.getdown.tools.Digester"
1736 task getdownDigest(type: JavaExec) {
1737 group = "distribution"
1738 description = "Digest the getdown website folder"
1739 dependsOn getdownWebsite
1741 classpath = files(getdownLauncher)
1743 main = "com.threerings.getdown.tools.Digester"
1744 args getdownWebsiteDir
1745 inputs.dir(getdownWebsiteDir)
1746 outputs.file("${getdownWebsiteDir}/digest2.txt")
1751 group = "distribution"
1752 description = "Create the minimal and full getdown app folder for installers and website and create digest file"
1753 dependsOn getdownDigest
1755 if (reportRsyncCommand) {
1756 def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
1757 def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
1758 println "LIKELY RSYNC COMMAND:"
1759 println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
1760 if (RUNRSYNC == "true") {
1762 commandLine "mkdir", "-p", toDir
1765 commandLine "rsync", "-avh", "--delete", fromDir, toDir
1773 task getdownArchive() {
1774 group = "distribution"
1775 description = "Create the archive dir to go on the website"
1777 dependsOn getdownWebsite
1784 tasks.withType(JavaCompile) {
1785 options.encoding = 'UTF-8'
1791 delete getdownWebsiteDir
1792 delete getdownFilesDir
1798 if (file(install4jHomeDir).exists()) {
1800 } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) {
1801 install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
1802 } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) {
1803 install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app"
1805 installDir(file(install4jHomeDir))
1807 mediaTypes = Arrays.asList(install4j_media_types.split(","))
1811 task copyInstall4jTemplate {
1812 def install4jTemplateFile = file("${install4jDir}/${install4j_template}")
1813 def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}")
1814 inputs.file(install4jTemplateFile)
1815 inputs.file(install4jFileAssociationsFile)
1816 inputs.property("CHANNEL", { CHANNEL })
1817 outputs.file(install4jConfFile)
1820 def install4jConfigXml = new XmlParser().parse(install4jTemplateFile)
1822 // turn off code signing if no OSX_KEYPASS
1823 if (OSX_KEYPASS == "") {
1824 install4jConfigXml.'**'.codeSigning.each { codeSigning ->
1825 codeSigning.'@macEnabled' = "false"
1827 install4jConfigXml.'**'.windows.each { windows ->
1828 windows.'@runPostProcessor' = "false"
1832 // disable install screen for OSX dmg (for 2.11.2.0)
1833 install4jConfigXml.'**'.macosArchive.each { macosArchive ->
1834 macosArchive.attributes().remove('executeSetupApp')
1835 macosArchive.attributes().remove('setupAppId')
1838 // turn off checksum creation for LOCAL channel
1839 def e = install4jConfigXml.application[0]
1840 if (CHANNEL == "LOCAL") {
1841 e.'@createChecksums' = "false"
1843 e.'@createChecksums' = "true"
1846 // put file association actions where placeholder action is
1847 def install4jFileAssociationsText = install4jFileAssociationsFile.text
1848 def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
1849 install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true
1850 if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') {
1851 def parent = a.parent()
1853 fileAssociationActions.each { faa ->
1856 // don't need to continue in .any loop once replacements have been made
1861 // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else
1862 // NB we're deleting the /other/ one!
1863 // Also remove the examples subdir from non-release versions
1864 def customizedIdToDelete = "PROGRAM_GROUP_RELEASE"
1865 // 2.11.1.0 NOT releasing with the Examples folder in the Program Group
1866 if (false && CHANNEL=="RELEASE") { // remove 'false && ' to include Examples folder in RELEASE channel
1867 customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE"
1869 // remove the examples subdir from Full File Set
1870 def files = install4jConfigXml.files[0]
1871 def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" }
1872 def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' }
1873 def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' }
1874 def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" }
1875 dirEntry.parent().remove(dirEntry)
1877 install4jConfigXml.'**'.action.any { a ->
1878 if (a.'@customizedId' == customizedIdToDelete) {
1879 def parent = a.parent()
1885 // write install4j file
1886 install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
1893 delete install4jConfFile
1898 task installers(type: com.install4j.gradle.Install4jTask) {
1899 group = "distribution"
1900 description = "Create the install4j installers"
1902 dependsOn copyInstall4jTemplate
1904 projectFile = install4jConfFile
1906 // create an md5 for the input files to use as version for install4j conf file
1907 def digest = MessageDigest.getInstance("MD5")
1909 (file("${install4jDir}/${install4j_template}").text +
1910 file("${install4jDir}/${install4j_info_plist_file_associations}").text +
1911 file("${install4jDir}/${install4j_installer_file_associations}").text).bytes)
1912 def filesMd5 = new BigInteger(1, digest.digest()).toString(16)
1913 if (filesMd5.length() >= 8) {
1914 filesMd5 = filesMd5.substring(0,8)
1916 def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
1917 // make install4jBuildDir relative to jalviewDir
1918 def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
1921 'JALVIEW_NAME': jalview_name,
1922 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
1923 'JALVIEW_DIR': "../..",
1924 'OSX_KEYSTORE': OSX_KEYSTORE,
1925 'OSX_APPLEID': OSX_APPLEID,
1926 'OSX_ALTOOLPASS': OSX_ALTOOLPASS,
1927 'JSIGN_SH': JSIGN_SH,
1928 'JRE_DIR': getdown_app_dir_java,
1929 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
1930 'JALVIEW_VERSION': JALVIEW_VERSION,
1931 'JAVA_MIN_VERSION': JAVA_MIN_VERSION,
1932 'JAVA_MAX_VERSION': JAVA_MAX_VERSION,
1933 'JAVA_VERSION': JAVA_VERSION,
1934 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
1935 'VERSION': JALVIEW_VERSION,
1936 'MACOS_JAVA_VM_DIR': macosJavaVMDir,
1937 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
1938 'LINUX_JAVA_VM_DIR': linuxJavaVMDir,
1939 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
1940 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
1941 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz,
1942 'COPYRIGHT_MESSAGE': install4j_copyright_message,
1943 'BUNDLE_ID': install4jBundleId,
1944 'INTERNAL_ID': install4jInternalId,
1945 'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
1946 'MACOS_DMG_DS_STORE': install4jDMGDSStore,
1947 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
1948 'WRAPPER_LINK': getdownWrapperLink,
1949 'BASH_WRAPPER_SCRIPT': getdown_bash_wrapper_script,
1950 'POWERSHELL_WRAPPER_SCRIPT': getdown_powershell_wrapper_script,
1951 'WRAPPER_SCRIPT_BIN_DIR': getdown_wrapper_script_dir,
1952 'INSTALLER_NAME': install4jInstallerName,
1953 'INSTALL4J_UTILS_DIR': install4j_utils_dir,
1954 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
1955 'GETDOWN_FILES_DIR': getdown_files_dir,
1956 'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
1957 'GETDOWN_DIST_DIR': getdownAppDistDir,
1958 'GETDOWN_ALT_DIR': getdown_app_dir_alt,
1959 'GETDOWN_INSTALL_DIR': getdown_install_dir,
1960 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
1961 'BUILD_DIR': install4jBuildDir,
1962 'APPLICATION_CATEGORIES': install4j_application_categories,
1963 'APPLICATION_FOLDER': install4jApplicationFolder,
1964 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
1965 'EXECUTABLE_NAME': install4jExecutableName,
1966 'EXTRA_SCHEME': install4jExtraScheme,
1967 'MAC_ICONS_FILE': install4jMacIconsFile,
1968 'WINDOWS_ICONS_FILE': install4jWindowsIconsFile,
1969 'PNG_ICON_FILE': install4jPngIconFile,
1970 'BACKGROUND': install4jBackground,
1974 //println("INSTALL4J VARIABLES:")
1975 //variables.each{k,v->println("${k}=${v}")}
1977 destination = "${jalviewDir}/${install4jBuildDir}"
1978 buildSelected = true
1980 if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
1982 disableSigning = true
1983 disableNotarization = true
1987 macKeystorePassword = OSX_KEYPASS
1990 if (OSX_ALTOOLPASS) {
1991 appleIdPassword = OSX_ALTOOLPASS
1992 disableNotarization = false
1994 disableNotarization = true
1998 println("Using projectFile "+projectFile)
1999 if (!disableNotarization) { println("Will notarize OSX App DMG") }
2003 inputs.dir(getdownWebsiteDir)
2004 inputs.file(install4jConfFile)
2005 inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
2006 inputs.dir(macosJavaVMDir)
2007 inputs.dir(windowsJavaVMDir)
2008 outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
2014 eclipse().configFile(eclipse_codestyle_file)
2019 task sourceDist(type: Tar) {
2020 group "distribution"
2021 description "Create a source .tar.gz file for distribution"
2023 dependsOn createBuildProperties
2024 dependsOn convertMdFiles
2026 def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
2027 def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
2028 archiveFileName = outputFileName
2030 compression Compression.GZIP
2045 "**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales",
2047 "utils/InstallAnywhere",
2062 "gradle.properties",
2073 ".settings/org.eclipse.jdt.core.jalview.prefs",
2077 exclude (EXCLUDE_FILES)
2078 include (PROCESS_FILES)
2079 filter(ReplaceTokens,
2083 'Version-Rel': JALVIEW_VERSION,
2084 'Year-Rel': getDate("yyyy")
2089 exclude (EXCLUDE_FILES)
2090 exclude (PROCESS_FILES)
2091 exclude ("appletlib")
2092 exclude ("**/*locales")
2093 exclude ("*locales/**")
2094 exclude ("utils/InstallAnywhere")
2096 exclude (getdown_files_dir)
2097 exclude (getdown_website_dir)
2099 // exluding these as not using jars as modules yet
2100 exclude ("${j11modDir}/**/*.jar")
2103 include(INCLUDE_FILES)
2105 // from (jalviewDir) {
2106 // // explicit includes for stuff that seemed to not get included
2107 // include(fileTree("test/**/*."))
2108 // exclude(EXCLUDE_FILES)
2109 // exclude(PROCESS_FILES)
2112 from(file(buildProperties).getParent()) {
2113 include(file(buildProperties).getName())
2114 rename(file(buildProperties).getName(), "build_properties")
2116 line.replaceAll("^INSTALLATION=.*\$","INSTALLATION=Source Release"+" git-commit\\\\:"+gitHash+" ["+gitBranch+"]")
2125 dependsOn pubhtmlhelp
2127 inputs.dir("${helpBuildDir}/${help_dir}")
2128 outputs.dir("${buildDir}/distributions/${help_dir}")
2132 task j2sSetHeadlessBuild {
2139 task jalviewjsEnableAltFileProperty(type: WriteProperties) {
2141 description "Enable the alternative J2S Config file for headless build"
2143 outputFile = jalviewjsJ2sSettingsFileName
2144 def j2sPropsFile = file(jalviewjsJ2sSettingsFileName)
2145 def j2sProps = new Properties()
2146 if (j2sPropsFile.exists()) {
2148 def j2sPropsFileFIS = new FileInputStream(j2sPropsFile)
2149 j2sProps.load(j2sPropsFileFIS)
2150 j2sPropsFileFIS.close()
2152 j2sProps.each { prop, val ->
2155 } catch (Exception e) {
2156 println("Exception reading ${jalviewjsJ2sSettingsFileName}")
2160 if (! j2sProps.stringPropertyNames().contains(jalviewjs_j2s_alt_file_property_config)) {
2161 property(jalviewjs_j2s_alt_file_property_config, jalviewjs_j2s_alt_file_property)
2166 task jalviewjsSetEclipseWorkspace {
2167 def propKey = "jalviewjs_eclipse_workspace"
2169 if (project.hasProperty(propKey)) {
2170 propVal = project.getProperty(propKey)
2171 if (propVal.startsWith("~/")) {
2172 propVal = System.getProperty("user.home") + propVal.substring(1)
2175 def propsFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
2176 def propsFile = file(propsFileName)
2177 def eclipseWsDir = propVal
2178 def props = new Properties()
2180 def writeProps = true
2181 if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && propsFile.exists()) {
2182 def ins = new FileInputStream(propsFileName)
2185 if (props.getProperty(propKey, null) != null) {
2186 eclipseWsDir = props.getProperty(propKey)
2191 if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
2192 def tempDir = File.createTempDir()
2193 eclipseWsDir = tempDir.getAbsolutePath()
2196 eclipseWorkspace = file(eclipseWsDir)
2199 // do not run a headless transpile when we claim to be in Eclipse
2201 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2202 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2204 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2208 props.setProperty(propKey, eclipseWsDir)
2209 propsFile.parentFile.mkdirs()
2210 def bytes = new ByteArrayOutputStream()
2211 props.store(bytes, null)
2212 def propertiesString = bytes.toString()
2213 propsFile.text = propertiesString
2219 println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
2222 //inputs.property(propKey, eclipseWsDir) // eclipseWsDir only gets set once this task runs, so will be out-of-date
2223 outputs.file(propsFileName)
2224 outputs.upToDateWhen { eclipseWorkspace.exists() && propsFile.exists() }
2228 task jalviewjsEclipsePaths {
2231 def eclipseRoot = jalviewjs_eclipse_root
2232 if (eclipseRoot.startsWith("~/")) {
2233 eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
2235 if (OperatingSystem.current().isMacOsX()) {
2236 eclipseRoot += "/Eclipse.app"
2237 eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse"
2238 eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct"
2239 } else if (OperatingSystem.current().isWindows()) { // check these paths!!
2240 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2241 eclipseRoot += "/eclipse"
2243 eclipseBinary = "${eclipseRoot}/eclipse.exe"
2244 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2245 } else { // linux or unix
2246 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2247 eclipseRoot += "/eclipse"
2248 println("eclipseDir exists")
2250 eclipseBinary = "${eclipseRoot}/eclipse"
2251 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2254 eclipseVersion = "4.13" // default
2255 def assumedVersion = true
2256 if (file(eclipseProduct).exists()) {
2257 def fis = new FileInputStream(eclipseProduct)
2258 def props = new Properties()
2260 eclipseVersion = props.getProperty("version")
2262 assumedVersion = false
2265 def propKey = "eclipse_debug"
2266 eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true"))
2269 // do not run a headless transpile when we claim to be in Eclipse
2271 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2272 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2274 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2277 if (!assumedVersion) {
2278 println("ECLIPSE VERSION=${eclipseVersion}")
2284 task printProperties {
2286 description "Output to console all System.properties"
2288 System.properties.each { key, val -> System.out.println("Property: ${key}=${val}") }
2294 dependsOn eclipseProject
2295 dependsOn eclipseClasspath
2296 dependsOn eclipseJdt
2300 // this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir
2301 task jalviewjsEclipseCopyDropins(type: Copy) {
2302 dependsOn jalviewjsEclipsePaths
2304 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar")
2305 inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}")
2306 def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}"
2313 // this eclipse -clean doesn't actually work
2314 task jalviewjsCleanEclipse(type: Exec) {
2315 dependsOn eclipseSetup
2316 dependsOn jalviewjsEclipsePaths
2317 dependsOn jalviewjsEclipseCopyDropins
2319 executable(eclipseBinary)
2320 args(["-nosplash", "--launcher.suppressErrors", "-data", eclipseWorkspace.getPath(), "-clean", "-console", "-consoleLog"])
2326 def inputString = """exit
2329 def inputByteStream = new ByteArrayInputStream(inputString.getBytes())
2330 standardInput = inputByteStream
2333 /* not really working yet
2334 jalviewjsEclipseCopyDropins.finalizedBy jalviewjsCleanEclipse
2338 task jalviewjsTransferUnzipSwingJs {
2339 def file_zip = "${jalviewDir}/${jalviewjs_swingjs_zip}"
2343 from zipTree(file_zip)
2344 into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2348 inputs.file file_zip
2349 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2353 task jalviewjsTransferUnzipLib {
2354 def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
2357 zipFiles.each { file_zip ->
2359 from zipTree(file_zip)
2360 into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2365 inputs.files zipFiles
2366 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2370 task jalviewjsTransferUnzipAllLibs {
2371 dependsOn jalviewjsTransferUnzipSwingJs
2372 dependsOn jalviewjsTransferUnzipLib
2376 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
2378 description "Create the alternative j2s file from the j2s.* properties"
2380 jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
2381 def siteDirProperty = "j2s.site.directory"
2382 def setSiteDir = false
2383 jalviewjsJ2sProps.each { prop, val ->
2385 if (prop == siteDirProperty) {
2386 if (!(val.startsWith('/') || val.startsWith("file://") )) {
2387 val = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${val}"
2393 if (!setSiteDir) { // default site location, don't override specifically set property
2394 property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
2397 outputFile = jalviewjsJ2sAltSettingsFileName
2400 inputs.properties(jalviewjsJ2sProps)
2401 outputs.file(jalviewjsJ2sAltSettingsFileName)
2406 task jalviewjsEclipseSetup {
2407 dependsOn jalviewjsEclipseCopyDropins
2408 dependsOn jalviewjsSetEclipseWorkspace
2409 dependsOn jalviewjsCreateJ2sSettings
2413 task jalviewjsSyncAllLibs (type: Sync) {
2414 dependsOn jalviewjsTransferUnzipAllLibs
2415 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
2416 inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
2417 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2421 def outputFiles = []
2422 rename { filename ->
2423 outputFiles += "${outputDir}/${filename}"
2430 // should this be exclude really ?
2431 duplicatesStrategy "INCLUDE"
2433 outputs.files outputFiles
2434 inputs.files inputFiles
2438 task jalviewjsSyncResources (type: Sync) {
2439 dependsOn buildResources
2441 def inputFiles = fileTree(dir: resourcesBuildDir)
2442 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2446 def outputFiles = []
2447 rename { filename ->
2448 outputFiles += "${outputDir}/${filename}"
2454 outputs.files outputFiles
2455 inputs.files inputFiles
2459 task jalviewjsSyncSiteResources (type: Sync) {
2460 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}")
2461 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2465 def outputFiles = []
2466 rename { filename ->
2467 outputFiles += "${outputDir}/${filename}"
2473 outputs.files outputFiles
2474 inputs.files inputFiles
2478 task jalviewjsSyncBuildProperties (type: Sync) {
2479 dependsOn createBuildProperties
2480 def inputFiles = [file(buildProperties)]
2481 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2485 def outputFiles = []
2486 rename { filename ->
2487 outputFiles += "${outputDir}/${filename}"
2493 outputs.files outputFiles
2494 inputs.files inputFiles
2498 task jalviewjsProjectImport(type: Exec) {
2499 dependsOn eclipseSetup
2500 dependsOn jalviewjsEclipsePaths
2501 dependsOn jalviewjsEclipseSetup
2504 // do not run a headless import when we claim to be in Eclipse
2506 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2507 throw new StopExecutionException("Not running headless import whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2509 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2513 //def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
2514 def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
2515 executable(eclipseBinary)
2516 args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
2520 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2522 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2523 args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
2526 inputs.file("${jalviewDir}/.project")
2527 outputs.upToDateWhen {
2528 file(projdir).exists()
2533 task jalviewjsTranspile(type: Exec) {
2534 dependsOn jalviewjsEclipseSetup
2535 dependsOn jalviewjsProjectImport
2536 dependsOn jalviewjsEclipsePaths
2538 dependsOn jalviewjsEnableAltFileProperty
2542 // do not run a headless transpile when we claim to be in Eclipse
2544 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2545 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2547 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2551 executable(eclipseBinary)
2552 args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipse_build_arg}", eclipse_project_name ])
2556 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2558 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2559 args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
2565 stdout = new ByteArrayOutputStream()
2566 stderr = new ByteArrayOutputStream()
2568 def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}"
2569 def logOutFile = file(logOutFileName)
2570 logOutFile.createNewFile()
2571 logOutFile.text = """ROOT: ${jalviewjs_eclipse_root}
2572 BINARY: ${eclipseBinary}
2573 VERSION: ${eclipseVersion}
2574 WORKSPACE: ${eclipseWorkspace}
2575 DEBUG: ${eclipseDebug}
2578 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2579 // combine stdout and stderr
2580 def logErrFOS = logOutFOS
2582 if (jalviewjs_j2s_to_console.equals("true")) {
2583 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2584 new org.apache.tools.ant.util.TeeOutputStream(
2588 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2589 new org.apache.tools.ant.util.TeeOutputStream(
2594 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2597 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2604 if (stdout.toString().contains("Error processing ")) {
2605 // j2s did not complete transpile
2606 //throw new TaskExecutionException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2607 if (jalviewjs_ignore_transpile_errors.equals("true")) {
2608 println("IGNORING TRANSPILE ERRORS")
2609 println("See eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2611 throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2616 inputs.dir("${jalviewDir}/${sourceDir}")
2617 outputs.dir("${jalviewDir}/${jalviewjsTransferSiteJsDir}")
2618 outputs.upToDateWhen( { file("${jalviewDir}/${jalviewjsTransferSiteJsDir}${jalviewjs_server_resource}").exists() } )
2622 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
2624 def stdout = new ByteArrayOutputStream()
2625 def stderr = new ByteArrayOutputStream()
2627 def coreFile = file(jsfile)
2629 msg = "Creating core for ${name}...\nGenerating ${jsfile}"
2631 logOutFile.createNewFile()
2632 logOutFile.append(msg+"\n")
2634 def coreTop = file(prefixFile)
2635 def coreBottom = file(suffixFile)
2636 coreFile.getParentFile().mkdirs()
2637 coreFile.createNewFile()
2638 coreFile.write( coreTop.getText("UTF-8") )
2642 def t = f.getText("UTF-8")
2643 t.replaceAll("Clazz\\.([^_])","Clazz_${1}")
2644 coreFile.append( t )
2646 msg = "...file '"+f.getPath()+"' does not exist, skipping"
2648 logOutFile.append(msg+"\n")
2651 coreFile.append( coreBottom.getText("UTF-8") )
2653 msg = "Generating ${zjsfile}"
2655 logOutFile.append(msg+"\n")
2656 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2657 def logErrFOS = logOutFOS
2660 classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
2661 main = "com.google.javascript.jscomp.CommandLineRunner"
2662 jvmArgs = [ "-Dfile.encoding=UTF-8" ]
2663 args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
2666 msg = "\nRunning '"+commandLine.join(' ')+"'\n"
2668 logOutFile.append(msg+"\n")
2670 if (logOutConsole) {
2671 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2672 new org.apache.tools.ant.util.TeeOutputStream(
2676 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2677 new org.apache.tools.ant.util.TeeOutputStream(
2682 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2685 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2692 logOutFile.append(msg+"\n")
2696 task jalviewjsBuildAllCores {
2698 description "Build the core js lib closures listed in the classlists dir"
2699 dependsOn jalviewjsTranspile
2700 dependsOn jalviewjsTransferUnzipSwingJs
2702 def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
2703 def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
2704 def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
2705 def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
2706 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
2707 def prefixFile = "${jsDir}/core/coretop2.js"
2708 def suffixFile = "${jsDir}/core/corebottom2.js"
2710 inputs.file prefixFile
2711 inputs.file suffixFile
2713 def classlistFiles = []
2714 // add the classlists found int the jalviewjs_classlists_dir
2715 fileTree(dir: "${jalviewDir}/${jalviewjs_classlists_dir}", include: "*.txt").each {
2717 def name = file.getName() - ".txt"
2724 // _jmol and _jalview cores. Add any other peculiar classlist.txt files here
2725 //classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jmol}"), 'name': "_jvjmol" ]
2726 classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jalview}"), 'name': jalviewjsJalviewCoreName ]
2728 jalviewjsCoreClasslists = []
2730 classlistFiles.each {
2733 def file = hash['file']
2734 if (! file.exists()) {
2735 //println("...classlist file '"+file.getPath()+"' does not exist, skipping")
2736 return false // this is a "continue" in groovy .each closure
2738 def name = hash['name']
2740 name = file.getName() - ".txt"
2748 def list = fileTree(dir: j2sDir, includes: filelist)
2750 def jsfile = "${outputDir}/core${name}.js"
2751 def zjsfile = "${outputDir}/core${name}.z.js"
2753 jalviewjsCoreClasslists += [
2762 outputs.file(jsfile)
2763 outputs.file(zjsfile)
2766 // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
2767 def stevesoftClasslistName = "_stevesoft"
2768 def stevesoftClasslist = [
2769 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
2770 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
2771 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
2772 'name': stevesoftClasslistName
2774 jalviewjsCoreClasslists += stevesoftClasslist
2775 inputs.files(stevesoftClasslist['list'])
2776 outputs.file(stevesoftClasslist['jsfile'])
2777 outputs.file(stevesoftClasslist['zjsfile'])
2780 def allClasslistName = "_all"
2781 def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
2782 allJsFiles += fileTree(
2786 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2787 "**/org/jmol/jvxl/readers/IsoIntersectFileReader.js",
2788 "**/org/jmol/export/JSExporter.js"
2791 allJsFiles += fileTree(
2795 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2796 "**/sun/misc/Unsafe.js",
2797 "**/swingjs/jquery/jquery-editable-select.js",
2798 "**/swingjs/jquery/j2sComboBox.js",
2799 "**/sun/misc/FloatingDecimal.js"
2802 def allClasslist = [
2803 'jsfile': "${outputDir}/core${allClasslistName}.js",
2804 'zjsfile': "${outputDir}/core${allClasslistName}.z.js",
2806 'name': allClasslistName
2808 // not including this version of "all" core at the moment
2809 //jalviewjsCoreClasslists += allClasslist
2810 inputs.files(allClasslist['list'])
2811 outputs.file(allClasslist['jsfile'])
2812 outputs.file(allClasslist['zjsfile'])
2815 def logOutFile = file("${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_closure_stdout}")
2816 logOutFile.getParentFile().mkdirs()
2817 logOutFile.createNewFile()
2818 logOutFile.write(getDate("yyyy-MM-dd HH:mm:ss")+" jalviewjsBuildAllCores\n----\n")
2820 jalviewjsCoreClasslists.each {
2821 jalviewjsCallCore(it.name, it.list, prefixFile, suffixFile, it.jsfile, it.zjsfile, logOutFile, jalviewjs_j2s_to_console.equals("true"))
2828 def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inputFile, String outputFile) {
2831 into file(outputFile).getParentFile()
2832 rename { filename ->
2833 if (filename.equals(inputFile.getName())) {
2834 return file(outputFile).getName()
2838 filter(ReplaceTokens,
2842 'MAIN': '"'+main_class+'"',
2844 'NAME': jalviewjsJalviewTemplateName+" [core ${coreName}]",
2845 'COREKEY': jalviewjs_core_key,
2846 'CORENAME': coreName
2853 task jalviewjsPublishCoreTemplates {
2854 dependsOn jalviewjsBuildAllCores
2855 def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
2856 def inputFile = file(inputFileName)
2857 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2859 def outputFiles = []
2860 jalviewjsCoreClasslists.each { cl ->
2861 def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html"
2862 cl['outputfile'] = outputFile
2863 outputFiles += outputFile
2867 jalviewjsCoreClasslists.each { cl ->
2868 jalviewjsPublishCoreTemplate(cl.name, jalviewjsJalviewTemplateName, inputFile, cl.outputfile)
2871 inputs.file(inputFile)
2872 outputs.files(outputFiles)
2876 task jalviewjsSyncCore (type: Sync) {
2877 dependsOn jalviewjsBuildAllCores
2878 dependsOn jalviewjsPublishCoreTemplates
2879 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
2880 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2884 def outputFiles = []
2885 rename { filename ->
2886 outputFiles += "${outputDir}/${filename}"
2892 outputs.files outputFiles
2893 inputs.files inputFiles
2897 // this Copy version of TransferSiteJs will delete anything else in the target dir
2898 task jalviewjsCopyTransferSiteJs(type: Copy) {
2899 dependsOn jalviewjsTranspile
2900 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2901 into "${jalviewDir}/${jalviewjsSiteDir}"
2905 // this Sync version of TransferSite is used by buildship to keep the website automatically up to date when a file changes
2906 task jalviewjsSyncTransferSiteJs(type: Sync) {
2907 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2909 into "${jalviewDir}/${jalviewjsSiteDir}"
2916 jalviewjsSyncAllLibs.mustRunAfter jalviewjsCopyTransferSiteJs
2917 jalviewjsSyncResources.mustRunAfter jalviewjsCopyTransferSiteJs
2918 jalviewjsSyncSiteResources.mustRunAfter jalviewjsCopyTransferSiteJs
2919 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsCopyTransferSiteJs
2921 jalviewjsSyncAllLibs.mustRunAfter jalviewjsSyncTransferSiteJs
2922 jalviewjsSyncResources.mustRunAfter jalviewjsSyncTransferSiteJs
2923 jalviewjsSyncSiteResources.mustRunAfter jalviewjsSyncTransferSiteJs
2924 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
2927 task jalviewjsPrepareSite {
2929 description "Prepares the website folder including unzipping files and copying resources"
2930 dependsOn jalviewjsSyncAllLibs
2931 dependsOn jalviewjsSyncResources
2932 dependsOn jalviewjsSyncSiteResources
2933 dependsOn jalviewjsSyncBuildProperties
2934 dependsOn jalviewjsSyncCore
2938 task jalviewjsBuildSite {
2940 description "Builds the whole website including transpiled code"
2941 dependsOn jalviewjsCopyTransferSiteJs
2942 dependsOn jalviewjsPrepareSite
2946 task cleanJalviewjsTransferSite {
2948 delete "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2949 delete "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2950 delete "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2951 delete "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2956 task cleanJalviewjsSite {
2957 dependsOn cleanJalviewjsTransferSite
2959 delete "${jalviewDir}/${jalviewjsSiteDir}"
2964 task jalviewjsSiteTar(type: Tar) {
2966 description "Creates a tar.gz file for the website"
2967 dependsOn jalviewjsBuildSite
2968 def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
2969 archiveFileName = outputFilename
2971 compression Compression.GZIP
2973 from "${jalviewDir}/${jalviewjsSiteDir}"
2974 into jalviewjs_site_dir // this is inside the tar file
2976 inputs.dir("${jalviewDir}/${jalviewjsSiteDir}")
2980 task jalviewjsServer {
2982 def filename = "jalviewjsTest.html"
2983 description "Starts a webserver on localhost to test the website. See ${filename} to access local site on most recently used port."
2984 def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
2989 def f = Class.forName("org.gradle.plugins.javascript.envjs.http.simple.SimpleHttpFileServerFactory")
2990 factory = f.newInstance()
2991 } catch (ClassNotFoundException e) {
2992 throw new GradleException("Unable to create SimpleHttpFileServerFactory")
2994 def port = Integer.valueOf(jalviewjs_server_port)
2999 while(port < start+1000 && !running) {
3001 def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}")
3002 jalviewjsServer = factory.start(doc_root, port)
3004 url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource)
3005 println("SERVER STARTED with document root ${doc_root}.")
3006 println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).")
3007 println("For debug: "+url+"?j2sdebug")
3008 println("For verbose: "+url+"?j2sverbose")
3009 } catch (Exception e) {
3014 <p><a href="${url}">JalviewJS Test. <${url}></a></p>
3015 <p><a href="${url}?j2sdebug">JalviewJS Test with debug. <${url}?j2sdebug></a></p>
3016 <p><a href="${url}?j2sverbose">JalviewJS Test with verbose. <${url}?j2sdebug></a></p>
3018 jalviewjsCoreClasslists.each { cl ->
3019 def urlcore = jalviewjsServer.getResourceUrl(file(cl.outputfile).getName())
3021 <p><a href="${urlcore}">${jalviewjsJalviewTemplateName} [core ${cl.name}]. <${urlcore}></a></p>
3023 println("For core ${cl.name}: "+urlcore)
3026 file(htmlFile).text = htmlText
3029 outputs.file(htmlFile)
3030 outputs.upToDateWhen({false})
3034 task cleanJalviewjsAll {
3036 description "Delete all configuration and build artifacts to do with JalviewJS build"
3037 dependsOn cleanJalviewjsSite
3038 dependsOn jalviewjsEclipsePaths
3041 delete "${jalviewDir}/${jalviewjsBuildDir}"
3042 delete "${jalviewDir}/${eclipse_bin_dir}"
3043 if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
3044 delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
3046 delete jalviewjsJ2sAltSettingsFileName
3049 outputs.upToDateWhen( { false } )
3053 task jalviewjsIDE_checkJ2sPlugin {
3054 group "00 JalviewJS in Eclipse"
3055 description "Compare the swingjs/net.sf.j2s.core(-j11)?.jar file with the Eclipse IDE's plugin version (found in the 'dropins' dir)"
3058 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
3059 def j2sPluginFile = file(j2sPlugin)
3060 def eclipseHome = System.properties["eclipse.home.location"]
3061 if (eclipseHome == null || ! IN_ECLIPSE) {
3062 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. Skipping J2S Plugin Check.")
3064 def eclipseJ2sPluginDirs = [ "${eclipseHome}/dropins" ]
3065 def altPluginsDir = System.properties["org.eclipse.equinox.p2.reconciler.dropins.directory"]
3066 if (altPluginsDir != null && file(altPluginsDir).exists()) {
3067 eclipseJ2sPluginDirs += altPluginsDir
3069 def foundPlugin = false
3070 def j2sPluginFileName = j2sPluginFile.getName()
3071 def eclipseJ2sPlugin
3072 def eclipseJ2sPluginFile
3073 eclipseJ2sPluginDirs.any { dir ->
3074 eclipseJ2sPlugin = "${dir}/${j2sPluginFileName}"
3075 eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
3076 if (eclipseJ2sPluginFile.exists()) {
3082 def msg = "Eclipse J2S Plugin is not installed (could not find '${j2sPluginFileName}' in\n"+eclipseJ2sPluginDirs.join("\n")+"\n)\nTry running task jalviewjsIDE_copyJ2sPlugin"
3083 System.err.println(msg)
3084 throw new StopExecutionException(msg)
3087 def digest = MessageDigest.getInstance("MD5")
3089 digest.update(j2sPluginFile.text.bytes)
3090 def j2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
3092 digest.update(eclipseJ2sPluginFile.text.bytes)
3093 def eclipseJ2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
3095 if (j2sPluginMd5 != eclipseJ2sPluginMd5) {
3096 def msg = "WARNING! Eclipse J2S Plugin '${eclipseJ2sPlugin}' is different to this commit's version '${j2sPlugin}'"
3097 System.err.println(msg)
3098 throw new StopExecutionException(msg)
3100 def msg = "Eclipse J2S Plugin '${eclipseJ2sPlugin}' is the same as '${j2sPlugin}' (this is good)"
3106 task jalviewjsIDE_copyJ2sPlugin {
3107 group "00 JalviewJS in Eclipse"
3108 description "Copy the swingjs/net.sf.j2s.core(-j11)?.jar file into the Eclipse IDE's 'dropins' dir"
3111 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
3112 def j2sPluginFile = file(j2sPlugin)
3113 def eclipseHome = System.properties["eclipse.home.location"]
3114 if (eclipseHome == null || ! IN_ECLIPSE) {
3115 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. NOT copying J2S Plugin.")
3117 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
3118 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
3119 def msg = "WARNING! Copying this commit's j2s plugin '${j2sPlugin}' to Eclipse J2S Plugin '${eclipseJ2sPlugin}'\n* May require an Eclipse restart"
3120 System.err.println(msg)
3123 eclipseJ2sPluginFile.getParentFile().mkdirs()
3124 into eclipseJ2sPluginFile.getParent()
3130 task jalviewjsIDE_j2sFile {
3131 group "00 JalviewJS in Eclipse"
3132 description "Creates the .j2s file"
3133 dependsOn jalviewjsCreateJ2sSettings
3137 task jalviewjsIDE_SyncCore {
3138 group "00 JalviewJS in Eclipse"
3139 description "Build the core js lib closures listed in the classlists dir and publish core html from template"
3140 dependsOn jalviewjsSyncCore
3144 task jalviewjsIDE_SyncSiteAll {
3145 dependsOn jalviewjsSyncAllLibs
3146 dependsOn jalviewjsSyncResources
3147 dependsOn jalviewjsSyncSiteResources
3148 dependsOn jalviewjsSyncBuildProperties
3152 cleanJalviewjsTransferSite.mustRunAfter jalviewjsIDE_SyncSiteAll
3155 task jalviewjsIDE_PrepareSite {
3156 group "00 JalviewJS in Eclipse"
3157 description "Sync libs and resources to site dir, but not closure cores"
3159 dependsOn jalviewjsIDE_SyncSiteAll
3160 //dependsOn cleanJalviewjsTransferSite // not sure why this clean is here -- will slow down a re-run of this task
3164 task jalviewjsIDE_AssembleSite {
3165 group "00 JalviewJS in Eclipse"
3166 description "Assembles unzipped supporting zipfiles, resources, site resources and closure cores into the Eclipse transpiled site"
3167 dependsOn jalviewjsPrepareSite
3171 task jalviewjsIDE_SiteClean {
3172 group "00 JalviewJS in Eclipse"
3173 description "Deletes the Eclipse transpiled site"
3174 dependsOn cleanJalviewjsSite
3178 task jalviewjsIDE_Server {
3179 group "00 JalviewJS in Eclipse"
3180 description "Starts a webserver on localhost to test the website"
3181 dependsOn jalviewjsServer
3185 // buildship runs this at import or gradle refresh
3186 task eclipseSynchronizationTask {
3187 //dependsOn eclipseSetup
3188 dependsOn createBuildProperties
3190 dependsOn jalviewjsIDE_j2sFile
3191 dependsOn jalviewjsIDE_checkJ2sPlugin
3192 dependsOn jalviewjsIDE_PrepareSite
3197 // buildship runs this at build time or project refresh
3198 task eclipseAutoBuildTask {
3199 //dependsOn jalviewjsIDE_checkJ2sPlugin
3200 //dependsOn jalviewjsIDE_PrepareSite
3206 description "Build the site"
3207 dependsOn jalviewjsBuildSite