From 9c7631f9f2b09f50f99c3610b250bad5c93a3945 Mon Sep 17 00:00:00 2001 From: Dario Ghunney Ware Date: Tue, 20 May 2025 12:35:36 +0100 Subject: [PATCH] wip - fixing jar file --- LICENSE | 2 +- build.gradle | 5 +- .../common/configuration/YamlConfig.java | 45 --------- .../common/model/ApplicationProperties.java | 93 +++++++++++++------ proprietary/{LICENSE => LICENSE-proprietary} | 0 stirling-pdf/build.gradle | 45 ++++++++- .../resources/main/application.properties | 3 + .../software/spdf/SPDFApplication.java | 4 - .../src/main/resources/application.properties | 3 + 9 files changed, 120 insertions(+), 80 deletions(-) delete mode 100644 common/src/main/java/stirling/software/common/configuration/YamlConfig.java rename proprietary/{LICENSE => LICENSE-proprietary} (100%) diff --git a/LICENSE b/LICENSE index 07c21cee3..2aa88ade7 100644 --- a/LICENSE +++ b/LICENSE @@ -4,7 +4,7 @@ Copyright (c) 2024 Stirling Tools Portions of this software are licensed as follows: -* All content that resides under the "enterprise/" directory of this repository, if that directory exists, is licensed under the license defined in "enterprise/LICENSE". +* All content that resides under the "proprietary/" directory of this repository, if that directory exists, is licensed under the license defined in "proprietary/LICENSE". * Content outside of the above mentioned directories or restrictions above is available under the MIT License as defined below. Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/build.gradle b/build.gradle index ff86a5352..d1793efd6 100644 --- a/build.gradle +++ b/build.gradle @@ -8,8 +8,9 @@ plugins { id "com.diffplug.spotless" version "7.0.3" id "com.github.jk1.dependency-license-report" version "2.9" //id "nebula.lint" version "19.0.3" - id("org.panteleyev.jpackageplugin") version "1.6.1" + id "org.panteleyev.jpackageplugin" version "1.6.1" id "org.sonarqube" version "6.1.0.5360" + id "com.gradleup.shadow" version "8.3.6" } import com.github.jk1.license.render.* @@ -29,7 +30,6 @@ ext { tempJrePath = null } -// todo: package jar with option for enterprise features to be included jar { enabled = false manifest { @@ -86,6 +86,7 @@ subprojects { apply plugin: 'com.diffplug.spotless' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' + apply plugin: 'com.gradleup.shadow' java { // 17 is lowest but we support and recommend 21 diff --git a/common/src/main/java/stirling/software/common/configuration/YamlConfig.java b/common/src/main/java/stirling/software/common/configuration/YamlConfig.java deleted file mode 100644 index b03b184ca..000000000 --- a/common/src/main/java/stirling/software/common/configuration/YamlConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package stirling.software.common.configuration; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.PropertySource; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.EncodedResource; - -@Slf4j -@Configuration -public class YamlConfig { - - @Bean - public PropertySource dynamicYamlPropertySource(ConfigurableEnvironment environment) - throws IOException { - String configPath = InstallationPathConfig.getSettingsPath(); - log.debug("Attempting to load settings from: {}", configPath); - - File file = new File(configPath); - if (!file.exists()) { - log.error("Warning: Settings file does not exist at: {}", configPath); - } - - Resource resource = new FileSystemResource(configPath); - if (!resource.exists()) { - throw new FileNotFoundException("Settings file not found at: " + configPath); - } - - EncodedResource encodedResource = new EncodedResource(resource); - PropertySource propertySource = - new YamlPropertySourceFactory().createPropertySource(null, encodedResource); - environment.getPropertySources().addFirst(propertySource); - - log.debug("Loaded properties: {}", propertySource.getSource()); - - return propertySource; - } - -} diff --git a/common/src/main/java/stirling/software/common/model/ApplicationProperties.java b/common/src/main/java/stirling/software/common/model/ApplicationProperties.java index 2e453806e..39825ab17 100644 --- a/common/src/main/java/stirling/software/common/model/ApplicationProperties.java +++ b/common/src/main/java/stirling/software/common/model/ApplicationProperties.java @@ -1,5 +1,7 @@ package stirling.software.common.model; +import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; @@ -14,26 +16,63 @@ import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.PropertySource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; +import org.springframework.core.io.support.EncodedResource; import org.springframework.stereotype.Component; +import stirling.software.common.configuration.InstallationPathConfig; +import stirling.software.common.configuration.YamlPropertySourceFactory; import stirling.software.common.model.exception.UnsupportedProviderException; import stirling.software.common.util.ValidationUtil; import stirling.software.common.model.oauth2.provider.GitHubProvider; import stirling.software.common.model.oauth2.provider.GoogleProvider; import stirling.software.common.model.oauth2.provider.KeycloakProvider; import stirling.software.common.model.oauth2.provider.Provider; +import static stirling.software.common.util.ValidationUtil.isCollectionEmpty; +import static stirling.software.common.util.ValidationUtil.isStringEmpty; -@Data -@Component -@Order(Ordered.HIGHEST_PRECEDENCE) +@Configuration @ConfigurationProperties(prefix = "") +@Data +@Order(Ordered.HIGHEST_PRECEDENCE) +@Slf4j public class ApplicationProperties { + @Bean + public PropertySource dynamicYamlPropertySource(ConfigurableEnvironment environment) + throws IOException { + String configPath = InstallationPathConfig.getSettingsPath(); + log.info("Attempting to load settings from: " + configPath); + + File file = new File(configPath); + if (!file.exists()) { + log.error("Warning: Settings file does not exist at: " + configPath); + } + + Resource resource = new FileSystemResource(configPath); + if (!resource.exists()) { + throw new FileNotFoundException("Settings file not found at: " + configPath); + } + + EncodedResource encodedResource = new EncodedResource(resource); + PropertySource propertySource = + new YamlPropertySourceFactory().createPropertySource(null, encodedResource); + environment.getPropertySources().addFirst(propertySource); + + log.info("Loaded properties: " + propertySource.getSource()); + + return propertySource; + } + private Legal legal = new Legal(); private Security security = new Security(); private System system = new System(); @@ -99,19 +138,19 @@ public class ApplicationProperties { public boolean isUserPass() { return (loginMethod.equalsIgnoreCase(LoginMethods.NORMAL.toString()) - || loginMethod.equalsIgnoreCase(LoginMethods.ALL.toString())); + || loginMethod.equalsIgnoreCase(LoginMethods.ALL.toString())); } public boolean isOauth2Active() { return (oauth2 != null - && oauth2.getEnabled() - && !loginMethod.equalsIgnoreCase(LoginMethods.NORMAL.toString())); + && oauth2.getEnabled() + && !loginMethod.equalsIgnoreCase(LoginMethods.NORMAL.toString())); } public boolean isSaml2Active() { return (saml2 != null - && saml2.getEnabled() - && !loginMethod.equalsIgnoreCase(LoginMethods.NORMAL.toString())); + && saml2.getEnabled() + && !loginMethod.equalsIgnoreCase(LoginMethods.NORMAL.toString())); } @Data @@ -140,7 +179,7 @@ public class ApplicationProperties { public InputStream getIdpMetadataUri() throws IOException { if (idpMetadataUri.startsWith("classpath:")) { return new ClassPathResource(idpMetadataUri.substring("classpath".length())) - .getInputStream(); + .getInputStream(); } try { URI uri = new URI(idpMetadataUri); @@ -195,7 +234,7 @@ public class ApplicationProperties { public void setScopes(String scopes) { List scopesList = - Arrays.stream(scopes.split(",")).map(String::trim).toList(); + Arrays.stream(scopes.split(",")).map(String::trim).toList(); this.scopes.addAll(scopesList); } @@ -208,11 +247,11 @@ public class ApplicationProperties { } public boolean isSettingsValid() { - return !ValidationUtil.isStringEmpty(this.getIssuer()) - && !ValidationUtil.isStringEmpty(this.getClientId()) - && !ValidationUtil.isStringEmpty(this.getClientSecret()) - && !ValidationUtil.isCollectionEmpty(this.getScopes()) - && !ValidationUtil.isStringEmpty(this.getUseAsUsername()); + return !isStringEmpty(this.getIssuer()) + && !isStringEmpty(this.getClientId()) + && !isStringEmpty(this.getClientSecret()) + && !isCollectionEmpty(this.getScopes()) + && !isStringEmpty(this.getUseAsUsername()); } @Data @@ -227,11 +266,11 @@ public class ApplicationProperties { case "github" -> getGithub(); case "keycloak" -> getKeycloak(); default -> - throw new UnsupportedProviderException( - "Logout from the provider " - + registrationId - + " is not supported. " - + "Report it at https://github.com/Stirling-Tools/Stirling-PDF/issues"); + throw new UnsupportedProviderException( + "Logout from the provider " + + registrationId + + " is not supported. " + + "Report it at https://github.com/Stirling-Tools/Stirling-PDF/issues"); }; } } @@ -309,7 +348,7 @@ public class ApplicationProperties { driverName='%s' } """ - .formatted(driverName); + .formatted(driverName); } } @@ -326,14 +365,14 @@ public class ApplicationProperties { public String getHomeDescription() { return homeDescription != null && homeDescription.trim().length() > 0 - ? homeDescription - : null; + ? homeDescription + : null; } public String getAppNameNavbar() { return appNameNavbar != null && appNameNavbar.trim().length() > 0 - ? appNameNavbar - : null; + ? appNameNavbar + : null; } } @@ -419,8 +458,8 @@ public class ApplicationProperties { public String getProducer() { return producer == null || producer.trim().isEmpty() - ? "Stirling-PDF" - : producer; + ? "Stirling-PDF" + : producer; } } diff --git a/proprietary/LICENSE b/proprietary/LICENSE-proprietary similarity index 100% rename from proprietary/LICENSE rename to proprietary/LICENSE-proprietary diff --git a/stirling-pdf/build.gradle b/stirling-pdf/build.gradle index 98a206e01..e0424abe3 100644 --- a/stirling-pdf/build.gradle +++ b/stirling-pdf/build.gradle @@ -68,5 +68,48 @@ dependencies { // runtimeOnly "com.twelvemonkeys.imageio:imageio-thumbsdb:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-xwd:$imageioVersion" - developmentOnly "org.springframework.boot:spring-boot-devtools:$springBootVersion" + developmentOnly 'org.springframework.boot:spring-boot-devtools' } + +sourceSets { + main { + resources { + srcDirs += ['../configs'] + } + } +} + +jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + + manifest { + attributes( + 'Main-Class': 'stirling.software.spdf.SPDFApplication', + "Implementation-Title": "Stirling-PDF", + "Implementation-Version": project.version + ) + } +} + +shadowJar { + archiveClassifier.set('shadow') + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + manifest { + attributes( + 'Main-Class': 'stirling.software.spdf.SPDFApplication' + ) + } + zip64 = true + mergeServiceFiles() +} + +build.dependsOn shadowJar +jar.dependsOn ':common:jar' +shadowJar.dependsOn ':common:jar' +jar.dependsOn ':proprietary:jar' +shadowJar.dependsOn ':proprietary:jar' diff --git a/stirling-pdf/build/resources/main/application.properties b/stirling-pdf/build/resources/main/application.properties index 0fd3751f0..64b658906 100644 --- a/stirling-pdf/build/resources/main/application.properties +++ b/stirling-pdf/build/resources/main/application.properties @@ -17,6 +17,7 @@ server.error.include-message=always #logging.level.org.springframework.web=DEBUG #logging.level.org.springframework=DEBUG #logging.level.org.springframework.security=DEBUG + spring.servlet.multipart.max-file-size=2000MB spring.servlet.multipart.max-request-size=2000MB server.servlet.session.tracking-modes=cookie @@ -29,6 +30,8 @@ spring.web.resources.mime-mappings.webmanifest=application/manifest+json spring.mvc.async.request-timeout=${SYSTEM_CONNECTIONTIMEOUTMILLISECONDS:1200000} management.endpoints.web.exposure.include=beans +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration +#spring.config.additional-location=classpath:configs/settings.yml spring.datasource.url=jdbc:h2:file:./configs/stirling-pdf-DB-2.3.232;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa diff --git a/stirling-pdf/src/main/java/stirling/software/spdf/SPDFApplication.java b/stirling-pdf/src/main/java/stirling/software/spdf/SPDFApplication.java index 08e12b695..8f4d1a9c4 100644 --- a/stirling-pdf/src/main/java/stirling/software/spdf/SPDFApplication.java +++ b/stirling-pdf/src/main/java/stirling/software/spdf/SPDFApplication.java @@ -40,10 +40,6 @@ import stirling.software.common.util.UrlUtils; "stirling.software.common", "stirling.software.proprietary", "stirling.software.proprietary.configuration" - }, - exclude = { - DataSourceAutoConfiguration.class, - DataSourceTransactionManagerAutoConfiguration.class }) public class SPDFApplication { diff --git a/stirling-pdf/src/main/resources/application.properties b/stirling-pdf/src/main/resources/application.properties index 0fd3751f0..64b658906 100644 --- a/stirling-pdf/src/main/resources/application.properties +++ b/stirling-pdf/src/main/resources/application.properties @@ -17,6 +17,7 @@ server.error.include-message=always #logging.level.org.springframework.web=DEBUG #logging.level.org.springframework=DEBUG #logging.level.org.springframework.security=DEBUG + spring.servlet.multipart.max-file-size=2000MB spring.servlet.multipart.max-request-size=2000MB server.servlet.session.tracking-modes=cookie @@ -29,6 +30,8 @@ spring.web.resources.mime-mappings.webmanifest=application/manifest+json spring.mvc.async.request-timeout=${SYSTEM_CONNECTIONTIMEOUTMILLISECONDS:1200000} management.endpoints.web.exposure.include=beans +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration +#spring.config.additional-location=classpath:configs/settings.yml spring.datasource.url=jdbc:h2:file:./configs/stirling-pdf-DB-2.3.232;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa