Compare commits
No commits in common. 'ddb07f323b1ec37e96d39268d1dec8145ba2095c' and '98072dcdfb7ef57dca31d91062b2c7713c60582c' have entirely different histories.
ddb07f323b
...
98072dcdfb
@ -1,149 +0,0 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
||||
<modelVersion>4.0.0</modelVersion> |
||||
<groupId>de.kreth.property2java</groupId> |
||||
<artifactId>PropertyToJavaGenerator</artifactId> |
||||
<version>2.0.3-SNAPSHOT</version> |
||||
|
||||
<properties> |
||||
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
||||
<java.version>11</java.version> |
||||
<org.junit.jupiter>5.3.0-M1</org.junit.jupiter> |
||||
<org.slf4j>1.7.36</org.slf4j> |
||||
<org.apache.logging.log4j>2.17.2</org.apache.logging.log4j> |
||||
|
||||
<timestamp>${maven.build.timestamp}</timestamp> |
||||
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format> |
||||
</properties> |
||||
|
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>org.apache.commons</groupId> |
||||
<artifactId>commons-lang3</artifactId> |
||||
<version>3.8.1</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.apache.commons</groupId> |
||||
<artifactId>commons-text</artifactId> |
||||
<version>1.10.0</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>commons-cli</groupId> |
||||
<artifactId>commons-cli</artifactId> |
||||
<version>1.4</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.freemarker</groupId> |
||||
<artifactId>freemarker</artifactId> |
||||
<version>2.3.28</version> |
||||
</dependency> |
||||
|
||||
<!-- LOGGING --> |
||||
<dependency> |
||||
<groupId>org.slf4j</groupId> |
||||
<artifactId>slf4j-api</artifactId> |
||||
<version>${org.slf4j}</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-api</artifactId> |
||||
<version>${org.apache.logging.log4j}</version> |
||||
<scope>runtime</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-core</artifactId> |
||||
<version>${org.apache.logging.log4j}</version> |
||||
<scope>runtime</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-slf4j-impl</artifactId> |
||||
<version>${org.apache.logging.log4j}</version> |
||||
<scope>runtime</scope> |
||||
</dependency> |
||||
|
||||
<!-- TESTING --> |
||||
<dependency> |
||||
<groupId>org.junit.jupiter</groupId> |
||||
<artifactId>junit-jupiter-api</artifactId> |
||||
<version>5.3.2</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.junit.jupiter</groupId> |
||||
<artifactId>junit-jupiter-engine</artifactId> |
||||
<version>5.3.2</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.junit.jupiter</groupId> |
||||
<artifactId>junit-jupiter-params</artifactId> |
||||
<version>5.3.2</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.junit.platform</groupId> |
||||
<artifactId>junit-platform-launcher</artifactId> |
||||
<version>1.5.0-M1</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.junit.platform</groupId> |
||||
<artifactId>junit-platform-runner</artifactId> |
||||
<version>1.5.0-M1</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.mockito</groupId> |
||||
<artifactId>mockito-core</artifactId> |
||||
<version>2.24.5</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.mockito</groupId> |
||||
<artifactId>mockito-junit-jupiter</artifactId> |
||||
<version>2.24.5</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.hamcrest</groupId> |
||||
<artifactId>hamcrest-library</artifactId> |
||||
<version>2.1-rc4</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
</dependencies> |
||||
|
||||
<distributionManagement> |
||||
<snapshotRepository> |
||||
<id>kreth.snapshots</id> |
||||
<url>https://nexus.kreth-development.de/repository/maven-snapshots/</url> |
||||
</snapshotRepository> |
||||
<repository> |
||||
<id>kreth.releases</id> |
||||
<url>https://nexus.kreth-development.de/repository/maven-releases/</url> |
||||
</repository> |
||||
</distributionManagement> |
||||
|
||||
<build> |
||||
<plugins> |
||||
<plugin> |
||||
<groupId>org.apache.maven.plugins</groupId> |
||||
<artifactId>maven-compiler-plugin</artifactId> |
||||
<version>3.8.0</version> |
||||
<configuration> |
||||
<release>${java.version}</release> |
||||
<compilerArgs>-proc:none</compilerArgs> |
||||
</configuration> |
||||
</plugin> |
||||
</plugins> |
||||
</build> |
||||
<scm> |
||||
<developerConnection>scm:git:https://gitea.kreth-development.de/markus/PropertyToJavaGenerator_migration.git</developerConnection> |
||||
<connection>scm:git:https://gitea.kreth-development.de/markus/PropertyToJavaGenerator_migration.git</connection> |
||||
<tag>HEAD</tag> |
||||
</scm> |
||||
</project> |
||||
@ -1,5 +0,0 @@ |
||||
package de.kreth.property2java; |
||||
|
||||
public enum GeneratorOptions { |
||||
WithSubstitutors |
||||
} |
||||
@ -1,70 +0,0 @@ |
||||
/** |
||||
* The text for this key from {@link Properties} with args as replacements of placeholders. |
||||
* <p>Placeholder must be defined as {0}, {1} etc. |
||||
* @return human readable text |
||||
*/ |
||||
public String getText(Object...objects) { |
||||
String property = properties.getProperty(value); |
||||
return doReplacements(property, objects); |
||||
} |
||||
|
||||
<#-- From here tested substitution method --> |
||||
private String doReplacements(String property, Object...objects) { |
||||
StringBuilder text = new StringBuilder(); |
||||
int index = property.indexOf('{'); |
||||
text.append(property.substring(0, index)); |
||||
|
||||
while (index >= 0) { |
||||
index++; |
||||
int endIndex = withEndIndex(index, property); |
||||
if (endIndex >0) { |
||||
String theIndex = property.substring(index, endIndex); |
||||
int withIndex = Integer.valueOf(theIndex); |
||||
if (withIndex+1> objects.length) { |
||||
throw new IllegalStateException("No Argument for Index {" + theIndex |
||||
+ "}" + " at Position=" + (index - 1) + " in \"" + property + "\""); |
||||
} |
||||
text.append(objects[withIndex].toString()); |
||||
index = property.indexOf('{', endIndex); |
||||
if (index <0) { |
||||
text.append(property.substring(endIndex + 1)); |
||||
} else { |
||||
text.append(property.substring(endIndex + 1, index)); |
||||
} |
||||
} else { |
||||
endIndex = index; |
||||
|
||||
index = property.indexOf('{', index); |
||||
if (index <0) { |
||||
text.append('{'); |
||||
text.append(property.substring(endIndex)); |
||||
} |
||||
} |
||||
} |
||||
return text.toString(); |
||||
} |
||||
|
||||
/** |
||||
* extracts the end index, if (and only if) the closing } exists and |
||||
* between the indicee an integer value exists. |
||||
* @param index |
||||
* @param property |
||||
* @return -1 if invalid or not existing |
||||
*/ |
||||
private int withEndIndex(int index, String property) { |
||||
|
||||
int result = -1; |
||||
int endIndex = property.indexOf('}', index); |
||||
if (endIndex >index) { |
||||
String between = property.substring(index, endIndex); |
||||
if (between.length() > 0) { |
||||
result = endIndex; |
||||
for(int i=0; i<between.length(); i++) { |
||||
if (Character.isDigit(between.charAt(i)) == false) { |
||||
return -1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return result; |
||||
} |
||||
@ -1,7 +0,0 @@ |
||||
/** |
||||
* Represented Key in property File. |
||||
* @return key |
||||
*/ |
||||
public String getKey() { |
||||
return value; |
||||
} |
||||
@ -1,5 +0,0 @@ |
||||
<#if options??> |
||||
<#list options as option> |
||||
<#include "${option}.tpl"> |
||||
</#list> |
||||
</#if> |
||||
@ -1,203 +0,0 @@ |
||||
package de.kreth.property2java.generated; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.UncheckedIOException; |
||||
import java.util.Properties; |
||||
|
||||
import javax.annotation.processing.Generated; |
||||
|
||||
/** |
||||
* Property keys from property_loader_options.properties |
||||
*/ |
||||
|
||||
@Generated(date = "06.08.2024, 23:03:48", value = "de.kreth.property2java.Generator") |
||||
public enum Property_Loader_Options_Properties { |
||||
|
||||
/** |
||||
* label = "" |
||||
*/ |
||||
LABEL ("label"), |
||||
/** |
||||
* label.addarticle = "Add Article" |
||||
*/ |
||||
LABEL_ADDARTICLE ("label.addarticle"), |
||||
/** |
||||
* label.cancel = "Cancel" |
||||
*/ |
||||
LABEL_CANCEL ("label.cancel"), |
||||
/** |
||||
* label.close = "Close" |
||||
*/ |
||||
LABEL_CLOSE ("label.close"), |
||||
/** |
||||
* label.delete = "Delete" |
||||
*/ |
||||
LABEL_DELETE ("label.delete"), |
||||
/** |
||||
* label.discart = "Discart" |
||||
*/ |
||||
LABEL_DISCART ("label.discart"), |
||||
/** |
||||
* label.loggedin = "Logged in:" |
||||
*/ |
||||
LABEL_LOGGEDIN ("label.loggedin"), |
||||
/** |
||||
* label.logout = "Logout" |
||||
*/ |
||||
LABEL_LOGOUT ("label.logout"), |
||||
/** |
||||
* label.ok = "OK" |
||||
*/ |
||||
LABEL_OK ("label.ok"), |
||||
/** |
||||
* label.open = "Open" |
||||
*/ |
||||
LABEL_OPEN ("label.open"), |
||||
/** |
||||
* label.preview = "Preview" |
||||
*/ |
||||
LABEL_PREVIEW ("label.preview"), |
||||
/** |
||||
* label.store = "Store" |
||||
*/ |
||||
LABEL_STORE ("label.store"), |
||||
/** |
||||
* label.user.register = "Register" |
||||
*/ |
||||
LABEL_USER_REGISTER ("label.user.register"), |
||||
/** |
||||
* message.article.priceerror = "Please set the price." |
||||
*/ |
||||
MESSAGE_ARTICLE_PRICEERROR ("message.article.priceerror"), |
||||
/** |
||||
* message.delete.text = "Delete {0}?" |
||||
*/ |
||||
MESSAGE_DELETE_TEXT ("message.delete.text"), |
||||
/** |
||||
* message.delete.title = "Really delete?" |
||||
*/ |
||||
MESSAGE_DELETE_TITLE ("message.delete.title"), |
||||
/** |
||||
* message.invoiceitem.allfieldsmustbeset = "Start, end and article must not be |
||||
empty!" |
||||
*/ |
||||
MESSAGE_INVOICEITEM_ALLFIELDSMUSTBESET ("message.invoiceitem.allfieldsmustbeset"), |
||||
/** |
||||
* message.invoiceitem.startbeforeend = "End must be later than start." |
||||
*/ |
||||
MESSAGE_INVOICEITEM_STARTBEFOREEND ("message.invoiceitem.startbeforeend"), |
||||
/** |
||||
* message.user.create.success = "Thanks {0} created!" |
||||
*/ |
||||
MESSAGE_USER_CREATE_SUCCESS ("message.user.create.success"), |
||||
/** |
||||
* message.user.loginfailure = "Login Error! Wrong user or password?" |
||||
*/ |
||||
MESSAGE_USER_LOGINFAILURE ("message.user.loginfailure"), |
||||
/** |
||||
* message.user.passwordmissmatch = "Passwords don't match." |
||||
*/ |
||||
MESSAGE_USER_PASSWORDMISSMATCH ("message.user.passwordmissmatch"), |
||||
/** |
||||
* message.with.five.placeholders = "Third is first{2}, then last "{4}", second={1}, fourth={3} and first is last={0}" |
||||
*/ |
||||
MESSAGE_WITH_FIVE_PLACEHOLDERS ("message.with.five.placeholders"); |
||||
private Property_Loader_Options_Properties (String value) { |
||||
this.value = value; |
||||
} |
||||
|
||||
private static Properties properties = new Properties(); |
||||
static { |
||||
try { |
||||
properties.load(Property_Loader_Options_Properties.class.getResourceAsStream("/property_loader_options.properties")); |
||||
} catch (IOException e) { |
||||
throw new UncheckedIOException(e); |
||||
} |
||||
} |
||||
|
||||
private final String value; |
||||
|
||||
/** |
||||
* Represented Key in property File. |
||||
* @return key |
||||
*/ |
||||
public String getKey() { |
||||
return value; |
||||
} |
||||
/** |
||||
* The text for this key from {@link Properties} |
||||
* @return human readable text |
||||
*/ |
||||
public String getText() { |
||||
return properties.getProperty(value); |
||||
} |
||||
|
||||
/** |
||||
* The text for this key from {@link Properties} with args as replacements of placeholders. |
||||
* <p>Placeholder must be defined as {0}, {1} etc. |
||||
* @return human readable text |
||||
*/ |
||||
public String getText(Object...objects) { |
||||
String property = properties.getProperty(value); |
||||
return doReplacements(property, objects); |
||||
} |
||||
|
||||
private String doReplacements(String property, Object...objects) { |
||||
StringBuilder text = new StringBuilder(); |
||||
int index = property.indexOf('{'); |
||||
text.append(property.substring(0, index)); |
||||
|
||||
while (index >= 0) { |
||||
index++; |
||||
int endIndex = withEndIndex(index, property); |
||||
if (endIndex >0) { |
||||
String theIndex = property.substring(index, endIndex); |
||||
int withIndex = Integer.valueOf(theIndex); |
||||
if (withIndex+1> objects.length) { |
||||
throw new IllegalStateException("No Argument for Index {" + theIndex |
||||
+ "}" + " at Position=" + (index - 1) + " in \"" + property + "\""); |
||||
} |
||||
text.append(objects[withIndex].toString()); |
||||
index = property.indexOf('{', endIndex); |
||||
if (index <0) { |
||||
text.append(property.substring(endIndex + 1)); |
||||
} else { |
||||
text.append(property.substring(endIndex + 1, index)); |
||||
} |
||||
} else { |
||||
endIndex = index; |
||||
|
||||
index = property.indexOf('{', index); |
||||
if (index <0) { |
||||
text.append('{'); |
||||
text.append(property.substring(endIndex)); |
||||
} |
||||
} |
||||
} |
||||
return text.toString(); |
||||
} |
||||
|
||||
/** |
||||
* extracts the end index, if (and only if) the closing } exists and |
||||
* between the indicee an integer value exists. |
||||
* @param index |
||||
* @param property |
||||
* @return -1 if invalid or not existing |
||||
*/ |
||||
private int withEndIndex(int index, String property) { |
||||
|
||||
int result = -1; |
||||
int endIndex = property.indexOf('}', index); |
||||
if (endIndex >index) { |
||||
String between = property.substring(index, endIndex); |
||||
if (between.length() > 0) { |
||||
result = endIndex; |
||||
for(int i=0; i<between.length(); i++) { |
||||
if (Character.isDigit(between.charAt(i)) == false) { |
||||
return -1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return result; |
||||
}} |
||||
@ -1,65 +0,0 @@ |
||||
package de.kreth.property2java.parts; |
||||
|
||||
public class ReplaceLogicForTemplate { |
||||
|
||||
static String doReplacements(String property, Object...objects) { |
||||
StringBuilder text = new StringBuilder(); |
||||
int index = property.indexOf('{'); |
||||
text.append(property.substring(0, index)); |
||||
|
||||
while (index >= 0) { |
||||
index++; |
||||
int endIndex = withEndIndex(index, property); |
||||
if (endIndex >0) { |
||||
String theIndex = property.substring(index, endIndex); |
||||
int withIndex = Integer.valueOf(theIndex); |
||||
if (withIndex+1> objects.length) { |
||||
throw new IllegalStateException("No Argument for Index {" + theIndex |
||||
+ "}" + " at Position=" + (index - 1) + " in \"" + property + "\""); |
||||
} |
||||
text.append(objects[withIndex].toString()); |
||||
index = property.indexOf('{', endIndex); |
||||
if (index <0) { |
||||
text.append(property.substring(endIndex + 1)); |
||||
} else { |
||||
text.append(property.substring(endIndex + 1, index)); |
||||
} |
||||
} else { |
||||
endIndex = index; |
||||
|
||||
index = property.indexOf('{', index); |
||||
if (index <0) { |
||||
text.append('{'); |
||||
text.append(property.substring(endIndex)); |
||||
} |
||||
} |
||||
} |
||||
return text.toString(); |
||||
} |
||||
|
||||
/** |
||||
* extracts the end index, if (and only if) the closing } exists and |
||||
* between the indicee an integer value exists. |
||||
* @param index |
||||
* @param property |
||||
* @return -1 if invalid or not existing |
||||
*/ |
||||
private static int withEndIndex(int index, String property) { |
||||
|
||||
int result = -1; |
||||
int endIndex = property.indexOf('}', index); |
||||
if (endIndex >index) { |
||||
String between = property.substring(index, endIndex); |
||||
if (between.length() > 0) { |
||||
result = endIndex; |
||||
for(int i=0; i<between.length(); i++) { |
||||
if (Character.isDigit(between.charAt(i)) == false) { |
||||
return -1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
} |
||||
@ -1,82 +0,0 @@ |
||||
package de.kreth.property2java.parts; |
||||
|
||||
import static org.assertj.core.api.Assertions.*; |
||||
import static de.kreth.property2java.parts.ReplaceLogicForTemplate.doReplacements; |
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
public class ReplaceLogicForTemplateTest { |
||||
|
||||
@Test |
||||
void testPlaceholderOnly() { |
||||
String property = "{0}"; |
||||
String replaced = doReplacements(property, "Replacement"); |
||||
assertThat(replaced).isEqualTo("Replacement"); |
||||
} |
||||
|
||||
@Test |
||||
void testPlaceholderTrailing() { |
||||
String property = "|{0}"; |
||||
String replaced = doReplacements(property, "Replacement"); |
||||
assertThat(replaced).isEqualTo("|Replacement"); |
||||
} |
||||
|
||||
@Test |
||||
void testPlaceholderLeading() { |
||||
String property = "{0}|"; |
||||
String replaced = doReplacements(property, "Replacement"); |
||||
assertThat(replaced).isEqualTo("Replacement|"); |
||||
} |
||||
|
||||
@Test |
||||
void testPlaceholderOrdered() { |
||||
String property = "Start{0}|{1}|{2}End"; |
||||
String replaced = doReplacements(property, "R1", "R2", "R3"); |
||||
assertThat(replaced).isEqualTo("StartR1|R2|R3End"); |
||||
} |
||||
|
||||
@Test |
||||
void testPlaceholdersOrderedAtEdgesAndMissingIndex() { |
||||
String property = "{0}||{2}"; |
||||
String replaced = doReplacements(property, "R1", "R2", "R3"); |
||||
assertThat(replaced).isEqualTo("R1||R3"); |
||||
} |
||||
|
||||
@Test |
||||
void testSimpleReplacementWithEmpty() { |
||||
String property = "Start{0}End"; |
||||
String replaced = doReplacements(property, ""); |
||||
assertThat(replaced).isEqualTo("StartEnd"); |
||||
} |
||||
|
||||
@Test |
||||
void testSimpleReplacementToManyArguments() { |
||||
String property = "Start{0}End"; |
||||
String replaced = doReplacements(property, "|0|", "notUsed"); |
||||
assertThat(replaced).isEqualTo("Start|0|End"); |
||||
} |
||||
|
||||
@Test |
||||
void testNoReplacementWithoutIndex() { |
||||
String property = "Start{}End"; |
||||
String replaced = doReplacements(property, "|0|", "notUsed"); |
||||
assertThat(replaced).isEqualTo("Start{}End"); |
||||
} |
||||
|
||||
@Test |
||||
void testNoReplacementWithNoIntBetweenBraces() { |
||||
String property = "Start{xy}End"; |
||||
String replaced = doReplacements(property, "|0|", "notUsed"); |
||||
assertThat(replaced).isEqualTo("Start{xy}End"); |
||||
} |
||||
|
||||
@Test |
||||
void testMissingReplacement() { |
||||
String property = "Start{1}End"; |
||||
assertThatThrownBy(() -> doReplacements(property, "|0|")) |
||||
.isInstanceOf(IllegalStateException.class) |
||||
.hasMessageContaining("{1}") // Orignal Placeholder
|
||||
.hasMessageContaining("Position=5") // Index of missing Placeholder
|
||||
.hasMessageContaining(property); // Orignal Text
|
||||
} |
||||
|
||||
} |
||||
@ -1,25 +0,0 @@ |
||||
|
||||
label = |
||||
|
||||
label.addarticle = Add Article |
||||
label.cancel = Cancel |
||||
label.close = Close |
||||
label.delete = Delete |
||||
label.discart = Discart |
||||
label.loggedin = Logged in: |
||||
label.logout = Logout |
||||
label.ok = OK |
||||
label.store = Store |
||||
label.preview = Preview |
||||
label.open = Open |
||||
label.user.register = Register |
||||
|
||||
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} |
||||
Loading…
Reference in new issue