Skip to content

Commit e136308

Browse files
authored
Merge branch 'main' into bump-qodana-2025.2
2 parents 9289326 + a1aaeee commit e136308

File tree

15 files changed

+238
-127
lines changed

15 files changed

+238
-127
lines changed

.editorconfig

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ ij_wrap_on_typing = false
1818

1919
[*.java]
2020
indent_style = tab
21-
ij_java_imports_layout = $*,|,*,|,javax.**,java.**,|
21+
ij_java_imports_layout = $*, |, *, |, javax.**, java.**, |, @*
2222
ij_java_names_count_to_use_import_on_demand = 999
2323
ij_java_class_count_to_use_import_on_demand = 999
2424
ij_java_align_consecutive_assignments = false
@@ -103,14 +103,6 @@ ij_java_doc_param_description_on_new_line = false
103103
ij_java_doc_preserve_line_breaks = false
104104
ij_java_doc_use_throws_not_exception_tag = true
105105
ij_java_else_on_new_line = false
106-
ij_java_entity_dd_suffix = EJB
107-
ij_java_entity_eb_suffix = Bean
108-
ij_java_entity_hi_suffix = Home
109-
ij_java_entity_lhi_prefix = Local
110-
ij_java_entity_lhi_suffix = Home
111-
ij_java_entity_li_prefix = Local
112-
ij_java_entity_pk_class = java.lang.String
113-
ij_java_entity_vo_suffix = VO
114106
ij_java_enum_constants_wrap = off
115107
ij_java_extends_keyword_wrap = off
116108
ij_java_extends_list_wrap = off
@@ -147,8 +139,6 @@ ij_java_layout_static_imports_separately = true
147139
ij_java_line_comment_add_space = false
148140
ij_java_line_comment_add_space_on_reformat = false
149141
ij_java_line_comment_at_first_column = true
150-
ij_java_message_dd_suffix = EJB
151-
ij_java_message_eb_suffix = Bean
152142
ij_java_method_annotation_wrap = split_into_lines
153143
ij_java_method_brace_style = end_of_line
154144
ij_java_method_call_chain_wrap = off
@@ -177,13 +167,6 @@ ij_java_resource_list_wrap = off
177167
ij_java_rparen_on_new_line_in_annotation = false
178168
ij_java_rparen_on_new_line_in_deconstruction_pattern = true
179169
ij_java_rparen_on_new_line_in_record_header = false
180-
ij_java_session_dd_suffix = EJB
181-
ij_java_session_eb_suffix = Bean
182-
ij_java_session_hi_suffix = Home
183-
ij_java_session_lhi_prefix = Local
184-
ij_java_session_lhi_suffix = Home
185-
ij_java_session_li_prefix = Local
186-
ij_java_session_si_suffix = Service
187170
ij_java_space_after_closing_angle_bracket_in_type_argument = false
188171
ij_java_space_after_colon = true
189172
ij_java_space_after_comma = true

.github/workflows/bump.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ jobs:
1111
runs-on: ubuntu-latest
1212
steps:
1313
- name: Checkout code changes
14-
uses: actions/checkout@v4
14+
uses: actions/checkout@v5
1515

1616
- name: Update dependencies
1717
uses: wader/bump/action@master

.github/workflows/docker-image.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- name: Checkout code changes
16-
uses: actions/checkout@v4
16+
uses: actions/checkout@v5
1717

1818
- name: Prepare Docker
1919
uses: docker/setup-buildx-action@v3

.github/workflows/unit-test.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
os: [ ubuntu-latest, windows-latest, macos-13 ] # pin macos to latest x64 image
2222
steps:
2323
- name: Checkout code changes
24-
uses: actions/checkout@v4
24+
uses: actions/checkout@v5
2525

2626
- name: Setup FFmpeg
2727
uses: FedericoCarboni/setup-ffmpeg@v3
@@ -61,13 +61,13 @@ jobs:
6161
runs-on: ubuntu-latest
6262
steps:
6363
- name: Checkout code changes
64-
uses: actions/checkout@v4
64+
uses: actions/checkout@v5
6565
with:
6666
ref: ${{ github.event.pull_request.head.sha }}
6767
fetch-depth: 0
6868

6969
- name: Download coverage report
70-
uses: actions/download-artifact@v4
70+
uses: actions/download-artifact@v5
7171
with:
7272
name: coverage_report
7373
path: .qodana/code-coverage

Dockerfile

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,12 @@ RUN curl -L --fail --retry 3 --retry-delay 5 "$LIBWEBP_URL" -O && \
1414
tar -xzf "$LIBWEBP_FILE" --one-top-level=libwebp --strip-components=1 && \
1515
rm "$LIBWEBP_FILE"
1616

17-
ENV GRADLE_OPTS="-Dorg.gradle.daemon=false"
18-
COPY settings.gradle build.gradle gradlew ./
19-
COPY gradle gradle
20-
RUN --mount=type=cache,target=/root/.gradle ./gradlew dependencies
2117
COPY . .
22-
RUN --mount=type=cache,target=/root/.gradle ./gradlew jre shadowJar
18+
RUN --mount=type=cache,target=/root/.gradle ./gradlew jlink shadowJar
2319

