diff options
author | 2023-04-08 22:56:44 +0200 | |
---|---|---|
committer | 2023-04-08 22:58:21 +0200 | |
commit | 561fac70fd3dc3ebe1cfbc50146757495fb828d5 (patch) | |
tree | 20aa72bbe438aaa70c8de264ff0d366758e7772d /subprojects | |
parent | refactor: remove TupleLike (diff) | |
download | refinery-561fac70fd3dc3ebe1cfbc50146757495fb828d5.tar.gz refinery-561fac70fd3dc3ebe1cfbc50146757495fb828d5.tar.zst refinery-561fac70fd3dc3ebe1cfbc50146757495fb828d5.zip |
build: convert Gradle scripts to Kotlin
Improves IDE support build scripts in IntelliJ.
There is no Eclipse IDE support, but Eclipse didn't have support for Groovy
either, so there is no degradation of functionality.
Diffstat (limited to 'subprojects')
20 files changed, 401 insertions, 411 deletions
diff --git a/subprojects/frontend/build.gradle b/subprojects/frontend/build.gradle deleted file mode 100644 index 4cc2c5d7..00000000 --- a/subprojects/frontend/build.gradle +++ /dev/null | |||
@@ -1,131 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-frontend-workspace' | ||
3 | id 'refinery-sonarqube' | ||
4 | } | ||
5 | |||
6 | import org.siouan.frontendgradleplugin.infrastructure.gradle.RunYarn | ||
7 | |||
8 | def viteOutputDir = "${buildDir}/vite" | ||
9 | def productionResources = file("${viteOutputDir}/production") | ||
10 | |||
11 | frontend { | ||
12 | assembleScript = 'run build' | ||
13 | } | ||
14 | |||
15 | configurations { | ||
16 | productionAssets { | ||
17 | canBeConsumed = true | ||
18 | canBeResolved = false | ||
19 | } | ||
20 | } | ||
21 | |||
22 | def installFrontend = tasks.named('installFrontend') | ||
23 | |||
24 | def sourcesWithoutTypegen = fileTree('src') { | ||
25 | exclude '**/*.typegen.ts' | ||
26 | } | ||
27 | |||
28 | def assembleFrontend = tasks.named('assembleFrontend') | ||
29 | assembleFrontend.configure { | ||
30 | dependsOn generateXStateTypes | ||
31 | inputs.dir 'public' | ||
32 | inputs.files sourcesWithoutTypegen | ||
33 | inputs.file 'index.html' | ||
34 | inputs.files('package.json', 'tsconfig.json', 'tsconfig.base.json', 'vite.config.ts') | ||
35 | inputs.file rootProject.file('yarn.lock') | ||
36 | outputs.dir productionResources | ||
37 | } | ||
38 | |||
39 | artifacts { | ||
40 | productionAssets(productionResources) { | ||
41 | builtBy assembleFrontend | ||
42 | } | ||
43 | } | ||
44 | |||
45 | def generateXStateTypes = tasks.register('generateXStateTypes', RunYarn) { | ||
46 | dependsOn installFrontend | ||
47 | inputs.files sourcesWithoutTypegen | ||
48 | inputs.file 'package.json' | ||
49 | inputs.file rootProject.file('yarn.lock') | ||
50 | outputs.dir 'src' | ||
51 | script = 'run typegen' | ||
52 | description = 'Generate TypeScript typings for XState state machines.' | ||
53 | } | ||
54 | |||
55 | def typecheckFrontend = tasks.register('typecheckFrontend', RunYarn) { | ||
56 | dependsOn installFrontend | ||
57 | dependsOn generateXStateTypes | ||
58 | inputs.dir 'src' | ||
59 | inputs.dir 'types' | ||
60 | inputs.files('package.json', 'tsconfig.json', 'tsconfig.base.json', 'tsconfig.node.json') | ||
61 | inputs.file rootProject.file('yarn.lock') | ||
62 | outputs.dir "${buildDir}/typescript" | ||
63 | script = 'run typecheck' | ||
64 | group = 'verification' | ||
65 | description = 'Check for TypeScript type errors.' | ||
66 | } | ||
67 | |||
68 | def lintFrontend = tasks.register('lintFrontend', RunYarn) { | ||
69 | dependsOn installFrontend | ||
70 | dependsOn generateXStateTypes | ||
71 | dependsOn typecheckFrontend | ||
72 | inputs.dir 'src' | ||
73 | inputs.dir 'types' | ||
74 | inputs.files('.eslintrc.cjs', 'prettier.config.cjs') | ||
75 | inputs.files('package.json', 'tsconfig.json', 'tsconfig.base.json', 'tsconfig.node.json') | ||
76 | inputs.file rootProject.file('yarn.lock') | ||
77 | if (project.hasProperty('ci')) { | ||
78 | outputs.file "${buildDir}/eslint.json" | ||
79 | script = 'run lint:ci' | ||
80 | } else { | ||
81 | script = 'run lint' | ||
82 | } | ||
83 | group = 'verification' | ||
84 | description = 'Check for TypeScript lint errors and warnings.' | ||
85 | } | ||
86 | |||
87 | def prettier = tasks.register('fixFrontend', RunYarn) { | ||
88 | dependsOn installFrontend | ||
89 | dependsOn generateXStateTypes | ||
90 | dependsOn typecheckFrontend | ||
91 | inputs.dir 'src' | ||
92 | inputs.dir 'types' | ||
93 | inputs.files('.eslintrc.cjs', 'prettier.config.cjs') | ||
94 | inputs.files('package.json', 'tsconfig.json', 'tsconfig.base.json', 'tsconfig.node.json') | ||
95 | inputs.file rootProject.file('yarn.lock') | ||
96 | script = 'run lint:fix' | ||
97 | group = 'verification' | ||
98 | description = 'Fix TypeScript lint errors and warnings.' | ||
99 | } | ||
100 | |||
101 | tasks.named('check') { | ||
102 | dependsOn(typecheckFrontend) | ||
103 | dependsOn(lintFrontend) | ||
104 | } | ||
105 | |||
106 | tasks.register('serveFrontend', RunYarn) { | ||
107 | dependsOn installFrontend | ||
108 | dependsOn generateXStateTypes | ||
109 | inputs.dir 'public' | ||
110 | inputs.files sourcesWithoutTypegen | ||
111 | inputs.file 'index.html' | ||
112 | inputs.files('package.json', 'tsconfig.json', 'tsconfig.base.json', 'vite.config.ts') | ||
113 | inputs.file rootProject.file('yarn.lock') | ||
114 | outputs.dir "${viteOutputDir}/development" | ||
115 | script = 'run serve' | ||
116 | group = 'run' | ||
117 | description = 'Start a Vite dev server with hot module replacement.' | ||
118 | } | ||
119 | |||
120 | tasks.named('clean') { | ||
121 | delete 'dev-dist' | ||
122 | delete fileTree('src') { | ||
123 | include '**/*.typegen.ts' | ||
124 | } | ||
125 | } | ||
126 | |||
127 | sonarqube.properties { | ||
128 | properties['sonar.sources'] = 'src' | ||
129 | property 'sonar.nodejs.executable', "${frontend.nodeInstallDirectory.get()}/bin/node" | ||
130 | property 'sonar.eslint.reportPaths', "${buildDir}/eslint.json" | ||
131 | } | ||
diff --git a/subprojects/frontend/build.gradle.kts b/subprojects/frontend/build.gradle.kts new file mode 100644 index 00000000..4a51c74e --- /dev/null +++ b/subprojects/frontend/build.gradle.kts | |||
@@ -0,0 +1,127 @@ | |||
1 | import org.siouan.frontendgradleplugin.infrastructure.gradle.RunYarn | ||
2 | import tools.refinery.buildsrc.SonarPropertiesUtils | ||
3 | |||
4 | plugins { | ||
5 | id("refinery-frontend-workspace") | ||
6 | id("refinery-sonarqube") | ||
7 | } | ||
8 | |||
9 | val viteOutputDir = "$buildDir/vite" | ||
10 | val productionResources = file("$viteOutputDir/production") | ||
11 | |||
12 | frontend { | ||
13 | assembleScript.set("run build") | ||
14 | } | ||
15 | |||
16 | val productionAssets: Configuration by configurations.creating { | ||
17 | isCanBeConsumed = true | ||
18 | isCanBeResolved = false | ||
19 | } | ||
20 | |||
21 | val sourcesWithoutTypeGen = fileTree("src") { | ||
22 | exclude("**/*.typegen.ts") | ||
23 | } | ||
24 | |||
25 | val generateXStateTypes by tasks.registering(RunYarn::class) { | ||
26 | dependsOn(tasks.installFrontend) | ||
27 | inputs.files(sourcesWithoutTypeGen) | ||
28 | inputs.file("package.json") | ||
29 | inputs.file(rootProject.file("yarn.lock")) | ||
30 | outputs.dir("src") | ||
31 | script.set("run typegen") | ||
32 | description = "Generate TypeScript typings for XState state machines." | ||
33 | } | ||
34 | |||
35 | tasks.assembleFrontend { | ||
36 | dependsOn(generateXStateTypes) | ||
37 | inputs.dir("public") | ||
38 | inputs.files(sourcesWithoutTypeGen) | ||
39 | inputs.file("index.html") | ||
40 | inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "vite.config.ts") | ||
41 | inputs.file(rootProject.file("yarn.lock")) | ||
42 | outputs.dir(productionResources) | ||
43 | } | ||
44 | |||
45 | artifacts { | ||
46 | add("productionAssets", productionResources) { | ||
47 | builtBy(tasks.assembleFrontend) | ||
48 | } | ||
49 | } | ||
50 | |||
51 | val typeCheckFrontend by tasks.registering(RunYarn::class) { | ||
52 | dependsOn(tasks.installFrontend) | ||
53 | dependsOn(generateXStateTypes) | ||
54 | inputs.dir("src") | ||
55 | inputs.dir("types") | ||
56 | inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "tsconfig.node.json") | ||
57 | inputs.file(rootProject.file("yarn.lock")) | ||
58 | outputs.dir("$buildDir/typescript") | ||
59 | script.set("run typecheck") | ||
60 | group = "verification" | ||
61 | description = "Check for TypeScript type errors." | ||
62 | } | ||
63 | |||
64 | val lintFrontend by tasks.registering(RunYarn::class) { | ||
65 | dependsOn(tasks.installFrontend) | ||
66 | dependsOn(generateXStateTypes) | ||
67 | dependsOn(typeCheckFrontend) | ||
68 | inputs.dir("src") | ||
69 | inputs.dir("types") | ||
70 | inputs.files(".eslintrc.cjs", "prettier.config.cjs") | ||
71 | inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "tsconfig.node.json") | ||
72 | inputs.file(rootProject.file("yarn.lock")) | ||
73 | if (project.hasProperty("ci")) { | ||
74 | outputs.file("$buildDir/eslint.json") | ||
75 | script.set("run lint:ci") | ||
76 | } else { | ||
77 | script.set("run lint") | ||
78 | } | ||
79 | group = "verification" | ||
80 | description = "Check for TypeScript lint errors and warnings." | ||
81 | } | ||
82 | |||
83 | val fixFrontend by tasks.registering(RunYarn::class) { | ||
84 | dependsOn(tasks.installFrontend) | ||
85 | dependsOn(generateXStateTypes) | ||
86 | dependsOn(typeCheckFrontend) | ||
87 | inputs.dir("src") | ||
88 | inputs.dir("types") | ||
89 | inputs.files(".eslintrc.cjs", "prettier.config.cjs") | ||
90 | inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "tsconfig.node.json") | ||
91 | inputs.file(rootProject.file("yarn.lock")) | ||
92 | script.set("run lint:fix") | ||
93 | group = "verification" | ||
94 | description = "Fix TypeScript lint errors and warnings." | ||
95 | } | ||
96 | |||
97 | tasks.check { | ||
98 | dependsOn(typeCheckFrontend) | ||
99 | dependsOn(lintFrontend) | ||
100 | } | ||
101 | |||
102 | tasks.register("serveFrontend", RunYarn::class) { | ||
103 | dependsOn(tasks.installFrontend) | ||
104 | dependsOn(generateXStateTypes) | ||
105 | inputs.dir("public") | ||
106 | inputs.files(sourcesWithoutTypeGen) | ||
107 | inputs.file("index.html") | ||
108 | inputs.files("package.json", "tsconfig.json", "tsconfig.base.json", "vite.config.ts") | ||
109 | inputs.file(rootProject.file("yarn.lock")) | ||
110 | outputs.dir("$viteOutputDir/development") | ||
111 | script.set("run serve") | ||
112 | group = "run" | ||
113 | description = "Start a Vite dev server with hot module replacement." | ||
114 | } | ||
115 | |||
116 | tasks.clean { | ||
117 | delete("dev-dist") | ||
118 | delete(fileTree("src") { | ||
119 | include("**/*.typegen.ts") | ||
120 | }) | ||
121 | } | ||
122 | |||
123 | sonarqube.properties { | ||
124 | SonarPropertiesUtils.addToList(properties, "sonar.sources", "src") | ||
125 | property("sonar.nodejs.executable", "${frontend.nodeInstallDirectory.get()}/bin/node") | ||
126 | property("sonar.eslint.reportPaths", "$buildDir/eslint.json") | ||
127 | } | ||
diff --git a/subprojects/language-ide/build.gradle b/subprojects/language-ide/build.gradle deleted file mode 100644 index 3786762b..00000000 --- a/subprojects/language-ide/build.gradle +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | id 'refinery-xtext-conventions' | ||
4 | } | ||
5 | |||
6 | dependencies { | ||
7 | api project(':refinery-language') | ||
8 | api libs.xtext.ide | ||
9 | api libs.xtext.xbase.ide | ||
10 | } | ||
11 | |||
12 | def generateXtextLanguage = project(':refinery-language').tasks.named('generateXtextLanguage') | ||
13 | |||
14 | for (taskName in ['compileJava', 'processResources']) { | ||
15 | tasks.named(taskName) { | ||
16 | dependsOn generateXtextLanguage | ||
17 | } | ||
18 | } | ||
diff --git a/subprojects/language-ide/build.gradle.kts b/subprojects/language-ide/build.gradle.kts new file mode 100644 index 00000000..b2e6d4c1 --- /dev/null +++ b/subprojects/language-ide/build.gradle.kts | |||
@@ -0,0 +1,18 @@ | |||
1 | plugins { | ||
2 | id("refinery-java-library") | ||
3 | id("refinery-xtext-conventions") | ||
4 | } | ||
5 | |||
6 | dependencies { | ||
7 | api(project(":refinery-language")) | ||
8 | api(libs.xtext.ide) | ||
9 | api(libs.xtext.xbase.ide) | ||
10 | } | ||
11 | |||
12 | val generateXtextLanguage = project(":refinery-language").tasks.named("generateXtextLanguage") | ||
13 | |||
14 | for (taskName in listOf("compileJava", "processResources")) { | ||
15 | tasks.named(taskName) { | ||
16 | dependsOn(generateXtextLanguage) | ||
17 | } | ||
18 | } | ||
diff --git a/subprojects/language-model/build.gradle b/subprojects/language-model/build.gradle deleted file mode 100644 index 275db188..00000000 --- a/subprojects/language-model/build.gradle +++ /dev/null | |||
@@ -1,55 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | id 'refinery-mwe2' | ||
4 | id 'refinery-sonarqube' | ||
5 | } | ||
6 | |||
7 | dependencies { | ||
8 | api libs.ecore | ||
9 | api libs.ecore.xmi | ||
10 | mwe2 libs.ecore.codegen | ||
11 | mwe2 libs.mwe.utils | ||
12 | mwe2 libs.mwe2.lib | ||
13 | mwe2 libs.xtext.core | ||
14 | mwe2 libs.xtext.xbase | ||
15 | } | ||
16 | |||
17 | sourceSets { | ||
18 | main { | ||
19 | java.srcDirs += ['src/main/emf-gen'] | ||
20 | } | ||
21 | } | ||
22 | |||
23 | def generateEPackage = tasks.register('generateEPackage', JavaExec) { | ||
24 | mainClass = 'org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher' | ||
25 | classpath = configurations.mwe2 | ||
26 | inputs.file 'src/main/java/tools/refinery/language/model/GenerateProblemModel.mwe2' | ||
27 | inputs.file 'src/main/resources/model/problem.ecore' | ||
28 | inputs.file 'src/main/resources/model/problem.genmodel' | ||
29 | outputs.dir 'src/main/emf-gen' | ||
30 | args += 'src/main/java/tools/refinery/language/model/GenerateProblemModel.mwe2' | ||
31 | args += '-p' | ||
32 | args += "rootPath=/${projectDir}" | ||
33 | } | ||
34 | |||
35 | for (taskName in ['compileJava', 'processResources', 'generateEclipseSourceFolders']) { | ||
36 | tasks.named(taskName) { | ||
37 | dependsOn generateEPackage | ||
38 | } | ||
39 | } | ||
40 | |||
41 | tasks.named('clean') { | ||
42 | delete 'src/main/emf-gen' | ||
43 | } | ||
44 | |||
45 | sonarqube.properties { | ||
46 | properties['sonar.exclusions'] += [ | ||
47 | 'src/main/emf-gen/**', | ||
48 | ] | ||
49 | } | ||
50 | |||
51 | eclipse.project.natures += [ | ||
52 | 'org.eclipse.sirius.nature.modelingproject', | ||
53 | 'org.eclipse.pde.PluginNature', | ||
54 | 'org.eclipse.xtext.ui.shared.xtextNature' | ||
55 | ] | ||
diff --git a/subprojects/language-model/build.gradle.kts b/subprojects/language-model/build.gradle.kts new file mode 100644 index 00000000..2804c698 --- /dev/null +++ b/subprojects/language-model/build.gradle.kts | |||
@@ -0,0 +1,53 @@ | |||
1 | import tools.refinery.buildsrc.SonarPropertiesUtils | ||
2 | |||
3 | plugins { | ||
4 | id("refinery-java-library") | ||
5 | id("refinery-mwe2") | ||
6 | id("refinery-sonarqube") | ||
7 | } | ||
8 | |||
9 | dependencies { | ||
10 | api(libs.ecore) | ||
11 | api(libs.ecore.xmi) | ||
12 | mwe2(libs.ecore.codegen) | ||
13 | mwe2(libs.mwe.utils) | ||
14 | mwe2(libs.mwe2.lib) | ||
15 | mwe2(libs.xtext.core) | ||
16 | mwe2(libs.xtext.xbase) | ||
17 | } | ||
18 | |||
19 | sourceSets { | ||
20 | main { | ||
21 | java.srcDir("src/main/emf-gen") | ||
22 | } | ||
23 | } | ||
24 | |||
25 | val generateEPackage by tasks.registering(JavaExec::class) { | ||
26 | mainClass.set("org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher") | ||
27 | classpath(configurations.mwe2) | ||
28 | inputs.file("src/main/java/tools/refinery/language/model/GenerateProblemModel.mwe2") | ||
29 | inputs.file("src/main/resources/model/problem.ecore") | ||
30 | inputs.file("src/main/resources/model/problem.genmodel") | ||
31 | outputs.dir("src/main/emf-gen") | ||
32 | args("src/main/java/tools/refinery/language/model/GenerateProblemModel.mwe2", "-p", "rootPath=/$projectDir") | ||
33 | } | ||
34 | |||
35 | for (taskName in listOf("compileJava", "processResources", "generateEclipseSourceFolders")) { | ||
36 | tasks.named(taskName) { | ||
37 | dependsOn(generateEPackage) | ||
38 | } | ||
39 | } | ||
40 | |||
41 | tasks.clean { | ||
42 | delete("src/main/emf-gen") | ||
43 | } | ||
44 | |||
45 | sonarqube.properties { | ||
46 | SonarPropertiesUtils.addToList(properties, "sonar.exclusions", "src/main/emf-gen/**") | ||
47 | } | ||
48 | |||
49 | eclipse.project.natures.plusAssign(listOf( | ||
50 | "org.eclipse.sirius.nature.modelingproject", | ||
51 | "org.eclipse.pde.PluginNature", | ||
52 | "org.eclipse.xtext.ui.shared.xtextNature", | ||
53 | )) | ||
diff --git a/subprojects/language-semantics/build.gradle b/subprojects/language-semantics/build.gradle deleted file mode 100644 index 4f43ad24..00000000 --- a/subprojects/language-semantics/build.gradle +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | } | ||
4 | |||
5 | dependencies { | ||
6 | implementation libs.eclipseCollections | ||
7 | implementation libs.eclipseCollections.api | ||
8 | api project(':refinery-language') | ||
9 | api project(':refinery-store') | ||
10 | testImplementation testFixtures(project(':refinery-language')) | ||
11 | } | ||
diff --git a/subprojects/language-semantics/build.gradle.kts b/subprojects/language-semantics/build.gradle.kts new file mode 100644 index 00000000..e13e5e4a --- /dev/null +++ b/subprojects/language-semantics/build.gradle.kts | |||
@@ -0,0 +1,11 @@ | |||
1 | plugins { | ||
2 | id("refinery-java-library") | ||
3 | } | ||
4 | |||
5 | dependencies { | ||
6 | implementation(libs.eclipseCollections) | ||
7 | implementation(libs.eclipseCollections.api) | ||
8 | api(project(":refinery-language")) | ||
9 | api(project(":refinery-store")) | ||
10 | testImplementation(testFixtures(project(":refinery-language"))) | ||
11 | } | ||
diff --git a/subprojects/language-web/build.gradle b/subprojects/language-web/build.gradle deleted file mode 100644 index 8d277a5b..00000000 --- a/subprojects/language-web/build.gradle +++ /dev/null | |||
@@ -1,87 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-application' | ||
3 | id 'refinery-xtext-conventions' | ||
4 | } | ||
5 | |||
6 | configurations { | ||
7 | webapp { | ||
8 | canBeConsumed = false | ||
9 | canBeResolved = true | ||
10 | } | ||
11 | |||
12 | all { | ||
13 | // Use log4j-over-slf4j instead of log4j 1.x | ||
14 | exclude group: 'log4j', module: 'log4j' | ||
15 | } | ||
16 | } | ||
17 | |||
18 | dependencies { | ||
19 | implementation project(':refinery-language') | ||
20 | implementation project(':refinery-language-ide') | ||
21 | implementation libs.jetty.server | ||
22 | implementation libs.jetty.servlet | ||
23 | implementation libs.jetty.websocket.server | ||
24 | implementation libs.slf4j.api | ||
25 | implementation libs.slf4j.simple | ||
26 | implementation libs.slf4j.log4j | ||
27 | implementation libs.xtext.web | ||
28 | webapp project(path: ':refinery-frontend', configuration: 'productionAssets') | ||
29 | testImplementation testFixtures(project(':refinery-language')) | ||
30 | testImplementation libs.jetty.websocket.client | ||
31 | } | ||
32 | |||
33 | def generateXtextLanguage = project(':refinery-language').tasks.named('generateXtextLanguage') | ||
34 | |||
35 | for (taskName in ['compileJava', 'processResources']) { | ||
36 | tasks.named(taskName) { | ||
37 | dependsOn generateXtextLanguage | ||
38 | } | ||
39 | } | ||
40 | |||
41 | mainClassName = 'tools.refinery.language.web.ServerLauncher' | ||
42 | |||
43 | // Enable JDK 19 preview features for virtual thread support. | ||
44 | application { | ||
45 | applicationDefaultJvmArgs += '--enable-preview' | ||
46 | } | ||
47 | tasks.withType(JavaCompile) { | ||
48 | options.release = 19 | ||
49 | options.compilerArgs += '--enable-preview' | ||
50 | } | ||
51 | tasks.withType(Test) { | ||
52 | jvmArgs += '--enable-preview' | ||
53 | } | ||
54 | |||
55 | tasks.named('jar') { | ||
56 | dependsOn project.configurations.webapp | ||
57 | from(project.configurations.webapp) { | ||
58 | into 'webapp' | ||
59 | } | ||
60 | } | ||
61 | |||
62 | tasks.named('shadowJar') { | ||
63 | dependsOn project.configurations.webapp | ||
64 | from(project.sourceSets.main.output) | ||
65 | configurations = [project.configurations.runtimeClasspath] | ||
66 | exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA','schema/*', | ||
67 | '.options', '.api_description', '*.profile', 'about.*', 'about_*.html', 'about_files/*', | ||
68 | 'plugin.xml', 'systembundle.properties', 'profile.list', 'META-INF/resources/xtext/**') | ||
69 | append('plugin.properties') | ||
70 | from(project.configurations.webapp) { | ||
71 | into 'webapp' | ||
72 | } | ||
73 | } | ||
74 | |||
75 | tasks.register('serveBackend', JavaExec) { | ||
76 | dependsOn project.configurations.webapp | ||
77 | dependsOn sourceSets.main.runtimeClasspath | ||
78 | classpath = sourceSets.main.runtimeClasspath | ||
79 | mainClass = mainClassName | ||
80 | // Enable JDK 19 preview features for virtual thread support. | ||
81 | jvmArgs += '--enable-preview' | ||
82 | standardInput = System.in | ||
83 | def baseResource = project.configurations.webapp.incoming.artifacts.artifactFiles.first() | ||
84 | environment BASE_RESOURCE: baseResource | ||
85 | group = 'run' | ||
86 | description = 'Start a Jetty web server serving the Xtex API and assets.' | ||
87 | } | ||
diff --git a/subprojects/language-web/build.gradle.kts b/subprojects/language-web/build.gradle.kts new file mode 100644 index 00000000..c68daa9a --- /dev/null +++ b/subprojects/language-web/build.gradle.kts | |||
@@ -0,0 +1,91 @@ | |||
1 | plugins { | ||
2 | id("refinery-java-application") | ||
3 | id("refinery-xtext-conventions") | ||
4 | } | ||
5 | |||
6 | val webapp: Configuration by configurations.creating { | ||
7 | isCanBeConsumed = false | ||
8 | isCanBeResolved = true | ||
9 | } | ||
10 | |||
11 | configurations.all { | ||
12 | // Use log4j-over-slf4j instead of log4j 1.x | ||
13 | exclude(group = "log4j", module = "log4j") | ||
14 | } | ||
15 | |||
16 | dependencies { | ||
17 | implementation(project(":refinery-language")) | ||
18 | implementation(project(":refinery-language-ide")) | ||
19 | implementation(libs.jetty.server) | ||
20 | implementation(libs.jetty.servlet) | ||
21 | implementation(libs.jetty.websocket.server) | ||
22 | implementation(libs.slf4j.api) | ||
23 | implementation(libs.slf4j.simple) | ||
24 | implementation(libs.slf4j.log4j) | ||
25 | implementation(libs.xtext.web) | ||
26 | webapp(project(path = ":refinery-frontend", configuration = "productionAssets")) | ||
27 | testImplementation(testFixtures(project(":refinery-language"))) | ||
28 | testImplementation(libs.jetty.websocket.client) | ||
29 | } | ||
30 | |||
31 | val generateXtextLanguage = project(":refinery-language").tasks.named("generateXtextLanguage") | ||
32 | |||
33 | for (taskName in listOf("compileJava", "processResources")) { | ||
34 | tasks.named(taskName) { | ||
35 | dependsOn(generateXtextLanguage) | ||
36 | } | ||
37 | } | ||
38 | |||
39 | application { | ||
40 | mainClass.set("tools.refinery.language.web.ServerLauncher") | ||
41 | // Enable JDK 19 preview features for virtual thread support. | ||
42 | applicationDefaultJvmArgs += "--enable-preview" | ||
43 | } | ||
44 | |||
45 | tasks.withType(JavaCompile::class) { | ||
46 | options.release.set(19) | ||
47 | // Enable JDK 19 preview features for virtual thread support. | ||
48 | options.compilerArgs.plusAssign("--enable-preview") | ||
49 | } | ||
50 | |||
51 | // Enable JDK 19 preview features for virtual thread support. | ||
52 | fun enablePreview(task: JavaForkOptions) { | ||
53 | task.jvmArgs("--enable-preview") | ||
54 | } | ||
55 | |||
56 | tasks.withType(Test::class) { | ||
57 | enablePreview(this) | ||
58 | } | ||
59 | |||
60 | tasks.jar { | ||
61 | dependsOn(webapp) | ||
62 | from(webapp) { | ||
63 | into("webapp") | ||
64 | } | ||
65 | } | ||
66 | |||
67 | tasks.shadowJar { | ||
68 | dependsOn(webapp) | ||
69 | from(project.sourceSets.main.map { it.output }) | ||
70 | exclude("META-INF/INDEX.LIST", "META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA","schema/*", | ||
71 | ".options", ".api_description", "*.profile", "about.*", "about_*.html", "about_files/*", | ||
72 | "plugin.xml", "systembundle.properties", "profile.list", "META-INF/resources/xtext/**") | ||
73 | append("plugin.properties") | ||
74 | from(webapp) { | ||
75 | into("webapp") | ||
76 | } | ||
77 | } | ||
78 | |||
79 | tasks.register("serveBackend", JavaExec::class) { | ||
80 | dependsOn(webapp) | ||
81 | val mainRuntimeClasspath = sourceSets.main.map { it.runtimeClasspath } | ||
82 | dependsOn(mainRuntimeClasspath) | ||
83 | classpath(mainRuntimeClasspath) | ||
84 | mainClass.set(application.mainClass) | ||
85 | enablePreview(this) | ||
86 | standardInput = System.`in` | ||
87 | val baseResource = webapp.incoming.artifacts.artifactFiles.first() | ||
88 | environment("BASE_RESOURCE", baseResource) | ||
89 | group = "run" | ||
90 | description = "Start a Jetty web server serving the Xtex API and assets." | ||
91 | } | ||
diff --git a/subprojects/language/build.gradle b/subprojects/language/build.gradle deleted file mode 100644 index 654558e3..00000000 --- a/subprojects/language/build.gradle +++ /dev/null | |||
@@ -1,73 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | id 'refinery-java-test-fixtures' | ||
4 | id 'refinery-mwe2' | ||
5 | id 'refinery-sonarqube' | ||
6 | id 'refinery-xtext-conventions' | ||
7 | } | ||
8 | |||
9 | dependencies { | ||
10 | api platform(libs.xtext.bom) | ||
11 | api libs.ecore | ||
12 | api libs.xtext.core | ||
13 | api libs.xtext.xbase | ||
14 | api project(':refinery-language-model') | ||
15 | testFixturesApi libs.xtext.testing | ||
16 | mwe2 libs.xtext.generator | ||
17 | mwe2 libs.xtext.generator.antlr | ||
18 | } | ||
19 | |||
20 | sourceSets { | ||
21 | testFixtures { | ||
22 | java.srcDirs += ['src/testFixtures/xtext-gen'] | ||
23 | resources.srcDirs += ['src/testFixtures/xtext-gen'] | ||
24 | } | ||
25 | } | ||
26 | |||
27 | tasks.named('jar') { | ||
28 | from(sourceSets.main.allSource) { | ||
29 | include '**/*.xtext' | ||
30 | } | ||
31 | } | ||
32 | |||
33 | def generateXtextLanguage = tasks.register('generateXtextLanguage', JavaExec) { | ||
34 | mainClass = 'org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher' | ||
35 | classpath = configurations.mwe2 | ||
36 | inputs.file 'src/main/java/tools/refinery/language/GenerateProblem.mwe2' | ||
37 | inputs.file 'src/main/java/tools/refinery/language/Problem.xtext' | ||
38 | outputs.dir 'src/main/xtext-gen' | ||
39 | outputs.dir 'src/testFixtures/xtext-gen' | ||
40 | outputs.dir '../language-ide/src/main/xtext-gen' | ||
41 | outputs.dir '../language-web/src/main/xtext-gen' | ||
42 | args += 'src/main/java/tools/refinery/language/GenerateProblem.mwe2' | ||
43 | args += '-p' | ||
44 | args += "rootPath=/${projectDir}/.." | ||
45 | } | ||
46 | |||
47 | for (taskName in [ | ||
48 | 'compileJava', | ||
49 | 'processResources', | ||
50 | 'processTestFixturesResources', | ||
51 | 'generateEclipseSourceFolders' | ||
52 | ]) { | ||
53 | tasks.named(taskName) { | ||
54 | dependsOn generateXtextLanguage | ||
55 | } | ||
56 | } | ||
57 | |||
58 | tasks.named('clean') { | ||
59 | delete 'src/main/xtext-gen' | ||
60 | delete 'src/testFixtures/xtext-gen' | ||
61 | delete '../language-ide/src/main/xtext-gen' | ||
62 | delete '../language-web/src/main/xtext-gen' | ||
63 | } | ||
64 | |||
65 | sonarqube.properties { | ||
66 | properties['sonar.exclusions'] += [ | ||
67 | 'src/testFixtures/xtext-gen/**', | ||
68 | ] | ||
69 | } | ||
70 | |||
71 | eclipse.project.natures += [ | ||
72 | 'org.eclipse.xtext.ui.shared.xtextNature' | ||
73 | ] | ||
diff --git a/subprojects/language/build.gradle.kts b/subprojects/language/build.gradle.kts new file mode 100644 index 00000000..ed4f95a5 --- /dev/null +++ b/subprojects/language/build.gradle.kts | |||
@@ -0,0 +1,65 @@ | |||
1 | import tools.refinery.buildsrc.SonarPropertiesUtils | ||
2 | |||
3 | plugins { | ||
4 | id("refinery-java-library") | ||
5 | id("refinery-java-test-fixtures") | ||
6 | id("refinery-sonarqube") | ||
7 | id("refinery-mwe2") | ||
8 | id("refinery-xtext-conventions") | ||
9 | } | ||
10 | |||
11 | dependencies { | ||
12 | api(platform(libs.xtext.bom)) | ||
13 | api(libs.ecore) | ||
14 | api(libs.xtext.core) | ||
15 | api(libs.xtext.xbase) | ||
16 | api(project(":refinery-language-model")) | ||
17 | testFixturesApi(libs.xtext.testing) | ||
18 | mwe2(libs.xtext.generator) | ||
19 | mwe2(libs.xtext.generator.antlr) | ||
20 | } | ||
21 | |||
22 | sourceSets { | ||
23 | testFixtures { | ||
24 | java.srcDir("src/testFixtures/xtext-gen") | ||
25 | resources.srcDir("src/testFixtures/xtext-gen") | ||
26 | } | ||
27 | } | ||
28 | |||
29 | tasks.jar { | ||
30 | from(sourceSets.main.map { it.allSource }) { | ||
31 | include("**/*.xtext") | ||
32 | } | ||
33 | } | ||
34 | |||
35 | val generateXtextLanguage by tasks.registering(JavaExec::class) { | ||
36 | mainClass.set("org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher") | ||
37 | classpath(configurations.mwe2) | ||
38 | inputs.file("src/main/java/tools/refinery/language/GenerateProblem.mwe2") | ||
39 | inputs.file("src/main/java/tools/refinery/language/Problem.xtext") | ||
40 | outputs.dir("src/main/xtext-gen") | ||
41 | outputs.dir("src/testFixtures/xtext-gen") | ||
42 | outputs.dir("../language-ide/src/main/xtext-gen") | ||
43 | outputs.dir("../language-web/src/main/xtext-gen") | ||
44 | args("src/main/java/tools/refinery/language/GenerateProblem.mwe2", "-p", "rootPath=/$projectDir/..") | ||
45 | } | ||
46 | |||
47 | for (taskName in listOf("compileJava", "processResources", "processTestFixturesResources", | ||
48 | "generateEclipseSourceFolders")) { | ||
49 | tasks.named(taskName) { | ||
50 | dependsOn(generateXtextLanguage) | ||
51 | } | ||
52 | } | ||
53 | |||
54 | tasks.clean { | ||
55 | delete("src/main/xtext-gen") | ||
56 | delete("src/testFixtures/xtext-gen") | ||
57 | delete("../language-ide/src/main/xtext-gen") | ||
58 | delete("../language-web/src/main/xtext-gen") | ||
59 | } | ||
60 | |||
61 | sonarqube.properties { | ||
62 | SonarPropertiesUtils.addToList(properties, "sonar.exclusions", "src/textFixtures/xtext-gen/**") | ||
63 | } | ||
64 | |||
65 | eclipse.project.natures.plusAssign("org.eclipse.xtext.ui.shared.xtextNature") | ||
diff --git a/subprojects/store-query-viatra/build.gradle b/subprojects/store-query-viatra/build.gradle deleted file mode 100644 index 13a7544f..00000000 --- a/subprojects/store-query-viatra/build.gradle +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | } | ||
4 | |||
5 | configurations.testRuntimeClasspath { | ||
6 | // VIATRA requires log4j 1.x, but we use log4j-over-slf4j instead | ||
7 | exclude group: 'log4j', module: 'log4j' | ||
8 | } | ||
9 | |||
10 | dependencies { | ||
11 | implementation libs.ecore | ||
12 | api libs.viatra | ||
13 | api project(':refinery-store-query') | ||
14 | testImplementation libs.slf4j.simple | ||
15 | testImplementation libs.slf4j.log4j | ||
16 | } | ||
diff --git a/subprojects/store-query-viatra/build.gradle.kts b/subprojects/store-query-viatra/build.gradle.kts new file mode 100644 index 00000000..d7a37f11 --- /dev/null +++ b/subprojects/store-query-viatra/build.gradle.kts | |||
@@ -0,0 +1,16 @@ | |||
1 | plugins { | ||
2 | id("refinery-java-library") | ||
3 | } | ||
4 | |||
5 | configurations.testRuntimeClasspath { | ||
6 | // VIATRA requires log4j 1.x, but we use log4j-over-slf4j instead | ||
7 | exclude(group = "log4j", module = "log4j") | ||
8 | } | ||
9 | |||
10 | dependencies { | ||
11 | implementation(libs.ecore) | ||
12 | api(libs.viatra) | ||
13 | api(project(":refinery-store-query")) | ||
14 | testImplementation(libs.slf4j.simple) | ||
15 | testImplementation(libs.slf4j.log4j) | ||
16 | } | ||
diff --git a/subprojects/store-query/build.gradle b/subprojects/store-query/build.gradle deleted file mode 100644 index 97761936..00000000 --- a/subprojects/store-query/build.gradle +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | id 'refinery-java-test-fixtures' | ||
4 | } | ||
5 | |||
6 | dependencies { | ||
7 | api project(':refinery-store') | ||
8 | testFixturesApi libs.hamcrest | ||
9 | } | ||
diff --git a/subprojects/store-query/build.gradle.kts b/subprojects/store-query/build.gradle.kts new file mode 100644 index 00000000..16dbd95d --- /dev/null +++ b/subprojects/store-query/build.gradle.kts | |||
@@ -0,0 +1,9 @@ | |||
1 | plugins { | ||
2 | id("refinery-java-library") | ||
3 | id("refinery-java-test-fixtures") | ||
4 | } | ||
5 | |||
6 | dependencies { | ||
7 | api(project(":refinery-store")) | ||
8 | testFixturesApi(libs.hamcrest) | ||
9 | } | ||
diff --git a/subprojects/store-reasoning/build.gradle b/subprojects/store-reasoning/build.gradle deleted file mode 100644 index cb440d9f..00000000 --- a/subprojects/store-reasoning/build.gradle +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | } | ||
4 | |||
5 | dependencies { | ||
6 | api project(':refinery-store-query') | ||
7 | } | ||
diff --git a/subprojects/store-reasoning/build.gradle.kts b/subprojects/store-reasoning/build.gradle.kts new file mode 100644 index 00000000..fe15fc42 --- /dev/null +++ b/subprojects/store-reasoning/build.gradle.kts | |||
@@ -0,0 +1,7 @@ | |||
1 | plugins { | ||
2 | id("refinery-java-library") | ||
3 | } | ||
4 | |||
5 | dependencies { | ||
6 | api(project(":refinery-store-query")) | ||
7 | } | ||
diff --git a/subprojects/store/build.gradle b/subprojects/store/build.gradle deleted file mode 100644 index 370d094b..00000000 --- a/subprojects/store/build.gradle +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | plugins { | ||
2 | id 'refinery-java-library' | ||
3 | id 'refinery-jmh' | ||
4 | } | ||
diff --git a/subprojects/store/build.gradle.kts b/subprojects/store/build.gradle.kts new file mode 100644 index 00000000..5b4eac46 --- /dev/null +++ b/subprojects/store/build.gradle.kts | |||
@@ -0,0 +1,4 @@ | |||
1 | plugins { | ||
2 | id("refinery-java-library") | ||
3 | id("refinery-jmh") | ||
4 | } | ||