diff --git a/README.md b/README.md index c9fba7e..e434c21 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ The full list of all the parameters is available [here](src/main/resources/MOJO. # Version Notes +## Version notes 2.3.1 - 2023-01-16 +- logs only warnings instead of throwing exception, when cannot fulfill default values for `` + (no configuration data required by the formula), see Issue [#213](../../issues/213) and PR [#216](../../pull/216) + ## Version notes 2.3.0 - 2023-01-06 - provides default values for plugin configuration, especially for ``, see Issue [#98](../../issues/98) - adds a `disableVersionInfoDefaults` parameter to be able to disable provided defaults, see PR [#205](../../pull/205) diff --git a/src/main/java/com/akathist/maven/plugins/launch4j/Launch4jMojo.java b/src/main/java/com/akathist/maven/plugins/launch4j/Launch4jMojo.java index 354e91d..f85db57 100644 --- a/src/main/java/com/akathist/maven/plugins/launch4j/Launch4jMojo.java +++ b/src/main/java/com/akathist/maven/plugins/launch4j/Launch4jMojo.java @@ -351,6 +351,7 @@ private void doExecute() throws MojoExecutionException { if(versionInfo == null) { versionInfo = new VersionInfo(); } + versionInfo.setLog(getLog()); versionInfo.tryFillOutByDefaults(project, outfile); } catch (RuntimeException exception) { throw new MojoExecutionException("Cannot fill out VersionInfo by defaults", exception); diff --git a/src/main/java/com/akathist/maven/plugins/launch4j/VersionInfo.java b/src/main/java/com/akathist/maven/plugins/launch4j/VersionInfo.java index 8adfc36..09f70d1 100644 --- a/src/main/java/com/akathist/maven/plugins/launch4j/VersionInfo.java +++ b/src/main/java/com/akathist/maven/plugins/launch4j/VersionInfo.java @@ -23,6 +23,7 @@ import net.sf.launch4j.config.LanguageID; import org.apache.commons.lang3.StringUtils; import org.apache.maven.model.Organization; +import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; @@ -115,13 +116,16 @@ public class VersionInfo { @Parameter String trademarks; + private Log log; + public VersionInfo() { } public VersionInfo(String fileVersion, String txtFileVersion, String fileDescription, String copyright, String productVersion, String txtProductVersion, String productName, String companyName, String internalName, - String originalFilename, String language, String trademarks) { + String originalFilename, String language, String trademarks, + Log log) { this.fileVersion = fileVersion; this.txtFileVersion = txtFileVersion; this.fileDescription = fileDescription; @@ -134,6 +138,11 @@ public VersionInfo(String fileVersion, String txtFileVersion, String fileDescrip this.originalFilename = originalFilename; this.language = language; this.trademarks = trademarks; + this.log = log; + } + + public void setLog(Log log) { + this.log = log; } net.sf.launch4j.config.VersionInfo toL4j() { @@ -171,65 +180,83 @@ void tryFillOutByDefaults(MavenProject project, File outfile) { throw new IllegalArgumentException("'outfile' is required, but it is null."); } - String version = project.getVersion(); + String version = getDefaultWhenSourceIsBlankAndLogWarn(project.getVersion(), "1.0.0", "project.version"); Organization organization = project.getOrganization(); + String organizationName = "Default organization"; + if(organization == null) { + logWarningAboutDummyValue("project.organization.name", organizationName); + } else { + organizationName = getDefaultWhenSourceIsBlankAndLogWarn(organization.getName(), organizationName, "project.organization.name"); + } tryFillOutByDefaultVersionInL4jFormat(version); - tryFillOutCopyrightByDefaults(project.getInceptionYear(), organization); - tryFillOutOrganizationRelatedDefaults(organization); + tryFillOutCopyrightByDefaults( + getDefaultWhenSourceIsBlankAndLogWarn(project.getInceptionYear(), "2020", "project.inceptionYear"), + organizationName + ); + tryFillOutOrganizationRelatedDefaults(organizationName); tryFillOutSimpleValuesByDefaults( version, - project.getName(), - project.getArtifactId(), - project.getDescription() + getDefaultWhenSourceIsBlankAndLogWarn(project.getName(), "Java Project", "project.name"), + getDefaultWhenSourceIsBlankAndLogWarn(project.getArtifactId(), "java-project", "project.artifactId"), + getDefaultWhenSourceIsBlankAndLogWarn(project.getDescription(), "A Java project.", "project.description") ); - originalFilename = getDefaultWhenOriginalIsBlank(originalFilename, outfile.getName(), "originalFilename", "${project.version}"); + String outfileName = getDefaultWhenSourceIsBlankAndLogWarn(outfile.getName(), "app.exe", "outfile"); + originalFilename = getDefaultWhenSourceIsBlank(originalFilename, outfileName); } private void tryFillOutByDefaultVersionInL4jFormat(String version) { - final String defaultFileVersion = Launch4jFileVersionGenerator.generate(version); - fileVersion = getDefaultWhenOriginalIsBlank(fileVersion, defaultFileVersion, "fileVersion", "${project.version}"); - productVersion = getDefaultWhenOriginalIsBlank(productVersion, defaultFileVersion, "productVersion", "${project.version}"); + String defaultFileVersion = Launch4jFileVersionGenerator.generate(version); + + fileVersion = getDefaultWhenSourceIsBlank(fileVersion, defaultFileVersion); + productVersion = getDefaultWhenSourceIsBlank(productVersion, defaultFileVersion); } - private void tryFillOutCopyrightByDefaults(String inceptionYear, Organization organization) { - final String defaultCopyright = CopyrightGenerator.generate(inceptionYear, organization); - copyright = getDefaultWhenOriginalIsBlank(copyright, defaultCopyright, "copyright", "${project.inceptionYear},${project.organization.name}"); + private void tryFillOutCopyrightByDefaults(String inceptionYear, String organizationName) { + final String defaultCopyright = CopyrightGenerator.generate(inceptionYear, organizationName); + copyright = getDefaultWhenSourceIsBlank(copyright, defaultCopyright); } - private void tryFillOutOrganizationRelatedDefaults(Organization organization) { - if (organization != null) { - companyName = getDefaultWhenOriginalIsBlank(companyName, organization.getName(), "companyName", "${project.organization.name}"); - trademarks = getDefaultWhenOriginalIsBlank(trademarks, organization.getName(), "trademarks", "${project.organization.name}"); - } + private void tryFillOutOrganizationRelatedDefaults(String organizationName) { + companyName = getDefaultWhenSourceIsBlank(companyName, organizationName); + trademarks = getDefaultWhenSourceIsBlank(trademarks, organizationName); } private void tryFillOutSimpleValuesByDefaults(String version, String name, String artifactId, String description) { - txtFileVersion = getDefaultWhenOriginalIsBlank(txtFileVersion, version, "txtFileVersion", "${project.version}"); - txtProductVersion = getDefaultWhenOriginalIsBlank(txtProductVersion, version, "txtProductVersion", "${project.version}"); - productName = getDefaultWhenOriginalIsBlank(productName, name, "productName", "${project.name}"); - internalName = getDefaultWhenOriginalIsBlank(internalName, artifactId, "internalName", "${project.artifactId}"); - fileDescription = getDefaultWhenOriginalIsBlank(fileDescription, description, "fileDescription", "${project.description}"); + txtFileVersion = getDefaultWhenSourceIsBlank(txtFileVersion, version); + txtProductVersion = getDefaultWhenSourceIsBlank(txtProductVersion, version); + productName = getDefaultWhenSourceIsBlank(productName, name); + internalName = getDefaultWhenSourceIsBlank(internalName, artifactId); + fileDescription = getDefaultWhenSourceIsBlank(fileDescription, description); } - private String getDefaultWhenOriginalIsBlank(final String originalValue, - final String defaultValue, - final String originalParameterName, - final String defaultValueFormulaParams) { - if (StringUtils.isBlank(originalValue)) { - if(StringUtils.isNotBlank(defaultValue)) { - return defaultValue; - } - - throw new IllegalStateException("Please fill the missing configuration values. " + - "Error when trying to fulfill default value for VersionInfo parameter:'" + originalParameterName + "' with formula params:'" + defaultValueFormulaParams + "'."); + private String getDefaultWhenSourceIsBlank(final String source, final String defaultValue) { + if (StringUtils.isBlank(source)) { + return defaultValue; } - return originalValue; + return source; + } + + private String getDefaultWhenSourceIsBlankAndLogWarn(final String source, + final String defaultValue, + final String sourceParamName) { + if (StringUtils.isBlank(source)) { + logWarningAboutDummyValue(sourceParamName, defaultValue); + + return defaultValue; + } + + return source; + } + + private void logWarningAboutDummyValue(final String sourceParamName, final String dummyValue) { + log.warn("Configuration param ${" + sourceParamName + "} is empty, so a dummy value \"" + dummyValue + "\" " + + "might be used instead to fulfill some of VersionInfo params by defaults."); } @Override diff --git a/src/main/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGenerator.java b/src/main/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGenerator.java index 8e5e250..8ee565c 100644 --- a/src/main/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGenerator.java +++ b/src/main/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGenerator.java @@ -1,7 +1,6 @@ package com.akathist.maven.plugins.launch4j.generators; import org.apache.commons.lang3.StringUtils; -import org.apache.maven.model.Organization; import java.time.LocalDate; @@ -12,13 +11,13 @@ private CopyrightGenerator() { /** * Parameters should be taken from MavenProject properties: * @param projectInceptionYear as ${project.inceptionYear} - * @param projectOrganization as ${project.organization} + * @param projectOrganizationName as ${project.organization.name} * @return a string representing copyrights */ - public static String generate(String projectInceptionYear, Organization projectOrganization) { + public static String generate(String projectInceptionYear, String projectOrganizationName) { String inceptionYear = generateInceptionYear(projectInceptionYear); int buildYear = LocalDate.now().getYear(); - String organizationName = generateOrganizationName(projectOrganization); + String organizationName = generateOrganizationName(projectOrganizationName); return String.format("Copyright © %s%d%s. All rights reserved.", inceptionYear, buildYear, organizationName); } @@ -31,9 +30,9 @@ private static String generateInceptionYear(String projectInceptionYear) { return ""; } - private static String generateOrganizationName(Organization projectOrganization) { - if(projectOrganization != null && StringUtils.isNotBlank(projectOrganization.getName())) { - return " " + projectOrganization.getName(); + private static String generateOrganizationName(String projectOrganizationName) { + if(StringUtils.isNotBlank(projectOrganizationName)) { + return " " + projectOrganizationName; } return ""; diff --git a/src/test/java/com/akathist/maven/plugins/launch4j/VersionInfoTest.java b/src/test/java/com/akathist/maven/plugins/launch4j/VersionInfoTest.java index e8eaa88..ac627e6 100644 --- a/src/test/java/com/akathist/maven/plugins/launch4j/VersionInfoTest.java +++ b/src/test/java/com/akathist/maven/plugins/launch4j/VersionInfoTest.java @@ -2,17 +2,23 @@ import net.sf.launch4j.config.LanguageID; import org.apache.maven.model.Organization; +import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.io.File; +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; import static org.junit.Assert.*; -import static org.mockito.Mockito.doReturn; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class VersionInfoTest { @@ -37,6 +43,8 @@ public class VersionInfoTest { MavenProject project; @Mock File outfile; + @Mock + Log log; // Subject private VersionInfo versionInfo; @@ -46,7 +54,8 @@ public void buildVersionInfoFromTestParams() { versionInfo = new VersionInfo(fileVersion, txtFileVersion, fileDescription, copyright, productVersion, txtProductVersion, productName, companyName, internalName, - originalFilename, language, trademarks); + originalFilename, language, trademarks, + log); } @Test @@ -172,20 +181,6 @@ public void shouldFillOut_Copyright_ByDefault_When_ItWas_Empty() { assertTrue(versionInfo.copyright.contains(organizationName)); } - @Test - public void should_Not_FillOutByDefaults_From_MavenProject_OrganizationName_When_OrganizationWas_Empty() { - // given - versionInfo.companyName = null; - versionInfo.trademarks = null; - - // when - versionInfo.tryFillOutByDefaults(project, outfile); - - // then - assertNull(versionInfo.companyName); - assertNull(versionInfo.trademarks); - } - @Test public void should_Not_FillOutByDefaults_From_OrganizationName_When_VersionInfoPropsWere_Filled() { // given @@ -221,26 +216,6 @@ public void shouldFillOutByDefaults_From_OrganizationName_When_OrganizationWas_F assertEquals(organizationName, versionInfo.trademarks); } - @Test(expected = IllegalStateException.class) - public void should_Not_FillOutByDefaults_SimpleValues_From_MavenProject_When_ProjectPropsWere_Empty() { - // given - doReturn(null).when(project).getVersion(); - versionInfo.txtFileVersion = null; - versionInfo.txtProductVersion = null; - - doReturn(null).when(project).getName(); - versionInfo.productName = null; - - doReturn(null).when(project).getArtifactId(); - versionInfo.internalName = null; - - doReturn(null).when(project).getDescription(); - versionInfo.fileDescription = null; - - // expect throws - versionInfo.tryFillOutByDefaults(project, outfile); - } - @Test public void should_Not_FillOutByDefaults_SimpleValues_From_MavenProject_When_VersionInfoPropsWere_Filled() { // given @@ -331,6 +306,58 @@ public void shouldFillOut_ByDefault_LastSegmentOfOutfilePath_When_OriginalFilena assertEquals(outfileName, versionInfo.originalFilename); } + @Test + public void shouldLogWarningsAboutDummyValues() { + // given + ArgumentCaptor logMessageCaptor = ArgumentCaptor.forClass(String.class); + List missingParamNames = Arrays.asList( + "project.version", + "project.name", + "project.artifactId", + "project.description", + "project.inceptionYear", + "project.organization.name", + "outfile" + ); + + // when + versionInfo.tryFillOutByDefaults(project, outfile); + + // then + verify(log, times(missingParamNames.size())).warn(logMessageCaptor.capture()); + List logMessages = logMessageCaptor.getAllValues(); + + + missingParamNames.forEach(missingParamName -> { + assertTrue(logMessages.stream().anyMatch(message -> message.contains(missingParamName))); + }); + } + + @Test + public void shouldFillOut_ByDummyValues_When_OriginalValues_Empty_And_ProjectParams_Empty() { + // given + final String buildYear = String.valueOf(LocalDate.now().getYear()); + + VersionInfo emptyValuesVersionInfo = new VersionInfo(); + emptyValuesVersionInfo.setLog(log); + + // when + emptyValuesVersionInfo.tryFillOutByDefaults(project, outfile); + + // then + assertEquals("1.0.0.0", emptyValuesVersionInfo.fileVersion); + assertEquals("1.0.0", emptyValuesVersionInfo.txtFileVersion); + assertEquals("A Java project.", emptyValuesVersionInfo.fileDescription); + assertEquals("Copyright © 2020-" + buildYear + " Default organization. All rights reserved.", emptyValuesVersionInfo.copyright); + assertEquals("1.0.0.0", emptyValuesVersionInfo.productVersion); + assertEquals("1.0.0", emptyValuesVersionInfo.txtProductVersion); + assertEquals("Java Project", emptyValuesVersionInfo.productName); + assertEquals("Default organization", emptyValuesVersionInfo.companyName); + assertEquals("java-project", emptyValuesVersionInfo.internalName); + assertEquals("Default organization", emptyValuesVersionInfo.trademarks); + assertEquals("app.exe", emptyValuesVersionInfo.originalFilename); + } + @Test public void shouldGenerateString_WithTestParams() { // when @@ -355,4 +382,4 @@ public void shouldGenerateString_WithTestParams() { private boolean containsParam(String result, String paramName, String paramValue) { return result.contains(paramName + "='" + paramValue + "'"); } -} \ No newline at end of file +} diff --git a/src/test/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGeneratorTest.java b/src/test/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGeneratorTest.java index 734725f..9b1fa95 100644 --- a/src/test/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGeneratorTest.java +++ b/src/test/java/com/akathist/maven/plugins/launch4j/generators/CopyrightGeneratorTest.java @@ -1,6 +1,5 @@ package com.akathist.maven.plugins.launch4j.generators; -import org.apache.maven.model.Organization; import org.junit.Before; import org.junit.Test; @@ -51,11 +50,8 @@ public void shouldContain_BuildYear_And_OrganizationName() { // given final String organizationName = "SoftwareMill"; - Organization projectOrganization = new Organization(); - projectOrganization.setName(organizationName); - // when - final String copyright = CopyrightGenerator.generate(null, projectOrganization); + final String copyright = CopyrightGenerator.generate(null, organizationName); // then String expected = concatAndWrapWithCopyright( @@ -70,11 +66,8 @@ public void shouldContain_InceptionYear_And_BuildYear_And_OrganizationName() { final String projectInceptionYear = "2020"; final String organizationName = "Orphan OSS"; - Organization projectOrganization = new Organization(); - projectOrganization.setName(organizationName); - // when - final String copyright = CopyrightGenerator.generate(projectInceptionYear, projectOrganization); + final String copyright = CopyrightGenerator.generate(projectInceptionYear, organizationName); // then String expected = concatAndWrapWithCopyright( @@ -94,4 +87,4 @@ private String concatAndWrapWithCopyright(String... elements) { return builder.toString(); } -} \ No newline at end of file +}