24-
FROM alpine AS bot
20+
# bump: alpine /FROM alpine:([\d.]+)/ docker:alpine|^3
21+
# bump: alpine link "Release notes" https://alpinelinux.org/posts/Alpine-$LATEST-released.html
22+
FROM alpine:3.22.1 AS bot
2523

2624
# bump: ffmpeg /static-ffmpeg:([\d.]+)/ docker:mwader/static-ffmpeg|~7.0
2725
COPY --from=mwader/static-ffmpeg:7.0.2 /ffmpeg /usr/local/bin/
@@ -30,7 +28,7 @@ ENV FFMPEG_PATH=/usr/local/bin/ffmpeg
3028
COPY --from=builder /app/libwebp/bin/cwebp /usr/local/bin/
3129
COPY --from=builder /app/libwebp/bin/dwebp /usr/local/bin/
3230

33-
COPY --from=builder /app/build/jre jre
31+
COPY --from=builder /app/build/jlink/jre jre
3432
COPY --from=builder /app/build/libs/Stickerify-1.0-all.jar Stickerify.jar
3533

3634
CMD ["jre/bin/java", "-Dcom.sksamuel.scrimage.webp.binary.dir=/usr/local/bin/", "-jar", "Stickerify.jar"]

build.gradle

Lines changed: 60 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,43 @@
1-
import org.apache.tools.ant.taskdefs.condition.Os
1+
import com.github.stickerifier.stickerify.JlinkJavaLauncher
2+
import com.github.stickerifier.stickerify.JlinkTask
23

34
plugins {
5+
id('application')
6+
id('java')
7+
id('jacoco')
48
alias(libs.plugins.shadow)
5-
id 'application'
6-
id 'java'
7-
id 'jacoco'
89
}
910

1011
repositories {
1112
mavenCentral()
1213
}
1314

