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}/resource")
448 resourcesBuildDir = string("${resourceBuildDir}/resources")
449 helpBuildDir = string("${resourceBuildDir}/${help_dir}")
450 docBuildDir = string("${resourceBuildDir}/${doc_dir}")
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.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
497 compileClasspath = files(sourceSets.main.java.outputDir)
498 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
500 runtimeClasspath = compileClasspath
505 srcDirs cloverInstrDir
506 outputDir = cloverClassesDir
510 srcDirs = sourceSets.main.resources.srcDirs
513 compileClasspath = files( sourceSets.clover.java.outputDir )
514 //compileClasspath += files( testClassesDir )
515 compileClasspath += fileTree(dir: "${jalviewDir}/${libDir}", include: ["*.jar"])
516 compileClasspath += fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
517 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
519 runtimeClasspath = compileClasspath
524 srcDirs testSourceDir
525 outputDir = file(testClassesDir)
529 srcDirs = useClover ? sourceSets.clover.resources.srcDirs : sourceSets.main.resources.srcDirs
532 compileClasspath = files( sourceSets.test.java.outputDir )
533 compileClasspath += useClover ? sourceSets.clover.compileClasspath : sourceSets.main.compileClasspath
534 compileClasspath += fileTree(dir: "${jalviewDir}/${utils_dir}/testnglibs", include: ["**/*.jar"])
536 runtimeClasspath = compileClasspath
542 // eclipse project and settings files creation, also used by buildship
545 name = eclipse_project_name
547 natures 'org.eclipse.jdt.core.javanature',
548 'org.eclipse.jdt.groovy.core.groovyNature',
549 'org.eclipse.buildship.core.gradleprojectnature'
551 buildCommand 'org.eclipse.jdt.core.javabuilder'
552 buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
556 //defaultOutputDir = sourceSets.main.java.outputDir
557 configurations.each{ c->
558 if (c.isCanBeResolved()) {
559 minusConfigurations += [c]
563 plusConfigurations = [ ]
567 def removeTheseToo = []
568 HashMap<String, Boolean> alreadyAddedSrcPath = new HashMap<>();
569 cp.entries.each { entry ->
570 // This conditional removes all src classpathentries that a) have already been added or b) aren't "src" or "test".
571 // e.g. this removes the resources dir being copied into bin/main, bin/test AND bin/clover
572 // we add the resources and help/help dirs in as libs afterwards (see below)
573 if (entry.kind == 'src') {
574 if (alreadyAddedSrcPath.getAt(entry.path) || !(entry.path == bareSourceDir || entry.path == bareTestSourceDir)) {
575 removeTheseToo += entry
577 alreadyAddedSrcPath.putAt(entry.path, true)
582 cp.entries.removeAll(removeTheseToo)
584 //cp.entries += new Output("${eclipse_bin_dir}/main")
585 if (file(helpParentDir).isDirectory()) {
586 cp.entries += new Library(fileReference(helpParentDir))
588 if (file(resourceDir).isDirectory()) {
589 cp.entries += new Library(fileReference(resourceDir))
592 HashMap<String, Boolean> alreadyAddedLibPath = new HashMap<>();
594 sourceSets.main.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
595 //don't want to add outputDir as eclipse is using its own output dir in bin/main
596 if (it.isDirectory() || ! it.exists()) {
597 // don't add dirs to classpath, especially if they don't exist
598 return false // groovy "continue" in .any closure
600 def itPath = it.toString()
601 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
602 // make relative path
603 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
605 if (alreadyAddedLibPath.get(itPath)) {
606 //println("Not adding duplicate entry "+itPath)
608 //println("Adding entry "+itPath)
609 cp.entries += new Library(fileReference(itPath))
610 alreadyAddedLibPath.put(itPath, true)
614 sourceSets.test.compileClasspath.findAll { it.name.endsWith(".jar") }.any {
615 //no longer want to add outputDir as eclipse is using its own output dir in bin/main
616 if (it.isDirectory() || ! it.exists()) {
617 // don't add dirs to classpath
618 return false // groovy "continue" in .any closure
621 def itPath = it.toString()
622 if (itPath.startsWith("${jalviewDirAbsolutePath}/")) {
623 itPath = itPath.substring(jalviewDirAbsolutePath.length()+1)
625 if (alreadyAddedLibPath.get(itPath)) {
628 def lib = new Library(fileReference(itPath))
629 lib.entryAttributes["test"] = "true"
631 alreadyAddedLibPath.put(itPath, true)
639 containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
644 // for the IDE, use java 11 compatibility
645 sourceCompatibility = compile_source_compatibility
646 targetCompatibility = compile_target_compatibility
647 javaRuntimeName = eclipseJavaRuntimeName
649 // add in jalview project specific properties/preferences into eclipse core preferences
651 withProperties { props ->
652 def jalview_prefs = new Properties()
653 def ins = new FileInputStream("${jalviewDirAbsolutePath}/${eclipse_extra_jdt_prefs_file}")
654 jalview_prefs.load(ins)
656 jalview_prefs.forEach { t, v ->
657 if (props.getAt(t) == null) {
661 // codestyle file -- overrides previous formatter prefs
662 def csFile = file("${jalviewDirAbsolutePath}/${eclipse_codestyle_file}")
663 if (csFile.exists()) {
664 XmlParser parser = new XmlParser()
665 def profiles = parser.parse(csFile)
666 def profile = profiles.'profile'.find { p -> (p.'@kind' == "CodeFormatterProfile" && p.'@name' == "Jalview") }
667 if (profile != null) {
668 profile.'setting'.each { s ->
670 def value = s.'@value'
671 if (id != null && value != null) {
672 props.putAt(id, value)
683 // Don't want these to be activated if in headless build
684 synchronizationTasks "eclipseSynchronizationTask"
685 //autoBuildTasks "eclipseAutoBuildTask"
691 /* hack to change eclipse prefs in .settings files other than org.eclipse.jdt.core.prefs */
692 // Class to allow updating arbitrary properties files
693 class PropertiesFile extends PropertiesPersistableConfigurationObject {
694 public PropertiesFile(PropertiesTransformer t) { super(t); }
695 @Override protected void load(Properties properties) { }
696 @Override protected void store(Properties properties) { }
697 @Override protected String getDefaultResourceName() { return ""; }
698 // This is necessary, because PropertiesPersistableConfigurationObject fails
699 // if no default properties file exists.
700 @Override public void loadDefaults() { load(new StringBufferInputStream("")); }
703 // Task to update arbitrary properties files (set outputFile)
704 class PropertiesFileTask extends PropertiesGeneratorTask<PropertiesFile> {
705 private final PropertiesFileContentMerger file;
706 public PropertiesFileTask() { file = new PropertiesFileContentMerger(getTransformer()); }
707 protected PropertiesFile create() { return new PropertiesFile(getTransformer()); }
708 protected void configure(PropertiesFile props) {
709 file.getBeforeMerged().execute(props); file.getWhenMerged().execute(props);
711 public void file(Closure closure) { ConfigureUtil.configure(closure, file); }
714 task eclipseUIPreferences(type: PropertiesFileTask) {
715 description = "Generate Eclipse additional settings"
716 def filename = "org.eclipse.jdt.ui.prefs"
717 outputFile = "$projectDir/.settings/${filename}" as File
720 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
725 task eclipseGroovyCorePreferences(type: PropertiesFileTask) {
726 description = "Generate Eclipse additional settings"
727 def filename = "org.eclipse.jdt.groovy.core.prefs"
728 outputFile = "$projectDir/.settings/${filename}" as File
731 it.load new FileInputStream("$projectDir/utils/eclipse/${filename}" as String)
736 task eclipseAllPreferences {
738 dependsOn eclipseUIPreferences
739 dependsOn eclipseGroovyCorePreferences
742 eclipseUIPreferences.mustRunAfter eclipseJdt
743 eclipseGroovyCorePreferences.mustRunAfter eclipseJdt
745 /* end of eclipse preferences hack */
753 delete cloverBuildDir
754 delete cloverReportDir
759 task cloverInstrJava(type: JavaExec) {
760 group = "Verification"
761 description = "Create clover instrumented source java files"
763 dependsOn cleanClover
765 inputs.files(sourceSets.main.allJava)
766 outputs.dir(cloverInstrDir)
768 //classpath = fileTree(dir: "${jalviewDir}/${clover_lib_dir}", include: ["*.jar"])
769 classpath = sourceSets.clover.compileClasspath
770 main = "com.atlassian.clover.CloverInstr"
778 cloverInstrDir.getPath(),
780 def srcFiles = sourceSets.main.allJava.files
783 { file -> file.absolutePath }
786 args argsList.toArray()
789 delete cloverInstrDir
790 println("Clover: About to instrument "+srcFiles.size() +" files")
795 task cloverInstrTests(type: JavaExec) {
796 group = "Verification"
797 description = "Create clover instrumented source test files"
799 dependsOn cleanClover
801 inputs.files(testDir)
802 outputs.dir(cloverTestInstrDir)
804 classpath = sourceSets.clover.compileClasspath
805 main = "com.atlassian.clover.CloverInstr"
815 cloverTestInstrDir.getPath(),
817 args argsList.toArray()
820 delete cloverTestInstrDir
821 println("Clover: About to instrument test files")
827 group = "Verification"
828 description = "Create clover instrumented all source files"
830 dependsOn cloverInstrJava
831 dependsOn cloverInstrTests
835 cloverClasses.dependsOn cloverInstr
838 task cloverConsoleReport(type: JavaExec) {
839 group = "Verification"
840 description = "Creates clover console report"
843 file(cloverDb).exists()
846 inputs.dir cloverClassesDir
848 classpath = sourceSets.clover.runtimeClasspath
849 main = "com.atlassian.clover.reporters.console.ConsoleReporter"
851 if (cloverreport_mem.length() > 0) {
852 maxHeapSize = cloverreport_mem
854 if (cloverreport_jvmargs.length() > 0) {
855 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
865 args argsList.toArray()
869 task cloverHtmlReport(type: JavaExec) {
870 group = "Verification"
871 description = "Creates clover HTML report"
874 file(cloverDb).exists()
877 def cloverHtmlDir = cloverReportDir
878 inputs.dir cloverClassesDir
879 outputs.dir cloverHtmlDir
881 classpath = sourceSets.clover.runtimeClasspath
882 main = "com.atlassian.clover.reporters.html.HtmlReporter"
884 if (cloverreport_mem.length() > 0) {
885 maxHeapSize = cloverreport_mem
887 if (cloverreport_jvmargs.length() > 0) {
888 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
899 if (cloverreport_html_options.length() > 0) {
900 argsList += cloverreport_html_options.split(" ")
903 args argsList.toArray()
907 task cloverXmlReport(type: JavaExec) {
908 group = "Verification"
909 description = "Creates clover XML report"
912 file(cloverDb).exists()
915 def cloverXmlFile = "${cloverReportDir}/clover.xml"
916 inputs.dir cloverClassesDir
917 outputs.file cloverXmlFile
919 classpath = sourceSets.clover.runtimeClasspath
920 main = "com.atlassian.clover.reporters.xml.XMLReporter"
922 if (cloverreport_mem.length() > 0) {
923 maxHeapSize = cloverreport_mem
925 if (cloverreport_jvmargs.length() > 0) {
926 jvmArgs Arrays.asList(cloverreport_jvmargs.split(" "))
937 if (cloverreport_xml_options.length() > 0) {
938 argsList += cloverreport_xml_options.split(" ")
941 args argsList.toArray()
946 group = "Verification"
947 description = "Creates clover reports"
949 dependsOn cloverXmlReport
950 dependsOn cloverHtmlReport
957 sourceCompatibility = compile_source_compatibility
958 targetCompatibility = compile_target_compatibility
959 options.compilerArgs += additional_compiler_args
960 print ("Setting target compatibility to "+targetCompatibility+"\n")
962 //classpath += configurations.cloverRuntime
968 // JBP->BS should the print statement in doFirst refer to compile_target_compatibility ?
969 sourceCompatibility = compile_source_compatibility
970 targetCompatibility = compile_target_compatibility
971 options.compilerArgs = additional_compiler_args
972 options.encoding = "UTF-8"
974 print ("Setting target compatibility to "+compile_target_compatibility+"\n")
981 sourceCompatibility = compile_source_compatibility
982 targetCompatibility = compile_target_compatibility
983 options.compilerArgs = additional_compiler_args
985 print ("Setting target compatibility to "+targetCompatibility+"\n")
992 delete sourceSets.main.java.outputDir
998 dependsOn cleanClover
1000 delete sourceSets.test.java.outputDir
1005 // format is a string like date.format("dd MMMM yyyy")
1006 def getDate(format) {
1007 def date = new Date()
1008 return date.format(format)
1014 delete buildProperties
1019 task cleanBuildingHTML(type: Delete) {
1026 def convertMdToHtml (FileTree mdFiles, File cssFile) {
1027 MutableDataSet options = new MutableDataSet()
1029 def extensions = new ArrayList<>()
1030 extensions.add(AnchorLinkExtension.create())
1031 extensions.add(AutolinkExtension.create())
1032 extensions.add(StrikethroughExtension.create())
1033 extensions.add(TaskListExtension.create())
1034 extensions.add(TablesExtension.create())
1035 extensions.add(TocExtension.create())
1037 options.set(Parser.EXTENSIONS, extensions)
1039 // set GFM table parsing options
1040 options.set(TablesExtension.WITH_CAPTION, false)
1041 options.set(TablesExtension.COLUMN_SPANS, false)
1042 options.set(TablesExtension.MIN_HEADER_ROWS, 1)
1043 options.set(TablesExtension.MAX_HEADER_ROWS, 1)
1044 options.set(TablesExtension.APPEND_MISSING_COLUMNS, true)
1045 options.set(TablesExtension.DISCARD_EXTRA_COLUMNS, true)
1046 options.set(TablesExtension.HEADER_SEPARATOR_COLUMN_MATCH, true)
1048 options.set(AnchorLinkExtension.ANCHORLINKS_SET_ID, false)
1049 options.set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor")
1050 options.set(AnchorLinkExtension.ANCHORLINKS_SET_NAME, true)
1051 options.set(AnchorLinkExtension.ANCHORLINKS_TEXT_PREFIX, "<span class=\"octicon octicon-link\"></span>")
1053 Parser parser = Parser.builder(options).build()
1054 HtmlRenderer renderer = HtmlRenderer.builder(options).build()
1056 mdFiles.each { mdFile ->
1057 // add table of contents
1058 def mdText = "[TOC]\n"+mdFile.text
1060 // grab the first top-level title
1062 def titleRegex = /(?m)^#(\s+|([^#]))(.*)/
1063 def matcher = mdText =~ titleRegex
1064 if (matcher.size() > 0) {
1065 // matcher[0][2] is the first character of the title if there wasn't any whitespace after the #
1066 title = (matcher[0][2] != null ? matcher[0][2] : "")+matcher[0][3]
1068 // or use the filename if none found
1069 if (title == null) {
1070 title = mdFile.getName()
1073 Node document = parser.parse(mdText)
1074 String htmlBody = renderer.render(document)
1075 def htmlText = '''<html>
1076 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1077 <html xmlns="http://www.w3.org/1999/xhtml">
1079 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1080 <meta http-equiv="Content-Style-Type" content="text/css" />
1081 <meta name="generator" content="flexmark" />
1083 htmlText += ((title != null) ? " <title>${title}</title>" : '' )
1085 <style type="text/css">code{white-space: pre;}</style>
1087 htmlText += ((cssFile != null) ? cssFile.text : '')
1088 htmlText += '''</head>
1091 htmlText += htmlBody
1097 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1098 def htmlFile = file(htmlFilePath)
1099 htmlFile.text = htmlText
1104 task convertMdFiles {
1105 dependsOn cleanBuildingHTML
1106 def mdFiles = fileTree(dir: "${jalviewDir}/${doc_dir}", include: "*.md")
1107 def cssFile = file("${jalviewDir}/${flexmark_css}")
1110 convertMdToHtml(mdFiles, cssFile)
1113 inputs.files(mdFiles)
1114 inputs.file(cssFile)
1117 mdFiles.each { mdFile ->
1118 def htmlFilePath = mdFile.getPath().replaceAll(/\..*?$/, ".html")
1119 htmlFiles.add(file(htmlFilePath))
1121 outputs.files(htmlFiles)
1125 task copyDocs(type: Copy) {
1126 dependsOn convertMdFiles
1127 def syncDir = "${docBuildDir}"
1128 from ("${jalviewDir}/${doc_dir}") {
1132 filter(ReplaceTokens,
1136 'Version-Rel': JALVIEW_VERSION,
1137 'Year-Rel': getDate("yyyy")
1145 task copyHelp(type: Copy) {
1146 def inputDir = helpSourceDir
1147 def outputDir = "${helpBuildDir}"
1152 filter(ReplaceTokens,
1156 'Version-Rel': JALVIEW_VERSION,
1157 'Year-Rel': getDate("yyyy")
1168 inputs.dir(inputDir)
1169 outputs.files(helpFile)
1170 outputs.dir(outputDir)
1174 task copyResources(type: Copy) {
1176 filter(ReplaceTokens,
1180 'Version-Rel': JALVIEW_VERSION,
1181 'Year-Rel': getDate("yyyy")
1186 into "${resourcesBuildDir}"
1193 task createBuildProperties(type: WriteProperties) {
1194 dependsOn copyResources
1196 description = "Create the ${buildProperties} file"
1198 inputs.dir(sourceDir)
1199 inputs.dir(resourcesBuildDir)
1200 //println("MKDIRS "+file(buildProperties).getParentFile().toString())
1202 // file(buildProperties).getParentFile().mkdirs()
1204 outputFile (buildProperties)
1205 // taking time specific comment out to allow better incremental builds
1206 comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd HH:mm:ss")
1207 //comment "--Jalview Build Details--\n"+getDate("yyyy-MM-dd")
1208 property "BUILD_DATE", getDate("HH:mm:ss dd MMMM yyyy")
1209 property "VERSION", JALVIEW_VERSION
1210 property "INSTALLATION", INSTALLATION+" git-commit:"+gitHash+" ["+gitBranch+"]"
1211 outputs.file(outputFile)
1216 dependsOn copyResources
1220 jar.dependsOn prepare
1223 //testReportDirName = "test-reports" // note that test workingDir will be $jalviewDir
1226 //dependsOn compileJava ////? DELETE
1229 dependsOn cloverClasses
1231 dependsOn compileJava //?
1235 includeGroups testng_groups
1236 excludeGroups testng_excluded_groups
1238 useDefaultListeners=true
1241 maxHeapSize = "1024m"
1243 workingDir = jalviewDir
1244 //systemProperties 'clover.jar' System.properties.clover.jar
1245 def testLaf = project.findProperty("test_laf")
1246 if (testLaf != null) {
1247 println("Setting Test LaF to '${testLaf}'")
1248 systemProperty "laf", testLaf
1250 sourceCompatibility = compile_source_compatibility
1251 targetCompatibility = compile_target_compatibility
1252 jvmArgs += additional_compiler_args
1256 println("Running tests " + (useClover?"WITH":"WITHOUT") + " clover")
1262 task buildIndices(type: JavaExec) {
1264 classpath = sourceSets.main.compileClasspath
1265 main = "com.sun.java.help.search.Indexer"
1266 workingDir = "${helpBuildDir}"
1269 inputs.dir("${workingDir}/${argDir}")
1271 outputs.dir("${classesDir}/doc")
1272 outputs.dir("${classesDir}/help")
1273 outputs.file("${workingDir}/JavaHelpSearch/DOCS")
1274 outputs.file("${workingDir}/JavaHelpSearch/DOCS.TAB")
1275 outputs.file("${workingDir}/JavaHelpSearch/OFFSETS")
1276 outputs.file("${workingDir}/JavaHelpSearch/POSITIONS")
1277 outputs.file("${workingDir}/JavaHelpSearch/SCHEMA")
1278 outputs.file("${workingDir}/JavaHelpSearch/TMAP")
1282 task compileLinkCheck(type: JavaCompile) {
1284 classpath = files("${jalviewDir}/${utils_dir}")
1285 destinationDir = file("${jalviewDir}/${utils_dir}")
1286 source = fileTree(dir: "${jalviewDir}/${utils_dir}", include: ["HelpLinksChecker.java", "BufferedLineReader.java"])
1288 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1289 inputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.java")
1290 outputs.file("${jalviewDir}/${utils_dir}/HelpLinksChecker.class")
1291 outputs.file("${jalviewDir}/${utils_dir}/BufferedLineReader.class")
1295 task linkCheck(type: JavaExec) {
1296 dependsOn prepare, compileLinkCheck
1298 def helpLinksCheckerOutFile = file("${jalviewDir}/${utils_dir}/HelpLinksChecker.out")
1299 classpath = files("${jalviewDir}/${utils_dir}")
1300 main = "HelpLinksChecker"
1301 workingDir = jalviewDir
1302 def helpBuildDir = "${helpBuildDir}"
1303 args = [ helpBuildDir, "-nointernet" ]
1305 def outFOS = new FileOutputStream(helpLinksCheckerOutFile, false) // false == don't append
1307 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
1310 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
1314 inputs.dir(helpBuildDir)
1315 outputs.file(helpLinksCheckerOutFile)
1318 // import the pubhtmlhelp target
1319 ant.properties.basedir = "${jalviewDir}"
1320 ant.properties.helpBuildDir = "${jalviewDirAbsolutePath}/${helpBuildDir}"
1321 ant.importBuild "${utils_dir}/publishHelp.xml"
1324 task cleanPackageDir(type: Delete) {
1326 delete fileTree(dir: "${jalviewDir}/${package_dir}", include: "*.jar")
1333 dependsOn buildIndices
1334 dependsOn createBuildProperties
1337 attributes "Main-Class": main_class,
1338 "Permissions": "all-permissions",
1339 "Application-Name": install4jApplicationName,
1340 "Codebase": application_codebase,
1341 "Implementation-Version": JALVIEW_VERSION
1344 destinationDirectory = file("${jalviewDir}/${package_dir}")
1345 archiveFileName = rootProject.name+".jar"
1351 exclude "**/*.jar.*"
1353 inputs.dir(classesDir)
1354 outputs.file("${jalviewDir}/${package_dir}/${archiveFileName}")
1358 task copyJars(type: Copy) {
1359 from fileTree(dir: classesDir, include: "**/*.jar").files
1360 into "${jalviewDir}/${package_dir}"
1364 // doing a Sync instead of Copy as Copy doesn't deal with "outputs" very well
1365 task syncJars(type: Sync) {
1367 from fileTree(dir: "${jalviewDir}/${libDistDir}", include: "**/*.jar").files
1368 into "${jalviewDir}/${package_dir}"
1370 include jar.archiveFileName.getOrNull()
1377 description = "Put all required libraries in dist"
1378 // order of "cleanPackageDir", "copyJars", "jar" important!
1379 jar.mustRunAfter cleanPackageDir
1380 syncJars.mustRunAfter cleanPackageDir
1381 dependsOn cleanPackageDir
1384 outputs.dir("${jalviewDir}/${package_dir}")
1389 dependsOn cleanPackageDir
1395 group = "distribution"
1396 description = "Create a single jar file with all dependency libraries merged. Can be run with java -jar"
1400 from ("${jalviewDir}/${libDistDir}") {
1404 attributes "Implementation-Version": JALVIEW_VERSION,
1405 "Application-Name": install4jApplicationName
1407 mainClassName = shadow_jar_main_class
1409 classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
1414 task getdownWebsite() {
1415 group = "distribution"
1416 description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
1421 def getdownWebsiteResourceFilenames = []
1422 def getdownTextString = ""
1423 def getdownResourceDir = getdownResourceDir
1424 def getdownResourceFilenames = []
1427 // clean the getdown website and files dir before creating getdown folders
1428 delete getdownWebsiteDir
1429 delete getdownFilesDir
1432 from buildProperties
1433 rename(build_properties_file, getdown_build_properties)
1436 getdownWebsiteResourceFilenames += "${getdownAppDistDir}/${getdown_build_properties}"
1438 // set some getdown_txt_ properties then go through all properties looking for getdown_txt_...
1439 def props = project.properties.sort { it.key }
1440 if (getdownAltJavaMinVersion != null && getdownAltJavaMinVersion.length() > 0) {
1441 props.put("getdown_txt_java_min_version", getdownAltJavaMinVersion)
1443 if (getdownAltJavaMaxVersion != null && getdownAltJavaMaxVersion.length() > 0) {
1444 props.put("getdown_txt_java_max_version", getdownAltJavaMaxVersion)
1446 if (getdownAltMultiJavaLocation != null && getdownAltMultiJavaLocation.length() > 0) {
1447 props.put("getdown_txt_multi_java_location", getdownAltMultiJavaLocation)
1450 props.put("getdown_txt_title", jalview_name)
1451 props.put("getdown_txt_ui.name", install4jApplicationName)
1453 // start with appbase
1454 getdownTextString += "appbase = ${getdownAppBase}\n"
1455 props.each{ prop, val ->
1456 if (prop.startsWith("getdown_txt_") && val != null) {
1457 if (prop.startsWith("getdown_txt_multi_")) {
1458 def key = prop.substring(18)
1459 val.split(",").each{ v ->
1460 def line = "${key} = ${v}\n"
1461 getdownTextString += line
1464 // file values rationalised
1465 if (val.indexOf('/') > -1 || prop.startsWith("getdown_txt_resource")) {
1467 if (val.indexOf('/') == 0) {
1470 } else if (val.indexOf('/') > 0) {
1471 // relative path (relative to jalviewDir)
1472 r = file( "${jalviewDir}/${val}" )
1475 val = "${getdown_resource_dir}/" + r.getName()
1476 getdownWebsiteResourceFilenames += val
1477 getdownResourceFilenames += r.getPath()
1480 if (! prop.startsWith("getdown_txt_resource")) {
1481 def line = prop.substring(12) + " = ${val}\n"
1482 getdownTextString += line
1488 getdownWebsiteResourceFilenames.each{ filename ->
1489 getdownTextString += "resource = ${filename}\n"
1491 getdownResourceFilenames.each{ filename ->
1494 into getdownResourceDir
1499 fileTree(file(package_dir)).each{ f ->
1500 if (f.isDirectory()) {
1501 def files = fileTree(dir: f, include: ["*"]).getFiles()
1503 } else if (f.exists()) {
1507 codeFiles.sort().each{f ->
1508 def name = f.getName()
1509 def line = "code = ${getdownAppDistDir}/${name}\n"
1510 getdownTextString += line
1517 // NOT USING MODULES YET, EVERYTHING SHOULD BE IN dist
1519 if (JAVA_VERSION.equals("11")) {
1520 def j11libFiles = fileTree(dir: "${jalviewDir}/${j11libDir}", include: ["*.jar"]).getFiles()
1521 j11libFiles.sort().each{f ->
1522 def name = f.getName()
1523 def line = "code = ${getdown_j11lib_dir}/${name}\n"
1524 getdownTextString += line
1527 into getdownJ11libDir
1533 // 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.
1534 //getdownTextString += "class = " + file(getdownLauncher).getName() + "\n"
1535 getdownTextString += "resource = ${getdown_launcher_new}\n"
1536 getdownTextString += "class = ${main_class}\n"
1538 def getdown_txt = file("${getdownWebsiteDir}/getdown.txt")
1539 getdown_txt.write(getdownTextString)
1541 def getdownLaunchJvl = getdown_launch_jvl_name + ( (jvlChannelName != null && jvlChannelName.length() > 0)?"-${jvlChannelName}":"" ) + ".jvl"
1542 def launchJvl = file("${getdownWebsiteDir}/${getdownLaunchJvl}")
1543 launchJvl.write("appbase=${getdownAppBase}")
1546 from getdownLauncher
1547 rename(file(getdownLauncher).getName(), getdown_launcher_new)
1548 into getdownWebsiteDir
1552 from getdownLauncher
1553 if (file(getdownLauncher).getName() != getdown_launcher) {
1554 rename(file(getdownLauncher).getName(), getdown_launcher)
1556 into getdownWebsiteDir
1559 if (! (CHANNEL.startsWith("ARCHIVE") || CHANNEL.startsWith("DEVELOP"))) {
1562 from getdownLauncher
1563 from "${getdownWebsiteDir}/${getdown_build_properties}"
1564 if (file(getdownLauncher).getName() != getdown_launcher) {
1565 rename(file(getdownLauncher).getName(), getdown_launcher)
1567 into getdownInstallDir
1571 from getdownInstallDir
1572 into getdownFilesInstallDir
1579 from getdownLauncher
1580 from "${getdownWebsiteDir}/${getdown_build_properties}"
1581 if (file(getdownLauncher).getName() != getdown_launcher) {
1582 rename(file(getdownLauncher).getName(), getdown_launcher)
1584 into getdownFilesDir
1588 from getdownResourceDir
1589 into "${getdownFilesDir}/${getdown_resource_dir}"
1594 inputs.dir("${jalviewDir}/${package_dir}")
1596 outputs.dir(getdownWebsiteDir)
1597 outputs.dir(getdownFilesDir)
1601 // a helper task to allow getdown digest of any dir: `gradle getdownDigestDir -PDIGESTDIR=/path/to/my/random/getdown/dir
1602 task getdownDigestDir(type: JavaExec) {
1604 description "A task to run a getdown Digest on a dir with getdown.txt. Provide a DIGESTDIR property via -PDIGESTDIR=..."
1606 def digestDirPropertyName = "DIGESTDIR"
1608 classpath = files(getdownLauncher)
1609 def digestDir = findProperty(digestDirPropertyName)
1610 if (digestDir == null) {
1611 throw new GradleException("Must provide a DIGESTDIR value to produce an alternative getdown digest")
1615 main = "com.threerings.getdown.tools.Digester"
1619 task getdownDigest(type: JavaExec) {
1620 group = "distribution"
1621 description = "Digest the getdown website folder"
1622 dependsOn getdownWebsite
1624 classpath = files(getdownLauncher)
1626 main = "com.threerings.getdown.tools.Digester"
1627 args getdownWebsiteDir
1628 inputs.dir(getdownWebsiteDir)
1629 outputs.file("${getdownWebsiteDir}/digest2.txt")
1634 group = "distribution"
1635 description = "Create the minimal and full getdown app folder for installers and website and create digest file"
1636 dependsOn getdownDigest
1638 if (reportRsyncCommand) {
1639 def fromDir = getdownWebsiteDir + (getdownWebsiteDir.endsWith('/')?'':'/')
1640 def toDir = "${getdown_rsync_dest}/${getdownDir}" + (getdownDir.endsWith('/')?'':'/')
1641 println "LIKELY RSYNC COMMAND:"
1642 println "mkdir -p '$toDir'\nrsync -avh --delete '$fromDir' '$toDir'"
1643 if (RUNRSYNC == "true") {
1645 commandLine "mkdir", "-p", toDir
1648 commandLine "rsync", "-avh", "--delete", fromDir, toDir
1656 tasks.withType(JavaCompile) {
1657 options.encoding = 'UTF-8'
1663 delete getdownWebsiteDir
1664 delete getdownFilesDir
1670 if (file(install4jHomeDir).exists()) {
1672 } else if (file(System.getProperty("user.home")+"/buildtools/install4j").exists()) {
1673 install4jHomeDir = System.getProperty("user.home")+"/buildtools/install4j"
1674 } else if (file("/Applications/install4j.app/Contents/Resources/app").exists()) {
1675 install4jHomeDir = "/Applications/install4j.app/Contents/Resources/app"
1677 installDir(file(install4jHomeDir))
1679 mediaTypes = Arrays.asList(install4j_media_types.split(","))
1683 task copyInstall4jTemplate {
1684 def install4jTemplateFile = file("${install4jDir}/${install4j_template}")
1685 def install4jFileAssociationsFile = file("${install4jDir}/${install4j_installer_file_associations}")
1686 inputs.file(install4jTemplateFile)
1687 inputs.file(install4jFileAssociationsFile)
1688 inputs.property("CHANNEL", { CHANNEL })
1689 outputs.file(install4jConfFile)
1692 def install4jConfigXml = new XmlParser().parse(install4jTemplateFile)
1694 // turn off code signing if no OSX_KEYPASS
1695 if (OSX_KEYPASS == "") {
1696 install4jConfigXml.'**'.codeSigning.each { codeSigning ->
1697 codeSigning.'@macEnabled' = "false"
1699 install4jConfigXml.'**'.windows.each { windows ->
1700 windows.'@runPostProcessor' = "false"
1704 // turn off checksum creation for LOCAL channel
1705 def e = install4jConfigXml.application[0]
1706 if (CHANNEL == "LOCAL") {
1707 e.'@createChecksums' = "false"
1709 e.'@createChecksums' = "true"
1712 // put file association actions where placeholder action is
1713 def install4jFileAssociationsText = install4jFileAssociationsFile.text
1714 def fileAssociationActions = new XmlParser().parseText("<actions>${install4jFileAssociationsText}</actions>")
1715 install4jConfigXml.'**'.action.any { a -> // .any{} stops after the first one that returns true
1716 if (a.'@name' == 'EXTENSIONS_REPLACED_BY_GRADLE') {
1717 def parent = a.parent()
1719 fileAssociationActions.each { faa ->
1722 // don't need to continue in .any loop once replacements have been made
1727 // use Windows Program Group with Examples folder for RELEASE, and Program Group without Examples for everything else
1728 // NB we're deleting the /other/ one!
1729 // Also remove the examples subdir from non-release versions
1730 def customizedIdToDelete = "PROGRAM_GROUP_RELEASE"
1731 // 2.11.1.0 NOT releasing with the Examples folder in the Program Group
1732 if (false && CHANNEL=="RELEASE") { // remove 'false && ' to include Examples folder in RELEASE channel
1733 customizedIdToDelete = "PROGRAM_GROUP_NON_RELEASE"
1735 // remove the examples subdir from Full File Set
1736 def files = install4jConfigXml.files[0]
1737 def fileset = files.filesets.fileset.find { fs -> fs.'@customizedId' == "FULL_FILE_SET" }
1738 def root = files.roots.root.find { r -> r.'@fileset' == fileset.'@id' }
1739 def mountPoint = files.mountPoints.mountPoint.find { mp -> mp.'@root' == root.'@id' }
1740 def dirEntry = files.entries.dirEntry.find { de -> de.'@mountPoint' == mountPoint.'@id' && de.'@subDirectory' == "examples" }
1741 dirEntry.parent().remove(dirEntry)
1743 install4jConfigXml.'**'.action.any { a ->
1744 if (a.'@customizedId' == customizedIdToDelete) {
1745 def parent = a.parent()
1751 // remove the "Uninstall Old Jalview (optional)" symlink from DMG for non-release DS_Stores
1752 if (! (CHANNEL == "RELEASE" || CHANNEL == "TEST-RELEASE" ) ) {
1753 def symlink = install4jConfigXml.'**'.topLevelFiles.symlink.find { sl -> sl.'@name' == "Uninstall Old Jalview (optional).app" }
1754 symlink.parent().remove(symlink)
1757 // write install4j file
1758 install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
1765 delete install4jConfFile
1770 task installers(type: com.install4j.gradle.Install4jTask) {
1771 group = "distribution"
1772 description = "Create the install4j installers"
1774 dependsOn copyInstall4jTemplate
1776 projectFile = install4jConfFile
1778 // create an md5 for the input files to use as version for install4j conf file
1779 def digest = MessageDigest.getInstance("MD5")
1781 (file("${install4jDir}/${install4j_template}").text +
1782 file("${install4jDir}/${install4j_info_plist_file_associations}").text +
1783 file("${install4jDir}/${install4j_installer_file_associations}").text).bytes)
1784 def filesMd5 = new BigInteger(1, digest.digest()).toString(16)
1785 if (filesMd5.length() >= 8) {
1786 filesMd5 = filesMd5.substring(0,8)
1788 def install4jTemplateVersion = "${JALVIEW_VERSION}_F${filesMd5}_C${gitHash}"
1789 // make install4jBuildDir relative to jalviewDir
1790 def install4jBuildDir = "${install4j_build_dir}/${JAVA_VERSION}"
1793 'JALVIEW_NAME': jalview_name,
1794 'JALVIEW_APPLICATION_NAME': install4jApplicationName,
1795 'JALVIEW_DIR': "../..",
1796 'OSX_KEYSTORE': OSX_KEYSTORE,
1797 'JSIGN_SH': JSIGN_SH,
1798 'JRE_DIR': getdown_app_dir_java,
1799 'INSTALLER_TEMPLATE_VERSION': install4jTemplateVersion,
1800 'JALVIEW_VERSION': JALVIEW_VERSION,
1801 'JAVA_MIN_VERSION': JAVA_MIN_VERSION,
1802 'JAVA_MAX_VERSION': JAVA_MAX_VERSION,
1803 'JAVA_VERSION': JAVA_VERSION,
1804 'JAVA_INTEGER_VERSION': JAVA_INTEGER_VERSION,
1805 'VERSION': JALVIEW_VERSION,
1806 'MACOS_JAVA_VM_DIR': macosJavaVMDir,
1807 'WINDOWS_JAVA_VM_DIR': windowsJavaVMDir,
1808 'LINUX_JAVA_VM_DIR': linuxJavaVMDir,
1809 'MACOS_JAVA_VM_TGZ': macosJavaVMTgz,
1810 'WINDOWS_JAVA_VM_TGZ': windowsJavaVMTgz,
1811 'LINUX_JAVA_VM_TGZ': linuxJavaVMTgz,
1812 'COPYRIGHT_MESSAGE': install4j_copyright_message,
1813 'BUNDLE_ID': install4jBundleId,
1814 'INTERNAL_ID': install4jInternalId,
1815 'WINDOWS_APPLICATION_ID': install4jWinApplicationId,
1816 'MACOS_DS_STORE': install4jDSStore,
1817 'MACOS_DMG_BG_IMAGE': install4jDMGBackgroundImage,
1818 'INSTALLER_NAME': install4jInstallerName,
1819 'INSTALL4J_UTILS_DIR': install4j_utils_dir,
1820 'GETDOWN_WEBSITE_DIR': getdown_website_dir,
1821 'GETDOWN_FILES_DIR': getdown_files_dir,
1822 'GETDOWN_RESOURCE_DIR': getdown_resource_dir,
1823 'GETDOWN_DIST_DIR': getdownAppDistDir,
1824 'GETDOWN_ALT_DIR': getdown_app_dir_alt,
1825 'GETDOWN_INSTALL_DIR': getdown_install_dir,
1826 'INFO_PLIST_FILE_ASSOCIATIONS_FILE': install4j_info_plist_file_associations,
1827 'BUILD_DIR': install4jBuildDir,
1828 'APPLICATION_CATEGORIES': install4j_application_categories,
1829 'APPLICATION_FOLDER': install4jApplicationFolder,
1830 'UNIX_APPLICATION_FOLDER': install4jUnixApplicationFolder,
1831 'EXECUTABLE_NAME': install4jExecutableName,
1832 'EXTRA_SCHEME': install4jExtraScheme,
1835 //println("INSTALL4J VARIABLES:")
1836 //variables.each{k,v->println("${k}=${v}")}
1838 destination = "${jalviewDir}/${install4jBuildDir}"
1839 buildSelected = true
1841 if (install4j_faster.equals("true") || CHANNEL.startsWith("LOCAL")) {
1843 disableSigning = true
1847 macKeystorePassword = OSX_KEYPASS
1851 println("Using projectFile "+projectFile)
1854 inputs.dir(getdownWebsiteDir)
1855 inputs.file(install4jConfFile)
1856 inputs.file("${install4jDir}/${install4j_info_plist_file_associations}")
1857 inputs.dir(macosJavaVMDir)
1858 inputs.dir(windowsJavaVMDir)
1859 outputs.dir("${jalviewDir}/${install4j_build_dir}/${JAVA_VERSION}")
1865 eclipse().configFile(eclipse_codestyle_file)
1870 task sourceDist(type: Tar) {
1871 group "distribution"
1872 description "Create a source .tar.gz file for distribution"
1874 dependsOn convertMdFiles
1876 def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
1877 def outputFileName = "${project.name}_${VERSION_UNDERSCORES}.tar.gz"
1878 archiveFileName = outputFileName
1880 compression Compression.GZIP
1895 "**/*.class","$j11modDir/**/*.jar","appletlib","**/*locales",
1897 "utils/InstallAnywhere",
1912 "gradle.properties",
1923 ".settings/org.eclipse.jdt.core.jalview.prefs",
1927 exclude (EXCLUDE_FILES)
1928 include (PROCESS_FILES)
1929 filter(ReplaceTokens,
1933 'Version-Rel': JALVIEW_VERSION,
1934 'Year-Rel': getDate("yyyy")
1939 exclude (EXCLUDE_FILES)
1940 exclude (PROCESS_FILES)
1941 exclude ("appletlib")
1942 exclude ("**/*locales")
1943 exclude ("*locales/**")
1944 exclude ("utils/InstallAnywhere")
1946 exclude (getdown_files_dir)
1947 exclude (getdown_website_dir)
1949 // exluding these as not using jars as modules yet
1950 exclude ("${j11modDir}/**/*.jar")
1953 include(INCLUDE_FILES)
1955 // from (jalviewDir) {
1956 // // explicit includes for stuff that seemed to not get included
1957 // include(fileTree("test/**/*."))
1958 // exclude(EXCLUDE_FILES)
1959 // exclude(PROCESS_FILES)
1966 dependsOn pubhtmlhelp
1968 inputs.dir("${helpBuildDir}")
1969 outputs.dir("${buildDir}/distributions/${help_dir}")
1973 task j2sSetHeadlessBuild {
1980 task jalviewjsSetEclipseWorkspace {
1981 def propKey = "jalviewjs_eclipse_workspace"
1983 if (project.hasProperty(propKey)) {
1984 propVal = project.getProperty(propKey)
1985 if (propVal.startsWith("~/")) {
1986 propVal = System.getProperty("user.home") + propVal.substring(1)
1989 def propsFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_workspace_location_file}"
1990 def propsFile = file(propsFileName)
1991 def eclipseWsDir = propVal
1992 def props = new Properties()
1994 def writeProps = true
1995 if (( eclipseWsDir == null || !file(eclipseWsDir).exists() ) && propsFile.exists()) {
1996 def ins = new FileInputStream(propsFileName)
1999 if (props.getProperty(propKey, null) != null) {
2000 eclipseWsDir = props.getProperty(propKey)
2005 if (eclipseWsDir == null || !file(eclipseWsDir).exists()) {
2006 def tempDir = File.createTempDir()
2007 eclipseWsDir = tempDir.getAbsolutePath()
2010 eclipseWorkspace = file(eclipseWsDir)
2013 // do not run a headless transpile when we claim to be in Eclipse
2015 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2016 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2018 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2022 props.setProperty(propKey, eclipseWsDir)
2023 propsFile.parentFile.mkdirs()
2024 def bytes = new ByteArrayOutputStream()
2025 props.store(bytes, null)
2026 def propertiesString = bytes.toString()
2027 propsFile.text = propertiesString
2033 println("ECLIPSE WORKSPACE: "+eclipseWorkspace.getPath())
2036 //inputs.property(propKey, eclipseWsDir) // eclipseWsDir only gets set once this task runs, so will be out-of-date
2037 outputs.file(propsFileName)
2038 outputs.upToDateWhen { eclipseWorkspace.exists() && propsFile.exists() }
2042 task jalviewjsEclipsePaths {
2045 def eclipseRoot = jalviewjs_eclipse_root
2046 if (eclipseRoot.startsWith("~/")) {
2047 eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
2049 if (OperatingSystem.current().isMacOsX()) {
2050 eclipseRoot += "/Eclipse.app"
2051 eclipseBinary = "${eclipseRoot}/Contents/MacOS/eclipse"
2052 eclipseProduct = "${eclipseRoot}/Contents/Eclipse/.eclipseproduct"
2053 } else if (OperatingSystem.current().isWindows()) { // check these paths!!
2054 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2055 eclipseRoot += "/eclipse"
2057 eclipseBinary = "${eclipseRoot}/eclipse.exe"
2058 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2059 } else { // linux or unix
2060 if (file("${eclipseRoot}/eclipse").isDirectory() && file("${eclipseRoot}/eclipse/.eclipseproduct").exists()) {
2061 eclipseRoot += "/eclipse"
2062 println("eclipseDir exists")
2064 eclipseBinary = "${eclipseRoot}/eclipse"
2065 eclipseProduct = "${eclipseRoot}/.eclipseproduct"
2068 eclipseVersion = "4.13" // default
2069 def assumedVersion = true
2070 if (file(eclipseProduct).exists()) {
2071 def fis = new FileInputStream(eclipseProduct)
2072 def props = new Properties()
2074 eclipseVersion = props.getProperty("version")
2076 assumedVersion = false
2079 def propKey = "eclipse_debug"
2080 eclipseDebug = (project.hasProperty(propKey) && project.getProperty(propKey).equals("true"))
2083 // do not run a headless transpile when we claim to be in Eclipse
2085 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2086 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2088 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2091 if (!assumedVersion) {
2092 println("ECLIPSE VERSION=${eclipseVersion}")
2098 task printProperties {
2100 description "Output to console all System.properties"
2102 System.properties.each { key, val -> System.out.println("Property: ${key}=${val}") }
2108 dependsOn eclipseProject
2109 dependsOn eclipseClasspath
2110 dependsOn eclipseJdt
2114 // this version (type: Copy) will delete anything in the eclipse dropins folder that isn't in fromDropinsDir
2115 task jalviewjsEclipseCopyDropins(type: Copy) {
2116 dependsOn jalviewjsEclipsePaths
2118 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_eclipse_dropins_dir}", include: "*.jar")
2119 inputFiles += file("${jalviewDir}/${jalviewjsJ2sPlugin}")
2120 def outputDir = "${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}"
2127 // this eclipse -clean doesn't actually work
2128 task jalviewjsCleanEclipse(type: Exec) {
2129 dependsOn eclipseSetup
2130 dependsOn jalviewjsEclipsePaths
2131 dependsOn jalviewjsEclipseCopyDropins
2133 executable(eclipseBinary)
2134 args(["-nosplash", "--launcher.suppressErrors", "-data", eclipseWorkspace.getPath(), "-clean", "-console", "-consoleLog"])
2140 def inputString = """exit
2143 def inputByteStream = new ByteArrayInputStream(inputString.getBytes())
2144 standardInput = inputByteStream
2147 /* not really working yet
2148 jalviewjsEclipseCopyDropins.finalizedBy jalviewjsCleanEclipse
2152 task jalviewjsTransferUnzipSwingJs {
2153 def file_zip = "${jalviewDir}/${jalviewjs_swingjs_zip}"
2157 from zipTree(file_zip)
2158 into "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2162 inputs.file file_zip
2163 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2167 task jalviewjsTransferUnzipLib {
2168 def zipFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_libjs_dir}", include: "*.zip")
2171 zipFiles.each { file_zip ->
2173 from zipTree(file_zip)
2174 into "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2179 inputs.files zipFiles
2180 outputs.dir "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2184 task jalviewjsTransferUnzipAllLibs {
2185 dependsOn jalviewjsTransferUnzipSwingJs
2186 dependsOn jalviewjsTransferUnzipLib
2190 task jalviewjsCreateJ2sSettings(type: WriteProperties) {
2192 description "Create the .j2s file from the j2s.* properties"
2194 jalviewjsJ2sProps = project.properties.findAll { it.key.startsWith("j2s.") }.sort { it.key }
2195 def siteDirProperty = "j2s.site.directory"
2196 def setSiteDir = false
2197 jalviewjsJ2sProps.each { prop, val ->
2199 if (prop == siteDirProperty) {
2200 if (!(val.startsWith('/') || val.startsWith("file://") )) {
2201 val = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${val}"
2207 if (!setSiteDir) { // default site location, don't override specifically set property
2208 property(siteDirProperty,"${jalviewDirRelativePath}/${jalviewjsTransferSiteJsDir}")
2211 outputFile = jalviewjsJ2sSettingsFileName
2214 inputs.properties(jalviewjsJ2sProps)
2215 outputs.file(jalviewjsJ2sSettingsFileName)
2220 task jalviewjsEclipseSetup {
2221 dependsOn jalviewjsEclipseCopyDropins
2222 dependsOn jalviewjsSetEclipseWorkspace
2223 dependsOn jalviewjsCreateJ2sSettings
2227 task jalviewjsSyncAllLibs (type: Sync) {
2228 dependsOn jalviewjsTransferUnzipAllLibs
2229 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteLibDir}")
2230 inputFiles += fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}")
2231 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2235 def outputFiles = []
2236 rename { filename ->
2237 outputFiles += "${outputDir}/${filename}"
2243 outputs.files outputFiles
2244 inputs.files inputFiles
2248 task jalviewjsSyncResources (type: Sync) {
2249 def inputFiles = fileTree(dir: resourceDir)
2250 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2254 def outputFiles = []
2255 rename { filename ->
2256 outputFiles += "${outputDir}/${filename}"
2262 outputs.files outputFiles
2263 inputs.files inputFiles
2267 task jalviewjsSyncSiteResources (type: Sync) {
2268 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjs_site_resource_dir}")
2269 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2273 def outputFiles = []
2274 rename { filename ->
2275 outputFiles += "${outputDir}/${filename}"
2281 outputs.files outputFiles
2282 inputs.files inputFiles
2286 task jalviewjsSyncBuildProperties (type: Sync) {
2287 dependsOn createBuildProperties
2288 def inputFiles = [file(buildProperties)]
2289 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}/${jalviewjs_j2s_subdir}"
2293 def outputFiles = []
2294 rename { filename ->
2295 outputFiles += "${outputDir}/${filename}"
2301 outputs.files outputFiles
2302 inputs.files inputFiles
2306 task jalviewjsProjectImport(type: Exec) {
2307 dependsOn eclipseSetup
2308 dependsOn jalviewjsEclipsePaths
2309 dependsOn jalviewjsEclipseSetup
2312 // do not run a headless import when we claim to be in Eclipse
2314 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2315 throw new StopExecutionException("Not running headless import whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2317 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2321 //def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core"
2322 def projdir = eclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
2323 executable(eclipseBinary)
2324 args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", eclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
2328 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2330 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2333 inputs.file("${jalviewDir}/.project")
2334 outputs.upToDateWhen {
2335 file(projdir).exists()
2340 task jalviewjsTranspile(type: Exec) {
2341 dependsOn jalviewjsEclipseSetup
2342 dependsOn jalviewjsProjectImport
2343 dependsOn jalviewjsEclipsePaths
2346 // do not run a headless transpile when we claim to be in Eclipse
2348 println("Skipping task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2349 throw new StopExecutionException("Not running headless transpile whilst IN_ECLIPSE is '${IN_ECLIPSE}'")
2351 println("Running task ${name} as IN_ECLIPSE=${IN_ECLIPSE}")
2355 executable(eclipseBinary)
2356 args(["-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.jdt.apt.core.aptBuild", "-data", eclipseWorkspace, "-${jalviewjs_eclipse_build_arg}", eclipse_project_name ])
2360 args += [ "--launcher.appendVmargs", "-vmargs", "-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_eclipse_tmp_dropins_dir}" ]
2362 args += [ "-D${j2sHeadlessBuildProperty}=true" ]
2368 stdout = new ByteArrayOutputStream()
2369 stderr = new ByteArrayOutputStream()
2371 def logOutFileName = "${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}"
2372 def logOutFile = file(logOutFileName)
2373 logOutFile.createNewFile()
2374 logOutFile.text = """ROOT: ${jalviewjs_eclipse_root}
2375 BINARY: ${eclipseBinary}
2376 VERSION: ${eclipseVersion}
2377 WORKSPACE: ${eclipseWorkspace}
2378 DEBUG: ${eclipseDebug}
2381 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2382 // combine stdout and stderr
2383 def logErrFOS = logOutFOS
2385 if (jalviewjs_j2s_to_console.equals("true")) {
2386 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2387 new org.apache.tools.ant.util.TeeOutputStream(
2391 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2392 new org.apache.tools.ant.util.TeeOutputStream(
2397 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2400 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2407 if (stdout.toString().contains("Error processing ")) {
2408 // j2s did not complete transpile
2409 //throw new TaskExecutionException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2410 if (jalviewjs_ignore_transpile_errors.equals("true")) {
2411 println("IGNORING TRANSPILE ERRORS")
2412 println("See eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2414 throw new GradleException("Error during transpilation:\n${stderr}\nSee eclipse transpile log file '${jalviewDir}/${jalviewjsBuildDir}/${jalviewjs_j2s_transpile_stdout}'")
2419 inputs.dir("${jalviewDir}/${sourceDir}")
2420 outputs.dir("${jalviewDir}/${jalviewjsTransferSiteJsDir}")
2421 outputs.upToDateWhen( { file("${jalviewDir}/${jalviewjsTransferSiteJsDir}${jalviewjs_server_resource}").exists() } )
2425 def jalviewjsCallCore(String name, FileCollection list, String prefixFile, String suffixFile, String jsfile, String zjsfile, File logOutFile, Boolean logOutConsole) {
2427 def stdout = new ByteArrayOutputStream()
2428 def stderr = new ByteArrayOutputStream()
2430 def coreFile = file(jsfile)
2432 msg = "Creating core for ${name}...\nGenerating ${jsfile}"
2434 logOutFile.createNewFile()
2435 logOutFile.append(msg+"\n")
2437 def coreTop = file(prefixFile)
2438 def coreBottom = file(suffixFile)
2439 coreFile.getParentFile().mkdirs()
2440 coreFile.createNewFile()
2441 coreFile.write( coreTop.getText("UTF-8") )
2445 def t = f.getText("UTF-8")
2446 t.replaceAll("Clazz\\.([^_])","Clazz_${1}")
2447 coreFile.append( t )
2449 msg = "...file '"+f.getPath()+"' does not exist, skipping"
2451 logOutFile.append(msg+"\n")
2454 coreFile.append( coreBottom.getText("UTF-8") )
2456 msg = "Generating ${zjsfile}"
2458 logOutFile.append(msg+"\n")
2459 def logOutFOS = new FileOutputStream(logOutFile, true) // true == append
2460 def logErrFOS = logOutFOS
2463 classpath = files(["${jalviewDir}/${jalviewjs_closure_compiler}"])
2464 main = "com.google.javascript.jscomp.CommandLineRunner"
2465 jvmArgs = [ "-Dfile.encoding=UTF-8" ]
2466 args = [ "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--warning_level", "QUIET", "--charset", "UTF-8", "--js", jsfile, "--js_output_file", zjsfile ]
2469 msg = "\nRunning '"+commandLine.join(' ')+"'\n"
2471 logOutFile.append(msg+"\n")
2473 if (logOutConsole) {
2474 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2475 new org.apache.tools.ant.util.TeeOutputStream(
2479 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2480 new org.apache.tools.ant.util.TeeOutputStream(
2485 standardOutput = new org.apache.tools.ant.util.TeeOutputStream(
2488 errorOutput = new org.apache.tools.ant.util.TeeOutputStream(
2495 logOutFile.append(msg+"\n")
2499 task jalviewjsBuildAllCores {
2501 description "Build the core js lib closures listed in the classlists dir"
2502 dependsOn jalviewjsTranspile
2503 dependsOn jalviewjsTransferUnzipSwingJs
2505 def j2sDir = "${jalviewDir}/${jalviewjsTransferSiteJsDir}/${jalviewjs_j2s_subdir}"
2506 def swingJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_j2s_subdir}"
2507 def libJ2sDir = "${jalviewDir}/${jalviewjsTransferSiteLibDir}/${jalviewjs_j2s_subdir}"
2508 def jsDir = "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}/${jalviewjs_js_subdir}"
2509 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}/${jalviewjs_j2s_subdir}/core"
2510 def prefixFile = "${jsDir}/core/coretop2.js"
2511 def suffixFile = "${jsDir}/core/corebottom2.js"
2513 inputs.file prefixFile
2514 inputs.file suffixFile
2516 def classlistFiles = []
2517 // add the classlists found int the jalviewjs_classlists_dir
2518 fileTree(dir: "${jalviewDir}/${jalviewjs_classlists_dir}", include: "*.txt").each {
2520 def name = file.getName() - ".txt"
2527 // _jmol and _jalview cores. Add any other peculiar classlist.txt files here
2528 //classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jmol}"), 'name': "_jvjmol" ]
2529 classlistFiles += [ 'file': file("${jalviewDir}/${jalviewjs_classlist_jalview}"), 'name': jalviewjsJalviewCoreName ]
2531 jalviewjsCoreClasslists = []
2533 classlistFiles.each {
2536 def file = hash['file']
2537 if (! file.exists()) {
2538 //println("...classlist file '"+file.getPath()+"' does not exist, skipping")
2539 return false // this is a "continue" in groovy .each closure
2541 def name = hash['name']
2543 name = file.getName() - ".txt"
2551 def list = fileTree(dir: j2sDir, includes: filelist)
2553 def jsfile = "${outputDir}/core${name}.js"
2554 def zjsfile = "${outputDir}/core${name}.z.js"
2556 jalviewjsCoreClasslists += [
2565 outputs.file(jsfile)
2566 outputs.file(zjsfile)
2569 // _stevesoft core. add any cores without a classlist here (and the inputs and outputs)
2570 def stevesoftClasslistName = "_stevesoft"
2571 def stevesoftClasslist = [
2572 'jsfile': "${outputDir}/core${stevesoftClasslistName}.js",
2573 'zjsfile': "${outputDir}/core${stevesoftClasslistName}.z.js",
2574 'list': fileTree(dir: j2sDir, include: "com/stevesoft/pat/**/*.js"),
2575 'name': stevesoftClasslistName
2577 jalviewjsCoreClasslists += stevesoftClasslist
2578 inputs.files(stevesoftClasslist['list'])
2579 outputs.file(stevesoftClasslist['jsfile'])
2580 outputs.file(stevesoftClasslist['zjsfile'])
2583 def allClasslistName = "_all"
2584 def allJsFiles = fileTree(dir: j2sDir, include: "**/*.js")
2585 allJsFiles += fileTree(
2589 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2590 "**/org/jmol/jvxl/readers/IsoIntersectFileReader.js",
2591 "**/org/jmol/export/JSExporter.js"
2594 allJsFiles += fileTree(
2598 // these exlusions are files that the closure-compiler produces errors for. Should fix them
2599 "**/sun/misc/Unsafe.js",
2600 "**/swingjs/jquery/jquery-editable-select.js",
2601 "**/swingjs/jquery/j2sComboBox.js",
2602 "**/sun/misc/FloatingDecimal.js"
2605 def allClasslist = [
2606 'jsfile': "${outputDir}/core${allClasslistName}.js",
2607 'zjsfile': "${outputDir}/core${allClasslistName}.z.js",
2609 'name': allClasslistName
2611 // not including this version of "all" core at the moment
2612 //jalviewjsCoreClasslists += allClasslist
2613 inputs.files(allClasslist['list'])
2614 outputs.file(allClasslist['jsfile'])
2615 outputs.file(allClasslist['zjsfile'])
2618 def logOutFile = file("${jalviewDirAbsolutePath}/${jalviewjsBuildDir}/${jalviewjs_j2s_closure_stdout}")
2619 logOutFile.getParentFile().mkdirs()
2620 logOutFile.createNewFile()
2621 logOutFile.write(getDate("yyyy-MM-dd HH:mm:ss")+" jalviewjsBuildAllCores\n----\n")
2623 jalviewjsCoreClasslists.each {
2624 jalviewjsCallCore(it.name, it.list, prefixFile, suffixFile, it.jsfile, it.zjsfile, logOutFile, jalviewjs_j2s_to_console.equals("true"))
2631 def jalviewjsPublishCoreTemplate(String coreName, String templateName, File inputFile, String outputFile) {
2634 into file(outputFile).getParentFile()
2635 rename { filename ->
2636 if (filename.equals(inputFile.getName())) {
2637 return file(outputFile).getName()
2641 filter(ReplaceTokens,
2645 'MAIN': '"'+main_class+'"',
2647 'NAME': jalviewjsJalviewTemplateName+" [core ${coreName}]",
2648 'COREKEY': jalviewjs_core_key,
2649 'CORENAME': coreName
2656 task jalviewjsPublishCoreTemplates {
2657 dependsOn jalviewjsBuildAllCores
2658 def inputFileName = "${jalviewDir}/${j2s_coretemplate_html}"
2659 def inputFile = file(inputFileName)
2660 def outputDir = "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2662 def outputFiles = []
2663 jalviewjsCoreClasslists.each { cl ->
2664 def outputFile = "${outputDir}/${jalviewjsJalviewTemplateName}_${cl.name}.html"
2665 cl['outputfile'] = outputFile
2666 outputFiles += outputFile
2670 jalviewjsCoreClasslists.each { cl ->
2671 jalviewjsPublishCoreTemplate(cl.name, jalviewjsJalviewTemplateName, inputFile, cl.outputfile)
2674 inputs.file(inputFile)
2675 outputs.files(outputFiles)
2679 task jalviewjsSyncCore (type: Sync) {
2680 dependsOn jalviewjsBuildAllCores
2681 dependsOn jalviewjsPublishCoreTemplates
2682 def inputFiles = fileTree(dir: "${jalviewDir}/${jalviewjsTransferSiteCoreDir}")
2683 def outputDir = "${jalviewDir}/${jalviewjsSiteDir}"
2687 def outputFiles = []
2688 rename { filename ->
2689 outputFiles += "${outputDir}/${filename}"
2695 outputs.files outputFiles
2696 inputs.files inputFiles
2700 // this Copy version of TransferSiteJs will delete anything else in the target dir
2701 task jalviewjsCopyTransferSiteJs(type: Copy) {
2702 dependsOn jalviewjsTranspile
2703 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2704 into "${jalviewDir}/${jalviewjsSiteDir}"
2708 // this Sync version of TransferSite is used by buildship to keep the website automatically up to date when a file changes
2709 task jalviewjsSyncTransferSiteJs(type: Sync) {
2710 from "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2712 into "${jalviewDir}/${jalviewjsSiteDir}"
2719 jalviewjsSyncAllLibs.mustRunAfter jalviewjsCopyTransferSiteJs
2720 jalviewjsSyncResources.mustRunAfter jalviewjsCopyTransferSiteJs
2721 jalviewjsSyncSiteResources.mustRunAfter jalviewjsCopyTransferSiteJs
2722 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsCopyTransferSiteJs
2724 jalviewjsSyncAllLibs.mustRunAfter jalviewjsSyncTransferSiteJs
2725 jalviewjsSyncResources.mustRunAfter jalviewjsSyncTransferSiteJs
2726 jalviewjsSyncSiteResources.mustRunAfter jalviewjsSyncTransferSiteJs
2727 jalviewjsSyncBuildProperties.mustRunAfter jalviewjsSyncTransferSiteJs
2730 task jalviewjsPrepareSite {
2732 description "Prepares the website folder including unzipping files and copying resources"
2733 dependsOn jalviewjsSyncAllLibs
2734 dependsOn jalviewjsSyncResources
2735 dependsOn jalviewjsSyncSiteResources
2736 dependsOn jalviewjsSyncBuildProperties
2737 dependsOn jalviewjsSyncCore
2741 task jalviewjsBuildSite {
2743 description "Builds the whole website including transpiled code"
2744 dependsOn jalviewjsCopyTransferSiteJs
2745 dependsOn jalviewjsPrepareSite
2749 task cleanJalviewjsTransferSite {
2751 delete "${jalviewDir}/${jalviewjsTransferSiteJsDir}"
2752 delete "${jalviewDir}/${jalviewjsTransferSiteLibDir}"
2753 delete "${jalviewDir}/${jalviewjsTransferSiteSwingJsDir}"
2754 delete "${jalviewDir}/${jalviewjsTransferSiteCoreDir}"
2759 task cleanJalviewjsSite {
2760 dependsOn cleanJalviewjsTransferSite
2762 delete "${jalviewDir}/${jalviewjsSiteDir}"
2767 task jalviewjsSiteTar(type: Tar) {
2769 description "Creates a tar.gz file for the website"
2770 dependsOn jalviewjsBuildSite
2771 def outputFilename = "jalviewjs-site-${JALVIEW_VERSION}.tar.gz"
2772 archiveFileName = outputFilename
2774 compression Compression.GZIP
2776 from "${jalviewDir}/${jalviewjsSiteDir}"
2777 into jalviewjs_site_dir // this is inside the tar file
2779 inputs.dir("${jalviewDir}/${jalviewjsSiteDir}")
2783 task jalviewjsServer {
2785 def filename = "jalviewjsTest.html"
2786 description "Starts a webserver on localhost to test the website. See ${filename} to access local site on most recently used port."
2787 def htmlFile = "${jalviewDirAbsolutePath}/${filename}"
2790 SimpleHttpFileServerFactory factory = new SimpleHttpFileServerFactory()
2791 def port = Integer.valueOf(jalviewjs_server_port)
2796 while(port < start+1000 && !running) {
2798 def doc_root = new File("${jalviewDirAbsolutePath}/${jalviewjsSiteDir}")
2799 jalviewjsServer = factory.start(doc_root, port)
2801 url = jalviewjsServer.getResourceUrl(jalviewjs_server_resource)
2802 println("SERVER STARTED with document root ${doc_root}.")
2803 println("Go to "+url+" . Run gradle --stop to stop (kills all gradle daemons).")
2804 println("For debug: "+url+"?j2sdebug")
2805 println("For verbose: "+url+"?j2sverbose")
2806 } catch (Exception e) {
2811 <p><a href="${url}">JalviewJS Test. <${url}></a></p>
2812 <p><a href="${url}?j2sdebug">JalviewJS Test with debug. <${url}?j2sdebug></a></p>
2813 <p><a href="${url}?j2sverbose">JalviewJS Test with verbose. <${url}?j2sdebug></a></p>
2815 jalviewjsCoreClasslists.each { cl ->
2816 def urlcore = jalviewjsServer.getResourceUrl(file(cl.outputfile).getName())
2818 <p><a href="${urlcore}">${jalviewjsJalviewTemplateName} [core ${cl.name}]. <${urlcore}></a></p>
2820 println("For core ${cl.name}: "+urlcore)
2823 file(htmlFile).text = htmlText
2826 outputs.file(htmlFile)
2827 outputs.upToDateWhen({false})
2831 task cleanJalviewjsAll {
2833 description "Delete all configuration and build artifacts to do with JalviewJS build"
2834 dependsOn cleanJalviewjsSite
2835 dependsOn jalviewjsEclipsePaths
2838 delete "${jalviewDir}/${jalviewjsBuildDir}"
2839 delete "${jalviewDir}/${eclipse_bin_dir}"
2840 if (eclipseWorkspace != null && file(eclipseWorkspace.getAbsolutePath()+"/.metadata").exists()) {
2841 delete file(eclipseWorkspace.getAbsolutePath()+"/.metadata")
2843 delete "${jalviewDir}/${jalviewjs_j2s_settings}"
2846 outputs.upToDateWhen( { false } )
2850 task jalviewjsIDE_checkJ2sPlugin {
2851 group "00 JalviewJS in Eclipse"
2852 description "Compare the swingjs/net.sf.j2s.core(-j11)?.jar file with the Eclipse IDE's plugin version (found in the 'dropins' dir)"
2855 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2856 def j2sPluginFile = file(j2sPlugin)
2857 def eclipseHome = System.properties["eclipse.home.location"]
2858 if (eclipseHome == null || ! IN_ECLIPSE) {
2859 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. Skipping J2S Plugin Check.")
2861 def eclipseJ2sPluginDirs = [ "${eclipseHome}/dropins" ]
2862 def altPluginsDir = System.properties["org.eclipse.equinox.p2.reconciler.dropins.directory"]
2863 if (altPluginsDir != null && file(altPluginsDir).exists()) {
2864 eclipseJ2sPluginDirs += altPluginsDir
2866 def foundPlugin = false
2867 def j2sPluginFileName = j2sPluginFile.getName()
2868 def eclipseJ2sPlugin
2869 def eclipseJ2sPluginFile
2870 eclipseJ2sPluginDirs.any { dir ->
2871 eclipseJ2sPlugin = "${dir}/${j2sPluginFileName}"
2872 eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2873 if (eclipseJ2sPluginFile.exists()) {
2879 def msg = "Eclipse J2S Plugin is not installed (could not find '${j2sPluginFileName}' in\n"+eclipseJ2sPluginDirs.join("\n")+"\n)\nTry running task jalviewjsIDE_copyJ2sPlugin"
2880 System.err.println(msg)
2881 throw new StopExecutionException(msg)
2884 def digest = MessageDigest.getInstance("MD5")
2886 digest.update(j2sPluginFile.text.bytes)
2887 def j2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2889 digest.update(eclipseJ2sPluginFile.text.bytes)
2890 def eclipseJ2sPluginMd5 = new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
2892 if (j2sPluginMd5 != eclipseJ2sPluginMd5) {
2893 def msg = "WARNING! Eclipse J2S Plugin '${eclipseJ2sPlugin}' is different to this commit's version '${j2sPlugin}'"
2894 System.err.println(msg)
2895 throw new StopExecutionException(msg)
2897 def msg = "Eclipse J2S Plugin '${eclipseJ2sPlugin}' is the same as '${j2sPlugin}' (this is good)"
2903 task jalviewjsIDE_copyJ2sPlugin {
2904 group "00 JalviewJS in Eclipse"
2905 description "Copy the swingjs/net.sf.j2s.core(-j11)?.jar file into the Eclipse IDE's 'dropins' dir"
2908 def j2sPlugin = string("${jalviewDir}/${jalviewjsJ2sPlugin}")
2909 def j2sPluginFile = file(j2sPlugin)
2910 def eclipseHome = System.properties["eclipse.home.location"]
2911 if (eclipseHome == null || ! IN_ECLIPSE) {
2912 throw new StopExecutionException("Cannot find running Eclipse home from System.properties['eclipse.home.location']. NOT copying J2S Plugin.")
2914 def eclipseJ2sPlugin = "${eclipseHome}/dropins/${j2sPluginFile.getName()}"
2915 def eclipseJ2sPluginFile = file(eclipseJ2sPlugin)
2916 def msg = "WARNING! Copying this commit's j2s plugin '${j2sPlugin}' to Eclipse J2S Plugin '${eclipseJ2sPlugin}'\n* May require an Eclipse restart"
2917 System.err.println(msg)
2920 eclipseJ2sPluginFile.getParentFile().mkdirs()
2921 into eclipseJ2sPluginFile.getParent()
2927 task jalviewjsIDE_j2sFile {
2928 group "00 JalviewJS in Eclipse"
2929 description "Creates the .j2s file"
2930 dependsOn jalviewjsCreateJ2sSettings
2934 task jalviewjsIDE_SyncCore {
2935 group "00 JalviewJS in Eclipse"
2936 description "Build the core js lib closures listed in the classlists dir and publish core html from template"
2937 dependsOn jalviewjsSyncCore
2941 task jalviewjsIDE_SyncSiteAll {
2942 dependsOn jalviewjsSyncAllLibs
2943 dependsOn jalviewjsSyncResources
2944 dependsOn jalviewjsSyncSiteResources
2945 dependsOn jalviewjsSyncBuildProperties
2949 cleanJalviewjsTransferSite.mustRunAfter jalviewjsIDE_SyncSiteAll
2952 task jalviewjsIDE_PrepareSite {
2953 group "00 JalviewJS in Eclipse"
2954 description "Sync libs and resources to site dir, but not closure cores"
2956 dependsOn jalviewjsIDE_SyncSiteAll
2957 //dependsOn cleanJalviewjsTransferSite // not sure why this clean is here -- will slow down a re-run of this task
2961 task jalviewjsIDE_AssembleSite {
2962 group "00 JalviewJS in Eclipse"
2963 description "Assembles unzipped supporting zipfiles, resources, site resources and closure cores into the Eclipse transpiled site"
2964 dependsOn jalviewjsPrepareSite
2968 task jalviewjsIDE_SiteClean {
2969 group "00 JalviewJS in Eclipse"
2970 description "Deletes the Eclipse transpiled site"
2971 dependsOn cleanJalviewjsSite
2975 task jalviewjsIDE_Server {
2976 group "00 JalviewJS in Eclipse"
2977 description "Starts a webserver on localhost to test the website"
2978 dependsOn jalviewjsServer
2982 // buildship runs this at import or gradle refresh
2983 task eclipseSynchronizationTask {
2984 //dependsOn eclipseSetup
2985 dependsOn createBuildProperties
2987 dependsOn jalviewjsIDE_j2sFile
2988 dependsOn jalviewjsIDE_checkJ2sPlugin
2989 dependsOn jalviewjsIDE_PrepareSite
2994 // buildship runs this at build time or project refresh
2995 task eclipseAutoBuildTask {
2996 //dependsOn jalviewjsIDE_checkJ2sPlugin
2997 //dependsOn jalviewjsIDE_PrepareSite
3003 description "Build the site"
3004 dependsOn jalviewjsBuildSite