1 /* Convention for properties. Read from gradle.properties, use lower_case_underlines for property names.
2 * For properties set within build.gradle, use camelCaseNoSpace.
4 import org.apache.tools.ant.filters.ReplaceTokens
5 import org.gradle.internal.os.OperatingSystem
6 import org.gradle.plugins.ide.internal.generator.PropertiesPersistableConfigurationObject
7 import org.gradle.api.internal.PropertiesTransformer
8 import org.gradle.util.ConfigureUtil
9 import org.gradle.plugins.ide.eclipse.model.Output
10 import org.gradle.plugins.ide.eclipse.model.Library
11 import java.security.MessageDigest
12 import groovy.transform.ExternalizeMethods
13 import groovy.util.XmlParser
14 import groovy.xml.XmlUtil
15 import com.vladsch.flexmark.util.ast.Node
16 import com.vladsch.flexmark.html.HtmlRenderer
17 import com.vladsch.flexmark.parser.Parser
18 import com.vladsch.flexmark.util.data.MutableDataSet
19 import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension
20 import com.vladsch.flexmark.ext.tables.TablesExtension
21 import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension
22 import com.vladsch.flexmark.ext.autolink.AutolinkExtension
23 import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension
24 import com.vladsch.flexmark.ext.toc.TocExtension
32 classpath "com.vladsch.flexmark:flexmark-all:0.62.0"
41 id "com.diffplug.gradle.spotless" version "3.28.0"
42 id 'com.github.johnrengelman.shadow' version '4.0.3'
43 id 'com.install4j.gradle' version '8.0.4'
44 id 'com.dorongold.task-tree' version '1.5' // only needed to display task dependency tree with gradle task1 [task2 ...] taskTree
45 id 'com.palantir.git-version' version '0.12.3'
55 // in ext the values are cast to Object. Ensure string values are cast as String (and not GStringImpl) for later use
56 def string(Object o) {
57 return o == null ? "" : o.toString()
62 jalviewDirAbsolutePath = file(jalviewDir).getAbsolutePath()
63 jalviewDirRelativePath = jalviewDir
65 // local build environment properties
66 // can be "projectDir/local.properties"
67 def localProps = "${projectDir}/local.properties"
69 if (file(localProps).exists()) {
70 propsFile = localProps
72 // or "../projectDir_local.properties"
73 def dirLocalProps = projectDir.getParent() + "/" + projectDir.getName() + "_local.properties"
74 if (file(dirLocalProps).exists()) {
75 propsFile = dirLocalProps
77 if (propsFile != null) {
79 def p = new Properties()
80 def localPropsFIS = new FileInputStream(propsFile)
85 def oldval = findProperty(key)
88 println("Overriding property '${key}' ('${oldval}') with ${file(propsFile).getName()} value '${val}'")
90 println("Setting unknown property '${key}' with ${file(propsFile).getName()}s value '${val}'")
93 } catch (Exception e) {
94 System.out.println("Exception reading local.properties")
99 // Import releaseProps from the RELEASE file
100 // or a file specified via JALVIEW_RELEASE_FILE if defined
101 // Expect jalview.version and target release branch in jalview.release
102 def releaseProps = new Properties();
103 def releasePropFile = findProperty("JALVIEW_RELEASE_FILE");
104 def defaultReleasePropFile = "${jalviewDirAbsolutePath}/RELEASE";
106 (new File(releasePropFile!=null ? releasePropFile : defaultReleasePropFile)).withInputStream {
107 releaseProps.load(it)
109 } catch (Exception fileLoadError) {
110 throw new Error("Couldn't load release properties file "+(releasePropFile==null ? defaultReleasePropFile : "from custom location: releasePropFile"),fileLoadError);
113 // Set JALVIEW_VERSION if it is not already set
114 if (findProperty(JALVIEW_VERSION)==null || "".equals(JALVIEW_VERSION)) {
115 JALVIEW_VERSION = releaseProps.get("jalview.version")
118 // this property set when running Eclipse headlessly
119 j2sHeadlessBuildProperty = string("net.sf.j2s.core.headlessbuild")
120 // this property set by Eclipse
121 eclipseApplicationProperty = string("eclipse.application")
122 // CHECK IF RUNNING FROM WITHIN ECLIPSE
123 def eclipseApplicationPropertyVal = System.properties[eclipseApplicationProperty]
124 IN_ECLIPSE = eclipseApplicationPropertyVal != null && eclipseApplicationPropertyVal.startsWith("org.eclipse.ui.")
125 // BUT WITHOUT THE HEADLESS BUILD PROPERTY SET
126 if (System.properties[j2sHeadlessBuildProperty].equals("true")) {
127 println("Setting IN_ECLIPSE to ${IN_ECLIPSE} as System.properties['${j2sHeadlessBuildProperty}'] == '${System.properties[j2sHeadlessBuildProperty]}'")
131 println("WITHIN ECLIPSE IDE")
133 println("HEADLESS BUILD")
136 J2S_ENABLED = (project.hasProperty('j2s.compiler.status') && project['j2s.compiler.status'] != null && project['j2s.compiler.status'] == "enable")
138 println("J2S ENABLED")
141 System.properties.sort { it.key }.each {
142 key, val -> println("SYSTEM PROPERTY ${key}='${val}'")
145 if (false && IN_ECLIPSE) {
146 jalviewDir = jalviewDirAbsolutePath
151 bareSourceDir = string(source_dir)
152 sourceDir = string("${jalviewDir}/${bareSourceDir}")
153 resourceDir = string("${jalviewDir}/${resource_dir}")
154 bareTestSourceDir = string(test_source_dir)
155 testDir = string("${jalviewDir}/${bareTestSourceDir}")
157 classesDir = string("${jalviewDir}/${classes_dir}")
160 useClover = clover.equals("true")
161 cloverBuildDir = "${buildDir}/clover"
162 cloverInstrDir = file("${cloverBuildDir}/clover-instr")
163 cloverClassesDir = file("${cloverBuildDir}/clover-classes")
164 cloverReportDir = file("${buildDir}/reports/clover")
165 cloverTestInstrDir = file("${cloverBuildDir}/clover-test-instr")
166 cloverTestClassesDir = file("${cloverBuildDir}/clover-test-classes")
167 //cloverTestClassesDir = cloverClassesDir
168 cloverDb = string("${cloverBuildDir}/clover.db")
170 testSourceDir = useClover ? cloverTestInstrDir : testDir
171 testClassesDir = useClover ? cloverTestClassesDir : "${jalviewDir}/${test_output_dir}"
173 getdownWebsiteDir = string("${jalviewDir}/${getdown_website_dir}/${JAVA_VERSION}")
176 // the following values might be overridden by the CHANNEL switch
177 getdownChannelName = CHANNEL.toLowerCase()
178 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
179 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
180 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher}")
181 getdownAppDistDir = getdown_app_dir_alt
182 reportRsyncCommand = false
183 jvlChannelName = CHANNEL.toLowerCase()
184 install4jSuffix = CHANNEL.substring(0, 1).toUpperCase() + CHANNEL.substring(1).toLowerCase(); // BUILD -> Build
185 install4jDSStore = "DS_Store-NON-RELEASE"
186 install4jDMGBackgroundImage = "jalview_dmg_background-NON-RELEASE.png"
187 install4jInstallerName = "${jalview_name} Non-Release Installer"
188 install4jExecutableName = jalview_name.replaceAll("[^\\w]+", "_").toLowerCase()
189 install4jExtraScheme = "jalviewx"
193 // TODO: get bamboo build artifact URL for getdown artifacts
194 getdown_channel_base = bamboo_channelbase
195 getdownChannelName = string("${bamboo_planKey}/${JAVA_VERSION}")
196 getdownAppBase = string("${bamboo_channelbase}/${bamboo_planKey}${bamboo_getdown_channel_suffix}/${JAVA_VERSION}")
197 jvlChannelName += "_${getdownChannelName}"
198 // automatically add the test group Not-bamboo for exclusion
199 if ("".equals(testng_excluded_groups)) {
200 testng_excluded_groups = "Not-bamboo"
202 install4jExtraScheme = "jalviewb"
206 getdownAppDistDir = getdown_app_dir_release
207 reportRsyncCommand = true
209 install4jDSStore = "DS_Store"
210 install4jDMGBackgroundImage = "jalview_dmg_background.png"
211 install4jInstallerName = "${jalview_name} Installer"
215 getdownChannelName = CHANNEL.toLowerCase()+"/${JALVIEW_VERSION}"
216 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
217 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
218 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
219 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
221 package_dir = string("${ARCHIVEDIR}/${package_dir}")
222 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
225 reportRsyncCommand = true
226 install4jExtraScheme = "jalviewa"
230 getdownChannelName = string("archive/${JALVIEW_VERSION}")
231 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
232 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
233 if (!file("${ARCHIVEDIR}/${package_dir}").exists()) {
234 throw new GradleException("Must provide an ARCHIVEDIR value to produce an archive distribution")
236 package_dir = string("${ARCHIVEDIR}/${package_dir}")
237 buildProperties = string("${ARCHIVEDIR}/${classes_dir}/${build_properties_file}")
240 reportRsyncCommand = true
241 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
242 install4jSuffix = "Archive"
243 install4jExtraScheme = "jalviewa"
247 reportRsyncCommand = true
249 // DEVELOP-RELEASE is usually associated with a Jalview release series so set the version
250 JALVIEW_VERSION=JALVIEW_VERSION+"-develop"
252 channelPropertiesFile = string("${channel_properties_dir}/develop_properties")
253 getdownImagesDir = "${getdown_images_dir}/develop"
254 getdownBgColour = "000000"
255 getdownFgColour = "FFFFFF"
256 getdownLightFgColour = "CCCCFF"
257 install4jSuffix = "Develop"
258 install4jDSStore = "DS_Store-DEVELOP"
259 install4jDMGBackgroundImage = "jalview_dmg_background-DEVELOP.png"
260 install4jExtraScheme = "jalviewd"
261 install4jInstallerName = "${jalview_name} Develop Installer"
262 install4jMacIconsFile = string("${install4j_utils_dir}/develop/${install4j_mac_icons_file}")
263 install4jWindowsIconsFile = string("${install4j_utils_dir}/develop/${install4j_windows_icons_file}")
264 install4jPngIconFile = string("${install4j_utils_dir}/develop/${install4j_png_icon_file}")
268 reportRsyncCommand = true
269 // Don't ignore transpile errors for release build
270 if (jalviewjs_ignore_transpile_errors.equals("true")) {
271 jalviewjs_ignore_transpile_errors = "false"
272 println("Setting jalviewjs_ignore_transpile_errors to 'false'")
274 JALVIEW_VERSION = JALVIEW_VERSION+"-test"
275 install4jSuffix = "Test"
276 install4jDSStore = "DS_Store-TEST-RELEASE"
277 install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png"
278 install4jExtraScheme = "jalviewt"
279 install4jInstallerName = "${jalview_name} Test Installer"
282 case ~/^SCRATCH(|-[-\w]*)$/:
283 getdownChannelName = CHANNEL
284 JALVIEW_VERSION = JALVIEW_VERSION+"-"+CHANNEL
286 getdownDir = string("${getdownChannelName}/${JAVA_VERSION}")
287 getdownAppBase = string("${getdown_channel_base}/${getdownDir}")
288 reportRsyncCommand = true
289 install4jSuffix = "Scratch"
293 if (!file("${LOCALDIR}").exists()) {
294 throw new GradleException("Must provide a LOCALDIR value to produce a local distribution")
296 getdownAppBase = file(file("${LOCALDIR}").getAbsolutePath()).toURI().toString()
297 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
299 JALVIEW_VERSION = "TEST"
300 install4jSuffix = "Test-Local"
301 install4jDSStore = "DS_Store-TEST-RELEASE"
302 install4jDMGBackgroundImage = "jalview_dmg_background-TEST.png"
303 install4jExtraScheme = "jalviewt"
304 install4jInstallerName = "${jalview_name} Test Installer"
308 JALVIEW_VERSION = "TEST"
309 getdownAppBase = file(getdownWebsiteDir).toURI().toString()
310 getdownLauncher = string("${jalviewDir}/${getdown_lib_dir}/${getdown_launcher_local}")
311 install4jExtraScheme = "jalviewl"
314 default: // something wrong specified
315 throw new GradleException("CHANNEL must be one of BUILD, RELEASE, ARCHIVE, DEVELOP, TEST-RELEASE, SCRATCH-..., LOCAL [default]")
319 // override getdownAppBase if requested
320 if (findProperty("getdown_appbase_override") != null) {
321 getdownAppBase = string(getProperty("getdown_appbase_override"))
322 println("Overriding getdown appbase with '${getdownAppBase}'")
324 // sanitise file name for jalview launcher file for this channel
325 jvlChannelName = jvlChannelName.replaceAll("[^\\w\\-]+", "_")
326 // install4j application and folder names
327 if (install4jSuffix == "") {
328 install4jApplicationName = "${jalview_name}"
329 install4jBundleId = "${install4j_bundle_id}"
330 install4jWinApplicationId = install4j_release_win_application_id
332 install4jApplicationName = "${jalview_name} ${install4jSuffix}"
333 install4jBundleId = "${install4j_bundle_id}-" + install4jSuffix.toLowerCase()
334 // add int hash of install4jSuffix to the last part of the application_id
335 def id = install4j_release_win_application_id
336 def idsplitreverse = id.split("-").reverse()
337 idsplitreverse[0] = idsplitreverse[0].toInteger() + install4jSuffix.hashCode()
338 install4jWinApplicationId = idsplitreverse.reverse().join("-")
340 // sanitise folder and id names
341 // install4jApplicationFolder = e.g. "Jalview Build"
342 install4jApplicationFolder = install4jApplicationName
343 .replaceAll("[\"'~:/\\\\\\s]", "_") // replace all awkward filename chars " ' ~ : / \
344 .replaceAll("_+", "_") // collapse __
345 install4jInternalId = install4jApplicationName
347 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
348 .replaceAll("_+", "") // collapse __
349 //.replaceAll("_*-_*", "-") // collapse _-_
350 install4jUnixApplicationFolder = install4jApplicationName
352 .replaceAll("[^\\w\\-\\.]", "_") // replace other non [alphanumeric,_,-,.]
353 .replaceAll("_+", "_") // collapse __
354 .replaceAll("_*-_*", "-") // collapse _-_
357 getdownAppDir = string("${getdownWebsiteDir}/${getdownAppDistDir}")
358 //getdownJ11libDir = "${getdownWebsiteDir}/${getdown_j11lib_dir}"
359 getdownResourceDir = string("${getdownWebsiteDir}/${getdown_resource_dir}")
360 getdownInstallDir = string("${getdownWebsiteDir}/${getdown_install_dir}")
361 getdownFilesDir = string("${jalviewDir}/${getdown_files_dir}/${JAVA_VERSION}/")
362 getdownFilesInstallDir = string("${getdownFilesDir}/${getdown_install_dir}")
363 /* compile without modules -- using classpath libraries
364 modules_compileClasspath = fileTree(dir: "${jalviewDir}/${j11modDir}", include: ["*.jar"])
365 modules_runtimeClasspath = modules_compileClasspath
367 def details = versionDetails()
368 gitHash = details.gitHash
369 gitBranch = details.branchName
371 println("Using a ${CHANNEL} profile.")
373 additional_compiler_args = []
374 // configure classpath/args for j8/j11 compilation
375 if (JAVA_VERSION.equals("1.8")) {
376 JAVA_INTEGER_VERSION = string("8")
379 libDistDir = j8libDir
380 compile_source_compatibility = 1.8
381 compile_target_compatibility = 1.8
382 // these are getdown.txt properties defined dependent on the JAVA_VERSION
383 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java8_min_version"))
384 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java8_max_version"))
385 // this property is assigned below and expanded to multiple lines in the getdown task
386 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java8_txt_multi_java_location"))
387 // this property is for the Java library used in eclipse
388 eclipseJavaRuntimeName = string("JavaSE-1.8")
389 } else if (JAVA_VERSION.equals("11")) {
390 JAVA_INTEGER_VERSION = string("11")
392 libDistDir = j11libDir
393 compile_source_compatibility = 11
394 compile_target_compatibility = 11
395 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
396 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
397 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
398 eclipseJavaRuntimeName = string("JavaSE-11")
399 /* compile without modules -- using classpath libraries
400 additional_compiler_args += [
401 '--module-path', modules_compileClasspath.asPath,
402 '--add-modules', j11modules
405 } else if (JAVA_VERSION.equals("12") || JAVA_VERSION.equals("13")) {
406 JAVA_INTEGER_VERSION = JAVA_VERSION
408 libDistDir = j11libDir
409 compile_source_compatibility = JAVA_VERSION
410 compile_target_compatibility = JAVA_VERSION
411 getdownAltJavaMinVersion = string(findProperty("getdown_alt_java11_min_version"))
412 getdownAltJavaMaxVersion = string(findProperty("getdown_alt_java11_max_version"))
413 getdownAltMultiJavaLocation = string(findProperty("getdown_alt_java11_txt_multi_java_location"))
414 eclipseJavaRuntimeName = string("JavaSE-11")
415 /* compile without modules -- using classpath libraries
416 additional_compiler_args += [
417 '--module-path', modules_compileClasspath.asPath,
418 '--add-modules', j11modules
422 throw new GradleException("JAVA_VERSION=${JAVA_VERSION} not currently supported by Jalview")
427 JAVA_MIN_VERSION = JAVA_VERSION
428 JAVA_MAX_VERSION = JAVA_VERSION
429 def jreInstallsDir = string(jre_installs_dir)
430 if (jreInstallsDir.startsWith("~/")) {
431 jreInstallsDir = System.getProperty("user.home") + jreInstallsDir.substring(1)
433 macosJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-mac-x64/jre")
434 macosJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-mac-x64.tar.gz")
435 windowsJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-windows-x64/jre")
436 windowsJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-windows-x64.tar.gz")
437 linuxJavaVMDir = string("${jreInstallsDir}/jre-${JAVA_INTEGER_VERSION}-linux-x64/jre")
438 linuxJavaVMTgz = string("${jreInstallsDir}/tgz/jre-${JAVA_INTEGER_VERSION}-linux-x64.tar.gz")
439 install4jDir = string("${jalviewDir}/${install4j_utils_dir}")
440 install4jConfFileName = string("jalview-install4j-conf.install4j")
441 install4jConfFile = file("${install4jDir}/${install4jConfFileName}")
442 install4jHomeDir = install4j_home_dir
443 if (install4jHomeDir.startsWith("~/")) {
444 install4jHomeDir = System.getProperty("user.home") + install4jHomeDir.substring(1)
447 resourceBuildDir = string("${buildDir}/resources")
448 resourcesBuildDir = string("${resourceBuildDir}/resources_build")
449 helpBuildDir = string("${resourceBuildDir}/help_build")
450 docBuildDir = string("${resourceBuildDir}/doc_build")
452 buildProperties = string("${resourcesBuildDir}/${build_properties_file}")
453 buildingHTML = string("${jalviewDir}/${doc_dir}/building.html")
454 helpParentDir = string("${jalviewDir}/${help_parent_dir}")
455 helpSourceDir = string("${helpParentDir}/${help_dir}")
456 helpFile = string("${helpBuildDir}/${help_dir}/help.jhm")
459 relativeBuildDir = file(jalviewDirAbsolutePath).toPath().relativize(buildDir.toPath())
460 jalviewjsBuildDir = string("${relativeBuildDir}/jalviewjs")
461 jalviewjsSiteDir = string("${jalviewjsBuildDir}/${jalviewjs_site_dir}")
463 jalviewjsTransferSiteJsDir = string(jalviewjsSiteDir)
465 jalviewjsTransferSiteJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_js")
467 jalviewjsTransferSiteLibDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_lib")
468 jalviewjsTransferSiteSwingJsDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_swingjs")
469 jalviewjsTransferSiteCoreDir = string("${jalviewjsBuildDir}/tmp/${jalviewjs_site_dir}_core")
470 jalviewjsJalviewCoreHtmlFile = string("")
471 jalviewjsJalviewCoreName = string(jalviewjs_core_name)
472 jalviewjsCoreClasslists = []
473 jalviewjsJalviewTemplateName = string(jalviewjs_name)
474 jalviewjsJ2sSettingsFileName = string("${jalviewDir}/${jalviewjs_j2s_settings}")
475 jalviewjsJ2sProps = null
476 jalviewjsJ2sPlugin = jalviewjs_j2s_plugin
478 eclipseWorkspace = null
479 eclipseBinary = string("")
480 eclipseVersion = string("")
490 outputDir = file(classesDir)
494 srcDirs = [ resourcesBuildDir, docBuildDir, helpBuildDir ]
497 compileClasspath = files(sourceSets.main.java.outputDir)
498 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
500 runtimeClasspath = compileClasspath
501 runtimeClasspath += files(sourceSets.main.resources.srcDirs)
506 srcDirs cloverInstrDir
507 outputDir = cloverClassesDir
511 srcDirs = sourceSets.main.resources.srcDirs
514 compileClasspath = files( sourceSets.clover.java.outputDir )
515 //compileClasspath += files( testClassesDir )
516 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
517 compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
518 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
520 runtimeClasspath = compileClasspath
525 srcDirs testSourceDir
526 outputDir = file(testClassesDir)
530 srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs
533 compileClasspath = files( sourceSets.test.java.outputDir )
534 compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath
535 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
537 runtimeClasspath = compileClasspath
538 runtimeClasspath += files(sourceSets.test.resources.srcDirs)
544 // eclipse project and settings files creation, also used by buildship
547 name = eclipse_project_name
549 natures 'org.eclipse.jdt.core.javanature',
550 'org.eclipse.jdt.groovy.core.groovyNature',
551 'org.eclipse.buildship.core.gradleprojectnature'
553 buildCommand 'org.eclipse.jdt.core.javabuilder'
554 buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
558 //defaultOutputDir = sourceSets.main.java.outputDir
559 configurations.each{ c->
560 if (c.isCanBeResolved()) {
561 minusConfigurations += [c]
565 plusConfigurations = [ ]
569 def removeTheseToo = []
570 HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
571 cp.entries.each { entry ->
572 // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test".
573 // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover
574 // we add the resources and help/help dirs in as libs afterwards (see below)
575 if (entry.kind == 'src') {
576 if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) {
577 removeTheseToo += entry
579 alreadyAddedSrcPath.putAt(entry.path, true)
584 cp.entries.removeAll(removeTheseToo)
586 //cp.entries += new Output("${eclipse_bin_dir}/main")
587 if (file(helpParentDir).isDirectory()) {
588 cp.entries += new Library(fileReference(helpParentDir))
590 if (file(resourceDir).isDirectory()) {
591 cp.entries += new Library(fileReference(resourceDir))
594 HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
596 sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
597 //don't want to add outputDir as eclipse is using its own output dir in bin/main
598 if (it.isDirectory() || ! it.exists()) {
599 // don't add dirs to classpath, especially if they don't exist
600 return false // groovy "continue" in .any closure
602 def itPath = it.toString()
603 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
604 // make relative path
605 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
607 if (alreadyAddedLibPath.get(itPath)) {
608 //println("Not adding duplicate entry "+itPath)
610 //println("Adding entry "+itPath)
611 cp.entries += new Library(fileReference(itPath))
612 alreadyAddedLibPath.put(itPath, true)
616 sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
617 //no longer want to add outputDir as eclipse is using its own output dir in bin/main
618 if (it.isDirectory() || ! it.exists()) {
619 // don't add dirs to classpath
620 return false // groovy "continue" in .any closure
623 def itPath = it.toString()
624 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
625 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
627 if (alreadyAddedLibPath.get(itPath)) {
630 def lib = new Library(fileReference(itPath))
631 lib.entryAttributes["test"] = "true"
633 alreadyAddedLibPath.put(itPath, true)
641 containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
646 // for the IDE, use java 11 compatibility
647 sourceCompatibility = compile_source_compatibility
648 targetCompatibility = compile_target_compatibility
649 javaRuntimeName = eclipseJavaRuntimeName
651 // add in jalview project specific properties/preferences into eclipse core preferences
653 withProperties { props ->
654 def jalview_prefs = new Properties()
655 def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}")
656 jalview_prefs.load(ins)
658 jalview_prefs.forEach { t, v ->
659 if (props.getAt(t) == null) {
663 // codestyle file -- overrides previous formatter prefs
664 def csFile = file("${jalviewDirAbsolutePath}/${eclipse_codestyle_file}")
665 if (csFile.exists()) {
666 XmlParser parser = new XmlParser()
667 def profiles = parser.parse(csFile)
668 def profile = profiles.'profile'.find { p -> (p.'@kind' == "CodeFormatterProfile" && p.'@name' == "Jalview") }
669 if (profile != null) {
670 profile.'setting'.each { s ->
672 def value = s.'@value'
673 if (id != null && value != null) {
674 props.putAt(id, value)
685 // Don't want these to be activated if in headless build
686 synchronizationTasks "eclipseSynchronizationTask"
687 //autoBuildTasks "eclipseAutoBuildTask"
693 /* hack to change eclipse prefs in .settings files other than org.eclipse.jdt.core.prefs */
694 // Class to allow updating arbitrary properties files
695 class PropertiesFile extends PropertiesPersistableConfigurationObject {
696 public PropertiesFile(PropertiesTransformer t) { super(t); }
697 @Override protected void load(Properties properties) { }
698 @Override protected void store(Properties properties) { }
699 @Override protected String getDefaultResourceName() { return ""; }
700 // This is necessary, because PropertiesPersistableConfigurationObject fails
701 // if no default properties file exists.
702 @Override public void loadDefaults() { load(new StringBufferInputStream("")); }
705 // Task to update arbitrary properties files (set outputFile)
706 class PropertiesFileTask extends PropertiesGeneratorTask<PropertiesFile> {
707 private final PropertiesFileContentMerger file;
708 public PropertiesFileTask() { file = new PropertiesFileContentMerger(getTransformer()); }
709 protected PropertiesFile create() { return new PropertiesFile(getTransformer()); }
710 protected void configure(PropertiesFile props) {
711 file.getBeforeMerged().execute(props); file.getWhenMerged().execute(props);
713 public void file(Closure closure) { ConfigureUtil.configure(closure, file); }
716 task eclipseUIPreferences(type: PropertiesFileTask) {
717 description = "Generate Eclipse additional settings"
718 def filename = "org.eclipse.jdt.ui.prefs"
719 outputFile = "$projectDir/.settings/${filename}" as File
722 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
727 task eclipseGroovyCorePreferences(type: PropertiesFileTask) {
728 description = "Generate Eclipse additional settings"
729 def filename = "org.eclipse.jdt.groovy.core.prefs"
730 outputFile = "$projectDir/.settings/${filename}" as File
733 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
738 task eclipseAllPreferences {
740 dependsOn eclipseUIPreferences
741 dependsOn eclipseGroovyCorePreferences
744 eclipseUIPreferences.mustRunAfter eclipseJdt
745 eclipseGroovyCorePreferences.mustRunAfter eclipseJdt
747 /* end of eclipse preferences hack */
755 delete cloverBuildDir
756 delete cloverReportDir
761 task cloverInstrJava(type: JavaExec) {
762 group = "Verification"
763 description = "Create clover instrumented source java files"
765 dependsOn cleanClover
767 inputs.files(sourceSets.main.allJava)
768 outputs.dir(cloverInstrDir)
770 //classpath = fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
771 classpath = sourceSets.clover.compileClasspath
772 main = "com.atlassian.clover.CloverInstr"
780 cloverInstrDir.getPath(),
782 def srcFiles = sourceSets.main.allJava.files
785 { file -> file.absolutePath }
788 args argsList.toArray()
791 delete cloverInstrDir
792 println("Clover: About to instrument "+srcFiles.size() +" files")
797 task cloverInstrTests(type: JavaExec) {
798 group = "Verification"
799 description = "Create clover instrumented source test files"
801 dependsOn cleanClover
803 inputs.files(testDir)
804 outputs.dir(cloverTestInstrDir)
806 classpath = sourceSets.clover.compileClasspath
807 main = "com.atlassian.clover.CloverInstr"
817 cloverTestInstrDir.getPath(),
819 args argsList.toArray()
822 delete cloverTestInstrDir
823 println("Clover: About to instrument test files")
829 group = "Verification"
830 description = "Create clover instrumented all source files"
832 dependsOn cloverInstrJava
833 dependsOn cloverInstrTests
837 cloverClasses.dependsOn cloverInstr
840 task cloverConsoleReport(type: JavaExec) {
841 group = "Verification"
842 description = "Creates clover console report"
845 file(cloverDb).exists()
848 inputs.dir cloverClassesDir
850 classpath = sourceSets.clover.runtimeClasspath
851 main = "com.atlassian.clover.reporters.console.ConsoleReporter"
853 if (cloverreport_mem.length() > 0) {
854 maxHeapSize = cloverreport_mem
856 if (cloverreport_jvmargs.length() > 0) {
857 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
867 args argsList.toArray()
871 task cloverHtmlReport(type: JavaExec) {
872 group = "Verification"
873 description = "Creates clover HTML report"
876 file(cloverDb).exists()
879 def cloverHtmlDir = cloverReportDir
880 inputs.dir cloverClassesDir
881 outputs.dir cloverHtmlDir
883 classpath = sourceSets.clover.runtimeClasspath
884 main = "com.atlassian.clover.reporters.html.HtmlReporter"
886 if (cloverreport_mem.length() > 0) {
887 maxHeapSize = cloverreport_mem
889 if (cloverreport_jvmargs.length() > 0) {
890 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
901 if (cloverreport_html_options.length() > 0) {
902 argsList += cloverreport_html_options.split(" ")
905 args argsList.toArray()
909 task cloverXmlReport(type: JavaExec) {
910 group = "Verification"
911 description = "Creates clover XML report"
914 file(cloverDb).exists()
917 def cloverXmlFile = "${cloverReportDir}/clover.xml"
918 inputs.dir cloverClassesDir
919 outputs.file cloverXmlFile
921 classpath = sourceSets.clover.runtimeClasspath
922 main = "com.atlassian.clover.reporters.xml.XMLReporter"
924 if (cloverreport_mem.length() > 0) {
925 maxHeapSize = cloverreport_mem
927 if (cloverreport_jvmargs.length() > 0) {
928 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
939 if (cloverreport_xml_options.length() > 0) {
940 argsList += cloverreport_xml_options.split(" ")
943 args argsList.toArray()
948 group = "Verification"
949 description = "Creates clover reports"
951 dependsOn cloverXmlReport
952 dependsOn cloverHtmlReport
959 sourceCompatibility = compile_source_compatibility
960 targetCompatibility = compile_target_compatibility
961 options.compilerArgs += additional_compiler_args
962 print ("Setting target compatibility to "+targetCompatibility+"\n")
964 //classpath += configurations.cloverRuntime
970 // JBP->BS should the print statement in doFirst refer to compile_target_compatibility ?
971 sourceCompatibility = compile_source_compatibility
972 targetCompatibility = compile_target_compatibility
973 options.compilerArgs = additional_compiler_args
974 options.encoding = "UTF-8"
976 print ("Setting target compatibility to "+compile_target_compatibility+"\n")
983 sourceCompatibility = compile_source_compatibility
984 targetCompatibility = compile_target_compatibility
985 options.compilerArgs = additional_compiler_args
987 print ("Setting target compatibility to "+targetCompatibility+"\n")
994 delete sourceSets.main.java.outputDir
1000 dependsOn cleanClover
1002 delete sourceSets.test.java.outputDir
1007 // format is a string like date.format("dd MMMM yyyy")
1008 def getDate(format) {
1009 def date = new Date()
1010 return date.format(format)
1014 def convertMdToHtml (FileTree mdFiles, File cssFile) {
1015 MutableDataSet options = new MutableDataSet()
1017 def extensions = new ArrayList<>()
1018 extensions.add(AnchorLinkExtension.create())
1019 extensions.add(AutolinkExtension.create())
1020 extensions.add(StrikethroughExtension.create())
1021 extensions.add(TaskListExtension.create())
1022 extensions.add(TablesExtension.create())
1023 extensions.add(TocExtension.create())
1025 options.set(Parser.EXTENSIONS, extensions)
1027 // set GFM table parsing options
1028 options.set(TablesExtension.WITH_CAPTION, false)
1029 options.set(TablesExtension.COLUMN_SPANS, false)
1030 options.set(TablesExtension.MIN_HEADER_ROWS, 1)
1031 options.set(TablesExtension.MAX_HEADER_ROWS, 1)
1032 options.set(TablesExtension.APPEND_MISSING_COLUMNS, true)
1033 options.set(TablesExtension.DISCARD_EXTRA_COLUMNS, true)
1034 options.set(TablesExtension.HEADER_SEPARATOR_COLUMN_MATCH, true)
1036 options.set(AnchorLinkExtension.ANCHORLINKS_SET_ID, false)
1037 options.set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor")
1038 options.set(AnchorLinkExtension.ANCHORLINKS_SET_NAME, true)
1039 options.set(AnchorLinkExtension.ANCHORLINKS_TEXT_PREFIX, "<span class=\"octicon octicon-link\"></span>")
1041 Parser parser = Parser.builder(options).build()
1042 HtmlRenderer renderer = HtmlRenderer.builder(options).build()
1044 mdFiles.each { mdFile ->
1045 // add table of contents
1046 def mdText = "[TOC]\n"+mdFile.text
1048 // grab the first top-level title
1050 def titleRegex = /(?m)^#(\s+|([^#]))(.*)/
1051 def matcher = mdText =~ titleRegex
1052 if (matcher.size() > 0) {
1053 // matcher[0][2] is the first character of the title if there wasn't any whitespace after the #
1054 title = (matcher[0][2] != null ? matcher[0][2] : "")+matcher[0][3]
1056 // or use the filename if none found
1057 if (title == null) {
1058 title = mdFile.getName()
1061 Node document = parser.parse(mdText)
1062 String htmlBody = renderer.render(document)
1063 def htmlText = '''<html>
1064 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1065 <html xmlns="http://www.w3.org/1999/xhtml">
1067 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1068 <meta http-equiv="Content-Style-Type" content="text/css" />
1069 <meta name="generator" content="flexmark" />
1071 htmlText += ((title != null) ? " <title>${title}</title>" : '' )
1073 <style type="text/css">code{white-space: pre;}</style>
1075 htmlText += ((cssFile != null) ? cssFile.text : '')
1076 htmlText += '''</head>
1079 htmlText += htmlBody
1085 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1086 def htmlFile = file(htmlFilePath)
1087 htmlFile.text = htmlText
1092 task copyDocs(type: Copy) {
1093 def inputDir = "${jalviewDir}/${doc_dir}"
1094 def outputDir = "${docBuildDir}/${doc_dir}"
1099 filter(ReplaceTokens,
1103 'Version-Rel': JALVIEW_VERSION,
1104 'Year-Rel': getDate("yyyy")
1115 inputs.dir(inputDir)
1116 outputs.files(helpFile)
1117 outputs.dir(outputDir)
1121 task convertMdFiles {
1123 def mdFiles = fileTree(dir: docBuildDir, include: "*.md")
1124 def cssFile = file("${jalviewDir}/${flexmark_css}")
1127 convertMdToHtml(mdFiles, cssFile)
1130 inputs.files(mdFiles)
1131 inputs.file(cssFile)
1134 mdFiles.each { mdFile ->
1135 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1136 htmlFiles.add(file(htmlFilePath))
1138 outputs.files(htmlFiles)
1142 task copyHelp(type: Copy) {
1143 def inputDir = helpSourceDir
1144 def outputDir = "${helpBuildDir}/${help_dir}"
1149 filter(ReplaceTokens,
1153 'Version-Rel': JALVIEW_VERSION,
1154 'Year-Rel': getDate("yyyy")
1165 inputs.dir(inputDir)
1166 outputs.files(helpFile)
1167 outputs.dir(outputDir)
1171 task copyResources(type: Copy) {
1172 def inputDir = resourceDir
1173 def outputDir = resourcesBuildDir
1178 filter(ReplaceTokens,
1182 'Version-Rel': JALVIEW_VERSION,
1183 'Year-Rel': getDate("yyyy")
1194 inputs.dir(inputDir)
1195 outputs.dir(outputDir)
1199 task createBuildProperties(type: WriteProperties) {
1200 dependsOn copyResources
1202 description = "Create the ${buildProperties} file"
1204 inputs.dir(sourceDir)
1205 inputs.dir(resourcesBuildDir)
1206 outputFile (buildProperties)
1207 // taking time specific comment out to allow better incremental builds
1208 comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
1209 //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
1210 property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
1211 property "VERSION", JALVIEW_VERSION
1212 property "INSTALLATION", INSTALLATION+" git-commit:"+gitHash+" ["+gitBranch+"]"
1213 outputs.file(outputFile)
1218 dependsOn copyResources
1221 dependsOn createBuildProperties
1222 dependsOn convertMdFiles
1226 compileJava.dependsOn prepare
1227 run.dependsOn compileJava
1228 //run.dependsOn prepare
1231 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
1236 dependsOn cloverClasses
1238 dependsOn compileJava //?
1242 includeGroups testng_groups
1243 excludeGroups testng_excluded_groups
1245 useDefaultListeners=true
1248 maxHeapSize = "1024m"
1250 workingDir = jalviewDir
1251 def testLaf = project.findProperty("test_laf")
1252 if (testLaf != null) {
1253 println("Setting Test LaF to '${testLaf}'")
1254 systemProperty "laf", testLaf
1256 sourceCompatibility = compile_source_compatibility
1257 targetCompatibility = compile_target_compatibility
1258 jvmArgs += additional_compiler_args
1262 println("Running tests " + (useClover?"WITH":"WITHOUT") + " clover")
1268 task buildIndices(type: JavaExec) {
1270 classpath = sourceSets.main.compileClasspath
1271 main = "com.sun.java.help.search.Indexer"
1272 workingDir = "${helpBuildDir}/${help_dir}"
1275 inputs.dir("${workingDir}/${argDir}")
1277 outputs.dir("${classesDir}/doc")
1278 outputs.dir("${classesDir}/help")
1279 outputs.file("${workingDir}/JavaHelpSearch/DOCS")
1280 outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB")
1281 outputs.file("${workingDir}/JavaHelpSearch/OFFSETS")
1282 outputs.file("${workingDir}/JavaHelpSearch/POSITIONS")
1283 outputs.file("${workingDir}/JavaHelpSearch/SCHEMA")
1284 outputs.file("${workingDir}/JavaHelpSearch/TMAP")
1288 task compileLinkCheck(type: JavaCompile) {
1290 classpath = files("${jalviewDir}/${utils_dir}")
1291 destinationDir = file("${jalviewDir}/${utils_dir}")
1292 source = fileTree(dir: "${jalviewDir}/${utils_dir}", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
1294 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1295 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1296 outputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.class")
1297 outputs.file("${jalviewDir}/${utils_dir}/BufferedLineReader.class")
1301 task linkCheck(type: JavaExec) {
1302 dependsOn prepare, compileLinkCheck
1304 def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
1305 classpath = files("${jalviewDir}/${utils_dir}")
1306 main = "HelpLinksChecker"
1307 workingDir = jalviewDir
1308 args = [ "${helpBuildDir}/${help_dir}", "-nointernet" ]
1310 def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
1312 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
1315 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
1319 inputs.dir(helpBuildDir)
1320 outputs.file(helpLinksCheckerOutFile)
1324 // import the pubhtmlhelp target
1325 ant.properties.basedir = "${jalviewDir}"
1326 ant.properties.helpBuildDir = "${helpBuildDir}/${help_dir}"
1327 ant.importBuild "${utils_dir}/publishHelp.xml"
1330 task cleanPackageDir(type: Delete) {
1332 delete fileTree(dir: "${jalviewDir}/${package_dir}", include: "*.jar")
1339 dependsOn buildIndices
1340 dependsOn createBuildProperties
1344 attributes "Main-Class": main_class,
1345 "Permissions": "all-permissions",
1346 "Application-Name": install4jApplicationName,
1347 "Codebase": application_codebase,
1348 "Implementation-Version": JALVIEW_VERSION
1351 destinationDirectory = file("${jalviewDir}/${package_dir}")
1352 archiveFileName = rootProject.name+".jar"
1358 exclude "**/*.jar.*"
1360 inputs.dir(sourceSets.main.java.outputDir)
1361 sourceSets.main.resources.srcDirs.each{ dir ->
1364 outputs.file("${destinationDirectory}/${archiveFileName}")
1368 task copyJars(type: Copy) {
1369 from fileTree(dir: classesDir, include: "**/*.jar").files
1370 into "${jalviewDir}/${package_dir}"
1374 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
1375 task syncJars(type: Sync) {
1377 from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
1378 into "${jalviewDir}/${package_dir}"
1380 include jar.archiveFileName.getOrNull()
1387 description = "Put all required libraries in dist"
1388 // order of "cleanPackageDir", "copyJars", "jar" important!
1389 jar.mustRunAfter cleanPackageDir
1390 syncJars.mustRunAfter cleanPackageDir
1391 dependsOn cleanPackageDir
1394 outputs.dir("${jalviewDir}/${package_dir}")
1399 dependsOn cleanPackageDir
1406 group = "distribution"
1407 description = "Create a single jar file with all dependency libraries merged. Can be run with java -jar"
1411 from ("${jalviewDir}/${libDistDir}") {
1415 attributes "Implementation-Version": JALVIEW_VERSION,
1416 "Application-Name": install4jApplicationName
1418 mainClassName = shadow_jar_main_class
1420 classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
1425 task getdownWebsite() {
1426 group = "distribution"
1427 description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
1432 def getdownWebsiteResourceFilenames = []
1433 def getdownTextString = ""
1434 def getdownResourceDir = getdownResourceDir
1435 def getdownResourceFilenames = []
1438 // clean the getdown website and files dir before creating getdown folders
1439 delete getdownWebsiteDir
1440 delete getdownFilesDir
1443 from buildProperties
1444 rename(build_properties_file, getdown_build_properties)
1447 getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
1449 // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
1450 def props = project.properties.sort { it.key }
1451 if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
1452 props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
1454 if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) {
1455 props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion)
1457 if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
1458 props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
1461 props.put("getdown_txt_title", jalview_name)
1462 props.put("getdown_txt_ui.name", install4jApplicationName)
1464 // start with appbase
1465 getdownTextString += "appbase = ${getdownAppBase}\n"
1466 props.each{ prop, val ->
1467 if (prop.startsWith("getdown_txt_") && val != null) {
1468 if (prop.startsWith("getdown_txt_multi_")) {
1469 def key = prop.substring(18)
1470 val.split(",").each{ v ->
1471 def line = "${key} = ${v}\n"
1472 getdownTextString += line
1475 // file values rationalised
1476 if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
1478 if (val.indexOf('/') == 0) {
1481 } else if (val.indexOf('/') > 0) {
1482 // relative path (relative to jalviewDir)
1483 r = file( "${jalviewDir}/${val}" )
1486 val = "${getdown_resource_dir}/" + r.getName()
1487 getdownWebsiteResourceFilenames += val
1488 getdownResourceFilenames += r.getPath()
1491 if (! prop.startsWith("getdown_txt_resource")) {
1492 def line = prop.substring(12) + " = ${val}\n"
1493 getdownTextString += line
1499 getdownWebsiteResourceFilenames.each{ filename ->
1500 getdownTextString += "resource = ${filename}\n"
1502 getdownResourceFilenames.each{ filename ->
1505 into getdownResourceDir
1510 fileTree(file(package_dir)).each{ f ->
1511 if (f.isDirectory()) {
1512 def files = fileTree(dir: f, include: ["*"]).getFiles()
1514 } else if (f.exists()) {
1518 codeFiles.sort().each{f ->
1519 def name = f.getName()
1520 def line = "code = ${getdownAppDistDir}/${name}\n"
1521 getdownTextString += line
1528 // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
1530 if (JAVA_VERSION.equals("11")) {
1531 def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
1532 j11libFiles.sort().each{f ->
1533 def name = f.getName()
1534 def line = "code = ${getdown_j11lib_dir}/${name}\n"
1535 getdownTextString += line
1538 into getdownJ11libDir
1544 // 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.
1545 //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
1546 getdownTextString += "resource = ${getdown_launcher_new}\n"
1547 getdownTextString += "class = ${main_class}\n"
1549 def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
1550 getdown_txt.write(getdownTextString)
1552 def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
1553 def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
1554 launchJvl.write("appbase=${getdownAppBase}")
1557 from getdownLauncher
1558 rename(file(getdownLauncher).getName(), getdown_launcher_new)
1559 into getdownWebsiteDir
1563 from getdownLauncher
1564 if (file(getdownLauncher).getName() != getdown_launcher) {
1565 rename(file(getdownLauncher).getName(), getdown_launcher)
1567 into getdownWebsiteDir
1570 if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
1573 from getdownLauncher
1574 from "${getdownWebsiteDir}/${getdown_build_properties}"
1575 if (file(getdownLauncher).getName() != getdown_launcher) {
1576 rename(file(getdownLauncher).getName(), getdown_launcher)
1578 into getdownInstallDir
1582 from getdownInstallDir
1583 into getdownFilesInstallDir
1590 from getdownLauncher
1591 from "${getdownWebsiteDir}/${getdown_build_properties}"
1592 if (file(getdownLauncher).getName() != getdown_launcher) {
1593 rename(file(getdownLauncher).getName(), getdown_launcher)
1595 into getdownFilesDir
1599 from getdownResourceDir
1600 into "${getdownFilesDir}/${getdown_resource_dir}"
1605 inputs.dir("${jalviewDir}/${package_dir}")
1607 outputs.dir(getdownWebsiteDir)
1608 outputs.dir(getdownFilesDir)
1612 // a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir
1613 task getdownDigestDir(type: JavaExec) {
1615 description "A task to run a getdown Digest on a dir with getdown.txt. Provide a DIGESTDIR property via -PDIGESTDIR=..."
1617 def digestDirPropertyName = "DIGESTDIR"
1619 classpath = files(getdownLauncher)
1620 def digestDir = findProperty(digestDirPropertyName)
1621 if (digestDir == null) {
1622 throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest")
1626 main = "com.threerings.getdown.tools.Digester"
1630 task getdownDigest(type: JavaExec) {
1631 group = "distribution"
1632 description = "Digest the getdown website folder"
1633 dependsOn getdownWebsite
1635 classpath = files(getdownLauncher)
1637 main = "com.threerings.getdown.tools.Digester"
1638 args getdownWebsiteDir
1639 inputs.dir(getdownWebsiteDir)
1640 outputs.file("${getdownWebsiteDir}/digest2.txt")
1645 group = "distribution"
1646 description = "Create the minimal and full getdown app folder for installers and website and create digest file"
1647 dependsOn getdownDigest
1649 if (reportRsyncCommand) {
1650 def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
1651 def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
1652 println "LIKELY RSYNC COMMAND:"
1653 println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
1654 if (RUNRSYNC == "true") {
1656 commandLine "mkdir", "-p", toDir
1659 commandLine "rsync", "-avh", "--delete", fromDir, toDir
1667 tasks.withType(JavaCompile) {
1668 options.encoding = 'UTF-8'
1674 delete getdownWebsiteDir
1675 delete getdownFilesDir
1681 if (file(install4jHomeDir).exists()) {
1683 } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) {
1684 install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
1685 } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) {
1686 install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app"
1688 installDir(file(install4jHomeDir))
1690 mediaTypes = Arrays.asList(install4j_media_types.split(","))
1694 task copyInstall4jTemplate {
1695 def install4jTemplateFile = file("${install4jDir}/${install4j_template}")
1696 def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}")
1697 inputs.file(install4jTemplateFile)
1698 inputs.file(install4jFileAssociationsFile)
1699 inputs.property("CHANNEL", { CHANNEL })
1700 outputs.file(install4jConfFile)
1703 def install4jConfigXml = new XmlParser().parse(install4jTemplateFile)
1705 // turn off code signing if no OSX_KEYPASS
1706 if (OSX_KEYPASS == "") {
1707 install4jConfigXml.'**'.codeSigning.each { codeSigning ->
1708 codeSigning.'@macEnabled' = "false"
1710 install4jConfigXml.'**'.windows.each { windows ->
1711 windows.'@runPostProcessor' = "false"
1715 // turn off checksum creation for LOCAL channel
1716 def e = install4jConfigXml.application[0]
1717 if (CHANNEL == "LOCAL") {
1718 e.'@createChecksums' = "false"
1720 e.'@createChecksums' = "true"
1723 // put file association actions where placeholder action is
1724 def install4jFileAssociationsText = install4jFileAssociationsFile.text
1725 def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
1726 install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true
1727 if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') {
1728 def parent = a.parent()
1730 fileAssociationActions.each { faa ->
1733 // don't need to continue in .any loop once replacements have been made
1738 // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else
1739 // NB we're deleting the /other/ one!
1740 // Also remove the examples subdir from non-release versions
1741 def customizedIdToDelete = "PROGRAM_GROUP_RELEASE"
1742 // 2.11.1.0 NOT releasing with the Examples folder in the Program Group
1743 if (false && CHANNEL=="RELEASE") { // remove 'false && ' to include Examples folder in RELEASE channel
1744 customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE"
1746 // remove the examples subdir from Full File Set
1747 def files = install4jConfigXml.files[0]
1748 def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" }
1749 def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' }
1750 def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' }
1751 def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" }
1752 dirEntry.parent().remove(dirEntry)
1754 install4jConfigXml.'**'.action.any { a ->
1755 if (a.'@customizedId' == customizedIdToDelete) {
1756 def parent = a.parent()
1762 // remove the "Uninstall Old Jalview (optional)" symlink from DMG for non-release DS_Stores
1763 if (! (CHANNEL == "RELEASE" || CHANNEL == "TEST-RELEASE" ) ) {
1764 def symlink = install4jConfigXml.'**'.topLevelFiles.symlink.find { sl -> sl.'@name' == "Uninstall Old Jalview (optional).app" }
1765 symlink.parent().remove(symlink)
1768 // write install4j file
1769 install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
1776 delete install4jConfFile
1781 task installers(type: com.install4j.gradle.Install4jTask) {
1782 group = "distribution"
1783 description = "Create the install4j installers"
1785 dependsOn copyInstall4jTemplate
1787 projectFile = install4jConfFile
1789 // create an md5 for the input files to use as version for install4j conf file
1790 def digest = MessageDigest.getInstance("MD5")
1792 (file("${install4jDir}/${install4j_template}").text +
1793 file("${install4jDir}/${install4j_info_plist_file_associations}").text +
1794 file("${install4jDir}/${install4j_installer_file_associations}").text).bytes)
1795 def filesMd5 = new BigInteger(1, digest.digest()).toString(16)
1796 if (filesMd5.length() >= 8) {
1797 filesMd5 = filesMd5.substring(0,8)
1799 def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
1800 // make install4jBuildDir relative to jalviewDir
1801 def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
1804 'JALVIEW_NAME': jalview_name,
1805 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
1806 'JALVIEW_DIR': "../..",
1807 'OSX_KEYSTORE': OSX_KEYSTORE,
1808 'JSIGN_SH': JSIGN_SH,
1809 'JRE_DIR': getdown_app_dir_java,
1810 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
1811 'JALVIEW_VERSION': JALVIEW_VERSION,
1812 'JAVA_MIN_VERSION': JAVA_MIN_VERSION,
1813 'JAVA_MAX_VERSION': JAVA_MAX_VERSION,
1814 'JAVA_VERSION': JAVA_VERSION,
1815 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
1816 'VERSION': JALVIEW_VERSION,
1817 'MACOS_JAVA_VM_DIR': macosJavaVMDir,
1818 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
1819 'LINUX_JAVA_VM_DIR': linuxJavaVMDir,
1820 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
1821 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
1822 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz,
1823 'COPYRIGHT_MESSAGE': install4j_copyright_message,
1824 'BUNDLE_ID': install4jBundleId,
1825 'INTERNAL_ID': install4jInternalId,
1826 'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
1827 'MACOS_DS_STORE': install4jDSStore,
1828 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
1829 'INSTALLER_NAME': install4jInstallerName,
1830 'INSTALL4J_UTILS_DIR': install4j_utils_dir,
1831 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
1832 'GETDOWN_FILES_DIR': getdown_files_dir,
1833 'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
1834 'GETDOWN_DIST_DIR': getdownAppDistDir,
1835 'GETDOWN_ALT_DIR': getdown_app_dir_alt,
1836 'GETDOWN_INSTALL_DIR': getdown_install_dir,
1837 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
1838 'BUILD_DIR': install4jBuildDir,
1839 'APPLICATION_CATEGORIES': install4j_application_categories,
1840 'APPLICATION_FOLDER': install4jApplicationFolder,
1841 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
1842 'EXECUTABLE_NAME': install4jExecutableName,
1843 'EXTRA_SCHEME': install4jExtraScheme,
1846 //println("INSTALL4J VARIABLES:")
1847 //variables.each{k,v->println("${k}=${v}")}
1849 destination = "${jalviewDir}/${install4jBuildDir}"
1850 buildSelected = true
1852 if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
1854 disableSigning = true
1858 macKeystorePassword = OSX_KEYPASS
1862 println("Using projectFile "+projectFile)
1865 inputs.dir(getdownWebsiteDir)
1866 inputs.file(install4jConfFile)
1867 inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
1868 inputs.dir(macosJavaVMDir)
1869 inputs.dir(windowsJavaVMDir)
1870 outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
1876 eclipse().configFile(eclipse_codestyle_file)
1881 task sourceDist(type: Tar) {
1882 group "distribution"
1883 description "Create a source .tar.gz file for distribution"
1885 dependsOn convertMdFiles
1887 def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
1888 def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
1889 archiveFileName = outputFileName
1891 compression Compression.GZIP
1906 "**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales",
1908 "utils/InstallAnywhere",
1923 "gradle.properties",
1934 ".settings/org.eclipse.jdt.core.jalview.prefs",
1938 exclude (EXCLUDE_FILES)
1939 include (PROCESS_FILES)
1940 filter(ReplaceTokens,
1944 'Version-Rel': JALVIEW_VERSION,
1945 'Year-Rel': getDate("yyyy")
1950 exclude (EXCLUDE_FILES)
1951 exclude (PROCESS_FILES)
1952 exclude ("appletlib")
1953 exclude ("**/*locales")
1954 exclude ("*locales/**")
1955 exclude ("utils/InstallAnywhere")
1957 exclude (getdown_files_dir)
1958 exclude (getdown_website_dir)
1960 // exluding these as not using jars as modules yet
1961 exclude ("${j11modDir}/**/*.jar")
1964 include(INCLUDE_FILES)
1966 // from (jalviewDir) {
1967 // // explicit includes for stuff that seemed to not get included
1968 // include(fileTree("test/**/*."))
1969 // exclude(EXCLUDE_FILES)
1970 // exclude(PROCESS_FILES)
1977 dependsOn pubhtmlhelp
1979 inputs.dir("${helpBuildDir}/${help_dir}")
1980 outputs.dir("${buildDir}/distributions/${help_dir}")
1984 task j2sSetHeadlessBuild {
1991 task jalviewjsSetEclipseWorkspace {
1992 def propKey = "jalviewjs_eclipse_workspace"
1994 if (project.hasProperty(propKey)) {
1995 propVal = project.getProperty(propKey)
1996 if (propVal.startsWith("~/")) {
1997 propVal = System.getProperty("user.home") + propVal.substring(1)
2000 def propsFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
2001 def propsFile = file(propsFileName)
2002 def eclipseWsDir = propVal
2003 def props = new Properties()
2005 def writeProps = true
2006 if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && propsFile.exists()) {
2007 def ins = new FileInputStream(propsFileName)
2010 if (props.getProperty(propKey, null) != null) {
2011 eclipseWsDir = props.getProperty(propKey)
2016 if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
2017 def tempDir = File.createTempDir()
2018 eclipseWsDir = tempDir.getAbsolutePath()
2021 eclipseWorkspace = file(eclipseWsDir)
2024 // do not run a headless transpile when we claim to be in Eclipse
2026 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2027 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2029 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2033 props.setProperty(propKey, eclipseWsDir)
2034 propsFile.parentFile.mkdirs()
2035 def bytes = new ByteArrayOutputStream()
2036 props.store(bytes, null)
2037 def propertiesString = bytes.toString()
2038 propsFile.text = propertiesString
2044 println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
2047 //inputs.property(propKey, eclipseWsDir) // eclipseWsDir only gets set once this task runs, so will be out-of-date
2048 outputs.file(propsFileName)
2049 outputs.upToDateWhen { eclipseWorkspace.exists() && propsFile.exists() }
2053 task jalviewjsEclipsePaths {
2056 def eclipseRoot = jalviewjs_eclipse_root
2057 if (eclipseRoot.startsWith("~/")) {
2058 eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
2060 if (OperatingSystem.current().isMacOsX()) {
2061 eclipseRoot += "/Eclipse.app"
2062 eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse"
2063 eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct"
2064 } else if (OperatingSystem.current().isWindows()) { // check these paths!!
2065 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2066 eclipseRoot += "/eclipse"
2068 eclipseBinary = "${eclipseRoot}/eclipse.exe"
2069 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2070 } else { // linux or unix
2071 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2072 eclipseRoot += "/eclipse"
2073 println("eclipseDir exists")
2075 eclipseBinary = "${eclipseRoot}/eclipse"
2076 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2079 eclipseVersion = "4.13" // default
2080 def assumedVersion = true
2081 if (file(eclipseProduct).exists()) {
2082 def fis = new FileInputStream(eclipseProduct)
2083 def props = new Properties()
2085 eclipseVersion = props.getProperty("version")
2087 assumedVersion = false
2090 def propKey = "eclipse_debug"
2091 eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true"))
2094 // do not run a headless transpile when we claim to be in Eclipse
2096 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2097 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2099 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2102 if (!assumedVersion) {
2103 println("ECLIPSE VERSION=${eclipseVersion}")
2109 task printProperties {
2111 description "Output to console all System.properties"
2113 System.properties.each { key, val -> System.out.println("Property: ${key}=${val}") }
2119 dependsOn eclipseProject
2120 dependsOn eclipseClasspath
2121 dependsOn eclipseJdt
2125 // this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir
2126 task jalviewjsEclipseCopyDropins(type: Copy) {
2127 dependsOn jalviewjsEclipsePaths
2129 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar")
2130 inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}")
2131 def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}"
2138 // this eclipse -clean doesn't actually work
2139 task jalviewjsCleanEclipse(type: Exec) {
2140 dependsOn eclipseSetup
2141 dependsOn jalviewjsEclipsePaths
2142 dependsOn jalviewjsEclipseCopyDropins
2144 executable(eclipseBinary)
2145 args(["-nosplash", "--launcher.suppressErrors", "-data", eclipseWorkspace.getPath(), "-clean", "-console", "-consoleLog"])
2151 def inputString = """exit
2154 def inputByteStream = new ByteArrayInputStream(inputString.getBytes())
2155 standardInput = inputByteStream
2158 /* not really working yet
2159 jalviewjsEclipseCopyDropins.finalizedBy jalviewjsCleanEclipse
2163 task jalviewjsTransferUnzipSwingJs {
2164 def file_zip = "${jalviewDir}/${jalviewjs_swingjs_zip}"
2168 from zipTree(file_zip)
2169 into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2173 inputs.file file_zip
2174 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2178 task jalviewjsTransferUnzipLib {
2179 def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
2182 zipFiles.each { file_zip ->
2184 from zipTree(file_zip)
2185 into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2190 inputs.files zipFiles
2191 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2195 task jalviewjsTransferUnzipAllLibs {
2196 dependsOn jalviewjsTransferUnzipSwingJs
2197 dependsOn jalviewjsTransferUnzipLib
2201 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
2203 description "Create the .j2s file from the j2s.* properties"
2205 jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
2206 def siteDirProperty = "j2s.site.directory"
2207 def setSiteDir = false
2208 jalviewjsJ2sProps.each { prop, val ->
2210 if (prop == siteDirProperty) {
2211 if (!(val.startsWith('/') || val.startsWith("file://") )) {
2212 val = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${val}"
2218 if (!setSiteDir) { // default site location, don't override specifically set property
2219 property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
2222 outputFile = jalviewjsJ2sSettingsFileName
2225 inputs.properties(jalviewjsJ2sProps)
2226 outputs.file(jalviewjsJ2sSettingsFileName)
2231 task jalviewjsEclipseSetup {
2232 dependsOn jalviewjsEclipseCopyDropins
2233 dependsOn jalviewjsSetEclipseWorkspace
2234 dependsOn jalviewjsCreateJ2sSettings
2238 task jalviewjsSyncAllLibs (type: Sync) {
2239 dependsOn jalviewjsTransferUnzipAllLibs
2240 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
2241 inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
2242 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2246 def outputFiles = []
2247 rename { filename ->
2248 outputFiles += "${outputDir}/${filename}"
2254 outputs.files outputFiles
2255 inputs.files inputFiles
2259 task jalviewjsSyncResources (type: Sync) {
2260 def inputFiles = fileTree(dir: resourceDir)
2261 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2265 def outputFiles = []
2266 rename { filename ->
2267 outputFiles += "${outputDir}/${filename}"
2273 outputs.files outputFiles
2274 inputs.files inputFiles
2278 task jalviewjsSyncSiteResources (type: Sync) {
2279 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}")
2280 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2284 def outputFiles = []
2285 rename { filename ->
2286 outputFiles += "${outputDir}/${filename}"
2292 outputs.files outputFiles
2293 inputs.files inputFiles
2297 task jalviewjsSyncBuildProperties (type: Sync) {
2298 dependsOn createBuildProperties
2299 def inputFiles = [file(buildProperties)]
2300 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2304 def outputFiles = []
2305 rename { filename ->
2306 outputFiles += "${outputDir}/${filename}"
2312 outputs.files outputFiles
2313 inputs.files inputFiles
2317 task jalviewjsProjectImport(type: Exec) {
2318 dependsOn eclipseSetup
2319 dependsOn jalviewjsEclipsePaths
2320 dependsOn jalviewjsEclipseSetup
2323 // do not run a headless import when we claim to be in Eclipse
2325 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2326 throw new StopExecutionException("Not running headless import whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2328 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2332 //def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
2333 def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
2334 executable(eclipseBinary)
2335 args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
2339 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2341 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2344 inputs.file("${jalviewDir}/.project")
2345 outputs.upToDateWhen {
2346 file(projdir).exists()
2351 task jalviewjsTranspile(type: Exec) {
2352 dependsOn jalviewjsEclipseSetup
2353 dependsOn jalviewjsProjectImport
2354 dependsOn jalviewjsEclipsePaths
2357 // do not run a headless transpile when we claim to be in Eclipse
2359 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2360 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2362 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2366 executable(eclipseBinary)
2367 args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipse_build_arg}", eclipse_project_name ])
2371 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2373 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2379 stdout = new ByteArrayOutputStream()
2380 stderr = new ByteArrayOutputStream()
2382 def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}"
2383 def logOutFile = file(logOutFileName)
2384 logOutFile.createNewFile()
2385 logOutFile.text = """ROOT: ${jalviewjs_eclipse_root}
2386 BINARY: ${eclipseBinary}
2387 VERSION: ${eclipseVersion}
2388 WORKSPACE: ${eclipseWorkspace}
2389 DEBUG: ${eclipseDebug}
2392 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2393 // combine stdout and stderr
2394 def logErrFOS = logOutFOS
2396 if (jalviewjs_j2s_to_console.equals("true")) {
2397 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2398 new org.apache.tools.ant.util.TeeOutputStream(
2402 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2403 new org.apache.tools.ant.util.TeeOutputStream(
2408 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2411 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2418 if (stdout.toString().contains("Error processing ")) {
2419 // j2s did not complete transpile
2420 //throw new TaskExecutionException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2421 if (jalviewjs_ignore_transpile_errors.equals("true")) {
2422 println("IGNORING TRANSPILE ERRORS")
2423 println("See eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2425 throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2430 inputs.dir("${jalviewDir}/${sourceDir}")
2431 outputs.dir("${jalviewDir}/${jalviewjsTransferSiteJsDir}")
2432 outputs.upToDateWhen( { file("${jalviewDir}/${jalviewjsTransferSiteJsDir}${jalviewjs_server_resource}").exists() } )
2436 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
2438 def stdout = new ByteArrayOutputStream()
2439 def stderr = new ByteArrayOutputStream()
2441 def coreFile = file(jsfile)
2443 msg = "Creating core for ${name}...\nGenerating ${jsfile}"
2445 logOutFile.createNewFile()
2446 logOutFile.append(msg+"\n")
2448 def coreTop = file(prefixFile)
2449 def coreBottom = file(suffixFile)
2450 coreFile.getParentFile().mkdirs()
2451 coreFile.createNewFile()
2452 coreFile.write( coreTop.getText("UTF-8") )
2456 def t = f.getText("UTF-8")
2457 t.replaceAll("Clazz\\.([^_])","Clazz_${1}")
2458 coreFile.append( t )
2460 msg = "...file '"+f.getPath()+"' does not exist, skipping"
2462 logOutFile.append(msg+"\n")
2465 coreFile.append( coreBottom.getText("UTF-8") )
2467 msg = "Generating ${zjsfile}"
2469 logOutFile.append(msg+"\n")
2470 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2471 def logErrFOS = logOutFOS
2474 classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
2475 main = "com.google.javascript.jscomp.CommandLineRunner"
2476 jvmArgs = [ "-Dfile.encoding=UTF-8" ]
2477 args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
2480 msg = "\nRunning '"+commandLine.join(' ')+"'\n"
2482 logOutFile.append(msg+"\n")
2484 if (logOutConsole) {
2485 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2486 new org.apache.tools.ant.util.TeeOutputStream(
2490 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2491 new org.apache.tools.ant.util.TeeOutputStream(
2496 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2499 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2506 logOutFile.append(msg+"\n")
2510 task jalviewjsBuildAllCores {
2512 description "Build the core js lib closures listed in the classlists dir"
2513 dependsOn jalviewjsTranspile
2514 dependsOn jalviewjsTransferUnzipSwingJs
2516 def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
2517 def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
2518 def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
2519 def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
2520 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
2521 def prefixFile = "${jsDir}/core/coretop2.js"
2522 def suffixFile = "${jsDir}/core/corebottom2.js"
2524 inputs.file prefixFile
2525 inputs.file suffixFile
2527 def classlistFiles = []
2528 // add the classlists found int the jalviewjs_classlists_dir
2529 fileTree(dir: "${jalviewDir}/${jalviewjs_classlists_dir}", include: "*.txt").each {
2531 def name = file.getName() - ".txt"
2538 // _jmol and _jalview cores. Add any other peculiar classlist.txt files here
2539 //classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jmol}"), 'name': "_jvjmol" ]
2540 classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jalview}"), 'name': jalviewjsJalviewCoreName ]
2542 jalviewjsCoreClasslists = []
2544 classlistFiles.each {
2547 def file = hash['file']
2548 if (! file.exists()) {
2549 //println("...classlist file '"+file.getPath()+"' does not exist, skipping")
2550 return false // this is a "continue" in groovy .each closure
2552 def name = hash['name']
2554 name = file.getName() - ".txt"
2562 def list = fileTree(dir: j2sDir, includes: filelist)
2564 def jsfile = "${outputDir}/core${name}.js"
2565 def zjsfile = "${outputDir}/core${name}.z.js"
2567 jalviewjsCoreClasslists += [
2576 outputs.file(jsfile)
2577 outputs.file(zjsfile)
2580 // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
2581 def stevesoftClasslistName = "_stevesoft"
2582 def stevesoftClasslist = [
2583 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
2584 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
2585 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
2586 'name': stevesoftClasslistName
2588 jalviewjsCoreClasslists += stevesoftClasslist
2589 inputs.files(stevesoftClasslist['list'])
2590 outputs.file(stevesoftClasslist['jsfile'])
2591 outputs.file(stevesoftClasslist['zjsfile'])
2594 def allClasslistName = "_all"
2595 def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
2596 allJsFiles += fileTree(
2600 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2601 "**/org/jmol/jvxl/readers/IsoIntersectFileReader.js",
2602 "**/org/jmol/export/JSExporter.js"
2605 allJsFiles += fileTree(
2609 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2610 "**/sun/misc/Unsafe.js",
2611 "**/swingjs/jquery/jquery-editable-select.js",
2612 "**/swingjs/jquery/j2sComboBox.js",
2613 "**/sun/misc/FloatingDecimal.js"
2616 def allClasslist = [
2617 'jsfile': "${outputDir}/core${allClasslistName}.js",
2618 'zjsfile': "${outputDir}/core${allClasslistName}.z.js",
2620 'name': allClasslistName
2622 // not including this version of "all" core at the moment
2623 //jalviewjsCoreClasslists += allClasslist
2624 inputs.files(allClasslist['list'])
2625 outputs.file(allClasslist['jsfile'])
2626 outputs.file(allClasslist['zjsfile'])
2629 def logOutFile = file("${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_closure_stdout}")
2630 logOutFile.getParentFile().mkdirs()
2631 logOutFile.createNewFile()
2632 logOutFile.write(getDate("yyyy-MM-dd HH:mm:ss")+" jalviewjsBuildAllCores\n----\n")
2634 jalviewjsCoreClasslists.each {
2635 jalviewjsCallCore(it.name, it.list, prefixFile, suffixFile, it.jsfile, it.zjsfile, logOutFile, jalviewjs_j2s_to_console.equals("true"))
2642 def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inputFile, String outputFile) {
2645 into file(outputFile).getParentFile()
2646 rename { filename ->
2647 if (filename.equals(inputFile.getName())) {
2648 return file(outputFile).getName()
2652 filter(ReplaceTokens,
2656 'MAIN': '"'+main_class+'"',
2658 'NAME': jalviewjsJalviewTemplateName+" [core ${coreName}]",
2659 'COREKEY': jalviewjs_core_key,
2660 'CORENAME': coreName
2667 task jalviewjsPublishCoreTemplates {
2668 dependsOn jalviewjsBuildAllCores
2669 def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
2670 def inputFile = file(inputFileName)
2671 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2673 def outputFiles = []
2674 jalviewjsCoreClasslists.each { cl ->
2675 def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html"
2676 cl['outputfile'] = outputFile
2677 outputFiles += outputFile
2681 jalviewjsCoreClasslists.each { cl ->
2682 jalviewjsPublishCoreTemplate(cl.name, jalviewjsJalviewTemplateName, inputFile, cl.outputfile)
2685 inputs.file(inputFile)
2686 outputs.files(outputFiles)
2690 task jalviewjsSyncCore (type: Sync) {
2691 dependsOn jalviewjsBuildAllCores
2692 dependsOn jalviewjsPublishCoreTemplates
2693 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
2694 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2698 def outputFiles = []
2699 rename { filename ->
2700 outputFiles += "${outputDir}/${filename}"
2706 outputs.files outputFiles
2707 inputs.files inputFiles
2711 // this Copy version of TransferSiteJs will delete anything else in the target dir
2712 task jalviewjsCopyTransferSiteJs(type: Copy) {
2713 dependsOn jalviewjsTranspile
2714 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2715 into "${jalviewDir}/${jalviewjsSiteDir}"
2719 // this Sync version of TransferSite is used by buildship to keep the website automatically up to date when a file changes
2720 task jalviewjsSyncTransferSiteJs(type: Sync) {
2721 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2723 into "${jalviewDir}/${jalviewjsSiteDir}"
2730 jalviewjsSyncAllLibs.mustRunAfter jalviewjsCopyTransferSiteJs
2731 jalviewjsSyncResources.mustRunAfter jalviewjsCopyTransferSiteJs
2732 jalviewjsSyncSiteResources.mustRunAfter jalviewjsCopyTransferSiteJs
2733 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsCopyTransferSiteJs
2735 jalviewjsSyncAllLibs.mustRunAfter jalviewjsSyncTransferSiteJs
2736 jalviewjsSyncResources.mustRunAfter jalviewjsSyncTransferSiteJs
2737 jalviewjsSyncSiteResources.mustRunAfter jalviewjsSyncTransferSiteJs
2738 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
2741 task jalviewjsPrepareSite {
2743 description "Prepares the website folder including unzipping files and copying resources"
2744 dependsOn jalviewjsSyncAllLibs
2745 dependsOn jalviewjsSyncResources
2746 dependsOn jalviewjsSyncSiteResources
2747 dependsOn jalviewjsSyncBuildProperties
2748 dependsOn jalviewjsSyncCore
2752 task jalviewjsBuildSite {
2754 description "Builds the whole website including transpiled code"
2755 dependsOn jalviewjsCopyTransferSiteJs
2756 dependsOn jalviewjsPrepareSite
2760 task cleanJalviewjsTransferSite {
2762 delete "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2763 delete "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2764 delete "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2765 delete "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2770 task cleanJalviewjsSite {
2771 dependsOn cleanJalviewjsTransferSite
2773 delete "${jalviewDir}/${jalviewjsSiteDir}"
2778 task jalviewjsSiteTar(type: Tar) {
2780 description "Creates a tar.gz file for the website"
2781 dependsOn jalviewjsBuildSite
2782 def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
2783 archiveFileName = outputFilename
2785 compression Compression.GZIP
2787 from "${jalviewDir}/${jalviewjsSiteDir}"
2788 into jalviewjs_site_dir // this is inside the tar file
2790 inputs.dir("${jalviewDir}/${jalviewjsSiteDir}")
2794 task jalviewjsServer {
2796 def filename = "jalviewjsTest.html"
2797 description "Starts a webserver on localhost to test the website. See ${filename} to access local site on most recently used port."
2798 def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
2801 SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory()
2802 def port = Integer.valueOf(jalviewjs_server_port)
2807 while(port < start+1000 && !running) {
2809 def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}")
2810 jalviewjsServer = factory.start(doc_root, port)
2812 url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource)
2813 println("SERVER STARTED with document root ${doc_root}.")
2814 println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).")
2815 println("For debug: "+url+"?j2sdebug")
2816 println("For verbose: "+url+"?j2sverbose")
2817 } catch (Exception e) {
2822 <p><a href="${url}">JalviewJS Test. <${url}></a></p>
2823 <p><a href="${url}?j2sdebug">JalviewJS Test with debug. <${url}?j2sdebug></a></p>
2824 <p><a href="${url}?j2sverbose">JalviewJS Test with verbose. <${url}?j2sdebug></a></p>
2826 jalviewjsCoreClasslists.each { cl ->
2827 def urlcore = jalviewjsServer.getResourceUrl(file(cl.outputfile).getName())
2829 <p><a href="${urlcore}">${jalviewjsJalviewTemplateName} [core ${cl.name}]. <${urlcore}></a></p>
2831 println("For core ${cl.name}: "+urlcore)
2834 file(htmlFile).text = htmlText
2837 outputs.file(htmlFile)
2838 outputs.upToDateWhen({false})
2842 task cleanJalviewjsAll {
2844 description "Delete all configuration and build artifacts to do with JalviewJS build"
2845 dependsOn cleanJalviewjsSite
2846 dependsOn jalviewjsEclipsePaths
2849 delete "${jalviewDir}/${jalviewjsBuildDir}"
2850 delete "${jalviewDir}/${eclipse_bin_dir}"
2851 if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
2852 delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
2854 delete "${jalviewDir}/${jalviewjs_j2s_settings}"
2857 outputs.upToDateWhen( { false } )
2861 task jalviewjsIDE_checkJ2sPlugin {
2862 group "00 JalviewJS in Eclipse"
2863 description "Compare the swingjs/net.sf.j2s.core(-j11)?.jar file with the Eclipse IDE's plugin version (found in the 'dropins' dir)"
2866 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2867 def j2sPluginFile = file(j2sPlugin)
2868 def eclipseHome = System.properties["eclipse.home.location"]
2869 if (eclipseHome == null || ! IN_ECLIPSE) {
2870 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. Skipping J2S Plugin Check.")
2872 def eclipseJ2sPluginDirs = [ "${eclipseHome}/dropins" ]
2873 def altPluginsDir = System.properties["org.eclipse.equinox.p2.reconciler.dropins.directory"]
2874 if (altPluginsDir != null && file(altPluginsDir).exists()) {
2875 eclipseJ2sPluginDirs += altPluginsDir
2877 def foundPlugin = false
2878 def j2sPluginFileName = j2sPluginFile.getName()
2879 def eclipseJ2sPlugin
2880 def eclipseJ2sPluginFile
2881 eclipseJ2sPluginDirs.any { dir ->
2882 eclipseJ2sPlugin = "${dir}/${j2sPluginFileName}"
2883 eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2884 if (eclipseJ2sPluginFile.exists()) {
2890 def msg = "Eclipse J2S Plugin is not installed (could not find '${j2sPluginFileName}' in\n"+eclipseJ2sPluginDirs.join("\n")+"\n)\nTry running task jalviewjsIDE_copyJ2sPlugin"
2891 System.err.println(msg)
2892 throw new StopExecutionException(msg)
2895 def digest = MessageDigest.getInstance("MD5")
2897 digest.update(j2sPluginFile.text.bytes)
2898 def j2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2900 digest.update(eclipseJ2sPluginFile.text.bytes)
2901 def eclipseJ2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2903 if (j2sPluginMd5 != eclipseJ2sPluginMd5) {
2904 def msg = "WARNING! Eclipse J2S Plugin '${eclipseJ2sPlugin}' is different to this commit's version '${j2sPlugin}'"
2905 System.err.println(msg)
2906 throw new StopExecutionException(msg)
2908 def msg = "Eclipse J2S Plugin '${eclipseJ2sPlugin}' is the same as '${j2sPlugin}' (this is good)"
2914 task jalviewjsIDE_copyJ2sPlugin {
2915 group "00 JalviewJS in Eclipse"
2916 description "Copy the swingjs/net.sf.j2s.core(-j11)?.jar file into the Eclipse IDE's 'dropins' dir"
2919 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2920 def j2sPluginFile = file(j2sPlugin)
2921 def eclipseHome = System.properties["eclipse.home.location"]
2922 if (eclipseHome == null || ! IN_ECLIPSE) {
2923 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. NOT copying J2S Plugin.")
2925 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
2926 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2927 def msg = "WARNING! Copying this commit's j2s plugin '${j2sPlugin}' to Eclipse J2S Plugin '${eclipseJ2sPlugin}'\n* May require an Eclipse restart"
2928 System.err.println(msg)
2931 eclipseJ2sPluginFile.getParentFile().mkdirs()
2932 into eclipseJ2sPluginFile.getParent()
2938 task jalviewjsIDE_j2sFile {
2939 group "00 JalviewJS in Eclipse"
2940 description "Creates the .j2s file"
2941 dependsOn jalviewjsCreateJ2sSettings
2945 task jalviewjsIDE_SyncCore {
2946 group "00 JalviewJS in Eclipse"
2947 description "Build the core js lib closures listed in the classlists dir and publish core html from template"
2948 dependsOn jalviewjsSyncCore
2952 task jalviewjsIDE_SyncSiteAll {
2953 dependsOn jalviewjsSyncAllLibs
2954 dependsOn jalviewjsSyncResources
2955 dependsOn jalviewjsSyncSiteResources
2956 dependsOn jalviewjsSyncBuildProperties
2960 cleanJalviewjsTransferSite.mustRunAfter jalviewjsIDE_SyncSiteAll
2963 task jalviewjsIDE_PrepareSite {
2964 group "00 JalviewJS in Eclipse"
2965 description "Sync libs and resources to site dir, but not closure cores"
2967 dependsOn jalviewjsIDE_SyncSiteAll
2968 //dependsOn cleanJalviewjsTransferSite // not sure why this clean is here -- will slow down a re-run of this task
2972 task jalviewjsIDE_AssembleSite {
2973 group "00 JalviewJS in Eclipse"
2974 description "Assembles unzipped supporting zipfiles, resources, site resources and closure cores into the Eclipse transpiled site"
2975 dependsOn jalviewjsPrepareSite
2979 task jalviewjsIDE_SiteClean {
2980 group "00 JalviewJS in Eclipse"
2981 description "Deletes the Eclipse transpiled site"
2982 dependsOn cleanJalviewjsSite
2986 task jalviewjsIDE_Server {
2987 group "00 JalviewJS in Eclipse"
2988 description "Starts a webserver on localhost to test the website"
2989 dependsOn jalviewjsServer
2993 // buildship runs this at import or gradle refresh
2994 task eclipseSynchronizationTask {
2995 //dependsOn eclipseSetup
2996 dependsOn createBuildProperties
2998 dependsOn jalviewjsIDE_j2sFile
2999 dependsOn jalviewjsIDE_checkJ2sPlugin
3000 dependsOn jalviewjsIDE_PrepareSite
3005 // buildship runs this at build time or project refresh
3006 task eclipseAutoBuildTask {
3007 //dependsOn jalviewjsIDE_checkJ2sPlugin
3008 //dependsOn jalviewjsIDE_PrepareSite
3014 description "Build the site"
3015 dependsOn jalviewjsBuildSite