Compare commits

..

7 Commits

  1. 2
      .github/workflows/maven.yml
  2. 1
      .gitignore
  3. 1
      Application_Properties.java
  4. 40
      pom.xml
  5. 5
      src/main/java/de/kreth/property2java/Configuration.java
  6. 6
      src/main/java/de/kreth/property2java/Generator.java
  7. 11
      src/main/java/de/kreth/property2java/GeneratorException.java
  8. 2
      src/main/java/de/kreth/property2java/GeneratorOptions.java
  9. 5
      src/main/java/de/kreth/property2java/cli/ArgumentConfiguration.java
  10. 4
      src/main/java/de/kreth/property2java/cli/CliConfig.java
  11. 4
      src/main/java/de/kreth/property2java/config/FreemarkerConfig.java
  12. 5
      src/main/java/de/kreth/property2java/config/Regex.java
  13. 1
      src/main/java/de/kreth/property2java/processor/GenerateProperty2Java.java
  14. 1
      src/main/java/de/kreth/property2java/processor/GenerateResourceBundleProperty2Java.java
  15. 7
      src/main/java/de/kreth/property2java/processor/ProcessorConfiguration.java
  16. 9
      src/main/java/de/kreth/property2java/processor/Property2JavaGenerator.java
  17. 5
      src/test/java/de/kreth/property2java/ConfigurationTest.java
  18. 46
      src/test/java/de/kreth/property2java/GeneratorTests.java
  19. 22
      src/test/java/de/kreth/property2java/GeneratorWithInnerPropertiesTest.java
  20. 46
      src/test/java/de/kreth/property2java/TestPropertiesSource.java
  21. 3
      src/test/java/de/kreth/property2java/generated/GenerateTheTest.java
  22. 1
      src/test/java/de/kreth/property2java/generated/Property_Loader_Format_Properties.java
  23. 15
      src/test/java/de/kreth/property2java/parts/ReplaceLogicForTemplate.java
  24. 5
      src/test/java/de/kreth/property2java/parts/ReplaceLogicForTemplateTest.java
  25. 38
      src/test/java/de/kreth/property2java/processor/Property2JavaGeneratorTest.java

@ -19,6 +19,6 @@ jobs:
- name: Set up JDK 1.8 - name: Set up JDK 1.8
uses: actions/setup-java@v1 uses: actions/setup-java@v1
with: with:
java-version: 11 java-version: 17
- name: Build with Maven - name: Build with Maven
run: mvn -B package --file pom.xml run: mvn -B package --file pom.xml

1
.gitignore vendored

@ -2,4 +2,5 @@
.project .project
.factorypath .factorypath
.settings .settings
.idea
target target

