Skip to content

Commit

Permalink
Initial ffm support
Browse files Browse the repository at this point in the history
- Starter for jline ffm terminal provider
- Build changes for compiling with gradle toolchains
  defaulting to jdk22
- spring-shell-sample-ffm which compiles with jdk22
- ci workflow setups jdk 17/22
- Relates spring-projects#1131
  • Loading branch information
jvalkeal committed Aug 30, 2024
1 parent e1ef18e commit bad7588
Show file tree
Hide file tree
Showing 9 changed files with 202 additions and 2 deletions.
8 changes: 6 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ jobs:
- uses: actions/setup-java@v3
with:
distribution: adopt
java-version: ${{ matrix.java }}
java-version: |
22
17
cache: gradle
- name: Build
run: ./gradlew build
Expand All @@ -41,7 +43,9 @@ jobs:
- uses: actions/setup-java@v3
with:
distribution: adopt
java-version: 17
java-version: |
22
17
cache: gradle
- uses: jfrog/setup-jfrog-cli@v3
with:
Expand Down
4 changes: 4 additions & 0 deletions buildSrc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,9 @@ gradlePlugin {
id = "org.springframework.shell.sample"
implementationClass = "org.springframework.shell.gradle.SamplePlugin"
}
toolchainPlugin {
id = "org.springframework.shell.toolchain"
implementationClass = "org.springframework.shell.gradle.ToolchainPlugin"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.shell.gradle;

import org.gradle.api.Project;
import org.gradle.api.provider.Property;
import org.gradle.jvm.toolchain.JavaLanguageVersion;

public class ToolchainExtension {

private final Property<JavaLanguageVersion> maximumCompatibleJavaVersion;

private final JavaLanguageVersion javaVersion;

public ToolchainExtension(Project project) {
this.maximumCompatibleJavaVersion = project.getObjects().property(JavaLanguageVersion.class);
String toolchainVersion = (String) project.findProperty("toolchainVersion");
this.javaVersion = (toolchainVersion != null) ? JavaLanguageVersion.of(toolchainVersion) : null;
}

public Property<JavaLanguageVersion> getMaximumCompatibleJavaVersion() {
return this.maximumCompatibleJavaVersion;
}

JavaLanguageVersion getJavaVersion() {
return this.javaVersion;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.shell.gradle;

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.jvm.toolchain.JavaLanguageVersion;
import org.gradle.jvm.toolchain.JavaToolchainSpec;

public class ToolchainPlugin implements Plugin<Project> {

@Override
public void apply(Project project) {
configureToolchain(project);
}

private void configureToolchain(Project project) {
ToolchainExtension toolchain = project.getExtensions().create("toolchain", ToolchainExtension.class, project);
project.afterEvaluate((evaluated) -> configure(evaluated, toolchain));
}

private void configure(Project project, ToolchainExtension toolchain) {
JavaLanguageVersion toolchainVersion = toolchain.getJavaVersion();
if (toolchainVersion == null) {
toolchainVersion = JavaLanguageVersion.of(22);
}
JavaToolchainSpec toolchainSpec = project.getExtensions()
.getByType(JavaPluginExtension.class)
.getToolchain();
toolchainSpec.getLanguageVersion().set(toolchainVersion);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
plugins {
id 'org.springframework.shell.sample'
id 'org.springframework.shell.toolchain'
}

description = 'Spring Shell Sample FFM'

tasks.named("bootJar") {
manifest {
attributes 'Enable-Native-Access': 'ALL-UNNAMED'
}
}

dependencies {
management platform(project(":spring-shell-management"))
implementation project(':spring-shell-starters:spring-shell-starter-ffm')
testImplementation project(':spring-shell-starters:spring-shell-starter-test')
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.awaitility:awaitility'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.shell.samples.ffm;

import org.springframework.boot.Banner.Mode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.shell.command.annotation.CommandScan;

@SpringBootApplication
@CommandScan
public class SpringShellApplication {

public static void main(String[] args) throws Exception {
SpringApplication application = new SpringApplication(SpringShellApplication.class);
application.setBannerMode(Mode.OFF);
application.run(args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
spring:
main:
banner-mode: off
shell:
interactive:
enabled: true
## disable console logging
logging:
pattern:
console:
## log debug from a cli
# file:
# name: shell-ffm.log
# level:
# root: debug
# org:
# springframework:
# shell: debug
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.shell.samples.ffm;

public class SpringShellApplicationTests {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
plugins {
id 'org.springframework.shell.starter'
id 'org.springframework.shell.toolchain'
}

description = 'Spring Shell Starter FFM'

dependencies {
management platform(project(':spring-shell-management'))
api(project(':spring-shell-starters:spring-shell-starter'))
implementation 'org.jline:jline-terminal-ffm'
}

0 comments on commit bad7588

Please sign in to comment.