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
16 import com.vladsch.flexmark.util.ast.Node
17 import com.vladsch.flexmark.html.HtmlRenderer
18 import com.vladsch.flexmark.parser.Parser
19 import com.vladsch.flexmark.util.data.MutableDataSet
20 import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension
21 import com.vladsch.flexmark.ext.tables.TablesExtension
22 import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension
23 import com.vladsch.flexmark.ext.autolink.AutolinkExtension
24 import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension
25 import com.vladsch.flexmark.ext.toc.TocExtension
33 classpath "com.vladsch.flexmark:flexmark-all:0.62.0"
42 id "com.diffplug.gradle.spotless" version "3.28.0"
43 id 'com.github.johnrengelman.shadow' version '4.0.3'
44 id 'com.install4j.gradle' version '8.0.10'
45 id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree
46 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()
62 def overrideProperties(String propsFileName, boolean output = false) {
63 if (propsFileName == null) {
66 def propsFile = file(propsFileName)
67 if (propsFile != null && propsFile.exists()) {
68 println("Using properties from file '${propsFileName}'")
70 def p = new Properties()
71 def localPropsFIS = new FileInputStream(propsFile)
77 if (project.hasProperty(key)) {
78 oldval = project.findProperty(key)
79 project.setProperty(key, val)
81 println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'")
84 ext.setProperty(key, val)
86 println("Setting ext property '${key}' with ${file(propsFile).getName()}s value '${val}'")
90 } catch (Exception e) {
91 println("Exception reading local.properties")
98 jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
99 jalviewDirRelativePath = jalviewDir
101 getdownChannelName = CHANNEL.toLowerCase()
102 // default to "default". Currently only has different cosmetics for "develop", "release", "default"
103 propertiesChannelName = ["develop", "release", "test-release", "jalviewjs", "jalviewjs-release" ].contains(getdownChannelName) ? getdownChannelName : "default"
104 // Import channel_properties
105 channelDir = string("${jalviewDir}/${channel_properties_dir}/${propertiesChannelName}")
106 channelGradleProperties = string("${channelDir}/channel_gradle.properties")
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")
169 bareSourceDir = string(source_dir)
170 sourceDir = string("${jalviewDir}/${bareSourceDir}")
171 resourceDir = string("${jalviewDir}/${resource_dir}")
172 bareTestSourceDir = string(test_source_dir)
173 testDir = string("${jalviewDir}/${bareTestSourceDir}")
175 classesDir = string("${jalviewDir}/${classes_dir}")
178 useClover = clover.equals("true")
179 cloverBuildDir = "${buildDir}/clover"
180 cloverInstrDir = file("${cloverBuildDir}/clover-instr")
181 cloverClassesDir = file("${cloverBuildDir}/clover-classes")
182 cloverReportDir = file("${buildDir}/reports/clover")
183 cloverTestInstrDir = file("${cloverBuildDir}/clover-test-instr")
184 cloverTestClassesDir = file("${cloverBuildDir}/clover-test-classes")
185 //cloverTestClassesDir = cloverClassesDir
186 cloverDb = string("${cloverBuildDir}/clover.db")
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 macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz")
454 windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
455 windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz")
456 linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
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")
472 if (buildProperties == null) {
473 buildProperties = string("${resourcesBuildDir}/${build_properties_file}")
475 buildingHTML = string("${jalviewDir}/${doc_dir}/building.html")
476 helpParentDir = string("${jalviewDir}/${help_parent_dir}")
477 helpSourceDir = string("${helpParentDir}/${help_dir}")
478 helpFile = string("${helpBuildDir}/${help_dir}/help.jhm")
481 relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
482 jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs")
483 jalviewjsSiteDir = string("${jalviewjsBuildDir}/${jalviewjs_site_dir}")
485 jalviewjsTransferSiteJsDir = string(jalviewjsSiteDir)
487 jalviewjsTransferSiteJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_js")
489 jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
490 jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
491 jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
492 jalviewjsJalviewCoreHtmlFile = string("")
493 jalviewjsJalviewCoreName = string(jalviewjs_core_name)
494 jalviewjsCoreClasslists = []
495 jalviewjsJalviewTemplateName = string(jalviewjs_name)
496 jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}")
497 jalviewjsJ2sAltSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_alt_settings}")
498 jalviewjsJ2sProps = null
499 jalviewjsJ2sPlugin = jalviewjs_j2s_plugin
501 eclipseWorkspace = null
502 eclipseBinary = string("")
503 eclipseVersion = string("")
513 outputDir = file(classesDir)
517 srcDirs = [ resourcesBuildDir, docBuildDir, helpBuildDir ]
521 compileClasspath = files(sourceSets.main.java.outputDir)
522 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
524 runtimeClasspath = compileClasspath
525 runtimeClasspath += files(sourceSets.main.resources.srcDirs)
530 srcDirs cloverInstrDir
531 outputDir = cloverClassesDir
535 srcDirs = sourceSets.main.resources.srcDirs
538 compileClasspath = files( sourceSets.clover.java.outputDir )
539 //compileClasspath += files( testClassesDir )
540 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
541 compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
542 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
544 runtimeClasspath = compileClasspath
549 srcDirs testSourceDir
550 outputDir = file(testClassesDir)
554 srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs
557 compileClasspath = files( sourceSets.test.java.outputDir )
558 compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath
559 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
561 runtimeClasspath = compileClasspath
562 runtimeClasspath += files(sourceSets.test.resources.srcDirs)
568 // eclipse project and settings files creation, also used by buildship
571 name = eclipse_project_name
573 natures 'org.eclipse.jdt.core.javanature',
574 'org.eclipse.jdt.groovy.core.groovyNature',
575 'org.eclipse.buildship.core.gradleprojectnature'
577 buildCommand 'org.eclipse.jdt.core.javabuilder'
578 buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
582 //defaultOutputDir = sourceSets.main.java.outputDir
583 configurations.each{ c->
584 if (c.isCanBeResolved()) {
585 minusConfigurations += [c]
589 plusConfigurations = [ ]
593 def removeTheseToo = []
594 HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
595 cp.entries.each { entry ->
596 // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test".
597 // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover
598 // we add the resources and help/help dirs in as libs afterwards (see below)
599 if (entry.kind == 'src') {
600 if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) {
601 removeTheseToo += entry
603 alreadyAddedSrcPath.putAt(entry.path, true)
608 cp.entries.removeAll(removeTheseToo)
610 //cp.entries += new Output("${eclipse_bin_dir}/main")
611 if (file(helpParentDir).isDirectory()) {
612 cp.entries += new Library(fileReference(helpParentDir))
614 if (file(resourceDir).isDirectory()) {
615 cp.entries += new Library(fileReference(resourceDir))
618 HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
620 sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
621 //don't want to add outputDir as eclipse is using its own output dir in bin/main
622 if (it.isDirectory() || ! it.exists()) {
623 // don't add dirs to classpath, especially if they don't exist
624 return false // groovy "continue" in .any closure
626 def itPath = it.toString()
627 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
628 // make relative path
629 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
631 if (alreadyAddedLibPath.get(itPath)) {
632 //println("Not adding duplicate entry "+itPath)
634 //println("Adding entry "+itPath)
635 cp.entries += new Library(fileReference(itPath))
636 alreadyAddedLibPath.put(itPath, true)
640 sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
641 //no longer want to add outputDir as eclipse is using its own output dir in bin/main
642 if (it.isDirectory() || ! it.exists()) {
643 // don't add dirs to classpath
644 return false // groovy "continue" in .any closure
647 def itPath = it.toString()
648 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
649 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
651 if (alreadyAddedLibPath.get(itPath)) {
654 def lib = new Library(fileReference(itPath))
655 lib.entryAttributes["test"] = "true"
657 alreadyAddedLibPath.put(itPath, true)
665 containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
670 // for the IDE, use java 11 compatibility
671 sourceCompatibility = compile_source_compatibility
672 targetCompatibility = compile_target_compatibility
673 javaRuntimeName = eclipseJavaRuntimeName
675 // add in jalview project specific properties/preferences into eclipse core preferences
677 withProperties { props ->
678 def jalview_prefs = new Properties()
679 def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}")
680 jalview_prefs.load(ins)
682 jalview_prefs.forEach { t, v ->
683 if (props.getAt(t) == null) {
687 // codestyle file -- overrides previous formatter prefs
688 def csFile = file("${jalviewDirAbsolutePath}/${eclipse_codestyle_file}")
689 if (csFile.exists()) {
690 XmlParser parser = new XmlParser()
691 def profiles = parser.parse(csFile)
692 def profile = profiles.'profile'.find { p -> (p.'@kind' == "CodeFormatterProfile" && p.'@name' == "Jalview") }
693 if (profile != null) {
694 profile.'setting'.each { s ->
696 def value = s.'@value'
697 if (id != null && value != null) {
698 props.putAt(id, value)
709 // Don't want these to be activated if in headless build
710 synchronizationTasks "eclipseSynchronizationTask"
711 //autoBuildTasks "eclipseAutoBuildTask"
717 /* hack to change eclipse prefs in .settings files other than org.eclipse.jdt.core.prefs */
718 // Class to allow updating arbitrary properties files
719 class PropertiesFile extends PropertiesPersistableConfigurationObject {
720 public PropertiesFile(PropertiesTransformer t) { super(t); }
721 @Override protected void load(Properties properties) { }
722 @Override protected void store(Properties properties) { }
723 @Override protected String getDefaultResourceName() { return ""; }
724 // This is necessary, because PropertiesPersistableConfigurationObject fails
725 // if no default properties file exists.
726 @Override public void loadDefaults() { load(new StringBufferInputStream("")); }
729 // Task to update arbitrary properties files (set outputFile)
730 class PropertiesFileTask extends PropertiesGeneratorTask<PropertiesFile> {
731 private final PropertiesFileContentMerger file;
732 public PropertiesFileTask() { file = new PropertiesFileContentMerger(getTransformer()); }
733 protected PropertiesFile create() { return new PropertiesFile(getTransformer()); }
734 protected void configure(PropertiesFile props) {
735 file.getBeforeMerged().execute(props); file.getWhenMerged().execute(props);
737 public void file(Closure closure) { ConfigureUtil.configure(closure, file); }
740 task eclipseUIPreferences(type: PropertiesFileTask) {
741 description = "Generate Eclipse additional settings"
742 def filename = "org.eclipse.jdt.ui.prefs"
743 outputFile = "$projectDir/.settings/${filename}" as File
746 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
751 task eclipseGroovyCorePreferences(type: PropertiesFileTask) {
752 description = "Generate Eclipse additional settings"
753 def filename = "org.eclipse.jdt.groovy.core.prefs"
754 outputFile = "$projectDir/.settings/${filename}" as File
757 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
762 task eclipseAllPreferences {
764 dependsOn eclipseUIPreferences
765 dependsOn eclipseGroovyCorePreferences
768 eclipseUIPreferences.mustRunAfter eclipseJdt
769 eclipseGroovyCorePreferences.mustRunAfter eclipseJdt
771 /* end of eclipse preferences hack */
779 delete cloverBuildDir
780 delete cloverReportDir
785 task cloverInstrJava(type: JavaExec) {
786 group = "Verification"
787 description = "Create clover instrumented source java files"
789 dependsOn cleanClover
791 inputs.files(sourceSets.main.allJava)
792 outputs.dir(cloverInstrDir)
794 //classpath = fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
795 classpath = sourceSets.clover.compileClasspath
796 main = "com.atlassian.clover.CloverInstr"
804 cloverInstrDir.getPath(),
806 def srcFiles = sourceSets.main.allJava.files
809 { file -> file.absolutePath }
812 args argsList.toArray()
815 delete cloverInstrDir
816 println("Clover: About to instrument "+srcFiles.size() +" files")
821 task cloverInstrTests(type: JavaExec) {
822 group = "Verification"
823 description = "Create clover instrumented source test files"
825 dependsOn cleanClover
827 inputs.files(testDir)
828 outputs.dir(cloverTestInstrDir)
830 classpath = sourceSets.clover.compileClasspath
831 main = "com.atlassian.clover.CloverInstr"
841 cloverTestInstrDir.getPath(),
843 args argsList.toArray()
846 delete cloverTestInstrDir
847 println("Clover: About to instrument test files")
853 group = "Verification"
854 description = "Create clover instrumented all source files"
856 dependsOn cloverInstrJava
857 dependsOn cloverInstrTests
861 cloverClasses.dependsOn cloverInstr
864 task cloverConsoleReport(type: JavaExec) {
865 group = "Verification"
866 description = "Creates clover console report"
869 file(cloverDb).exists()
872 inputs.dir cloverClassesDir
874 classpath = sourceSets.clover.runtimeClasspath
875 main = "com.atlassian.clover.reporters.console.ConsoleReporter"
877 if (cloverreport_mem.length() > 0) {
878 maxHeapSize = cloverreport_mem
880 if (cloverreport_jvmargs.length() > 0) {
881 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
891 args argsList.toArray()
895 task cloverHtmlReport(type: JavaExec) {
896 group = "Verification"
897 description = "Creates clover HTML report"
900 file(cloverDb).exists()
903 def cloverHtmlDir = cloverReportDir
904 inputs.dir cloverClassesDir
905 outputs.dir cloverHtmlDir
907 classpath = sourceSets.clover.runtimeClasspath
908 main = "com.atlassian.clover.reporters.html.HtmlReporter"
910 if (cloverreport_mem.length() > 0) {
911 maxHeapSize = cloverreport_mem
913 if (cloverreport_jvmargs.length() > 0) {
914 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
925 if (cloverreport_html_options.length() > 0) {
926 argsList += cloverreport_html_options.split(" ")
929 args argsList.toArray()
933 task cloverXmlReport(type: JavaExec) {
934 group = "Verification"
935 description = "Creates clover XML report"
938 file(cloverDb).exists()
941 def cloverXmlFile = "${cloverReportDir}/clover.xml"
942 inputs.dir cloverClassesDir
943 outputs.file cloverXmlFile
945 classpath = sourceSets.clover.runtimeClasspath
946 main = "com.atlassian.clover.reporters.xml.XMLReporter"
948 if (cloverreport_mem.length() > 0) {
949 maxHeapSize = cloverreport_mem
951 if (cloverreport_jvmargs.length() > 0) {
952 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
963 if (cloverreport_xml_options.length() > 0) {
964 argsList += cloverreport_xml_options.split(" ")
967 args argsList.toArray()
972 group = "Verification"
973 description = "Creates clover reports"
975 dependsOn cloverXmlReport
976 dependsOn cloverHtmlReport
983 sourceCompatibility = compile_source_compatibility
984 targetCompatibility = compile_target_compatibility
985 options.compilerArgs += additional_compiler_args
986 print ("Setting target compatibility to "+targetCompatibility+"\n")
988 //classpath += configurations.cloverRuntime
994 // JBP->BS should the print statement in doFirst refer to compile_target_compatibility ?
995 sourceCompatibility = compile_source_compatibility
996 targetCompatibility = compile_target_compatibility
997 options.compilerArgs = additional_compiler_args
998 options.encoding = "UTF-8"
1000 print ("Setting target compatibility to "+compile_target_compatibility+"\n")
1007 sourceCompatibility = compile_source_compatibility
1008 targetCompatibility = compile_target_compatibility
1009 options.compilerArgs = additional_compiler_args
1011 print ("Setting target compatibility to "+targetCompatibility+"\n")
1018 delete sourceSets.main.java.outputDir
1024 dependsOn cleanClover
1026 delete sourceSets.test.java.outputDir
1031 // format is a string like date.format("dd MMMM yyyy")
1032 def getDate(format) {
1033 def date = new Date()
1034 return date.format(format)
1038 def convertMdToHtml (FileTree mdFiles, File cssFile) {
1039 MutableDataSet options = new MutableDataSet()
1041 def extensions = new ArrayList<>()
1042 extensions.add(AnchorLinkExtension.create())
1043 extensions.add(AutolinkExtension.create())
1044 extensions.add(StrikethroughExtension.create())
1045 extensions.add(TaskListExtension.create())
1046 extensions.add(TablesExtension.create())
1047 extensions.add(TocExtension.create())
1049 options.set(Parser.EXTENSIONS, extensions)
1051 // set GFM table parsing options
1052 options.set(TablesExtension.WITH_CAPTION, false)
1053 options.set(TablesExtension.COLUMN_SPANS, false)
1054 options.set(TablesExtension.MIN_HEADER_ROWS, 1)
1055 options.set(TablesExtension.MAX_HEADER_ROWS, 1)
1056 options.set(TablesExtension.APPEND_MISSING_COLUMNS, true)
1057 options.set(TablesExtension.DISCARD_EXTRA_COLUMNS, true)
1058 options.set(TablesExtension.HEADER_SEPARATOR_COLUMN_MATCH, true)
1060 options.set(AnchorLinkExtension.ANCHORLINKS_SET_ID, false)
1061 options.set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor")
1062 options.set(AnchorLinkExtension.ANCHORLINKS_SET_NAME, true)
1063 options.set(AnchorLinkExtension.ANCHORLINKS_TEXT_PREFIX, "<span class=\"octicon octicon-link\"></span>")
1065 Parser parser = Parser.builder(options).build()
1066 HtmlRenderer renderer = HtmlRenderer.builder(options).build()
1068 mdFiles.each { mdFile ->
1069 // add table of contents
1070 def mdText = "[TOC]\n"+mdFile.text
1072 // grab the first top-level title
1074 def titleRegex = /(?m)^#(\s+|([^#]))(.*)/
1075 def matcher = mdText =~ titleRegex
1076 if (matcher.size() > 0) {
1077 // matcher[0][2] is the first character of the title if there wasn't any whitespace after the #
1078 title = (matcher[0][2] != null ? matcher[0][2] : "")+matcher[0][3]
1080 // or use the filename if none found
1081 if (title == null) {
1082 title = mdFile.getName()
1085 Node document = parser.parse(mdText)
1086 String htmlBody = renderer.render(document)
1087 def htmlText = '''<html>
1088 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1089 <html xmlns="http://www.w3.org/1999/xhtml">
1091 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1092 <meta http-equiv="Content-Style-Type" content="text/css" />
1093 <meta name="generator" content="flexmark" />
1095 htmlText += ((title != null) ? " <title>${title}</title>" : '' )
1097 <style type="text/css">code{white-space: pre;}</style>
1099 htmlText += ((cssFile != null) ? cssFile.text : '')
1100 htmlText += '''</head>
1103 htmlText += htmlBody
1109 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1110 def htmlFile = file(htmlFilePath)
1111 println("Creating ${htmlFilePath}")
1112 htmlFile.text = htmlText
1117 task copyDocs(type: Copy) {
1118 def inputDir = "${jalviewDir}/${doc_dir}"
1119 def outputDir = "${docBuildDir}/${doc_dir}"
1123 include('**/*.html')
1125 filter(ReplaceTokens,
1129 'Version-Rel': JALVIEW_VERSION,
1130 'Year-Rel': getDate("yyyy")
1137 exclude('**/*.html')
1142 inputs.dir(inputDir)
1143 outputs.dir(outputDir)
1147 task convertMdFiles {
1149 def mdFiles = fileTree(dir: docBuildDir, include: "**/*.md")
1150 def cssFile = file("${jalviewDir}/${flexmark_css}")
1153 convertMdToHtml(mdFiles, cssFile)
1156 inputs.files(mdFiles)
1157 inputs.file(cssFile)
1160 mdFiles.each { mdFile ->
1161 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1162 htmlFiles.add(file(htmlFilePath))
1165 outputs.files(htmlFiles)
1169 task copyHelp(type: Copy) {
1170 def inputDir = helpSourceDir
1171 def outputDir = "${helpBuildDir}/${help_dir}"
1175 include('**/*.html')
1179 filter(ReplaceTokens,
1183 'Version-Rel': JALVIEW_VERSION,
1184 'Year-Rel': getDate("yyyy")
1191 exclude('**/*.html')
1198 inputs.dir(inputDir)
1199 outputs.files(helpFile)
1200 outputs.dir(outputDir)
1204 task copyResources(type: Copy) {
1206 description = "Copy (and make text substitutions in) the resources dir to the build area"
1208 def inputDir = resourceDir
1209 def outputDir = resourcesBuildDir
1213 include('**/*.html')
1215 filter(ReplaceTokens,
1219 'Version-Rel': JALVIEW_VERSION,
1220 'Year-Rel': getDate("yyyy")
1227 exclude('**/*.html')
1232 inputs.dir(inputDir)
1233 outputs.dir(outputDir)
1236 task copyChannelResources(type: Copy) {
1237 dependsOn copyResources
1239 description = "Copy the channel resources dir to the build resources area"
1241 def inputDir = "${channelDir}/${resource_dir}"
1242 def outputDir = resourcesBuildDir
1246 inputs.dir(inputDir)
1247 outputs.dir(outputDir)
1250 task createBuildProperties(type: WriteProperties) {
1251 dependsOn copyResources
1253 description = "Create the ${buildProperties} file"
1255 inputs.dir(sourceDir)
1256 inputs.dir(resourcesBuildDir)
1257 outputFile (buildProperties)
1258 // taking time specific comment out to allow better incremental builds
1259 comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
1260 //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
1261 property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
1262 property "VERSION", JALVIEW_VERSION
1263 property "INSTALLATION", INSTALLATION+" git-commit:"+gitHash+" ["+gitBranch+"]"
1264 if (getdownSetAppBaseProperty) {
1265 property "GETDOWNAPPBASE", getdownAppBase
1266 property "GETDOWNAPPDISTDIR", getdownAppDistDir
1268 outputs.file(outputFile)
1271 task buildIndices(type: JavaExec) {
1273 classpath = sourceSets.main.compileClasspath
1274 main = "com.sun.java.help.search.Indexer"
1275 workingDir = "${helpBuildDir}/${help_dir}"
1278 inputs.dir("${workingDir}/${argDir}")
1280 outputs.dir("${classesDir}/doc")
1281 outputs.dir("${classesDir}/help")
1282 outputs.file("${workingDir}/JavaHelpSearch/DOCS")
1283 outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB")
1284 outputs.file("${workingDir}/JavaHelpSearch/OFFSETS")
1285 outputs.file("${workingDir}/JavaHelpSearch/POSITIONS")
1286 outputs.file("${workingDir}/JavaHelpSearch/SCHEMA")
1287 outputs.file("${workingDir}/JavaHelpSearch/TMAP")
1290 task buildResources {
1291 dependsOn copyResources
1292 dependsOn copyChannelResources
1293 dependsOn createBuildProperties
1298 dependsOn buildResources
1301 dependsOn convertMdFiles
1302 dependsOn buildIndices
1306 compileJava.dependsOn prepare
1307 run.dependsOn compileJava
1308 //run.dependsOn prepare
1309 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
1314 dependsOn cloverClasses
1316 dependsOn compileJava //?
1320 includeGroups testng_groups
1321 excludeGroups testng_excluded_groups
1323 useDefaultListeners=true
1326 maxHeapSize = "1024m"
1328 workingDir = jalviewDir
1329 def testLaf = project.findProperty("test_laf")
1330 if (testLaf != null) {
1331 println("Setting Test LaF to '${testLaf}'")
1332 systemProperty "laf", testLaf
1334 def testHiDPIScale = project.findProperty("test_HiDPIScale")
1335 if (testHiDPIScale != null) {
1336 println("Setting Test HiDPI Scale to '${testHiDPIScale}'")
1337 systemProperty "sun.java2d.uiScale", testHiDPIScale
1339 sourceCompatibility = compile_source_compatibility
1340 targetCompatibility = compile_target_compatibility
1341 jvmArgs += additional_compiler_args
1345 println("Running tests " + (useClover?"WITH":"WITHOUT") + " clover")
1353 task compileLinkCheck(type: JavaCompile) {
1355 classpath = files("${jalviewDir}/${utils_dir}")
1356 destinationDir = file("${jalviewDir}/${utils_dir}")
1357 source = fileTree(dir: "${jalviewDir}/${utils_dir}", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
1359 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1360 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1361 outputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.class")
1362 outputs.file("${jalviewDir}/${utils_dir}/BufferedLineReader.class")
1366 task linkCheck(type: JavaExec) {
1368 dependsOn compileLinkCheck
1370 def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
1371 classpath = files("${jalviewDir}/${utils_dir}")
1372 main = "HelpLinksChecker"
1373 workingDir = jalviewDir
1374 args = [ "${helpBuildDir}/${help_dir}", "-nointernet" ]
1376 def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
1377 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
1380 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
1384 inputs.dir(helpBuildDir)
1385 outputs.file(helpLinksCheckerOutFile)
1388 // import the pubhtmlhelp target
1389 ant.properties.basedir = "${jalviewDir}"
1390 ant.properties.helpBuildDir = "${helpBuildDir}/${help_dir}"
1391 ant.importBuild "${utils_dir}/publishHelp.xml"
1394 task cleanPackageDir(type: Delete) {
1396 delete fileTree(dir: "${jalviewDir}/${package_dir}", include: "*.jar")
1406 attributes "Main-Class": main_class,
1407 "Permissions": "all-permissions",
1408 "Application-Name": install4jApplicationName,
1409 "Codebase": application_codebase,
1410 "Implementation-Version": JALVIEW_VERSION
1413 def outputDir = "${jalviewDir}/${package_dir}"
1414 destinationDirectory = file(outputDir)
1415 archiveFileName = rootProject.name+".jar"
1416 duplicatesStrategy "EXCLUDE"
1422 exclude "**/*.jar.*"
1424 inputs.dir(sourceSets.main.java.outputDir)
1425 sourceSets.main.resources.srcDirs.each{ dir ->
1428 outputs.file("${outputDir}/${archiveFileName}")
1432 task copyJars(type: Copy) {
1433 from fileTree(dir: classesDir, include: "**/*.jar").files
1434 into "${jalviewDir}/${package_dir}"
1438 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
1439 task syncJars(type: Sync) {
1441 from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
1442 into "${jalviewDir}/${package_dir}"
1444 include jar.archiveFileName.getOrNull()
1451 description = "Put all required libraries in dist"
1452 // order of "cleanPackageDir", "copyJars", "jar" important!
1453 jar.mustRunAfter cleanPackageDir
1454 syncJars.mustRunAfter cleanPackageDir
1455 dependsOn cleanPackageDir
1458 outputs.dir("${jalviewDir}/${package_dir}")
1463 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
1481 duplicatesStrategy "INCLUDE"
1482 mainClassName = shadow_jar_main_class
1484 classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
1489 task getdownWebsite() {
1490 group = "distribution"
1491 description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
1496 def getdownWebsiteResourceFilenames = []
1497 def getdownTextString = ""
1498 def getdownResourceDir = getdownResourceDir
1499 def getdownResourceFilenames = []
1502 // clean the getdown website and files dir before creating getdown folders
1503 delete getdownWebsiteDir
1504 delete getdownFilesDir
1507 from buildProperties
1508 rename(file(buildProperties).getName(), getdown_build_properties)
1511 getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
1513 // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
1514 def props = project.properties.sort { it.key }
1515 if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
1516 props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
1518 if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) {
1519 props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion)
1521 if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
1522 props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
1524 if (getdownImagesDir != null && file(getdownImagesDir).exists()) {
1525 props.put("getdown_txt_ui.background_image", "${getdownImagesDir}/${getdown_background_image}")
1526 props.put("getdown_txt_ui.instant_background_image", "${getdownImagesDir}/${getdown_instant_background_image}")
1527 props.put("getdown_txt_ui.error_background", "${getdownImagesDir}/${getdown_error_background}")
1528 props.put("getdown_txt_ui.progress_image", "${getdownImagesDir}/${getdown_progress_image}")
1529 props.put("getdown_txt_ui.icon", "${getdownImagesDir}/${getdown_icon}")
1530 props.put("getdown_txt_ui.mac_dock_icon", "${getdownImagesDir}/${getdown_mac_dock_icon}")
1533 props.put("getdown_txt_title", jalview_name)
1534 props.put("getdown_txt_ui.name", install4jApplicationName)
1536 // start with appbase
1537 getdownTextString += "appbase = ${getdownAppBase}\n"
1538 props.each{ prop, val ->
1539 if (prop.startsWith("getdown_txt_") && val != null) {
1540 if (prop.startsWith("getdown_txt_multi_")) {
1541 def key = prop.substring(18)
1542 val.split(",").each{ v ->
1543 def line = "${key} = ${v}\n"
1544 getdownTextString += line
1547 // file values rationalised
1548 if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
1550 if (val.indexOf('/') == 0) {
1553 } else if (val.indexOf('/') > 0) {
1554 // relative path (relative to jalviewDir)
1555 r = file( "${jalviewDir}/${val}" )
1558 val = "${getdown_resource_dir}/" + r.getName()
1559 getdownWebsiteResourceFilenames += val
1560 getdownResourceFilenames += r.getPath()
1563 if (! prop.startsWith("getdown_txt_resource")) {
1564 def line = prop.substring(12) + " = ${val}\n"
1565 getdownTextString += line
1571 getdownWebsiteResourceFilenames.each{ filename ->
1572 getdownTextString += "resource = ${filename}\n"
1574 getdownResourceFilenames.each{ filename ->
1577 into getdownResourceDir
1581 def getdownWrapperScripts = [ getdown_bash_wrapper_script, getdown_powershell_wrapper_script, getdown_batch_wrapper_script ]
1582 getdownWrapperScripts.each{ script ->
1583 def s = file( "${jalviewDir}/utils/getdown/${getdown_wrapper_script_dir}/${script}" )
1587 into "${getdownWebsiteDir}/${getdown_wrapper_script_dir}"
1589 getdownTextString += "resource = ${getdown_wrapper_script_dir}/${script}\n"
1594 fileTree(file(package_dir)).each{ f ->
1595 if (f.isDirectory()) {
1596 def files = fileTree(dir: f, include: ["*"]).getFiles()
1598 } else if (f.exists()) {
1602 codeFiles.sort().each{f ->
1603 def name = f.getName()
1604 def line = "code = ${getdownAppDistDir}/${name}\n"
1605 getdownTextString += line
1612 // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
1614 if (JAVA_VERSION.equals("11")) {
1615 def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
1616 j11libFiles.sort().each{f ->
1617 def name = f.getName()
1618 def line = "code = ${getdown_j11lib_dir}/${name}\n"
1619 getdownTextString += line
1622 into getdownJ11libDir
1628 // 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.
1629 //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
1630 getdownTextString += "resource = ${getdown_launcher_new}\n"
1631 getdownTextString += "class = ${main_class}\n"
1632 // Not setting these properties in general so that getdownappbase and getdowndistdir will default to release version in jalview.bin.Cache
1633 if (getdownSetAppBaseProperty) {
1634 getdownTextString += "jvmarg = -Dgetdowndistdir=${getdownAppDistDir}\n"
1635 getdownTextString += "jvmarg = -Dgetdownappbase=${getdownAppBase}\n"
1638 def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
1639 getdown_txt.write(getdownTextString)
1641 def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
1642 def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
1643 launchJvl.write("appbase=${getdownAppBase}")
1645 // files going into the getdown website dir: getdown-launcher.jar
1647 from getdownLauncher
1648 rename(file(getdownLauncher).getName(), getdown_launcher_new)
1649 into getdownWebsiteDir
1652 // files going into the getdown website dir: getdown-launcher(-local).jar
1654 from getdownLauncher
1655 if (file(getdownLauncher).getName() != getdown_launcher) {
1656 rename(file(getdownLauncher).getName(), getdown_launcher)
1658 into getdownWebsiteDir
1661 // files going into the getdown website dir: ./install dir and files
1662 if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
1665 from getdownLauncher
1666 from "${getdownAppDir}/${getdown_build_properties}"
1667 if (file(getdownLauncher).getName() != getdown_launcher) {
1668 rename(file(getdownLauncher).getName(), getdown_launcher)
1670 into getdownInstallDir
1673 // and make a copy in the getdown files dir (these are not downloaded by getdown)
1675 from getdownInstallDir
1676 into getdownFilesInstallDir
1680 // files going into the getdown files dir: getdown.txt, getdown-launcher.jar, channel-launch.jvl, build_properties
1684 from getdownLauncher
1685 from "${getdownWebsiteDir}/${getdown_build_properties}"
1686 if (file(getdownLauncher).getName() != getdown_launcher) {
1687 rename(file(getdownLauncher).getName(), getdown_launcher)
1689 into getdownFilesDir
1692 // and ./resources (not all downloaded by getdown)
1694 from getdownResourceDir
1695 into "${getdownFilesDir}/${getdown_resource_dir}"
1700 inputs.dir("${jalviewDir}/${package_dir}")
1702 outputs.dir(getdownWebsiteDir)
1703 outputs.dir(getdownFilesDir)
1707 // a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir
1708 task getdownDigestDir(type: JavaExec) {
1710 description "A task to run a getdown Digest on a dir with getdown.txt. Provide a DIGESTDIR property via -PDIGESTDIR=..."
1712 def digestDirPropertyName = "DIGESTDIR"
1714 classpath = files(getdownLauncher)
1715 def digestDir = findProperty(digestDirPropertyName)
1716 if (digestDir == null) {
1717 throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest")
1721 main = "com.threerings.getdown.tools.Digester"
1725 task getdownDigest(type: JavaExec) {
1726 group = "distribution"
1727 description = "Digest the getdown website folder"
1728 dependsOn getdownWebsite
1730 classpath = files(getdownLauncher)
1732 main = "com.threerings.getdown.tools.Digester"
1733 args getdownWebsiteDir
1734 inputs.dir(getdownWebsiteDir)
1735 outputs.file("${getdownWebsiteDir}/digest2.txt")
1740 group = "distribution"
1741 description = "Create the minimal and full getdown app folder for installers and website and create digest file"
1742 dependsOn getdownDigest
1744 if (reportRsyncCommand) {
1745 def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
1746 def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
1747 println "LIKELY RSYNC COMMAND:"
1748 println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
1749 if (RUNRSYNC == "true") {
1751 commandLine "mkdir", "-p", toDir
1754 commandLine "rsync", "-avh", "--delete", fromDir, toDir
1762 tasks.withType(JavaCompile) {
1763 options.encoding = 'UTF-8'
1769 delete getdownWebsiteDir
1770 delete getdownFilesDir
1776 if (file(install4jHomeDir).exists()) {
1778 } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) {
1779 install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
1780 } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) {
1781 install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app"
1783 installDir(file(install4jHomeDir))
1785 mediaTypes = Arrays.asList(install4j_media_types.split(","))
1789 task copyInstall4jTemplate {
1790 def install4jTemplateFile = file("${install4jDir}/${install4j_template}")
1791 def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}")
1792 inputs.file(install4jTemplateFile)
1793 inputs.file(install4jFileAssociationsFile)
1794 inputs.property("CHANNEL", { CHANNEL })
1795 outputs.file(install4jConfFile)
1798 def install4jConfigXml = new XmlParser().parse(install4jTemplateFile)
1800 // turn off code signing if no OSX_KEYPASS
1801 if (OSX_KEYPASS == "") {
1802 install4jConfigXml.'**'.codeSigning.each { codeSigning ->
1803 codeSigning.'@macEnabled' = "false"
1805 install4jConfigXml.'**'.windows.each { windows ->
1806 windows.'@runPostProcessor' = "false"
1810 // turn off checksum creation for LOCAL channel
1811 def e = install4jConfigXml.application[0]
1812 if (CHANNEL == "LOCAL") {
1813 e.'@createChecksums' = "false"
1815 e.'@createChecksums' = "true"
1818 // put file association actions where placeholder action is
1819 def install4jFileAssociationsText = install4jFileAssociationsFile.text
1820 def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
1821 install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true
1822 if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') {
1823 def parent = a.parent()
1825 fileAssociationActions.each { faa ->
1828 // don't need to continue in .any loop once replacements have been made
1833 // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else
1834 // NB we're deleting the /other/ one!
1835 // Also remove the examples subdir from non-release versions
1836 def customizedIdToDelete = "PROGRAM_GROUP_RELEASE"
1837 // 2.11.1.0 NOT releasing with the Examples folder in the Program Group
1838 if (false && CHANNEL=="RELEASE") { // remove 'false && ' to include Examples folder in RELEASE channel
1839 customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE"
1841 // remove the examples subdir from Full File Set
1842 def files = install4jConfigXml.files[0]
1843 def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" }
1844 def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' }
1845 def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' }
1846 def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" }
1847 dirEntry.parent().remove(dirEntry)
1849 install4jConfigXml.'**'.action.any { a ->
1850 if (a.'@customizedId' == customizedIdToDelete) {
1851 def parent = a.parent()
1858 // write install4j file
1859 install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
1866 delete install4jConfFile
1871 task installers(type: com.install4j.gradle.Install4jTask) {
1872 group = "distribution"
1873 description = "Create the install4j installers"
1875 dependsOn copyInstall4jTemplate
1877 projectFile = install4jConfFile
1879 // create an md5 for the input files to use as version for install4j conf file
1880 def digest = MessageDigest.getInstance("MD5")
1882 (file("${install4jDir}/${install4j_template}").text +
1883 file("${install4jDir}/${install4j_info_plist_file_associations}").text +
1884 file("${install4jDir}/${install4j_installer_file_associations}").text).bytes)
1885 def filesMd5 = new BigInteger(1, digest.digest()).toString(16)
1886 if (filesMd5.length() >= 8) {
1887 filesMd5 = filesMd5.substring(0,8)
1889 def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
1890 // make install4jBuildDir relative to jalviewDir
1891 def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
1894 'JALVIEW_NAME': jalview_name,
1895 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
1896 'JALVIEW_DIR': "../..",
1897 'OSX_KEYSTORE': OSX_KEYSTORE,
1898 'OSX_APPLEID': OSX_APPLEID,
1899 'OSX_ALTOOLPASS': OSX_ALTOOLPASS,
1900 'JSIGN_SH': JSIGN_SH,
1901 'JRE_DIR': getdown_app_dir_java,
1902 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
1903 'JALVIEW_VERSION': JALVIEW_VERSION,
1904 'JAVA_MIN_VERSION': JAVA_MIN_VERSION,
1905 'JAVA_MAX_VERSION': JAVA_MAX_VERSION,
1906 'JAVA_VERSION': JAVA_VERSION,
1907 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
1908 'VERSION': JALVIEW_VERSION,
1909 'MACOS_JAVA_VM_DIR': macosJavaVMDir,
1910 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
1911 'LINUX_JAVA_VM_DIR': linuxJavaVMDir,
1912 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
1913 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
1914 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz,
1915 'COPYRIGHT_MESSAGE': install4j_copyright_message,
1916 'BUNDLE_ID': install4jBundleId,
1917 'INTERNAL_ID': install4jInternalId,
1918 'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
1919 'MACOS_DMG_DS_STORE': install4jDMGDSStore,
1920 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
1921 'WRAPPER_LINK': getdownWrapperLink,
1922 'BASH_WRAPPER_SCRIPT': getdown_bash_wrapper_script,
1923 'POWERSHELL_WRAPPER_SCRIPT': getdown_powershell_wrapper_script,
1924 'WRAPPER_SCRIPT_BIN_DIR': getdown_wrapper_script_dir,
1925 'INSTALLER_NAME': install4jInstallerName,
1926 'INSTALL4J_UTILS_DIR': install4j_utils_dir,
1927 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
1928 'GETDOWN_FILES_DIR': getdown_files_dir,
1929 'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
1930 'GETDOWN_DIST_DIR': getdownAppDistDir,
1931 'GETDOWN_ALT_DIR': getdown_app_dir_alt,
1932 'GETDOWN_INSTALL_DIR': getdown_install_dir,
1933 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
1934 'BUILD_DIR': install4jBuildDir,
1935 'APPLICATION_CATEGORIES': install4j_application_categories,
1936 'APPLICATION_FOLDER': install4jApplicationFolder,
1937 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
1938 'EXECUTABLE_NAME': install4jExecutableName,
1939 'EXTRA_SCHEME': install4jExtraScheme,
1940 'MAC_ICONS_FILE': install4jMacIconsFile,
1941 'WINDOWS_ICONS_FILE': install4jWindowsIconsFile,
1942 'PNG_ICON_FILE': install4jPngIconFile,
1943 'BACKGROUND': install4jBackground,
1946 //println("INSTALL4J VARIABLES:")
1947 //variables.each{k,v->println("${k}=${v}")}
1949 destination = "${jalviewDir}/${install4jBuildDir}"
1950 buildSelected = true
1952 if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
1954 disableSigning = true
1955 disableNotarization = true
1959 macKeystorePassword = OSX_KEYPASS
1962 if (OSX_ALTOOLPASS) {
1963 appleIdPassword = OSX_ALTOOLPASS
1964 disableNotarization = false
1966 disableNotarization = true
1970 println("Using projectFile "+projectFile)
1971 if (!disableNotarization) { println("Will notarize OSX App DMG") }
1975 inputs.dir(getdownWebsiteDir)
1976 inputs.file(install4jConfFile)
1977 inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
1978 inputs.dir(macosJavaVMDir)
1979 inputs.dir(windowsJavaVMDir)
1980 outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
1986 eclipse().configFile(eclipse_codestyle_file)
1991 task sourceDist(type: Tar) {
1992 group "distribution"
1993 description "Create a source .tar.gz file for distribution"
1995 dependsOn createBuildProperties
1996 dependsOn convertMdFiles
1997 def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
1998 def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
1999 archiveFileName = outputFileName
2001 compression Compression.GZIP
2016 "**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales",
2018 "utils/InstallAnywhere",
2033 "gradle.properties",
2044 ".settings/org.eclipse.jdt.core.jalview.prefs",
2048 exclude (EXCLUDE_FILES)
2049 include (PROCESS_FILES)
2050 filter(ReplaceTokens,
2054 'Version-Rel': JALVIEW_VERSION,
2055 'Year-Rel': getDate("yyyy")
2060 exclude (EXCLUDE_FILES)
2061 exclude (PROCESS_FILES)
2062 exclude ("appletlib")
2063 exclude ("**/*locales")
2064 exclude ("*locales/**")
2065 exclude ("utils/InstallAnywhere")
2067 exclude (getdown_files_dir)
2068 exclude (getdown_website_dir)
2070 // exluding these as not using jars as modules yet
2071 exclude ("${j11modDir}/**/*.jar")
2074 include(INCLUDE_FILES)
2076 // from (jalviewDir) {
2077 // // explicit includes for stuff that seemed to not get included
2078 // include(fileTree("test/**/*."))
2079 // exclude(EXCLUDE_FILES)
2080 // exclude(PROCESS_FILES)
2082 from(file(buildProperties).getParent()) {
2083 include(file(buildProperties).getName())
2084 rename(file(buildProperties).getName(), "build_properties")
2086 line.replaceAll("^INSTALLATION=.*\$","INSTALLATION=Source Release"+" git-commit\\\\:"+gitHash+" ["+gitBranch+"]")
2094 dependsOn pubhtmlhelp
2096 inputs.dir("${helpBuildDir}/${help_dir}")
2097 outputs.dir("${buildDir}/distributions/${help_dir}")
2101 task j2sSetHeadlessBuild {
2108 task jalviewjsEnableAltFileProperty(type: WriteProperties) {
2110 description "Enable the alternative J2S Config file for headless build"
2112 outputFile = jalviewjsJ2sSettingsFileName
2113 def j2sPropsFile = file(jalviewjsJ2sSettingsFileName)
2114 def j2sProps = new Properties()
2115 if (j2sPropsFile.exists()) {
2117 def j2sPropsFileFIS = new FileInputStream(j2sPropsFile)
2118 j2sProps.load(j2sPropsFileFIS)
2119 j2sPropsFileFIS.close()
2121 j2sProps.each { prop, val ->
2124 } catch (Exception e) {
2125 println("Exception reading ${jalviewjsJ2sSettingsFileName}")
2129 if (! j2sProps.stringPropertyNames().contains(jalviewjs_j2s_alt_file_property_config)) {
2130 property(jalviewjs_j2s_alt_file_property_config, jalviewjs_j2s_alt_file_property)
2133 task jalviewjsSetEclipseWorkspace {
2134 def propKey = "jalviewjs_eclipse_workspace"
2136 if (project.hasProperty(propKey)) {
2137 propVal = project.getProperty(propKey)
2138 if (propVal.startsWith("~/")) {
2139 propVal = System.getProperty("user.home") + propVal.substring(1)
2142 def propsFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
2143 def propsFile = file(propsFileName)
2144 def eclipseWsDir = propVal
2145 def props = new Properties()
2147 def writeProps = true
2148 if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && propsFile.exists()) {
2149 def ins = new FileInputStream(propsFileName)
2152 if (props.getProperty(propKey, null) != null) {
2153 eclipseWsDir = props.getProperty(propKey)
2158 if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
2159 def tempDir = File.createTempDir()
2160 eclipseWsDir = tempDir.getAbsolutePath()
2163 eclipseWorkspace = file(eclipseWsDir)
2166 // do not run a headless transpile when we claim to be in Eclipse
2168 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2169 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2171 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2175 props.setProperty(propKey, eclipseWsDir)
2176 propsFile.parentFile.mkdirs()
2177 def bytes = new ByteArrayOutputStream()
2178 props.store(bytes, null)
2179 def propertiesString = bytes.toString()
2180 propsFile.text = propertiesString
2186 println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
2189 //inputs.property(propKey, eclipseWsDir) // eclipseWsDir only gets set once this task runs, so will be out-of-date
2190 outputs.file(propsFileName)
2191 outputs.upToDateWhen { eclipseWorkspace.exists() && propsFile.exists() }
2195 task jalviewjsEclipsePaths {
2198 def eclipseRoot = jalviewjs_eclipse_root
2199 if (eclipseRoot.startsWith("~/")) {
2200 eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
2202 if (OperatingSystem.current().isMacOsX()) {
2203 eclipseRoot += "/Eclipse.app"
2204 eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse"
2205 eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct"
2206 } else if (OperatingSystem.current().isWindows()) { // check these paths!!
2207 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2208 eclipseRoot += "/eclipse"
2210 eclipseBinary = "${eclipseRoot}/eclipse.exe"
2211 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2212 } else { // linux or unix
2213 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2214 eclipseRoot += "/eclipse"
2215 println("eclipseDir exists")
2217 eclipseBinary = "${eclipseRoot}/eclipse"
2218 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2221 eclipseVersion = "4.13" // default
2222 def assumedVersion = true
2223 if (file(eclipseProduct).exists()) {
2224 def fis = new FileInputStream(eclipseProduct)
2225 def props = new Properties()
2227 eclipseVersion = props.getProperty("version")
2229 assumedVersion = false
2232 def propKey = "eclipse_debug"
2233 eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true"))
2236 // do not run a headless transpile when we claim to be in Eclipse
2238 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2239 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2241 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2244 if (!assumedVersion) {
2245 println("ECLIPSE VERSION=${eclipseVersion}")
2251 task printProperties {
2253 description "Output to console all System.properties"
2255 System.properties.each { key, val -> System.out.println("Property: ${key}=${val}") }
2261 dependsOn eclipseProject
2262 dependsOn eclipseClasspath
2263 dependsOn eclipseJdt
2267 // this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir
2268 task jalviewjsEclipseCopyDropins(type: Copy) {
2269 dependsOn jalviewjsEclipsePaths
2271 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar")
2272 inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}")
2273 def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}"
2280 // this eclipse -clean doesn't actually work
2281 task jalviewjsCleanEclipse(type: Exec) {
2282 dependsOn eclipseSetup
2283 dependsOn jalviewjsEclipsePaths
2284 dependsOn jalviewjsEclipseCopyDropins
2286 executable(eclipseBinary)
2287 args(["-nosplash", "--launcher.suppressErrors", "-data", eclipseWorkspace.getPath(), "-clean", "-console", "-consoleLog"])
2293 def inputString = """exit
2296 def inputByteStream = new ByteArrayInputStream(inputString.getBytes())
2297 standardInput = inputByteStream
2300 /* not really working yet
2301 jalviewjsEclipseCopyDropins.finalizedBy jalviewjsCleanEclipse
2305 task jalviewjsTransferUnzipSwingJs {
2306 def file_zip = "${jalviewDir}/${jalviewjs_swingjs_zip}"
2310 from zipTree(file_zip)
2311 into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2315 inputs.file file_zip
2316 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2320 task jalviewjsTransferUnzipLib {
2321 def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
2324 zipFiles.each { file_zip ->
2326 from zipTree(file_zip)
2327 into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2332 inputs.files zipFiles
2333 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2337 task jalviewjsTransferUnzipAllLibs {
2338 dependsOn jalviewjsTransferUnzipSwingJs
2339 dependsOn jalviewjsTransferUnzipLib
2343 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
2345 description "Create the alternative j2s file from the j2s.* properties"
2347 jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
2348 def siteDirProperty = "j2s.site.directory"
2349 def setSiteDir = false
2350 jalviewjsJ2sProps.each { prop, val ->
2352 if (prop == siteDirProperty) {
2353 if (!(val.startsWith('/') || val.startsWith("file://") )) {
2354 val = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${val}"
2360 if (!setSiteDir) { // default site location, don't override specifically set property
2361 property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
2364 outputFile = jalviewjsJ2sAltSettingsFileName
2367 inputs.properties(jalviewjsJ2sProps)
2368 outputs.file(jalviewjsJ2sAltSettingsFileName)
2373 task jalviewjsEclipseSetup {
2374 dependsOn jalviewjsEclipseCopyDropins
2375 dependsOn jalviewjsSetEclipseWorkspace
2376 dependsOn jalviewjsCreateJ2sSettings
2380 task jalviewjsSyncAllLibs (type: Sync) {
2381 dependsOn jalviewjsTransferUnzipAllLibs
2382 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
2383 inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
2384 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2388 def outputFiles = []
2389 rename { filename ->
2390 outputFiles += "${outputDir}/${filename}"
2396 // should this be exclude really ?
2397 duplicatesStrategy "INCLUDE"
2398 outputs.files outputFiles
2399 inputs.files inputFiles
2403 task jalviewjsSyncResources (type: Sync) {
2404 dependsOn buildResources
2406 def inputFiles = fileTree(dir: resourcesBuildDir)
2407 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2411 def outputFiles = []
2412 rename { filename ->
2413 outputFiles += "${outputDir}/${filename}"
2419 outputs.files outputFiles
2420 inputs.files inputFiles
2424 task jalviewjsSyncSiteResources (type: Sync) {
2425 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}")
2426 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2430 def outputFiles = []
2431 rename { filename ->
2432 outputFiles += "${outputDir}/${filename}"
2438 outputs.files outputFiles
2439 inputs.files inputFiles
2443 task jalviewjsSyncBuildProperties (type: Sync) {
2444 dependsOn createBuildProperties
2445 def inputFiles = [file(buildProperties)]
2446 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2450 def outputFiles = []
2451 rename { filename ->
2452 outputFiles += "${outputDir}/${filename}"
2458 outputs.files outputFiles
2459 inputs.files inputFiles
2463 task jalviewjsProjectImport(type: Exec) {
2464 dependsOn eclipseSetup
2465 dependsOn jalviewjsEclipsePaths
2466 dependsOn jalviewjsEclipseSetup
2469 // do not run a headless import when we claim to be in Eclipse
2471 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2472 throw new StopExecutionException("Not running headless import whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2474 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2478 //def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
2479 def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
2480 executable(eclipseBinary)
2481 args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
2485 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2487 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2488 args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
2491 inputs.file("${jalviewDir}/.project")
2492 outputs.upToDateWhen {
2493 file(projdir).exists()
2498 task jalviewjsTranspile(type: Exec) {
2499 dependsOn jalviewjsEclipseSetup
2500 dependsOn jalviewjsProjectImport
2501 dependsOn jalviewjsEclipsePaths
2503 dependsOn jalviewjsEnableAltFileProperty
2507 // do not run a headless transpile when we claim to be in Eclipse
2509 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2510 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2512 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2516 executable(eclipseBinary)
2517 args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipse_build_arg}", eclipse_project_name ])
2521 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2523 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2524 args += [ "-D${jalviewjs_j2s_alt_file_property}=${jalviewjsJ2sAltSettingsFileName}" ]
2530 stdout = new ByteArrayOutputStream()
2531 stderr = new ByteArrayOutputStream()
2533 def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}"
2534 def logOutFile = file(logOutFileName)
2535 logOutFile.createNewFile()
2536 logOutFile.text = """ROOT: ${jalviewjs_eclipse_root}
2537 BINARY: ${eclipseBinary}
2538 VERSION: ${eclipseVersion}
2539 WORKSPACE: ${eclipseWorkspace}
2540 DEBUG: ${eclipseDebug}
2543 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2544 // combine stdout and stderr
2545 def logErrFOS = logOutFOS
2547 if (jalviewjs_j2s_to_console.equals("true")) {
2548 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2549 new org.apache.tools.ant.util.TeeOutputStream(
2553 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2554 new org.apache.tools.ant.util.TeeOutputStream(
2559 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2562 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2569 if (stdout.toString().contains("Error processing ")) {
2570 // j2s did not complete transpile
2571 //throw new TaskExecutionException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2572 if (jalviewjs_ignore_transpile_errors.equals("true")) {
2573 println("IGNORING TRANSPILE ERRORS")
2574 println("See eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2576 throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2581 inputs.dir("${jalviewDir}/${sourceDir}")
2582 outputs.dir("${jalviewDir}/${jalviewjsTransferSiteJsDir}")
2583 outputs.upToDateWhen( { file("${jalviewDir}/${jalviewjsTransferSiteJsDir}${jalviewjs_server_resource}").exists() } )
2587 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
2589 def stdout = new ByteArrayOutputStream()
2590 def stderr = new ByteArrayOutputStream()
2592 def coreFile = file(jsfile)
2594 msg = "Creating core for ${name}...\nGenerating ${jsfile}"
2596 logOutFile.createNewFile()
2597 logOutFile.append(msg+"\n")
2599 def coreTop = file(prefixFile)
2600 def coreBottom = file(suffixFile)
2601 coreFile.getParentFile().mkdirs()
2602 coreFile.createNewFile()
2603 coreFile.write( coreTop.getText("UTF-8") )
2607 def t = f.getText("UTF-8")
2608 t.replaceAll("Clazz\\.([^_])","Clazz_${1}")
2609 coreFile.append( t )
2611 msg = "...file '"+f.getPath()+"' does not exist, skipping"
2613 logOutFile.append(msg+"\n")
2616 coreFile.append( coreBottom.getText("UTF-8") )
2618 msg = "Generating ${zjsfile}"
2620 logOutFile.append(msg+"\n")
2621 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2622 def logErrFOS = logOutFOS
2625 classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
2626 main = "com.google.javascript.jscomp.CommandLineRunner"
2627 jvmArgs = [ "-Dfile.encoding=UTF-8" ]
2628 args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
2631 msg = "\nRunning '"+commandLine.join(' ')+"'\n"
2633 logOutFile.append(msg+"\n")
2635 if (logOutConsole) {
2636 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2637 new org.apache.tools.ant.util.TeeOutputStream(
2641 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2642 new org.apache.tools.ant.util.TeeOutputStream(
2647 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2650 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2657 logOutFile.append(msg+"\n")
2661 task jalviewjsBuildAllCores {
2663 description "Build the core js lib closures listed in the classlists dir"
2664 dependsOn jalviewjsTranspile
2665 dependsOn jalviewjsTransferUnzipSwingJs
2667 def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
2668 def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
2669 def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
2670 def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
2671 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
2672 def prefixFile = "${jsDir}/core/coretop2.js"
2673 def suffixFile = "${jsDir}/core/corebottom2.js"
2675 inputs.file prefixFile
2676 inputs.file suffixFile
2678 def classlistFiles = []
2679 // add the classlists found int the jalviewjs_classlists_dir
2680 fileTree(dir: "${jalviewDir}/${jalviewjs_classlists_dir}", include: "*.txt").each {
2682 def name = file.getName() - ".txt"
2689 // _jmol and _jalview cores. Add any other peculiar classlist.txt files here
2690 //classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jmol}"), 'name': "_jvjmol" ]
2691 classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jalview}"), 'name': jalviewjsJalviewCoreName ]
2693 jalviewjsCoreClasslists = []
2695 classlistFiles.each {
2698 def file = hash['file']
2699 if (! file.exists()) {
2700 //println("...classlist file '"+file.getPath()+"' does not exist, skipping")
2701 return false // this is a "continue" in groovy .each closure
2703 def name = hash['name']
2705 name = file.getName() - ".txt"
2713 def list = fileTree(dir: j2sDir, includes: filelist)
2715 def jsfile = "${outputDir}/core${name}.js"
2716 def zjsfile = "${outputDir}/core${name}.z.js"
2718 jalviewjsCoreClasslists += [
2727 outputs.file(jsfile)
2728 outputs.file(zjsfile)
2731 // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
2732 def stevesoftClasslistName = "_stevesoft"
2733 def stevesoftClasslist = [
2734 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
2735 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
2736 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
2737 'name': stevesoftClasslistName
2739 jalviewjsCoreClasslists += stevesoftClasslist
2740 inputs.files(stevesoftClasslist['list'])
2741 outputs.file(stevesoftClasslist['jsfile'])
2742 outputs.file(stevesoftClasslist['zjsfile'])
2745 def allClasslistName = "_all"
2746 def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
2747 allJsFiles += fileTree(
2751 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2752 "**/org/jmol/jvxl/readers/IsoIntersectFileReader.js",
2753 "**/org/jmol/export/JSExporter.js"
2756 allJsFiles += fileTree(
2760 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2761 "**/sun/misc/Unsafe.js",
2762 "**/swingjs/jquery/jquery-editable-select.js",
2763 "**/swingjs/jquery/j2sComboBox.js",
2764 "**/sun/misc/FloatingDecimal.js"
2767 def allClasslist = [
2768 'jsfile': "${outputDir}/core${allClasslistName}.js",
2769 'zjsfile': "${outputDir}/core${allClasslistName}.z.js",
2771 'name': allClasslistName
2773 // not including this version of "all" core at the moment
2774 //jalviewjsCoreClasslists += allClasslist
2775 inputs.files(allClasslist['list'])
2776 outputs.file(allClasslist['jsfile'])
2777 outputs.file(allClasslist['zjsfile'])
2780 def logOutFile = file("${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_closure_stdout}")
2781 logOutFile.getParentFile().mkdirs()
2782 logOutFile.createNewFile()
2783 logOutFile.write(getDate("yyyy-MM-dd HH:mm:ss")+" jalviewjsBuildAllCores\n----\n")
2785 jalviewjsCoreClasslists.each {
2786 jalviewjsCallCore(it.name, it.list, prefixFile, suffixFile, it.jsfile, it.zjsfile, logOutFile, jalviewjs_j2s_to_console.equals("true"))
2793 def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inputFile, String outputFile) {
2796 into file(outputFile).getParentFile()
2797 rename { filename ->
2798 if (filename.equals(inputFile.getName())) {
2799 return file(outputFile).getName()
2803 filter(ReplaceTokens,
2807 'MAIN': '"'+main_class+'"',
2809 'NAME': jalviewjsJalviewTemplateName+" [core ${coreName}]",
2810 'COREKEY': jalviewjs_core_key,
2811 'CORENAME': coreName
2818 task jalviewjsPublishCoreTemplates {
2819 dependsOn jalviewjsBuildAllCores
2820 def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
2821 def inputFile = file(inputFileName)
2822 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2824 def outputFiles = []
2825 jalviewjsCoreClasslists.each { cl ->
2826 def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html"
2827 cl['outputfile'] = outputFile
2828 outputFiles += outputFile
2832 jalviewjsCoreClasslists.each { cl ->
2833 jalviewjsPublishCoreTemplate(cl.name, jalviewjsJalviewTemplateName, inputFile, cl.outputfile)
2836 inputs.file(inputFile)
2837 outputs.files(outputFiles)
2841 task jalviewjsSyncCore (type: Sync) {
2842 dependsOn jalviewjsBuildAllCores
2843 dependsOn jalviewjsPublishCoreTemplates
2844 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
2845 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2849 def outputFiles = []
2850 rename { filename ->
2851 outputFiles += "${outputDir}/${filename}"
2857 outputs.files outputFiles
2858 inputs.files inputFiles
2862 // this Copy version of TransferSiteJs will delete anything else in the target dir
2863 task jalviewjsCopyTransferSiteJs(type: Copy) {
2864 dependsOn jalviewjsTranspile
2865 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2866 into "${jalviewDir}/${jalviewjsSiteDir}"
2870 // this Sync version of TransferSite is used by buildship to keep the website automatically up to date when a file changes
2871 task jalviewjsSyncTransferSiteJs(type: Sync) {
2872 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2874 into "${jalviewDir}/${jalviewjsSiteDir}"
2881 jalviewjsSyncAllLibs.mustRunAfter jalviewjsCopyTransferSiteJs
2882 jalviewjsSyncResources.mustRunAfter jalviewjsCopyTransferSiteJs
2883 jalviewjsSyncSiteResources.mustRunAfter jalviewjsCopyTransferSiteJs
2884 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsCopyTransferSiteJs
2886 jalviewjsSyncAllLibs.mustRunAfter jalviewjsSyncTransferSiteJs
2887 jalviewjsSyncResources.mustRunAfter jalviewjsSyncTransferSiteJs
2888 jalviewjsSyncSiteResources.mustRunAfter jalviewjsSyncTransferSiteJs
2889 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
2892 task jalviewjsPrepareSite {
2894 description "Prepares the website folder including unzipping files and copying resources"
2895 dependsOn jalviewjsSyncAllLibs
2896 dependsOn jalviewjsSyncResources
2897 dependsOn jalviewjsSyncSiteResources
2898 dependsOn jalviewjsSyncBuildProperties
2899 dependsOn jalviewjsSyncCore
2903 task jalviewjsBuildSite {
2905 description "Builds the whole website including transpiled code"
2906 dependsOn jalviewjsCopyTransferSiteJs
2907 dependsOn jalviewjsPrepareSite
2911 task cleanJalviewjsTransferSite {
2913 delete "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2914 delete "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2915 delete "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2916 delete "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2921 task cleanJalviewjsSite {
2922 dependsOn cleanJalviewjsTransferSite
2924 delete "${jalviewDir}/${jalviewjsSiteDir}"
2929 task jalviewjsSiteTar(type: Tar) {
2931 description "Creates a tar.gz file for the website"
2932 dependsOn jalviewjsBuildSite
2933 def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
2934 archiveFileName = outputFilename
2936 compression Compression.GZIP
2938 from "${jalviewDir}/${jalviewjsSiteDir}"
2939 into jalviewjs_site_dir // this is inside the tar file
2941 inputs.dir("${jalviewDir}/${jalviewjsSiteDir}")
2945 task jalviewjsServer {
2947 def filename = "jalviewjsTest.html"
2948 description "Starts a webserver on localhost to test the website. See ${filename} to access local site on most recently used port."
2949 def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
2954 def f = Class.forName("org.gradle.plugins.javascript.envjs.http.simple.SimpleHttpFileServerFactory")
2955 factory = f.newInstance()
2956 } catch (ClassNotFoundException e) {
2957 throw new GradleException("Unable to create SimpleHttpFileServerFactory")
2959 def port = Integer.valueOf(jalviewjs_server_port)
2964 while(port < start+1000 && !running) {
2966 def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}")
2967 jalviewjsServer = factory.start(doc_root, port)
2969 url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource)
2970 println("SERVER STARTED with document root ${doc_root}.")
2971 println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).")
2972 println("For debug: "+url+"?j2sdebug")
2973 println("For verbose: "+url+"?j2sverbose")
2974 } catch (Exception e) {
2979 <p><a href="${url}">JalviewJS Test. <${url}></a></p>
2980 <p><a href="${url}?j2sdebug">JalviewJS Test with debug. <${url}?j2sdebug></a></p>
2981 <p><a href="${url}?j2sverbose">JalviewJS Test with verbose. <${url}?j2sdebug></a></p>
2983 jalviewjsCoreClasslists.each { cl ->
2984 def urlcore = jalviewjsServer.getResourceUrl(file(cl.outputfile).getName())
2986 <p><a href="${urlcore}">${jalviewjsJalviewTemplateName} [core ${cl.name}]. <${urlcore}></a></p>
2988 println("For core ${cl.name}: "+urlcore)
2991 file(htmlFile).text = htmlText
2994 outputs.file(htmlFile)
2995 outputs.upToDateWhen({false})
2999 task cleanJalviewjsAll {
3001 description "Delete all configuration and build artifacts to do with JalviewJS build"
3002 dependsOn cleanJalviewjsSite
3003 dependsOn jalviewjsEclipsePaths
3006 delete "${jalviewDir}/${jalviewjsBuildDir}"
3007 delete "${jalviewDir}/${eclipse_bin_dir}"
3008 if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
3009 delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
3011 delete jalviewjsJ2sAltSettingsFileName
3014 outputs.upToDateWhen( { false } )
3018 task jalviewjsIDE_checkJ2sPlugin {
3019 group "00 JalviewJS in Eclipse"
3020 description "Compare the swingjs/net.sf.j2s.core(-j11)?.jar file with the Eclipse IDE's plugin version (found in the 'dropins' dir)"
3023 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
3024 def j2sPluginFile = file(j2sPlugin)
3025 def eclipseHome = System.properties["eclipse.home.location"]
3026 if (eclipseHome == null || ! IN_ECLIPSE) {
3027 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. Skipping J2S Plugin Check.")
3029 def eclipseJ2sPluginDirs = [ "${eclipseHome}/dropins" ]
3030 def altPluginsDir = System.properties["org.eclipse.equinox.p2.reconciler.dropins.directory"]
3031 if (altPluginsDir != null && file(altPluginsDir).exists()) {
3032 eclipseJ2sPluginDirs += altPluginsDir
3034 def foundPlugin = false
3035 def j2sPluginFileName = j2sPluginFile.getName()
3036 def eclipseJ2sPlugin
3037 def eclipseJ2sPluginFile
3038 eclipseJ2sPluginDirs.any { dir ->
3039 eclipseJ2sPlugin = "${dir}/${j2sPluginFileName}"
3040 eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
3041 if (eclipseJ2sPluginFile.exists()) {
3047 def msg = "Eclipse J2S Plugin is not installed (could not find '${j2sPluginFileName}' in\n"+eclipseJ2sPluginDirs.join("\n")+"\n)\nTry running task jalviewjsIDE_copyJ2sPlugin"
3048 System.err.println(msg)
3049 throw new StopExecutionException(msg)
3052 def digest = MessageDigest.getInstance("MD5")
3054 digest.update(j2sPluginFile.text.bytes)
3055 def j2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
3057 digest.update(eclipseJ2sPluginFile.text.bytes)
3058 def eclipseJ2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
3060 if (j2sPluginMd5 != eclipseJ2sPluginMd5) {
3061 def msg = "WARNING! Eclipse J2S Plugin '${eclipseJ2sPlugin}' is different to this commit's version '${j2sPlugin}'"
3062 System.err.println(msg)
3063 throw new StopExecutionException(msg)
3065 def msg = "Eclipse J2S Plugin '${eclipseJ2sPlugin}' is the same as '${j2sPlugin}' (this is good)"
3071 task jalviewjsIDE_copyJ2sPlugin {
3072 group "00 JalviewJS in Eclipse"
3073 description "Copy the swingjs/net.sf.j2s.core(-j11)?.jar file into the Eclipse IDE's 'dropins' dir"
3076 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
3077 def j2sPluginFile = file(j2sPlugin)
3078 def eclipseHome = System.properties["eclipse.home.location"]
3079 if (eclipseHome == null || ! IN_ECLIPSE) {
3080 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. NOT copying J2S Plugin.")
3082 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
3083 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
3084 def msg = "WARNING! Copying this commit's j2s plugin '${j2sPlugin}' to Eclipse J2S Plugin '${eclipseJ2sPlugin}'\n* May require an Eclipse restart"
3085 System.err.println(msg)
3088 eclipseJ2sPluginFile.getParentFile().mkdirs()
3089 into eclipseJ2sPluginFile.getParent()
3095 task jalviewjsIDE_j2sFile {
3096 group "00 JalviewJS in Eclipse"
3097 description "Creates the .j2s file"
3098 dependsOn jalviewjsCreateJ2sSettings
3102 task jalviewjsIDE_SyncCore {
3103 group "00 JalviewJS in Eclipse"
3104 description "Build the core js lib closures listed in the classlists dir and publish core html from template"
3105 dependsOn jalviewjsSyncCore
3109 task jalviewjsIDE_SyncSiteAll {
3110 dependsOn jalviewjsSyncAllLibs
3111 dependsOn jalviewjsSyncResources
3112 dependsOn jalviewjsSyncSiteResources
3113 dependsOn jalviewjsSyncBuildProperties
3117 cleanJalviewjsTransferSite.mustRunAfter jalviewjsIDE_SyncSiteAll
3120 task jalviewjsIDE_PrepareSite {
3121 group "00 JalviewJS in Eclipse"
3122 description "Sync libs and resources to site dir, but not closure cores"
3124 dependsOn jalviewjsIDE_SyncSiteAll
3125 //dependsOn cleanJalviewjsTransferSite // not sure why this clean is here -- will slow down a re-run of this task
3129 task jalviewjsIDE_AssembleSite {
3130 group "00 JalviewJS in Eclipse"
3131 description "Assembles unzipped supporting zipfiles, resources, site resources and closure cores into the Eclipse transpiled site"
3132 dependsOn jalviewjsPrepareSite
3136 task jalviewjsIDE_SiteClean {
3137 group "00 JalviewJS in Eclipse"
3138 description "Deletes the Eclipse transpiled site"
3139 dependsOn cleanJalviewjsSite
3143 task jalviewjsIDE_Server {
3144 group "00 JalviewJS in Eclipse"
3145 description "Starts a webserver on localhost to test the website"
3146 dependsOn jalviewjsServer
3150 // buildship runs this at import or gradle refresh
3151 task eclipseSynchronizationTask {
3152 //dependsOn eclipseSetup
3153 dependsOn createBuildProperties
3155 dependsOn jalviewjsIDE_j2sFile
3156 dependsOn jalviewjsIDE_checkJ2sPlugin
3157 dependsOn jalviewjsIDE_PrepareSite
3162 // buildship runs this at build time or project refresh
3163 task eclipseAutoBuildTask {
3164 //dependsOn jalviewjsIDE_checkJ2sPlugin
3165 //dependsOn jalviewjsIDE_PrepareSite
3171 description "Build the site"
3172 dependsOn jalviewjsBuildSite