1 import org.apache.tools.ant.filters.ReplaceTokens
2 import org.gradle.internal.os.OperatingSystem
3 import org.gradle.plugins.ide.internal.generator.PropertiesPersistableConfigurationObject
4 import org.gradle.api.internal.PropertiesTransformer
5 import org.gradle.util.ConfigureUtil
6 import org.gradle.plugins.ide.eclipse.model.Output
7 import org.gradle.plugins.ide.eclipse.model.Library
8 import java.security.MessageDigest
9 import groovy.transform.ExternalizeMethods
10 import groovy.util.XmlParser
11 import groovy.xml.XmlUtil
20 classpath 'org.openclover:clover:4.4.1'
29 id "com.diffplug.gradle.spotless" version "3.28.0"
30 id 'com.github.johnrengelman.shadow' version '4.0.3'
31 id 'com.install4j.gradle' version '8.0.4'
32 id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree
42 // in ext the values are cast to Object. Ensure string values are cast as String (and not GStringImpl) for later use
43 def string(Object o) {
44 return o == null ? "" : o.toString()
49 jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
50 jalviewDirRelativePath = jalviewDir
52 // local build environment properties
53 // can be "projectDir/local.properties"
54 def localProps = "${projectDir}/local.properties"
56 if (file(localProps).exists()) {
57 propsFile = localProps
59 // or "../projectDir_local.properties"
60 def dirLocalProps = projectDir.getParent() + "/" + projectDir.getName() + "_local.properties"
61 if (file(dirLocalProps).exists()) {
62 propsFile = dirLocalProps
64 if (propsFile != null) {
66 def p = new Properties()
67 def localPropsFIS = new FileInputStream(propsFile)
72 def oldval = findProperty(key)
75 println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'")
77 println("Setting unknown property '${key}' with ${file(propsFile).getName()}s value '${val}'")
80 } catch (Exception e) {
81 System.out.println("Exception reading local.properties")
85 // this property set when running Eclipse headlessly
86 j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild")
87 // this property set by Eclipse
88 eclipseApplicationProperty = string("eclipse.application")
89 // CHECK IF RUNNING FROM WITHIN ECLIPSE
90 def eclipseApplicationPropertyVal = System.properties[eclipseApplicationProperty]
91 IN_ECLIPSE = eclipseApplicationPropertyVal != null && eclipseApplicationPropertyVal.startsWith("org.eclipse.ui.")
92 // BUT WITHOUT THE HEADLESS BUILD PROPERTY SET
93 if (System.properties[j2sHeadlessBuildProperty].equals("true")) {
94 println("Setting IN_ECLIPSE to ${IN_ECLIPSE} as System.properties['${j2sHeadlessBuildProperty}'] == '${System.properties[j2sHeadlessBuildProperty]}'")
98 println("WITHIN ECLIPSE IDE")
100 println("HEADLESS BUILD")
103 J2S_ENABLED = (project.hasProperty('j2s.compiler.status') && project['j2s.compiler.status'] != null && project['j2s.compiler.status'] == "enable")
105 println("J2S ENABLED")
109 System.properties.sort { it.key }.each {
110 key, val -> println("SYSTEM PROPERTY ${key}='${val}'")
113 if (false && IN_ECLIPSE) {
114 jalviewDir = jalviewDirAbsolutePath
119 bareSourceDir = string(source_dir)
120 sourceDir = string("${jalviewDir}/${bareSourceDir}")
121 resourceDir = string("${jalviewDir}/${resource_dir}")
122 bareTestSourceDir = string(test_source_dir)
123 testSourceDir = string("${jalviewDir}/${bareTestSourceDir}")
126 cloverInstrDir = file("${buildDir}/${cloverSourcesInstrDir}")
127 cloverDb = string("${buildDir}/clover/clover.db")
128 classesDir = string("${jalviewDir}/${classes_dir}")
129 if (clover.equals("true")) {
131 classesDir = string("${buildDir}/${cloverClassesDir}")
134 classesDir = string("${jalviewDir}/${classes_dir}")
139 getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}")
142 // the following values might be overridden by the CHANNEL switch
143 getdownChannelName = CHANNEL.toLowerCase()
144 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
145 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
146 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}")
147 getdownAppDistDir = getdown_app_dir_alt
148 buildProperties = string("${resourceDir}/${build_properties_file}")
149 reportRsyncCommand = false
150 jvlChannelName = CHANNEL.toLowerCase()
151 install4jSuffix = CHANNEL.substring(0, 1).toUpperCase() + CHANNEL.substring(1).toLowerCase(); // BUILD -> Build
152 install4jDSStore = "DS_Store-NON-RELEASE"
153 install4jDMGBackgroundImage = "jalview_dmg_background-NON-RELEASE.png"
154 install4jInstallerName = "${jalview_name} Non-Release Installer"
155 install4jExecutableName = jalview_name.replaceAll("[^\\w]+", "_").toLowerCase()
156 install4jExtraScheme = "jalviewx"
160 // TODO: get bamboo build artifact URL for getdown artifacts
161 getdown_channel_base = bamboo_channelbase
162 getdownChannelName = string("${bamboo_planKey}/${JAVA_VERSION}")
163 getdownAppBase = string("${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}")
164 jvlChannelName += "_${getdownChannelName}"
165 // automatically add the test group Not-bamboo for exclusion
166 if ("".equals(testngExcludedGroups)) {
167 testngExcludedGroups = "Not-bamboo"
169 install4jExtraScheme = "jalviewb"
173 getdownAppDistDir = getdown_app_dir_release
174 reportRsyncCommand = true
175 // Don't ignore transpile errors for release build
176 if (jalviewjs_ignore_transpile_errors.equals("true")) {
177 jalviewjs_ignore_transpile_errors = "false"
178 println("Setting jalviewjs_ignore_transpile_errors to 'false'")
181 install4jDSStore = "DS_Store"
182 install4jDMGBackgroundImage = "jalview_dmg_background.png"
183 install4jInstallerName = "${jalview_name} Installer"
187 getdownChannelName = CHANNEL.toLowerCase()+"/${JALVIEW_VERSION}"
188 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
189 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
190 if (!file("${ARCHIVEDIR}/${packageDir}").exists()) {
191 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
193 packageDir = string("${ARCHIVEDIR}/${packageDir}")
194 buildProperties = string("${buildDir}/archive/${build_properties_file}")
197 reportRsyncCommand = true
198 install4jExtraScheme = "jalviewa"
202 getdownChannelName = string("archive/${JALVIEW_VERSION}")
203 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
204 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
205 if (!file("${ARCHIVEDIR}/${packageDir}").exists()) {
206 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
208 packageDir = string("${ARCHIVEDIR}/${packageDir}")
209 buildProperties = string("${buildDir}/archive/${build_properties_file}")
212 reportRsyncCommand = true
213 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
214 install4jSuffix = "Archive"
215 install4jExtraScheme = "jalviewa"
219 reportRsyncCommand = true
220 install4jDSStore = "DS_Store-DEVELOP"
221 install4jDMGBackgroundImage = "jalview_dmg_background-DEVELOP.png"
222 install4jExtraScheme = "jalviewd"
223 install4jInstallerName = "${jalview_name} Develop Installer"
227 reportRsyncCommand = true
228 // Don't ignore transpile errors for release build
229 if (jalviewjs_ignore_transpile_errors.equals("true")) {
230 jalviewjs_ignore_transpile_errors = "false"
231 println("Setting jalviewjs_ignore_transpile_errors to 'false'")
233 JALVIEW_VERSION = "TEST"
234 install4jSuffix = "Test"
235 install4jDSStore = "DS_Store-TEST-RELEASE"
236 install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png"
237 install4jExtraScheme = "jalviewt"
238 install4jInstallerName = "${jalview_name} Test Installer"
241 case ~/^SCRATCH(|-[-\w]*)$/:
242 getdownChannelName = CHANNEL
243 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
244 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
245 reportRsyncCommand = true
246 install4jSuffix = "Scratch"
250 if (!file("${LOCALDIR}").exists()) {
251 throw new GradleException("Must provide a LOCALDIR value to produce a local distribution")
253 getdownAppBase = file(file("${LOCALDIR}").getAbsolutePath()).toURI().toString()
254 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
256 JALVIEW_VERSION = "TEST"
257 install4jSuffix = "Test-Local"
258 install4jDSStore = "DS_Store-TEST-RELEASE"
259 install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png"
260 install4jExtraScheme = "jalviewt"
261 install4jInstallerName = "${jalview_name} Test Installer"
265 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
266 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
267 install4jExtraScheme = "jalviewl"
270 default: // something wrong specified
271 throw new GradleException("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
275 // override getdownAppBase if requested
276 if (findProperty("getdown_appbase_override") != null) {
277 getdownAppBase = string(getProperty("getdown_appbase_override"))
278 println("Overriding getdown appbase with '${getdownAppBase}'")
280 // sanitise file name for jalview launcher file for this channel
281 jvlChannelName = jvlChannelName.replaceAll("[^\\w\\-]+", "_")
282 // install4j application and folder names
283 if (install4jSuffix == "") {
284 install4jApplicationName = "${jalview_name}"
285 install4jBundleId = "${install4j_bundle_id}"
286 install4jWinApplicationId = install4j_release_win_application_id
288 install4jApplicationName = "${jalview_name} ${install4jSuffix}"
289 install4jBundleId = "${install4j_bundle_id}-" + install4jSuffix.toLowerCase()
290 // add int hash of install4jSuffix to the last part of the application_id
291 def id = install4j_release_win_application_id
292 def idsplitreverse = id.split("-").reverse()
293 idsplitreverse[0] = idsplitreverse[0].toInteger() + install4jSuffix.hashCode()
294 install4jWinApplicationId = idsplitreverse.reverse().join("-")
296 // sanitise folder and id names
297 // install4jApplicationFolder = e.g. "Jalview Build"
298 install4jApplicationFolder = install4jApplicationName
299 .replaceAll("[\"'~:/\\\\\\s]", "_") // replace all awkward filename chars " ' ~ : / \
300 .replaceAll("_+", "_") // collapse __
301 install4jInternalId = install4jApplicationName
303 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
304 .replaceAll("_+", "") // collapse __
305 //.replaceAll("_*-_*", "-") // collapse _-_
306 install4jUnixApplicationFolder = install4jApplicationName
308 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
309 .replaceAll("_+", "_") // collapse __
310 .replaceAll("_*-_*", "-") // collapse _-_
313 getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}")
314 //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
315 getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}")
316 getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}")
317 getdownFilesDir = string("${jalviewDir}/${getdown_files_dir}/${JAVA_VERSION}/")
318 getdownFilesInstallDir = string("${getdownFilesDir}/${getdown_install_dir}")
319 /* compile without modules -- using classpath libraries
320 modules_compileClasspath = fileTree(dir: "${jalviewDir}/${j11modDir}", include: ["*.jar"])
321 modules_runtimeClasspath = modules_compileClasspath
324 gitBranch = string("")
326 println("Using a ${CHANNEL} profile.")
328 additional_compiler_args = []
329 // configure classpath/args for j8/j11 compilation
330 if (JAVA_VERSION.equals("1.8")) {
331 JAVA_INTEGER_VERSION = string("8")
334 libDistDir = j8libDir
335 compile_source_compatibility = 1.8
336 compile_target_compatibility = 1.8
337 // these are getdown.txt properties defined dependent on the JAVA_VERSION
338 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java8_min_version"))
339 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java8_max_version"))
340 // this property is assigned below and expanded to multiple lines in the getdown task
341 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java8_txt_multi_java_location"))
342 // this property is for the Java library used in eclipse
343 eclipseJavaRuntimeName = string("JavaSE-1.8")
344 } else if (JAVA_VERSION.equals("11")) {
345 JAVA_INTEGER_VERSION = string("11")
347 libDistDir = j11libDir
348 compile_source_compatibility = 11
349 compile_target_compatibility = 11
350 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
351 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
352 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
353 eclipseJavaRuntimeName = string("JavaSE-11")
354 /* compile without modules -- using classpath libraries
355 additional_compiler_args += [
356 '--module-path', modules_compileClasspath.asPath,
357 '--add-modules', j11modules
360 } else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) {
361 JAVA_INTEGER_VERSION = JAVA_VERSION
363 libDistDir = j11libDir
364 compile_source_compatibility = JAVA_VERSION
365 compile_target_compatibility = JAVA_VERSION
366 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
367 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
368 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
369 eclipseJavaRuntimeName = string("JavaSE-11")
370 /* compile without modules -- using classpath libraries
371 additional_compiler_args += [
372 '--module-path', modules_compileClasspath.asPath,
373 '--add-modules', j11modules
377 throw new GradleException("JAVA_VERSION=${JAVA_VERSION} not currently supported by Jalview")
382 JAVA_MIN_VERSION = JAVA_VERSION
383 JAVA_MAX_VERSION = JAVA_VERSION
384 def jreInstallsDir = string(jre_installs_dir)
385 if (jreInstallsDir.startsWith("~/")) {
386 jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1)
388 macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre")
389 macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz")
390 windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
391 windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz")
392 linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
393 linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-linux-x64.tar.gz")
394 install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
395 install4jConfFileName = string("jalview-install4j-conf.install4j")
396 install4jConfFile = file("${install4jDir}/${install4jConfFileName}")
397 install4jHomeDir = install4j_home_dir
398 if (install4jHomeDir.startsWith("~/")) {
399 install4jHomeDir = System.getProperty("user.home") + install4jHomeDir.substring(1)
404 buildingHTML = string("${jalviewDir}/${docDir}/building.html")
405 helpFile = string("${classesDir}/${help_dir}/help.jhm")
406 helpParentDir = string("${jalviewDir}/${help_parent_dir}")
407 helpSourceDir = string("${helpParentDir}/${help_dir}")
410 relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
411 jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs")
412 jalviewjsSiteDir = string("${jalviewjsBuildDir}/${jalviewjs_site_dir}")
414 jalviewjsTransferSiteJsDir = string(jalviewjsSiteDir)
416 jalviewjsTransferSiteJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_js")
418 jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
419 jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
420 jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
421 jalviewjsJalviewCoreHtmlFile = string("")
422 jalviewjsJalviewCoreName = string(jalviewjs_core_name)
423 jalviewjsCoreClasslists = []
424 jalviewjsJalviewTemplateName = string(jalviewjs_name)
425 jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}")
426 jalviewjsJ2sProps = null
427 jalviewjsJ2sPlugin = jalviewjs_j2s_plugin
429 eclipseWorkspace = null
430 eclipseBinary = string("")
431 eclipseVersion = string("")
441 outputDir = file(classesDir)
446 srcDirs += helpParentDir
449 jar.destinationDir = file("${jalviewDir}/${packageDir}")
451 compileClasspath = files(sourceSets.main.java.outputDir)
452 //compileClasspath += files(sourceSets.main.resources.srcDirs)
453 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
455 runtimeClasspath = compileClasspath
460 srcDirs = [ cloverInstrDir ]
461 outputDir = file("${buildDir}/${cloverClassesDir}")
465 srcDirs = sourceSets.main.resources.srcDirs
467 compileClasspath = configurations.cloverRuntime + files( sourceSets.clover.java.outputDir )
468 compileClasspath += files(sourceSets.main.java.outputDir)
469 compileClasspath += sourceSets.main.compileClasspath
470 compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}", include: ["**/*.jar"])
471 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
473 runtimeClasspath = compileClasspath
478 srcDirs testSourceDir
479 outputDir = file("${jalviewDir}/${testOutputDir}")
483 srcDirs = sourceSets.main.resources.srcDirs
486 compileClasspath = files( sourceSets.test.java.outputDir )
489 compileClasspath = sourceSets.clover.compileClasspath
491 compileClasspath += files(sourceSets.main.java.outputDir)
494 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
495 compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}/testnglibs", include: ["**/*.jar"])
496 compileClasspath += fileTree(dir: "${jalviewDir}/${utilsDir}/testlibs", include: ["**/*.jar"])
498 runtimeClasspath = compileClasspath
506 cloverCompile 'org.openclover:clover:4.4.1'
507 testCompile 'org.openclover:clover:4.4.1'
514 cloverRuntime.extendsFrom cloverCompile
518 // eclipse project and settings files creation, also used by buildship
521 name = eclipse_project_name
523 natures 'org.eclipse.jdt.core.javanature',
524 'org.eclipse.jdt.groovy.core.groovyNature',
525 'org.eclipse.buildship.core.gradleprojectnature'
527 buildCommand 'org.eclipse.jdt.core.javabuilder'
528 buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
532 //defaultOutputDir = sourceSets.main.java.outputDir
535 if (it.isCanBeResolved()) {
540 minusConfigurations += removeThese
541 plusConfigurations = [ ]
545 def removeTheseToo = []
546 HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
547 cp.entries.each { entry ->
548 // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test".
549 // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover
550 // we add the resources and help/help dirs in as libs afterwards (see below)
551 if (entry.kind == 'src') {
552 if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) {
553 removeTheseToo += entry
555 alreadyAddedSrcPath.putAt(entry.path, true)
560 cp.entries.removeAll(removeTheseToo)
562 //cp.entries += new Output("${eclipse_bin_dir}/main")
563 if (file(helpParentDir).isDirectory()) {
564 cp.entries += new Library(fileReference(helpParentDir))
566 if (file(resourceDir).isDirectory()) {
567 cp.entries += new Library(fileReference(resourceDir))
570 HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
572 sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
573 //don't want to add outputDir as eclipse is using its own output dir in bin/main
574 if (it.isDirectory() || ! it.exists()) {
575 // don't add dirs to classpath, especially if they don't exist
576 return false // groovy "continue" in .any closure
578 def itPath = it.toString()
579 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
580 // make relative path
581 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
583 if (alreadyAddedLibPath.get(itPath)) {
584 //println("Not adding duplicate entry "+itPath)
586 //println("Adding entry "+itPath)
587 cp.entries += new Library(fileReference(itPath))
588 alreadyAddedLibPath.put(itPath, true)
592 sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
593 //no longer want to add outputDir as eclipse is using its own output dir in bin/main
594 if (it.isDirectory() || ! it.exists()) {
595 // don't add dirs to classpath
596 return false // groovy "continue" in .any closure
599 def itPath = it.toString()
600 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
601 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
603 if (alreadyAddedLibPath.get(itPath)) {
606 def lib = new Library(fileReference(itPath))
607 lib.entryAttributes["test"] = "true"
609 alreadyAddedLibPath.put(itPath, true)
617 containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
622 // for the IDE, use java 11 compatibility
623 sourceCompatibility = compile_source_compatibility
624 targetCompatibility = compile_target_compatibility
625 javaRuntimeName = eclipseJavaRuntimeName
627 // add in jalview project specific properties/preferences into eclipse core preferences
628 // and also the codestyle XML file
630 withProperties { props ->
631 def jalview_prefs = new Properties()
632 def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}")
633 jalview_prefs.load(ins)
635 jalview_prefs.forEach { t, v ->
636 if (props.getAt(t) == null) {
640 // codestyle file -- overrides previous formatter prefs
641 def csFile = file("${jalviewDirAbsolutePath}/${eclipse_codestyle_file}")
642 if (csFile.exists()) {
643 XmlParser parser = new XmlParser()
644 def profiles = parser.parse(csFile)
645 def profile = profiles.'profile'.find { p -> (p.'@kind' == "CodeFormatterProfile" && p.'@name' == "Jalview") }
646 if (profile != null) {
647 profile.'setting'.each { s ->
649 def value = s.'@value'
650 if (id != null && value != null) {
651 props.putAt(id, value)
662 // Don't want these to be activated if in headless build
663 synchronizationTasks "eclipseSynchronizationTask"
664 //autoBuildTasks "eclipseAutoBuildTask"
670 /* hack to change eclipse prefs in .settings files other than org.eclipse.jdt.core.prefs */
671 // Class to allow updating arbitrary properties files
672 class PropertiesFile extends PropertiesPersistableConfigurationObject {
673 public PropertiesFile(PropertiesTransformer t) { super(t); }
674 @Override protected void load(Properties properties) { }
675 @Override protected void store(Properties properties) { }
676 @Override protected String getDefaultResourceName() { return ""; }
677 // This is necessary, because PropertiesPersistableConfigurationObject fails
678 // if no default properties file exists.
679 @Override public void loadDefaults() { load(new StringBufferInputStream("")); }
682 // Task to update arbitrary properties files (set outputFile)
683 class PropertiesFileTask extends PropertiesGeneratorTask<PropertiesFile> {
684 private final PropertiesFileContentMerger file;
685 public PropertiesFileTask() { file = new PropertiesFileContentMerger(getTransformer()); }
686 protected PropertiesFile create() { return new PropertiesFile(getTransformer()); }
687 protected void configure(PropertiesFile props) {
688 file.getBeforeMerged().execute(props); file.getWhenMerged().execute(props);
690 public void file(Closure closure) { ConfigureUtil.configure(closure, file); }
693 task eclipseUIPreferences(type: PropertiesFileTask) {
694 description = "Generate Eclipse additional settings"
695 def filename = "org.eclipse.jdt.ui.prefs"
696 outputFile = "$projectDir/.settings/${filename}" as File
699 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
704 task eclipseGroovyCorePreferences(type: PropertiesFileTask) {
705 description = "Generate Eclipse additional settings"
706 def filename = "org.eclipse.jdt.groovy.core.prefs"
707 outputFile = "$projectDir/.settings/${filename}" as File
710 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
715 task eclipseAllPreferences {
717 dependsOn eclipseUIPreferences
718 dependsOn eclipseGroovyCorePreferences
721 eclipseUIPreferences.mustRunAfter eclipseJdt
722 eclipseGroovyCorePreferences.mustRunAfter eclipseJdt
724 /* end of eclipse preferences hack */
728 // only instrument source, we build test classes as normal
729 inputs.files files (sourceSets.main.allJava,sourceSets.test.allJava) // , fileTree(dir:"$jalviewDir/$testSourceDir", include: ["**/*.java"]))
730 outputs.dir cloverInstrDir
733 delete cloverInstrDir
738 cloverInstrDir.getPath(),
741 inputs.files.files.collect(
742 { file -> file.absolutePath }
745 String[] args = argsList.toArray()
746 println("About to instrument "+args.length +" files")
747 com.atlassian.clover.CloverInstr.mainImpl(args)
752 cloverClasses.dependsOn cloverInstr
756 group = "Verification"
757 description = "Creates the Clover report"
758 inputs.dir "${buildDir}/clover"
759 outputs.dir "${reportsDir}/clover"
761 file(cloverDb).exists()
768 "${reportsDir}/clover"
770 String[] args = argsList.toArray()
771 com.atlassian.clover.reporters.html.HtmlReporter.runReport(args)
773 // and generate ${reportsDir}/clover/clover.xml
778 "${reportsDir}/clover/clover.xml"
780 com.atlassian.clover.reporters.xml.XMLReporter.runReport(args)
788 sourceCompatibility = compile_source_compatibility
789 targetCompatibility = compile_target_compatibility
790 options.compilerArgs += additional_compiler_args
791 print ("Setting target compatibility to "+targetCompatibility+"\n")
793 classpath += configurations.cloverRuntime
799 delete cloverInstrDir
809 sourceCompatibility = compile_source_compatibility
810 targetCompatibility = compile_target_compatibility
811 options.compilerArgs = additional_compiler_args
812 print ("Setting target compatibility to "+targetCompatibility+"\n")
820 dependsOn compileCloverJava
821 classpath += configurations.cloverRuntime
823 classpath += sourceSets.main.runtimeClasspath
826 sourceCompatibility = compile_source_compatibility
827 targetCompatibility = compile_target_compatibility
828 options.compilerArgs = additional_compiler_args
829 print ("Setting target compatibility to "+targetCompatibility+"\n")
836 delete sourceSets.main.java.outputDir
842 dependsOn cleanClover
844 delete sourceSets.test.java.outputDir
849 // format is a string like date.format("dd MMMM yyyy")
850 def getDate(format) {
851 def date = new Date()
852 return date.format(format)
857 def hashStdOut = new ByteArrayOutputStream()
859 commandLine "git", "rev-parse", "--short", "HEAD"
860 standardOutput = hashStdOut
864 def branchStdOut = new ByteArrayOutputStream()
866 commandLine "git", "rev-parse", "--abbrev-ref", "HEAD"
867 standardOutput = branchStdOut
871 gitHash = hashStdOut.toString().trim()
872 gitBranch = branchStdOut.toString().trim()
874 outputs.upToDateWhen { false }
878 task createBuildProperties(type: WriteProperties) {
880 description = "Create the ${buildProperties} file"
883 inputs.dir(sourceDir)
884 inputs.dir(resourceDir)
885 file(buildProperties).getParentFile().mkdirs()
886 outputFile (buildProperties)
887 // taking time specific comment out to allow better incremental builds
888 comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
889 //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
890 property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
891 property "VERSION", JALVIEW_VERSION
892 property "INSTALLATION", INSTALLATION+" git-commit:"+gitHash+" ["+gitBranch+"]"
893 outputs.file(outputFile)
899 delete buildProperties
904 task cleanBuildingHTML(type: Delete) {
911 task convertBuildingMD(type: Exec) {
912 dependsOn cleanBuildingHTML
913 def buildingMD = "${jalviewDir}/${docDir}/building.md"
914 def css = "${jalviewDir}/${docDir}/github.css"
917 pandoc_exec.split(",").each {
918 if (file(it.trim()).exists()) {
924 def buildtoolsPandoc = System.getProperty("user.home")+"/buildtools/pandoc/bin/pandoc"
925 if ((pandoc == null || ! file(pandoc).exists()) && file(buildtoolsPandoc).exists()) {
926 pandoc = System.getProperty("user.home")+"/buildtools/pandoc/bin/pandoc"
930 if (pandoc != null && file(pandoc).exists()) {
931 commandLine pandoc, '-s', '-o', buildingHTML, '--metadata', 'pagetitle="Building Jalview from Source"', '--toc', '-H', css, buildingMD
933 println("Cannot find pandoc. Skipping convert building.md to HTML")
934 throw new StopExecutionException("Cannot find pandoc. Skipping convert building.md to HTML")
940 inputs.file(buildingMD)
942 outputs.file(buildingHTML)
946 task syncDocs(type: Sync) {
947 dependsOn convertBuildingMD
948 def syncDir = "${classesDir}/${docDir}"
949 from fileTree("${jalviewDir}/${docDir}")
955 task copyHelp(type: Copy) {
956 def inputDir = helpSourceDir
957 def outputDir = "${classesDir}/${help_dir}"
962 filter(ReplaceTokens,
966 'Version-Rel': JALVIEW_VERSION,
967 'Year-Rel': getDate("yyyy")
979 outputs.files(helpFile)
980 outputs.dir(outputDir)
984 task syncLib(type: Sync) {
985 def syncDir = "${classesDir}/${libDistDir}"
986 from fileTree("${jalviewDir}/${libDistDir}")
991 task syncResources(type: Sync) {
992 dependsOn createBuildProperties
1003 dependsOn syncResources
1009 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
1012 dependsOn compileJava
1014 dependsOn cloverInstr
1018 print("Running tests " + (use_clover?"WITH":"WITHOUT") + " clover [clover="+use_clover+"]\n")
1022 includeGroups testngGroups
1023 excludeGroups testngExcludedGroups
1025 useDefaultListeners=true
1028 maxHeapSize = "1024m"
1030 workingDir = jalviewDir
1031 //systemProperties 'clover.jar' System.properties.clover.jar
1032 sourceCompatibility = compile_source_compatibility
1033 targetCompatibility = compile_target_compatibility
1034 jvmArgs += additional_compiler_args
1039 task buildIndices(type: JavaExec) {
1041 classpath = sourceSets.main.compileClasspath
1042 main = "com.sun.java.help.search.Indexer"
1043 workingDir = "${classesDir}/${help_dir}"
1046 inputs.dir("${workingDir}/${argDir}")
1048 outputs.dir("${classesDir}/doc")
1049 outputs.dir("${classesDir}/help")
1050 outputs.file("${workingDir}/JavaHelpSearch/DOCS")
1051 outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB")
1052 outputs.file("${workingDir}/JavaHelpSearch/OFFSETS")
1053 outputs.file("${workingDir}/JavaHelpSearch/POSITIONS")
1054 outputs.file("${workingDir}/JavaHelpSearch/SCHEMA")
1055 outputs.file("${workingDir}/JavaHelpSearch/TMAP")
1059 task compileLinkCheck(type: JavaCompile) {
1061 classpath = files("${jalviewDir}/${utilsDir}")
1062 destinationDir = file("${jalviewDir}/${utilsDir}")
1063 source = fileTree(dir: "${jalviewDir}/${utilsDir}", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
1065 inputs.file("${jalviewDir}/${utilsDir}/HelpLinksChecker.java")
1066 inputs.file("${jalviewDir}/${utilsDir}/HelpLinksChecker.java")
1067 outputs.file("${jalviewDir}/${utilsDir}/HelpLinksChecker.class")
1068 outputs.file("${jalviewDir}/${utilsDir}/BufferedLineReader.class")
1072 task linkCheck(type: JavaExec) {
1073 dependsOn prepare, compileLinkCheck
1075 def helpLinksCheckerOutFile = file("${jalviewDir}/${utilsDir}/HelpLinksChecker.out")
1076 classpath = files("${jalviewDir}/${utilsDir}")
1077 main = "HelpLinksChecker"
1078 workingDir = jalviewDir
1079 args = [ "${classesDir}/${help_dir}", "-nointernet" ]
1081 def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
1083 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
1086 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
1090 inputs.dir("${classesDir}/${help_dir}")
1091 outputs.file(helpLinksCheckerOutFile)
1094 // import the pubhtmlhelp target
1095 ant.properties.basedir = "${jalviewDir}"
1096 ant.properties.helpBuildDir = "${jalviewDirAbsolutePath}/${classes_dir}/${help_dir}"
1097 ant.importBuild "${utilsDir}/publishHelp.xml"
1100 task cleanPackageDir(type: Delete) {
1102 delete fileTree(dir: "${jalviewDir}/${packageDir}", include: "*.jar")
1109 dependsOn buildIndices
1110 dependsOn createBuildProperties
1113 attributes "Main-Class": mainClass,
1114 "Permissions": "all-permissions",
1115 "Application-Name": "Jalview Desktop",
1116 "Codebase": application_codebase
1119 destinationDir = file("${jalviewDir}/${packageDir}")
1120 archiveName = rootProject.name+".jar"
1126 exclude "**/*.jar.*"
1128 inputs.dir(classesDir)
1129 outputs.file("${jalviewDir}/${packageDir}/${archiveName}")
1133 task copyJars(type: Copy) {
1134 from fileTree(dir: classesDir, include: "**/*.jar").files
1135 into "${jalviewDir}/${packageDir}"
1139 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
1140 task syncJars(type: Sync) {
1141 from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
1142 into "${jalviewDir}/${packageDir}"
1144 include jar.archiveName
1151 description = "Put all required libraries in dist"
1152 // order of "cleanPackageDir", "copyJars", "jar" important!
1153 jar.mustRunAfter cleanPackageDir
1154 syncJars.mustRunAfter cleanPackageDir
1155 dependsOn cleanPackageDir
1158 outputs.dir("${jalviewDir}/${packageDir}")
1163 dependsOn cleanPackageDir
1169 group = "distribution"
1173 from ("${jalviewDir}/${libDistDir}") {
1177 attributes 'Implementation-Version': JALVIEW_VERSION
1179 mainClassName = shadowJarMainClass
1181 classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
1186 task getdownWebsite() {
1187 group = "distribution"
1188 description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
1193 def getdownWebsiteResourceFilenames = []
1194 def getdownTextString = ""
1195 def getdownResourceDir = getdownResourceDir
1196 def getdownResourceFilenames = []
1199 // clean the getdown website and files dir before creating getdown folders
1200 delete getdownWebsiteDir
1201 delete getdownFilesDir
1204 from buildProperties
1205 rename(build_properties_file, getdown_build_properties)
1208 getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
1210 // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
1211 def props = project.properties.sort { it.key }
1212 if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
1213 props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
1215 if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) {
1216 props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion)
1218 if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
1219 props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
1222 props.put("getdown_txt_title", jalview_name)
1223 props.put("getdown_txt_ui.name", install4jApplicationName)
1225 // start with appbase
1226 getdownTextString += "appbase = ${getdownAppBase}\n"
1227 props.each{ prop, val ->
1228 if (prop.startsWith("getdown_txt_") && val != null) {
1229 if (prop.startsWith("getdown_txt_multi_")) {
1230 def key = prop.substring(18)
1231 val.split(",").each{ v ->
1232 def line = "${key} = ${v}\n"
1233 getdownTextString += line
1236 // file values rationalised
1237 if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
1239 if (val.indexOf('/') == 0) {
1242 } else if (val.indexOf('/') > 0) {
1243 // relative path (relative to jalviewDir)
1244 r = file( "${jalviewDir}/${val}" )
1247 val = "${getdown_resource_dir}/" + r.getName()
1248 getdownWebsiteResourceFilenames += val
1249 getdownResourceFilenames += r.getPath()
1252 if (! prop.startsWith("getdown_txt_resource")) {
1253 def line = prop.substring(12) + " = ${val}\n"
1254 getdownTextString += line
1260 getdownWebsiteResourceFilenames.each{ filename ->
1261 getdownTextString += "resource = ${filename}\n"
1263 getdownResourceFilenames.each{ filename ->
1266 into getdownResourceDir
1271 fileTree(file(packageDir)).each{ f ->
1272 if (f.isDirectory()) {
1273 def files = fileTree(dir: f, include: ["*"]).getFiles()
1275 } else if (f.exists()) {
1279 codeFiles.sort().each{f ->
1280 def name = f.getName()
1281 def line = "code = ${getdownAppDistDir}/${name}\n"
1282 getdownTextString += line
1289 // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
1291 if (JAVA_VERSION.equals("11")) {
1292 def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
1293 j11libFiles.sort().each{f ->
1294 def name = f.getName()
1295 def line = "code = ${getdown_j11lib_dir}/${name}\n"
1296 getdownTextString += line
1299 into getdownJ11libDir
1305 // 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.
1306 //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
1307 getdownTextString += "resource = ${getdown_launcher_new}\n"
1308 getdownTextString += "class = ${mainClass}\n"
1310 def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
1311 getdown_txt.write(getdownTextString)
1313 def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
1314 def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
1315 launchJvl.write("appbase=${getdownAppBase}")
1318 from getdownLauncher
1319 rename(file(getdownLauncher).getName(), getdown_launcher_new)
1320 into getdownWebsiteDir
1324 from getdownLauncher
1325 if (file(getdownLauncher).getName() != getdown_launcher) {
1326 rename(file(getdownLauncher).getName(), getdown_launcher)
1328 into getdownWebsiteDir
1331 if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
1334 from getdownLauncher
1335 from "${getdownWebsiteDir}/${getdown_build_properties}"
1336 if (file(getdownLauncher).getName() != getdown_launcher) {
1337 rename(file(getdownLauncher).getName(), getdown_launcher)
1339 into getdownInstallDir
1343 from getdownInstallDir
1344 into getdownFilesInstallDir
1351 from getdownLauncher
1352 from "${getdownWebsiteDir}/${getdown_build_properties}"
1353 if (file(getdownLauncher).getName() != getdown_launcher) {
1354 rename(file(getdownLauncher).getName(), getdown_launcher)
1356 into getdownFilesDir
1360 from getdownResourceDir
1361 into "${getdownFilesDir}/${getdown_resource_dir}"
1366 inputs.dir("${jalviewDir}/${packageDir}")
1368 outputs.dir(getdownWebsiteDir)
1369 outputs.dir(getdownFilesDir)
1373 // a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir
1374 task getdownDigestDir(type: JavaExec) {
1375 def digestDirPropertyName = "DIGESTDIR"
1376 description = "Digest a local dir (-P${digestDirPropertyName}=...) for getdown"
1378 classpath = files(getdownLauncher)
1379 def digestDir = findProperty(digestDirPropertyName)
1380 if (digestDir == null) {
1381 throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest")
1385 main = "com.threerings.getdown.tools.Digester"
1389 task getdownDigest(type: JavaExec) {
1390 group = "distribution"
1391 description = "Digest the getdown website folder"
1392 dependsOn getdownWebsite
1394 classpath = files(getdownLauncher)
1396 main = "com.threerings.getdown.tools.Digester"
1397 args getdownWebsiteDir
1398 inputs.dir(getdownWebsiteDir)
1399 outputs.file("${getdownWebsiteDir}/digest2.txt")
1404 group = "distribution"
1405 description = "Create the minimal and full getdown app folder for installers and website and create digest file"
1406 dependsOn getdownDigest
1408 if (reportRsyncCommand) {
1409 def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
1410 def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
1411 println "LIKELY RSYNC COMMAND:"
1412 println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
1413 if (RUNRSYNC == "true") {
1415 commandLine "mkdir", "-p", toDir
1418 commandLine "rsync", "-avh", "--delete", fromDir, toDir
1428 delete getdownWebsiteDir
1429 delete getdownFilesDir
1435 if (file(install4jHomeDir).exists()) {
1437 } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) {
1438 install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
1439 } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) {
1440 install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app"
1442 installDir(file(install4jHomeDir))
1444 mediaTypes = Arrays.asList(install4j_media_types.split(","))
1448 task copyInstall4jTemplate {
1449 def install4jTemplateFile = file("${install4jDir}/${install4j_template}")
1450 def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}")
1451 inputs.file(install4jTemplateFile)
1452 inputs.file(install4jFileAssociationsFile)
1453 inputs.property("CHANNEL", { CHANNEL })
1454 outputs.file(install4jConfFile)
1457 def install4jConfigXml = new XmlParser().parse(install4jTemplateFile)
1459 // turn off code signing if no OSX_KEYPASS
1460 if (OSX_KEYPASS == "") {
1461 install4jConfigXml.'**'.codeSigning.each { codeSigning ->
1462 codeSigning.'@macEnabled' = "false"
1464 install4jConfigXml.'**'.windows.each { windows ->
1465 windows.'@runPostProcessor' = "false"
1469 // turn off checksum creation for LOCAL channel
1470 def e = install4jConfigXml.application[0]
1471 if (CHANNEL == "LOCAL") {
1472 e.'@createChecksums' = "false"
1474 e.'@createChecksums' = "true"
1477 // put file association actions where placeholder action is
1478 def install4jFileAssociationsText = install4jFileAssociationsFile.text
1479 def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
1480 install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true
1481 if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') {
1482 def parent = a.parent()
1484 fileAssociationActions.each { faa ->
1487 // don't need to continue in .any loop once replacements have been made
1492 // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else
1493 // NB we're deleting the /other/ one!
1494 // Also remove the examples subdir from non-release versions
1495 def customizedIdToDelete = "PROGRAM_GROUP_RELEASE"
1496 if (CHANNEL=="RELEASE") {
1497 customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE"
1499 // remove the examples subdir from Full File Set
1500 def files = install4jConfigXml.files[0]
1501 def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" }
1502 def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' }
1503 def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' }
1504 def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" }
1505 dirEntry.parent().remove(dirEntry)
1507 install4jConfigXml.'**'.action.any { a ->
1508 if (a.'@customizedId' == customizedIdToDelete) {
1509 def parent = a.parent()
1515 // remove the "Uninstall Old Jalview (optional)" symlink from DMG for non-release DS_Stores
1516 if (! (CHANNEL == "RELEASE" || CHANNEL == "TEST-RELEASE" ) ) {
1517 def symlink = install4jConfigXml.'**'.topLevelFiles.symlink.find { sl -> sl.'@name' == "Uninstall Old Jalview (optional).app" }
1518 symlink.parent().remove(symlink)
1521 // write install4j file
1522 install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
1529 delete install4jConfFile
1534 task installers(type: com.install4j.gradle.Install4jTask) {
1535 group = "distribution"
1536 description = "Create the install4j installers"
1537 dependsOn setGitVals
1539 dependsOn copyInstall4jTemplate
1541 projectFile = install4jConfFile
1543 // create an md5 for the input files to use as version for install4j conf file
1544 def digest = MessageDigest.getInstance("MD5")
1546 (file("${install4jDir}/${install4j_template}").text +
1547 file("${install4jDir}/${install4j_info_plist_file_associations}").text +
1548 file("${install4jDir}/${install4j_installer_file_associations}").text).bytes)
1549 def filesMd5 = new BigInteger(1, digest.digest()).toString(16)
1550 if (filesMd5.length() >= 8) {
1551 filesMd5 = filesMd5.substring(0,8)
1553 def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
1554 // make install4jBuildDir relative to jalviewDir
1555 def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
1558 'JALVIEW_NAME': jalview_name,
1559 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
1560 'JALVIEW_DIR': "../..",
1561 'OSX_KEYSTORE': OSX_KEYSTORE,
1562 'JSIGN_SH': JSIGN_SH,
1563 'JRE_DIR': getdown_app_dir_java,
1564 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
1565 'JALVIEW_VERSION': JALVIEW_VERSION,
1566 'JAVA_MIN_VERSION': JAVA_MIN_VERSION,
1567 'JAVA_MAX_VERSION': JAVA_MAX_VERSION,
1568 'JAVA_VERSION': JAVA_VERSION,
1569 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
1570 'VERSION': JALVIEW_VERSION,
1571 'MACOS_JAVA_VM_DIR': macosJavaVMDir,
1572 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
1573 'LINUX_JAVA_VM_DIR': linuxJavaVMDir,
1574 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
1575 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
1576 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz,
1577 'COPYRIGHT_MESSAGE': install4j_copyright_message,
1578 'MACOS_BUNDLE_ID': install4j_macOS_bundle_id,
1579 'INSTALLER_NAME': install4j_installer_name,
1580 'BUNDLE_ID': install4jBundleId,
1581 'INTERNAL_ID': install4jInternalId,
1582 'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
1583 'MACOS_DS_STORE': install4jDSStore,
1584 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
1585 'INSTALLER_NAME': install4jInstallerName,
1586 'INSTALL4J_UTILS_DIR': install4j_utils_dir,
1587 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
1588 'GETDOWN_FILES_DIR': getdown_files_dir,
1589 'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
1590 'GETDOWN_DIST_DIR': getdownAppDistDir,
1591 'GETDOWN_ALT_DIR': getdown_app_dir_alt,
1592 'GETDOWN_INSTALL_DIR': getdown_install_dir,
1593 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
1594 'BUILD_DIR': install4jBuildDir,
1595 'APPLICATION_CATEGORIES': install4j_application_categories,
1596 'APPLICATION_FOLDER': install4jApplicationFolder,
1597 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
1598 'EXECUTABLE_NAME': install4jExecutableName,
1599 'EXTRA_SCHEME': install4jExtraScheme,
1602 //println("INSTALL4J VARIABLES:")
1603 //variables.each{k,v->println("${k}=${v}")}
1605 destination = "${jalviewDir}/${install4jBuildDir}"
1606 buildSelected = true
1608 if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
1610 disableSigning = true
1614 macKeystorePassword = OSX_KEYPASS
1618 println("Using projectFile "+projectFile)
1621 inputs.dir(getdownWebsiteDir)
1622 inputs.file(install4jConfFile)
1623 inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
1624 inputs.dir(macosJavaVMDir)
1625 inputs.dir(windowsJavaVMDir)
1626 outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
1632 eclipse().configFile(eclipse_codestyle_file)
1637 task sourceDist(type: Tar) {
1639 def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
1640 def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
1641 // cater for buildship < 3.1 [3.0.1 is max version in eclipse 2018-09]
1643 archiveFileName = outputFileName
1644 } catch (Exception e) {
1645 archiveName = outputFileName
1648 compression Compression.GZIP
1663 "**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales",
1665 "utils/InstallAnywhere",
1680 "gradle.properties",
1691 ".settings/org.eclipse.jdt.core.jalview.prefs",
1695 exclude (EXCLUDE_FILES)
1696 include (PROCESS_FILES)
1697 filter(ReplaceTokens,
1701 'Version-Rel': JALVIEW_VERSION,
1702 'Year-Rel': getDate("yyyy")
1707 exclude (EXCLUDE_FILES)
1708 exclude (PROCESS_FILES)
1709 exclude ("appletlib")
1710 exclude ("**/*locales")
1711 exclude ("*locales/**")
1712 exclude ("utils/InstallAnywhere")
1714 exclude (getdown_files_dir)
1715 exclude (getdown_website_dir)
1717 // exluding these as not using jars as modules yet
1718 exclude ("${j11modDir}/**/*.jar")
1721 include(INCLUDE_FILES)
1723 // from (jalviewDir) {
1724 // // explicit includes for stuff that seemed to not get included
1725 // include(fileTree("test/**/*."))
1726 // exclude(EXCLUDE_FILES)
1727 // exclude(PROCESS_FILES)
1734 dependsOn pubhtmlhelp
1736 inputs.dir("${classesDir}/${help_dir}")
1737 outputs.dir("${buildDir}/distributions/${help_dir}")
1741 task j2sSetHeadlessBuild {
1748 task jalviewjsSetEclipseWorkspace {
1749 def propKey = "jalviewjs_eclipse_workspace"
1751 if (project.hasProperty(propKey)) {
1752 propVal = project.getProperty(propKey)
1753 if (propVal.startsWith("~/")) {
1754 propVal = System.getProperty("user.home") + propVal.substring(1)
1757 def propsFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
1758 def propsFile = file(propsFileName)
1759 def eclipseWsDir = propVal
1760 def props = new Properties()
1762 def writeProps = true
1763 if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && propsFile.exists()) {
1764 def ins = new FileInputStream(propsFileName)
1767 if (props.getProperty(propKey, null) != null) {
1768 eclipseWsDir = props.getProperty(propKey)
1773 if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
1774 def tempDir = File.createTempDir()
1775 eclipseWsDir = tempDir.getAbsolutePath()
1778 eclipseWorkspace = file(eclipseWsDir)
1781 // do not run a headless transpile when we claim to be in Eclipse
1783 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
1784 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
1786 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
1790 props.setProperty(propKey, eclipseWsDir)
1791 propsFile.parentFile.mkdirs()
1792 def bytes = new ByteArrayOutputStream()
1793 props.store(bytes, null)
1794 def propertiesString = bytes.toString()
1795 propsFile.text = propertiesString
1801 println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
1804 //inputs.property(propKey, eclipseWsDir) // eclipseWsDir only gets set once this task runs, so will be out-of-date
1805 outputs.file(propsFileName)
1806 outputs.upToDateWhen { eclipseWorkspace.exists() && propsFile.exists() }
1810 task jalviewjsEclipsePaths {
1813 def eclipseRoot = jalviewjs_eclipse_root
1814 if (eclipseRoot.startsWith("~/")) {
1815 eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
1817 if (OperatingSystem.current().isMacOsX()) {
1818 eclipseRoot += "/Eclipse.app"
1819 eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse"
1820 eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct"
1821 } else if (OperatingSystem.current().isWindows()) { // check these paths!!
1822 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
1823 eclipseRoot += "/eclipse.exe"
1825 eclipseBinary = "${eclipseRoot}/eclipse"
1826 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
1827 } else { // linux or unix
1828 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
1829 eclipseRoot += "/eclipse"
1831 eclipseBinary = "${eclipseRoot}/eclipse"
1832 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
1835 eclipseVersion = "4.13" // default
1836 def assumedVersion = true
1837 if (file(eclipseProduct).exists()) {
1838 def fis = new FileInputStream(eclipseProduct)
1839 def props = new Properties()
1841 eclipseVersion = props.getProperty("version")
1843 assumedVersion = false
1846 def propKey = "eclipse_debug"
1847 eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true"))
1850 // do not run a headless transpile when we claim to be in Eclipse
1852 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
1853 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
1855 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
1858 if (!assumedVersion) {
1859 println("ECLIPSE VERSION=${eclipseVersion}")
1865 task printProperties {
1867 description "Output to console all System.properties"
1869 System.properties.each { key, val -> System.out.println("Property: ${key}=${val}") }
1875 dependsOn eclipseProject
1876 dependsOn eclipseClasspath
1877 dependsOn eclipseJdt
1881 // this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir
1882 task jalviewjsEclipseCopyDropins(type: Copy) {
1883 dependsOn jalviewjsEclipsePaths
1885 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar")
1886 inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}")
1887 def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}"
1894 // this eclipse -clean doesn't actually work
1895 task jalviewjsCleanEclipse(type: Exec) {
1896 dependsOn eclipseSetup
1897 dependsOn jalviewjsEclipsePaths
1898 dependsOn jalviewjsEclipseCopyDropins
1900 executable(eclipseBinary)
1901 args(["-nosplash", "--launcher.suppressErrors", "-data", eclipseWorkspace.getPath(), "-clean", "-console", "-consoleLog"])
1907 def inputString = """exit
1910 def inputByteStream = new ByteArrayInputStream(inputString.getBytes())
1911 standardInput = inputByteStream
1914 /* not really working yet
1915 jalviewjsEclipseCopyDropins.finalizedBy jalviewjsCleanEclipse
1919 task jalviewjsTransferUnzipSwingJs {
1920 def file_zip = "${jalviewDir}/${jalviewjs_swingjs_zip}"
1924 from zipTree(file_zip)
1925 into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
1929 inputs.file file_zip
1930 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
1934 task jalviewjsTransferUnzipLib {
1935 def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
1938 zipFiles.each { file_zip ->
1940 from zipTree(file_zip)
1941 into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
1946 inputs.files zipFiles
1947 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
1951 task jalviewjsTransferUnzipAllLibs {
1952 dependsOn jalviewjsTransferUnzipSwingJs
1953 dependsOn jalviewjsTransferUnzipLib
1957 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
1959 description "Create the .j2s file from the j2s.* properties"
1961 jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
1962 def siteDirProperty = "j2s.site.directory"
1963 def setSiteDir = false
1964 jalviewjsJ2sProps.each { prop, val ->
1966 if (prop == siteDirProperty) {
1967 if (!(val.startsWith('/') || val.startsWith("file://") )) {
1968 val = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${val}"
1974 if (!setSiteDir) { // default site location, don't override specifically set property
1975 property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
1978 outputFile = jalviewjsJ2sSettingsFileName
1981 inputs.properties(jalviewjsJ2sProps)
1982 outputs.file(jalviewjsJ2sSettingsFileName)
1987 task jalviewjsEclipseSetup {
1988 dependsOn jalviewjsEclipseCopyDropins
1989 dependsOn jalviewjsSetEclipseWorkspace
1990 dependsOn jalviewjsCreateJ2sSettings
1994 task jalviewjsSyncAllLibs (type: Sync) {
1995 dependsOn jalviewjsTransferUnzipAllLibs
1996 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
1997 inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
1998 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2002 def outputFiles = []
2003 rename { filename ->
2004 outputFiles += "${outputDir}/${filename}"
2010 outputs.files outputFiles
2011 inputs.files inputFiles
2015 task jalviewjsSyncResources (type: Sync) {
2016 def inputFiles = fileTree(dir: resourceDir)
2017 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2021 def outputFiles = []
2022 rename { filename ->
2023 outputFiles += "${outputDir}/${filename}"
2029 outputs.files outputFiles
2030 inputs.files inputFiles
2034 task jalviewjsSyncSiteResources (type: Sync) {
2035 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}")
2036 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2040 def outputFiles = []
2041 rename { filename ->
2042 outputFiles += "${outputDir}/${filename}"
2048 outputs.files outputFiles
2049 inputs.files inputFiles
2053 task jalviewjsSyncBuildProperties (type: Sync) {
2054 dependsOn createBuildProperties
2055 def inputFiles = [file(buildProperties)]
2056 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2060 def outputFiles = []
2061 rename { filename ->
2062 outputFiles += "${outputDir}/${filename}"
2068 outputs.files outputFiles
2069 inputs.files inputFiles
2073 task jalviewjsProjectImport(type: Exec) {
2074 dependsOn eclipseSetup
2075 dependsOn jalviewjsEclipsePaths
2076 dependsOn jalviewjsEclipseSetup
2079 // do not run a headless import when we claim to be in Eclipse
2081 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2082 throw new StopExecutionException("Not running headless import whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2084 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2088 //def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
2089 def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
2090 executable(eclipseBinary)
2091 args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
2095 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2097 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2100 inputs.file("${jalviewDir}/.project")
2101 outputs.upToDateWhen {
2102 file(projdir).exists()
2107 task jalviewjsTranspile(type: Exec) {
2108 dependsOn jalviewjsEclipseSetup
2109 dependsOn jalviewjsProjectImport
2110 dependsOn jalviewjsEclipsePaths
2113 // do not run a headless transpile when we claim to be in Eclipse
2115 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2116 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2118 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2122 executable(eclipseBinary)
2123 args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipse_build_arg}", eclipse_project_name ])
2127 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2129 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2135 stdout = new ByteArrayOutputStream()
2136 stderr = new ByteArrayOutputStream()
2138 def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}"
2139 def logOutFile = file(logOutFileName)
2140 logOutFile.createNewFile()
2141 logOutFile.text = """ROOT: ${jalviewjs_eclipse_root}
2142 BINARY: ${eclipseBinary}
2143 VERSION: ${eclipseVersion}
2144 WORKSPACE: ${eclipseWorkspace}
2145 DEBUG: ${eclipseDebug}
2148 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2149 // combine stdout and stderr
2150 def logErrFOS = logOutFOS
2152 if (jalviewjs_j2s_to_console.equals("true")) {
2153 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2154 new org.apache.tools.ant.util.TeeOutputStream(
2158 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2159 new org.apache.tools.ant.util.TeeOutputStream(
2164 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2167 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2174 if (stdout.toString().contains("Error processing ")) {
2175 // j2s did not complete transpile
2176 //throw new TaskExecutionException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2177 if (jalviewjs_ignore_transpile_errors.equals("true")) {
2178 println("IGNORING TRANSPILE ERRORS")
2179 println("See eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2181 throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2186 inputs.dir("${jalviewDir}/${sourceDir}")
2187 outputs.dir("${jalviewDir}/${jalviewjsTransferSiteJsDir}")
2188 outputs.upToDateWhen( { file("${jalviewDir}/${jalviewjsTransferSiteJsDir}${jalviewjs_server_resource}").exists() } )
2192 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
2194 def stdout = new ByteArrayOutputStream()
2195 def stderr = new ByteArrayOutputStream()
2197 def coreFile = file(jsfile)
2199 msg = "Creating core for ${name}...\nGenerating ${jsfile}"
2201 logOutFile.createNewFile()
2202 logOutFile.append(msg+"\n")
2204 def coreTop = file(prefixFile)
2205 def coreBottom = file(suffixFile)
2206 coreFile.getParentFile().mkdirs()
2207 coreFile.createNewFile()
2208 coreFile.write( coreTop.text )
2213 t.replaceAll("Clazz\\.([^_])","Clazz_${1}")
2214 coreFile.append( t )
2216 msg = "...file '"+f.getPath()+"' does not exist, skipping"
2218 logOutFile.append(msg+"\n")
2221 coreFile.append( coreBottom.text )
2223 msg = "Generating ${zjsfile}"
2225 logOutFile.append(msg+"\n")
2226 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2227 def logErrFOS = logOutFOS
2230 classpath = files(["${jalviewDir}/tools/closure_compiler.jar"])
2231 args = [ "--js", jsfile, "--js_output_file", zjsfile ]
2234 msg = "\nRunning '"+commandLine.join(' ')+"'\n"
2236 logOutFile.append(msg+"\n")
2238 if (logOutConsole) {
2239 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2240 new org.apache.tools.ant.util.TeeOutputStream(
2244 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2245 new org.apache.tools.ant.util.TeeOutputStream(
2250 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2253 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2260 logOutFile.append(msg+"\n")
2264 task jalviewjsBuildAllCores {
2266 description "Build the core js lib closures listed in the classlists dir"
2267 dependsOn jalviewjsTranspile
2268 dependsOn jalviewjsTransferUnzipSwingJs
2270 def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
2271 def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
2272 def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
2273 def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
2274 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
2275 def prefixFile = "${jsDir}/core/coretop2.js"
2276 def suffixFile = "${jsDir}/core/corebottom2.js"
2278 inputs.file prefixFile
2279 inputs.file suffixFile
2281 def classlistFiles = []
2282 // add the classlists found int the jalviewjs_classlists_dir
2283 fileTree(dir: "${jalviewDir}/${jalviewjs_classlists_dir}", include: "*.txt").each {
2285 def name = file.getName() - ".txt"
2292 // _jmol and _jalview cores. Add any other peculiar classlist.txt files here
2293 //classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jmol}"), 'name': "_jvjmol" ]
2294 classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jalview}"), 'name': jalviewjsJalviewCoreName ]
2296 jalviewjsCoreClasslists = []
2298 classlistFiles.each {
2301 def file = hash['file']
2302 if (! file.exists()) {
2303 //println("...classlist file '"+file.getPath()+"' does not exist, skipping")
2304 return false // this is a "continue" in groovy .each closure
2306 def name = hash['name']
2308 name = file.getName() - ".txt"
2316 def list = fileTree(dir: j2sDir, includes: filelist)
2318 def jsfile = "${outputDir}/core${name}.js"
2319 def zjsfile = "${outputDir}/core${name}.z.js"
2321 jalviewjsCoreClasslists += [
2330 outputs.file(jsfile)
2331 outputs.file(zjsfile)
2334 // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
2335 def stevesoftClasslistName = "_stevesoft"
2336 def stevesoftClasslist = [
2337 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
2338 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
2339 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
2340 'name': stevesoftClasslistName
2342 jalviewjsCoreClasslists += stevesoftClasslist
2343 inputs.files(stevesoftClasslist['list'])
2344 outputs.file(stevesoftClasslist['jsfile'])
2345 outputs.file(stevesoftClasslist['zjsfile'])
2348 def allClasslistName = "_all"
2349 def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
2350 allJsFiles += fileTree(
2354 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2355 "**/org/jmol/jvxl/readers/IsoIntersectFileReader.js",
2356 "**/org/jmol/export/JSExporter.js"
2359 allJsFiles += fileTree(
2363 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2364 "**/sun/misc/Unsafe.js",
2365 "**/swingjs/jquery/jquery-editable-select.js",
2366 "**/swingjs/jquery/j2sComboBox.js",
2367 "**/sun/misc/FloatingDecimal.js"
2370 def allClasslist = [
2371 'jsfile': "${outputDir}/core${allClasslistName}.js",
2372 'zjsfile': "${outputDir}/core${allClasslistName}.z.js",
2374 'name': allClasslistName
2376 // not including this version of "all" core at the moment
2377 //jalviewjsCoreClasslists += allClasslist
2378 inputs.files(allClasslist['list'])
2379 outputs.file(allClasslist['jsfile'])
2380 outputs.file(allClasslist['zjsfile'])
2383 def logOutFile = file("${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_closure_stdout}")
2384 logOutFile.getParentFile().mkdirs()
2385 logOutFile.createNewFile()
2386 logOutFile.write(getDate("yyyy-MM-dd HH:mm:ss")+" jalviewjsBuildAllCores\n----\n")
2388 jalviewjsCoreClasslists.each {
2389 jalviewjsCallCore(it.name, it.list, prefixFile, suffixFile, it.jsfile, it.zjsfile, logOutFile, jalviewjs_j2s_to_console.equals("true"))
2396 def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inputFile, String outputFile) {
2399 into file(outputFile).getParentFile()
2400 rename { filename ->
2401 if (filename.equals(inputFile.getName())) {
2402 return file(outputFile).getName()
2406 filter(ReplaceTokens,
2410 'MAIN': '"'+mainClass+'"',
2412 'NAME': jalviewjsJalviewTemplateName+" [core ${coreName}]",
2413 'COREKEY': jalviewjs_core_key,
2414 'CORENAME': coreName
2421 task jalviewjsPublishCoreTemplates {
2422 dependsOn jalviewjsBuildAllCores
2423 def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
2424 def inputFile = file(inputFileName)
2425 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2427 def outputFiles = []
2428 jalviewjsCoreClasslists.each { cl ->
2429 def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html"
2430 cl['outputfile'] = outputFile
2431 outputFiles += outputFile
2435 jalviewjsCoreClasslists.each { cl ->
2436 jalviewjsPublishCoreTemplate(cl.name, jalviewjsJalviewTemplateName, inputFile, cl.outputfile)
2439 inputs.file(inputFile)
2440 outputs.files(outputFiles)
2444 task jalviewjsSyncCore (type: Sync) {
2445 dependsOn jalviewjsBuildAllCores
2446 dependsOn jalviewjsPublishCoreTemplates
2447 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
2448 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2452 def outputFiles = []
2453 rename { filename ->
2454 outputFiles += "${outputDir}/${filename}"
2460 outputs.files outputFiles
2461 inputs.files inputFiles
2465 // this Copy version of TransferSiteJs will delete anything else in the target dir
2466 task jalviewjsCopyTransferSiteJs(type: Copy) {
2467 dependsOn jalviewjsTranspile
2468 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2469 into "${jalviewDir}/${jalviewjsSiteDir}"
2473 // this Sync version of TransferSite is used by buildship to keep the website automatically up to date when a file changes
2474 task jalviewjsSyncTransferSiteJs(type: Sync) {
2475 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2477 into "${jalviewDir}/${jalviewjsSiteDir}"
2484 jalviewjsSyncAllLibs.mustRunAfter jalviewjsCopyTransferSiteJs
2485 jalviewjsSyncResources.mustRunAfter jalviewjsCopyTransferSiteJs
2486 jalviewjsSyncSiteResources.mustRunAfter jalviewjsCopyTransferSiteJs
2487 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsCopyTransferSiteJs
2489 jalviewjsSyncAllLibs.mustRunAfter jalviewjsSyncTransferSiteJs
2490 jalviewjsSyncResources.mustRunAfter jalviewjsSyncTransferSiteJs
2491 jalviewjsSyncSiteResources.mustRunAfter jalviewjsSyncTransferSiteJs
2492 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
2495 task jalviewjsPrepareSite {
2497 description "Prepares the website folder including unzipping files and copying resources"
2498 dependsOn jalviewjsSyncAllLibs
2499 dependsOn jalviewjsSyncResources
2500 dependsOn jalviewjsSyncSiteResources
2501 dependsOn jalviewjsSyncBuildProperties
2502 dependsOn jalviewjsSyncCore
2506 task jalviewjsBuildSite {
2508 description "Builds the whole website including transpiled code"
2509 dependsOn jalviewjsCopyTransferSiteJs
2510 dependsOn jalviewjsPrepareSite
2514 task cleanJalviewjsTransferSite {
2516 delete "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2517 delete "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2518 delete "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2519 delete "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2524 task cleanJalviewjsSite {
2525 dependsOn cleanJalviewjsTransferSite
2527 delete "${jalviewDir}/${jalviewjsSiteDir}"
2532 task jalviewjsSiteTar(type: Tar) {
2534 description "Creates a tar.gz file for the website"
2535 dependsOn jalviewjsBuildSite
2536 def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
2538 archiveFileName = outputFilename
2539 } catch (Exception e) {
2540 archiveName = outputFilename
2543 compression Compression.GZIP
2545 from "${jalviewDir}/${jalviewjsSiteDir}"
2546 into jalviewjs_site_dir // this is inside the tar file
2548 inputs.dir("${jalviewDir}/${jalviewjsSiteDir}")
2552 task jalviewjsServer {
2554 def filename = "jalviewjsTest.html"
2555 description "Starts a webserver on localhost to test the website. See ${filename} to access local site on most recently used port."
2556 def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
2559 SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory()
2560 def port = Integer.valueOf(jalviewjs_server_port)
2565 while(port < start+1000 && !running) {
2567 def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}")
2568 jalviewjsServer = factory.start(doc_root, port)
2570 url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource)
2571 println("SERVER STARTED with document root ${doc_root}.")
2572 println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).")
2573 println("For debug: "+url+"?j2sdebug")
2574 println("For verbose: "+url+"?j2sverbose")
2575 } catch (Exception e) {
2580 <p><a href="${url}">JalviewJS Test. <${url}></a></p>
2581 <p><a href="${url}?j2sdebug">JalviewJS Test with debug. <${url}?j2sdebug></a></p>
2582 <p><a href="${url}?j2sverbose">JalviewJS Test with verbose. <${url}?j2sdebug></a></p>
2584 jalviewjsCoreClasslists.each { cl ->
2585 def urlcore = jalviewjsServer.getResourceUrl(file(cl.outputfile).getName())
2587 <p><a href="${urlcore}">${jalviewjsJalviewTemplateName} [core ${cl.name}]. <${urlcore}></a></p>
2589 println("For core ${cl.name}: "+urlcore)
2592 file(htmlFile).text = htmlText
2595 outputs.file(htmlFile)
2596 outputs.upToDateWhen({false})
2600 task cleanJalviewjsAll {
2602 description "Delete all configuration and build artifacts to do with JalviewJS build"
2603 dependsOn cleanJalviewjsSite
2604 dependsOn jalviewjsEclipsePaths
2607 delete "${jalviewDir}/${jalviewjsBuildDir}"
2608 delete "${jalviewDir}/${eclipse_bin_dir}"
2609 if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
2610 delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
2612 delete "${jalviewDir}/${jalviewjs_j2s_settings}"
2615 outputs.upToDateWhen( { false } )
2619 task jalviewjsIDE_checkJ2sPlugin {
2620 group "00 JalviewJS in Eclipse"
2621 description "Compare the swingjs/net.sf.j2s.core(-j11)?.jar file with the Eclipse IDE's plugin version (found in the 'dropins' dir)"
2624 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2625 def j2sPluginFile = file(j2sPlugin)
2626 def eclipseHome = System.properties["eclipse.home.location"]
2627 if (eclipseHome == null || ! IN_ECLIPSE) {
2628 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. Skipping J2S Plugin Check.")
2630 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
2631 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2632 if (!eclipseJ2sPluginFile.exists()) {
2633 def msg = "Eclipse J2S Plugin is not installed (could not find '${eclipseJ2sPlugin}')\nTry running task jalviewjsIDE_copyJ2sPlugin"
2634 System.err.println(msg)
2635 throw new StopExecutionException(msg)
2638 def digest = MessageDigest.getInstance("MD5")
2640 digest.update(j2sPluginFile.text.bytes)
2641 def j2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2643 digest.update(eclipseJ2sPluginFile.text.bytes)
2644 def eclipseJ2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2646 if (j2sPluginMd5 != eclipseJ2sPluginMd5) {
2647 def msg = "WARNING! Eclipse J2S Plugin '${eclipseJ2sPlugin}' is different to this commit's version '${j2sPlugin}'"
2648 System.err.println(msg)
2649 throw new StopExecutionException(msg)
2651 def msg = "Eclipse J2S Plugin is the same as '${j2sPlugin}' (this is good)"
2657 task jalviewjsIDE_copyJ2sPlugin {
2658 group "00 JalviewJS in Eclipse"
2659 description "Copy the swingjs/net.sf.j2s.core(-j11)?.jar file into the Eclipse IDE's 'dropins' dir"
2662 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2663 def j2sPluginFile = file(j2sPlugin)
2664 def eclipseHome = System.properties["eclipse.home.location"]
2665 if (eclipseHome == null || ! IN_ECLIPSE) {
2666 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. NOT copying J2S Plugin.")
2668 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
2669 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2670 def msg = "WARNING! Copying this commit's j2s plugin '${j2sPlugin}' to Eclipse J2S Plugin '${eclipseJ2sPlugin}'\n* May require an Eclipse restart"
2671 System.err.println(msg)
2674 eclipseJ2sPluginFile.getParentFile().mkdirs()
2675 into eclipseJ2sPluginFile.getParent()
2681 task jalviewjsIDE_j2sFile {
2682 group "00 JalviewJS in Eclipse"
2683 description "Creates the .j2s file"
2684 dependsOn jalviewjsCreateJ2sSettings
2688 task jalviewjsIDE_SyncCore {
2689 group "00 JalviewJS in Eclipse"
2690 description "Build the core js lib closures listed in the classlists dir and publish core html from template"
2691 dependsOn jalviewjsSyncCore
2695 task jalviewjsIDE_SyncSiteAll {
2696 dependsOn jalviewjsSyncAllLibs
2697 dependsOn jalviewjsSyncResources
2698 dependsOn jalviewjsSyncSiteResources
2699 dependsOn jalviewjsSyncBuildProperties
2703 cleanJalviewjsTransferSite.mustRunAfter jalviewjsIDE_SyncSiteAll
2706 task jalviewjsIDE_PrepareSite {
2707 group "00 JalviewJS in Eclipse"
2708 description "Sync libs and resources to site dir, but not closure cores"
2710 dependsOn jalviewjsIDE_SyncSiteAll
2711 dependsOn cleanJalviewjsTransferSite
2715 task jalviewjsIDE_AssembleSite {
2716 group "00 JalviewJS in Eclipse"
2717 description "Assembles unzipped supporting zipfiles, resources, site resources and closure cores into the Eclipse transpiled site"
2718 dependsOn jalviewjsPrepareSite
2722 task jalviewjsIDE_SiteClean {
2723 group "00 JalviewJS in Eclipse"
2724 description "Deletes the Eclipse transpiled site"
2725 dependsOn cleanJalviewjsSite
2729 task jalviewjsIDE_Server {
2730 group "00 JalviewJS in Eclipse"
2731 description "Starts a webserver on localhost to test the website"
2732 dependsOn jalviewjsServer
2736 // buildship runs this at import or gradle refresh
2737 task eclipseSynchronizationTask {
2738 //dependsOn eclipseSetup
2739 dependsOn createBuildProperties
2741 dependsOn jalviewjsIDE_j2sFile
2742 dependsOn jalviewjsIDE_checkJ2sPlugin
2743 dependsOn jalviewjsIDE_PrepareSite
2748 // buildship runs this at build time or project refresh
2749 task eclipseAutoBuildTask {
2750 //dependsOn jalviewjsIDE_checkJ2sPlugin
2751 //dependsOn jalviewjsIDE_PrepareSite
2757 description "Build the site"
2758 dependsOn jalviewjsBuildSite