1415
dependencies {
15-
implementation libs.batik
16-
implementation libs.gson
17-
implementation libs.imageio.batik
18-
implementation libs.imageio.psd
19-
implementation libs.jave
20-
implementation libs.logback.classic
21-
implementation libs.logback.core
22-
implementation libs.scrimage.core
23-
implementation libs.scrimage.formats.extra
24-
implementation libs.scrimage.webp
25-
implementation libs.slf4j.api
26-
implementation libs.telegram.bot.api
27-
implementation libs.tika
28-
29-
testRuntimeOnly libs.junit.platform
30-
testImplementation libs.hamcrest
31-
testImplementation libs.junit
32-
testImplementation libs.mockwebserver
16+
implementation(libs.batik)
17+
implementation(libs.gson)
18+
implementation(libs.imageio.batik)
19+
implementation(libs.imageio.psd)
20+
implementation(libs.jave)
21+
implementation(libs.logback.classic)
22+
implementation(libs.logback.core)
23+
implementation(libs.scrimage.core)
24+
implementation(libs.scrimage.formats.extra)
25+
implementation(libs.scrimage.webp)
26+
implementation(libs.slf4j.api)
27+
implementation(libs.telegram.bot.api)
28+
implementation(libs.tika)
29+
30+
testImplementation(libs.hamcrest)
31+
testImplementation(libs.junit.jupiter)
32+
testImplementation(libs.mockwebserver)
33+
testRuntimeOnly(libs.junit.platform)
3334

3435
constraints {
35-
implementation(libs.okio) {
36-
because 'CVE-2023-3635: Okio Signed to Unsigned Conversion Error vulnerability'
36+
implementation('org.apache.commons:commons-lang3') {
37+
version {
38+
strictly('[3.18.0, 4)')
39+
}
40+
because('CVE-2025-48924: Apache Commons Lang is vulnerable to Uncontrolled Recursion when processing long inputs')
3741
}
3842
}
3943
}
@@ -42,67 +46,34 @@ group = 'com.github.stickerifier'
4246
version = '1.0'
4347
description = 'Telegram bot to convert medias in the format required to be used as Telegram stickers'
4448

45-
java {
46-
toolchain {
47-
languageVersion = JavaLanguageVersion.of(24)
48-
vendor = JvmVendorSpec.AZUL
49-
}
49+
java.toolchain {
50+
languageVersion = JavaLanguageVersion.of(24)
51+
vendor = JvmVendorSpec.AZUL
5052
}
5153

52-
tasks.withType(JavaCompile).configureEach {
53-
options.encoding = 'UTF-8'
54+
updateDaemonJvm {
55+
languageVersion = JavaLanguageVersion.of(24)
56+
vendor = JvmVendorSpec.AZUL
5457
}
5558

56-
def jreOutputDir = layout.buildDirectory.dir('jre')
57-
tasks.register('jre') {
58-
inputs.property('options', ['--strip-debug', '--no-header-files', '--no-man-pages'])
59-
inputs.property('modules', ['java.desktop', 'java.instrument', 'java.naming', 'java.sql', 'jdk.crypto.ec', 'jdk.unsupported'])
60-
61-
outputs.dir(jreOutputDir)
62-
63-
doFirst {
64-
delete(jreOutputDir)
65-
}
66-
67-
def javaLauncher = javaToolchains.launcherFor(java.toolchain)
68-
69-
doLast {
70-
def installationPath = javaLauncher.get().metadata.installationPath
71-
72-
def jlink = installationPath.file(Os.isFamily(Os.FAMILY_WINDOWS) ? 'bin\\jlink.exe' : 'bin/jlink')
73-
def jmods = installationPath.dir('jmods')
74-
75-
def output = providers.exec {
76-
ignoreExitValue = true
77-
commandLine = [
78-
jlink.toString(), '-v',
79-
*(inputs.properties['options'] as List),
80-
'--module-path', jmods.toString(),
81-
'--add-modules', (inputs.properties['modules'] as List).join(','),
82-
'--output', jreOutputDir.get().toString()
83-
]
84-
}
59+
def jlink = tasks.register('jlink', JlinkTask) {
60+
options = ['--strip-debug', '--no-header-files', '--no-man-pages']
61+
modules = ['java.desktop', 'java.instrument', 'java.naming', 'java.sql', 'jdk.crypto.ec', 'jdk.unsupported']
8562

86-
def result = output.result.get()
87-
if (result.exitValue == 0) {
88-
logger.info(output.standardOutput.asText.get())
89-
} else {
90-
logger.log(LogLevel.ERROR, output.standardError.asText.get())
91-
}
92-
93-
result.assertNormalExitValue()
94-
result.rethrowFailure()
95-
}
63+
group = 'build'
64+
description = 'Generates a minimal JRE for the project.'
9665
}
9766

9867
test {
99-
dependsOn tasks.named('jre')
100-
inputs.dir(jreOutputDir)
101-
102-
executable = jreOutputDir.get().file(Os.isFamily(Os.FAMILY_WINDOWS) ? 'bin\\java.exe' : 'bin/java')
68+
inputs.dir(jlink.map { it.outputDirectory.get().asFile })
69+
javaLauncher = providers.provider { new JlinkJavaLauncher(jlink.get()) }
10370

10471
useJUnitPlatform()
105-
finalizedBy jacocoTestReport
72+
finalizedBy(jacocoTestReport)
73+
74+
testLogging {
75+
events "passed"
76+
}
10677
}
10778

10879
jacocoTestReport {
@@ -117,7 +88,7 @@ jacocoTestReport {
11788
fileTree(dir: it, exclude: ['**/MediaConstraints.class',
11889
'**/stickerify/exception/**',
11990
'**/stickerify/process/**',
120-
'**/stickerify/runner**',
91+
'**/stickerify/runner/**',
12192
'**/stickerify/telegram/**'])
12293
})
12394
}
@@ -128,9 +99,18 @@ application {
12899
}
129100

130101
shadowJar {
102+
duplicatesStrategy = DuplicatesStrategy.INCLUDE
131103
mergeServiceFiles()
132-
133-
dependencies {
134-
exclude('dist_webp_binaries/')
135-
}
104+
failOnDuplicateEntries = true
105+
106+
exclude('dist_webp_binaries/',
107+
'META-INF/LICENSE',
108+
'META-INF/LICENSE.txt',
109+
'META-INF/NOTICE',
110+
'META-INF/NOTICE.txt',
111+
'license/LICENSE',
112+
'license/LICENSE.dom-documentation.txt',
113+
'license/LICENSE.dom-software.txt',
114+
'license/NOTICE',
115+
'license/README.dom.txt')
136116
}

buildSrc/build.gradle

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
id('java-library')
3+
}
4+
5+
repositories {
6+
gradlePluginPortal()
7+
}
8+
9+
java.toolchain {
10+
languageVersion = JavaLanguageVersion.of(24)
11+
vendor = JvmVendorSpec.AZUL
12+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.github.stickerifier.stickerify;
2+
3+
import org.gradle.api.file.RegularFile;
4+
import org.gradle.api.provider.Provider;
5+
import org.gradle.jvm.toolchain.JavaCompiler;
6+
import org.gradle.jvm.toolchain.JavaInstallationMetadata;
7+
import org.gradle.jvm.toolchain.JavaLauncher;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
public record JlinkJavaLauncher(Provider<@NotNull JavaInstallationMetadata> metadata, Provider<@NotNull RegularFile> executablePath) implements JavaLauncher {
11+
public JlinkJavaLauncher(JlinkTask task) {
12+
this(task.getJavaCompiler().map(JavaCompiler::getMetadata), task.getOutputDirectory().file("jre/bin/java"));
13+
}
14+
15+
@Override
16+
public @NotNull JavaInstallationMetadata getMetadata() {
17+
return metadata.get();
18+
}
19+
20+
@Override
21+
public @NotNull RegularFile getExecutablePath() {
22+
return executablePath.get();
23+
}
24+
}

0 commit comments

Comments
 (0)