@ -10,7 +10,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version> <java.version>17</java.version>
<org.junit.jupiter>5.3.0-M1</org.junit.jupiter> <org.junit.jupiter>5.3.0-M1</org.junit.jupiter>
<org.slf4j>1.7.36</org.slf4j> <org.slf4j>1.7.36</org.slf4j>
<org.apache.logging.log4j>2.17.2</org.apache.logging.log4j> <org.apache.logging.log4j>2.17.2</org.apache.logging.log4j>
@ -47,6 +47,12 @@
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
<version>${org.slf4j}</version> <version>${org.slf4j}</version>
</dependency> </dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>org.apache.logging.log4j</groupId> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId> <artifactId>log4j-api</artifactId>
@ -140,12 +146,42 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version> <version>3.14.1</version>
<configuration> <configuration>
<release>${java.version}</release> <release>${java.version}</release>
<compilerArgs>-proc:none</compilerArgs> <compilerArgs>-proc:none</compilerArgs>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>6.15.0</version>
<configuration>
<activeRecipes>
<recipe>org.openrewrite.java.migrate.UpgradeToJava17</recipe>
<recipe>org.openrewrite.staticanalysis.JavaApiBestPractices</recipe>
<recipe>org.openrewrite.staticanalysis.CommonStaticAnalysis</recipe>
<recipe>org.openrewrite.staticanalysis.CodeCleanup</recipe>
<recipe>org.openrewrite.recipes.rewrite.OpenRewriteRecipeBestPractices</recipe>
</activeRecipes>
<exclusions>
<exclusion>**/generated/**</exclusion>
</exclusions>
</configuration>
<dependencies>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-migrate-java</artifactId>
<version>3.14.1</version>
</dependency>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-rewrite</artifactId>
<version>0.5.0</version>
</dependency>
</dependencies>
</plugin>
</plugins> </plugins>
</build> </build>
<scm> <scm>

@ -10,9 +10,9 @@ import java.nio.file.Path;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Map; import java.util.Map;
import org.apache.commons.text.WordUtils;
import de.kreth.property2java.config.Regex; import de.kreth.property2java.config.Regex;
import org.apache.commons.text.WordUtils;
public interface Configuration { public interface Configuration {
@ -59,8 +59,7 @@ public interface Configuration {
String path = Regex.PATTERN.matcher(fileName).replaceAll(".").replaceAll("\\.", "_").replaceAll(" ", "_") String path = Regex.PATTERN.matcher(fileName).replaceAll(".").replaceAll("\\.", "_").replaceAll(" ", "_")
.replaceAll("/", "_"); .replaceAll("/", "_");
path = WordUtils.capitalize(path, '_'); return WordUtils.capitalize(path, '_');
return path;
} }
} }

@ -17,8 +17,10 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import de.kreth.property2java.cli.ArgumentConfiguration; import de.kreth.property2java.cli.ArgumentConfiguration;
import de.kreth.property2java.config.FreemarkerConfig; import de.kreth.property2java.config.FreemarkerConfig;
import freemarker.template.Template; import freemarker.template.Template;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
@ -75,13 +77,13 @@ public class Generator {
root.put("fileName", fileName); root.put("fileName", fileName);
root.put("bundle_base_name", fileName.substring(0, min(fileName.length(), fileName.lastIndexOf('.')))); root.put("bundle_base_name", fileName.substring(0, min(fileName.length(), fileName.lastIndexOf('.'))));
root.put("classname", config.mapFilenameToClassName(fileName)); root.put("classname", config.mapFilenameToClassName(fileName));
if (config.getOptions().isEmpty() == false) { if (!config.getOptions().isEmpty()) {
root.put("options", config.getOptions()); root.put("options", config.getOptions());
List<String> imports = config.getOptions().stream() List<String> imports = config.getOptions().stream()
.map(GeneratorOptions::getAdditionalImport) .map(GeneratorOptions::getAdditionalImport)
.flatMap(Arrays::stream) .flatMap(Arrays::stream)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (imports.isEmpty() == false) { if (!imports.isEmpty()) {
root.put("imports", imports); root.put("imports", imports);
} }
} }

@ -1,19 +1,14 @@
package de.kreth.property2java; package de.kreth.property2java;
import java.io.Serial;
public class GeneratorException extends Exception { public class GeneratorException extends Exception {
@Serial
private static final long serialVersionUID = -7319030228448260990L; private static final long serialVersionUID = -7319030228448260990L;
public GeneratorException(String message, Throwable cause) { public GeneratorException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
public GeneratorException(String message) {
super(message);
}
public GeneratorException(Throwable cause) {
super(cause);
}
} }

@ -14,7 +14,7 @@ public enum GeneratorOptions {
private final String[] additionalImport; private final String[] additionalImport;
private GeneratorOptions(String... additionalImport) { GeneratorOptions(String... additionalImport) {
this.additionalImport = additionalImport!= null ? additionalImport : new String[]{}; this.additionalImport = additionalImport!= null ? additionalImport : new String[]{};
} }

@ -12,9 +12,10 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import de.kreth.property2java.Configuration; import de.kreth.property2java.Configuration;
public class ArgumentConfiguration implements Configuration { public final class ArgumentConfiguration implements Configuration {
private final String packageName; private final String packageName;
@ -51,7 +52,7 @@ public class ArgumentConfiguration implements Configuration {
@Override @Override
public Writer outWriter(String fileName) throws IOException { public Writer outWriter(String fileName) throws IOException {
File dir; File dir;
if (packageName != null && packageName.isBlank() == false) { if (packageName != null && !packageName.isBlank()) {
dir = new File(rootPath.toFile(), packageName.replace('.', File.separatorChar)); dir = new File(rootPath.toFile(), packageName.replace('.', File.separatorChar));
} else { } else {
dir = rootPath.toFile(); dir = rootPath.toFile();

@ -2,6 +2,8 @@ package de.kreth.property2java.cli;
import java.io.IOException; import java.io.IOException;
import de.kreth.property2java.cli.ArgumentConfiguration.Builder;
import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.DefaultParser;
@ -11,8 +13,6 @@ import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options; import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException; import org.apache.commons.cli.ParseException;
import de.kreth.property2java.cli.ArgumentConfiguration.Builder;
public class CliConfig { public class CliConfig {
private final Options options = options(); private final Options options = options();

@ -2,7 +2,9 @@ package de.kreth.property2java.config;
import java.io.IOException; import java.io.IOException;
import de.kreth.property2java.Format; import de.kreth.property2java.Format;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.Template; import freemarker.template.Template;
@ -28,7 +30,7 @@ public enum FreemarkerConfig {
} }
private FreemarkerConfig() { FreemarkerConfig() {
cfg = new Configuration(Configuration.VERSION_2_3_28); cfg = new Configuration(Configuration.VERSION_2_3_28);
cfg.setClassForTemplateLoading(this.getClass(), "/template/"); cfg.setClassForTemplateLoading(this.getClass(), "/template/");
cfg.setDefaultEncoding("UTF-8"); cfg.setDefaultEncoding("UTF-8");

@ -2,7 +2,10 @@ package de.kreth.property2java.config;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class Regex { public final class Regex {
public static final Pattern PATTERN = Pattern.compile("_[a-z]{2}(_[A-Z]{2})?\\."); public static final Pattern PATTERN = Pattern.compile("_[a-z]{2}(_[A-Z]{2})?\\.");
private Regex() {
}
} }

@ -6,6 +6,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import de.kreth.property2java.Format; import de.kreth.property2java.Format;
import de.kreth.property2java.GeneratorOptions; import de.kreth.property2java.GeneratorOptions;

@ -7,6 +7,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import de.kreth.property2java.Format; import de.kreth.property2java.Format;
import de.kreth.property2java.GeneratorOptions; import de.kreth.property2java.GeneratorOptions;

@ -11,7 +11,6 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import javax.annotation.processing.Filer; import javax.annotation.processing.Filer;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
import javax.lang.model.element.PackageElement; import javax.lang.model.element.PackageElement;
@ -19,6 +18,7 @@ import javax.lang.model.element.TypeElement;
import javax.tools.FileObject; import javax.tools.FileObject;
import javax.tools.StandardLocation; import javax.tools.StandardLocation;
import de.kreth.property2java.Configuration; import de.kreth.property2java.Configuration;
import de.kreth.property2java.Format; import de.kreth.property2java.Format;
import de.kreth.property2java.Generator; import de.kreth.property2java.Generator;
@ -49,8 +49,7 @@ public class ProcessorConfiguration implements Configuration {
public String getPackage() { public String getPackage() {
String packageName = ""; String packageName = "";
if (element instanceof TypeElement) { if (element instanceof TypeElement typeElement) {
TypeElement typeElement = (TypeElement) element;
PackageElement packageElement = (PackageElement) typeElement.getEnclosingElement(); PackageElement packageElement = (PackageElement) typeElement.getEnclosingElement();
packageName = packageElement.getQualifiedName().toString(); packageName = packageElement.getQualifiedName().toString();
} }
@ -91,7 +90,7 @@ public class ProcessorConfiguration implements Configuration {
return new Builder(filer, element); return new Builder(filer, element);
} }
static class Builder { static final class Builder {
public GeneratorOptions[] options; public GeneratorOptions[] options;
private final Filer filer; private final Filer filer;
private final Element element; private final Element element;

@ -4,9 +4,9 @@ import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedAnnotationTypes;
@ -16,6 +16,7 @@ import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind; import javax.tools.Diagnostic.Kind;
import de.kreth.property2java.Format; import de.kreth.property2java.Format;
import de.kreth.property2java.GeneratorException; import de.kreth.property2java.GeneratorException;
import de.kreth.property2java.GeneratorOptions; import de.kreth.property2java.GeneratorOptions;
@ -64,14 +65,14 @@ public class Property2JavaGenerator extends AbstractProcessor {
GenerateResourceBundleProperty2Java[] value = element GenerateResourceBundleProperty2Java[] value = element
.getAnnotation(GenerateResourceBundleProperty2Javas.class).value(); .getAnnotation(GenerateResourceBundleProperty2Javas.class).value();
for (GenerateResourceBundleProperty2Java generateResourceBundleProperty2Java : value) { for (GenerateResourceBundleProperty2Java generateResourceBundleProperty2Java : value) {
List<String> resources = Arrays.asList(generateResourceBundleProperty2Java.resource()); List<String> resources = Collections.singletonList(generateResourceBundleProperty2Java.resource());
generateElementProperties(element, resources, generateResourceBundleProperty2Java.format(), generateResourceBundleProperty2Java.options()); generateElementProperties(element, resources, generateResourceBundleProperty2Java.format(), generateResourceBundleProperty2Java.options());
} }
} }
} }
private void generateElementProperties(Element element, List<String> resources, Format format, GeneratorOptions[] options) { private void generateElementProperties(Element element, List<String> resources, Format format, GeneratorOptions[] options) {
processingEnv.getMessager().printMessage(Kind.NOTE, "Generating Java for " + Arrays.asList(resources)); processingEnv.getMessager().printMessage(Kind.NOTE, "Generating Java for " + Collections.singletonList(resources));
try { try {
ProcessorConfiguration ProcessorConfiguration
.builder(processingEnv.getFiler(), element) .builder(processingEnv.getFiler(), element)
@ -83,7 +84,7 @@ public class Property2JavaGenerator extends AbstractProcessor {
StringWriter out = new StringWriter(); StringWriter out = new StringWriter();
e.printStackTrace(new PrintWriter(out)); e.printStackTrace(new PrintWriter(out));
out.flush(); out.flush();
processingEnv.getMessager().printMessage(Kind.ERROR, "Exception " + e + "\n" + out.toString(), element); processingEnv.getMessager().printMessage(Kind.ERROR, "Exception " + e + "\n" + out, element);
} }
} }

@ -1,7 +1,7 @@
package de.kreth.property2java; package de.kreth.property2java;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -10,6 +10,7 @@ import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock; import org.mockito.Mock;
@ -30,7 +31,7 @@ class ConfigurationTest {
when(config.outputCharset()).thenCallRealMethod(); when(config.outputCharset()).thenCallRealMethod();
Writer outWriter = config.outWriter("application.properties"); Writer outWriter = config.outWriter("application.properties");
assertTrue(outWriter instanceof FileWriter); assertInstanceOf(FileWriter.class, outWriter);
} }
@Test @Test

@ -6,19 +6,21 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
@ -28,6 +30,8 @@ import java.util.Optional;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.cli.MissingOptionException;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -45,7 +49,7 @@ import freemarker.template.TemplateException;
@MockitoSettings(strictness = Strictness.LENIENT) @MockitoSettings(strictness = Strictness.LENIENT)
class GeneratorTests { class GeneratorTests {
private String path = "application.properties"; private final String path = "application.properties";
@Mock @Mock
private Configuration config; private Configuration config;
@ -189,6 +193,38 @@ class GeneratorTests {
assertLineMatch(lines, "message_invoiceitem_allfieldsmustbeset", "message.invoiceitem.allfieldsmustbeset"); assertLineMatch(lines, "message_invoiceitem_allfieldsmustbeset", "message.invoiceitem.allfieldsmustbeset");
} }
@Test
void testTemplateException() throws TemplateException, IOException {
Template template = mock(Template.class);
when(config.outWriter(anyString())).thenReturn(mock(Writer.class));
doThrow(new TemplateException(null)).when(template).process(any(Map.class), any(Writer.class));
Generator generator = new Generator(config, template);
GeneratorException ex = assertThrows(GeneratorException.class, generator::start);
assertThat(ex.getCause()).isInstanceOf(TemplateException.class);
}
@Test
void testMainMethod() throws IOException, GeneratorException {
Path source = Files.createTempFile(getClass().getSimpleName(), ".properties");
Generator.main(new String[]{"-t", "target", "-f", source.toString()});
}
@Test
void testMainMethodMissingOption() throws IOException, GeneratorException {
IllegalStateException e = assertThrows(IllegalStateException.class, () -> Generator.main(new String[]{}));
assertThat(e.getCause()).isInstanceOf(MissingOptionException.class);
}
@Test
void testGenerateFor() throws IOException, GeneratorException {
Class<?> locationClass = getClass();
List<URL> rescources = new ArrayList<>();
String relativeTargetDir = "target";
Generator.generateFor(locationClass, rescources, relativeTargetDir);
}
private void assertLineMatch(List<String> lines, String key, String expected) { private void assertLineMatch(List<String> lines, String key, String expected) {
Optional<String> found = lines.stream().filter(line -> keyMatches(line, key)).findFirst(); Optional<String> found = lines.stream().filter(line -> keyMatches(line, key)).findFirst();

@ -2,14 +2,9 @@ package de.kreth.property2java;
import static de.kreth.property2java.TestPropertiesSource.testProperties; import static de.kreth.property2java.TestPropertiesSource.testProperties;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -25,6 +20,7 @@ import java.util.Optional;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -38,7 +34,7 @@ import org.mockito.quality.Strictness;
@MockitoSettings(strictness = Strictness.LENIENT) @MockitoSettings(strictness = Strictness.LENIENT)
public class GeneratorWithInnerPropertiesTest { public class GeneratorWithInnerPropertiesTest {
private String path = "application.properties"; private final String path = "application.properties";
@Mock @Mock
private Configuration config; private Configuration config;
@ -123,11 +119,11 @@ public class GeneratorWithInnerPropertiesTest {
String load = null; String load = null;
while (sourceTokenizer.hasMoreTokens()) { while (sourceTokenizer.hasMoreTokens()) {
String line = sourceTokenizer.nextToken(); String line = sourceTokenizer.nextToken();
if (line.contains("Properties") if (line.contains("Properties") &&
&& !line.contains("import") !line.contains("import") &&
&& !line.contains("enum") !line.contains("enum") &&
&& !line.contains("@link") !line.contains("@link") &&
&& !line.contains("class")) { !line.contains("class")) {
declaration = line; declaration = line;
} else if (line.contains(".load")) { } else if (line.contains(".load")) {
load = line; load = line;

@ -5,28 +5,40 @@ import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
import de.kreth.property2java.generated.GenerateTheTest; import de.kreth.property2java.generated.GenerateTheTest;
public class TestPropertiesSource { public class TestPropertiesSource {
public static StringReader testProperties() { public static StringReader testProperties() {
return new StringReader("\r\n" + "label = \r\n" + "\r\n" + "label.addarticle = Add Article\r\n" return new StringReader("""
+ "label.cancel = Cancel\r\n" + "label.close = Close\r\n"
+ "label.delete = Delete\r\n" + "label.discart = Discart\r\n" label =
+ "label.loggedin = Logged in:\r\n" + "label.logout = Logout\r\n"
+ "label.ok = OK\r\n" + "label.store = Store\r\n" label.addarticle = Add Article
+ "label.preview = Preview\r\n" + "label.open = Open\r\n" label.cancel = Cancel
+ "label.user.register = Register\r\n" + "\r\n" label.close = Close
+ "message.article.priceerror = Please set the price.\r\n" label.delete = Delete
+ "message.delete.text = Delete {0}?\r\n" label.discart = Discart
+ "message.delete.title = Really delete?\r\n" label.loggedin = Logged in:
+ "message.invoiceitem.allfieldsmustbeset = Start, end and article must not be \\r\\n" label.logout = Logout
+ " empty!\r\n" label.ok = OK
+ "message.invoiceitem.startbeforeend = End must be later than start.\r\n" label.store = Store
+ "message.user.create.success = Thanks {0} created!\r\n" label.preview = Preview
+ "message.user.loginfailure = Login Error! Wrong user or password?\r\n" label.open = Open
+ "message.user.passwordmissmatch = Passwords don't match.\r\n" label.user.register = Register
+ "message.with.five.placeholders = Third is first{2}, then last \"{4}\", second={1}, fourth={3} and first is last={0}\r\n");
message.article.priceerror = Please set the price.
message.delete.text = Delete {0}?
message.delete.title = Really delete?
message.invoiceitem.allfieldsmustbeset = Start, end and article must not be \\r\\n\
empty!
message.invoiceitem.startbeforeend = End must be later than start.
message.user.create.success = Thanks {0} created!
message.user.loginfailure = Login Error! Wrong user or password?
message.user.passwordmissmatch = Passwords don't match.
message.with.five.placeholders = Third is first{2}, then last "{4}", second={1}, fourth={3} and first is last={0}
""");
} }
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {

@ -3,7 +3,6 @@ package de.kreth.property2java.generated;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -25,7 +24,7 @@ public class GenerateTheTest {
public static final String RESOURCE_BUNDLE = "resource_bundle.properties"; public static final String RESOURCE_BUNDLE = "resource_bundle.properties";
public static void main(String[] args) throws IOException, GeneratorException { public static void main(String[] args) throws IOException, GeneratorException {
Path current = Paths.get(".", "src", "test", "java", "de", "kreth", "property2java", "generated").toAbsolutePath().normalize(); Path current = Path.of(".", "src", "test", "java", "de", "kreth", "property2java", "generated").toAbsolutePath().normalize();
System.out.println(current); System.out.println(current);
withUnaryOperatorParameter(current); withUnaryOperatorParameter(current);

@ -5,7 +5,6 @@ import java.util.ResourceBundle;
import javax.annotation.processing.Generated; import javax.annotation.processing.Generated;
import java.text.MessageFormat; import java.text.MessageFormat;
;
/** /**
* Property keys from property_loader_format.properties * Property keys from property_loader_format.properties

@ -1,11 +1,11 @@
package de.kreth.property2java.parts; package de.kreth.property2java.parts;
public class ReplaceLogicForTemplate { public final class ReplaceLogicForTemplate {
static String doReplacements(String property, Object...objects) { static String doReplacements(String property, Object...objects) {
StringBuilder text = new StringBuilder(); StringBuilder text = new StringBuilder();
int index = property.indexOf('{'); int index = property.indexOf('{');
text.append(property.substring(0, index)); text.append(property, 0, index);
while (index >= 0) { while (index >= 0) {
index++; index++;
@ -14,15 +14,15 @@ public class ReplaceLogicForTemplate {
String theIndex = property.substring(index, endIndex); String theIndex = property.substring(index, endIndex);
int withIndex = Integer.valueOf(theIndex); int withIndex = Integer.valueOf(theIndex);
if (withIndex+1> objects.length) { if (withIndex+1> objects.length) {
throw new IllegalStateException("No Argument for Index {" + theIndex throw new IllegalStateException("No Argument for Index {" + theIndex +
+ "}" + " at Position=" + (index - 1) + " in \"" + property + "\""); "}" + " at Position=" + (index - 1) + " in \"" + property + "\"");
} }
text.append(objects[withIndex].toString()); text.append(objects[withIndex].toString());
index = property.indexOf('{', endIndex); index = property.indexOf('{', endIndex);
if (index <0) { if (index <0) {
text.append(property.substring(endIndex + 1)); text.append(property.substring(endIndex + 1));
} else { } else {
text.append(property.substring(endIndex + 1, index)); text.append(property, endIndex + 1, index);
} }
} else { } else {
endIndex = index; endIndex = index;
@ -53,7 +53,7 @@ public class ReplaceLogicForTemplate {
if (between.length() > 0) { if (between.length() > 0) {
result = endIndex; result = endIndex;
for (int i = 0; i < between.length(); i++) { for (int i = 0; i < between.length(); i++) {
if (Character.isDigit(between.charAt(i)) == false) { if (!Character.isDigit(between.charAt(i))) {
return -1; return -1;
} }
} }
@ -62,4 +62,7 @@ public class ReplaceLogicForTemplate {
return result; return result;
} }
private ReplaceLogicForTemplate() {
}
} }

@ -1,7 +1,10 @@
package de.kreth.property2java.parts; package de.kreth.property2java.parts;
import static org.assertj.core.api.Assertions.*;
import static de.kreth.property2java.parts.ReplaceLogicForTemplate.doReplacements; import static de.kreth.property2java.parts.ReplaceLogicForTemplate.doReplacements;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
public class ReplaceLogicForTemplateTest { public class ReplaceLogicForTemplateTest {

@ -1,15 +1,19 @@
package de.kreth.property2java.processor; package de.kreth.property2java.processor;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import java.lang.annotation.Annotation;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import javax.annotation.processing.Messager; import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
@ -38,10 +42,40 @@ public class Property2JavaGeneratorTest {
when(processingEnv.getMessager()).thenReturn(messanger); when(processingEnv.getMessager()).thenReturn(messanger);
} }
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "rawtypes"})
@Test @Test
void testGeneratorInitializedCorrectly() { void testGeneratorInitializedCorrectly() {
GenerateProperty2Java an = mock(GenerateProperty2Java.class);
when(an.resources()).thenReturn(new String[]{});
TypeElement element = mock(TypeElement.class);
when(element.getAnnotation(GenerateProperty2Java.class)).thenReturn(an);
annotations.add(element);
when(roundEnv.getElementsAnnotatedWith(ArgumentMatchers.any(Class.class))).thenReturn(annotations); when(roundEnv.getElementsAnnotatedWith(ArgumentMatchers.any(Class.class))).thenReturn(annotations);
Element annotatedElement = mock(Element.class);
GenerateResourceBundleProperty2Javas value = new GenerateResourceBundleProperty2Javas() {
@Override
public Class<? extends Annotation> annotationType() {
return null;
}
@Override
public GenerateResourceBundleProperty2Java[] value() {
return new GenerateResourceBundleProperty2Java[0];
}
};
when(annotatedElement.getAnnotation(GenerateResourceBundleProperty2Javas.class)).thenReturn(value);
Set<Element> elements = new HashSet<>(List.of(annotatedElement));
when(roundEnv.getElementsAnnotatedWith(GenerateResourceBundleProperty2Javas.class))
.thenReturn((Set) elements);
processor.process(annotations, roundEnv); processor.process(annotations, roundEnv);
} }
} }

Loading…
Cancel
Save