Skip to content

Commit

Permalink
Renamed some getters to shorten them, and also remove an ambiguity wi…
Browse files Browse the repository at this point in the history
…th `getAllOr()`.
  • Loading branch information
brett-smith committed Apr 14, 2024
1 parent 2f1801a commit 119ad69
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 54 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ And for writing an INI document ..
System.out.format(" City: %s%n". s.get("City"));
System.out.format(" County: %s%n". s.get("County"));
System.out.format(" PostCode: %s%n". s.get("PostCode"));
System.out.format(" Tel: %s%n". s.getOr("PostCode", "N/A"));
System.out.format(" Tel: %s%n". s.get("PostCode", "N/A"));
});

```
Expand Down Expand Up @@ -185,6 +185,7 @@ Note that a `store` is scoped, and should be closed when finished with.
### 0.3.1

* Added string interpolation features.
* Renamed some getters to shorten them, and also remove an ambiguity with `getAllOr()`.

### 0.3.0

Expand Down
28 changes: 14 additions & 14 deletions lib/src/main/java/com/sshtools/jini/Data.java
Original file line number Diff line number Diff line change
Expand Up @@ -913,7 +913,7 @@ default String get(String key) {
* @param defaultValue default value
* @return value or default
*/
default String getOr(String key, String defaultValue) {
default String get(String key, String defaultValue) {
return getOr(key).orElse(defaultValue);
}

Expand Down Expand Up @@ -958,7 +958,7 @@ default String[] getAll(String key) {
* @param defaultValues default values
* @return values
*/
default String[] getAllOr(String key, String... defaultValues) {
default String[] getAllElse(String key, String... defaultValues) {
return getAllOr(key).orElse(defaultValues);
}

Expand Down Expand Up @@ -991,7 +991,7 @@ default double getDouble(String key) {
* @param defaultValue default value
* @return value or default
*/
default double getDoubleOr(String key, double defaultValue) {
default double getDouble(String key, double defaultValue) {
return getOr(key).map(i -> Double.parseDouble(i)).orElse(defaultValue);
}

Expand Down Expand Up @@ -1026,7 +1026,7 @@ default double[] getAllDouble(String key) {
* @param defaultValues default values
* @return values
*/
default double[] getAllDoubleOr(String key, double... defaultValues) {
default double[] getAllDoubleElse(String key, double... defaultValues) {
return getAllDoubleOr(key).orElse(defaultValues);
}

Expand Down Expand Up @@ -1061,7 +1061,7 @@ default long getLong(String key) {
* @param defaultValue default value
* @return value or default
*/
default long getLongOr(String key, long defaultValue) {
default long getLong(String key, long defaultValue) {
return getOr(key).map(i -> Long.parseLong(i)).orElse(defaultValue);
}

Expand Down Expand Up @@ -1096,7 +1096,7 @@ default long[] getAllLong(String key) {
* @param defaultValues default values
* @return values
*/
default long[] getAllLongOr(String key, long... defaultValues) {
default long[] getAllLongElse(String key, long... defaultValues) {
return getAllLongOr(key).orElse(defaultValues);
}

Expand Down Expand Up @@ -1131,7 +1131,7 @@ default int getInt(String key) {
* @param defaultValue default value
* @return value or default
*/
default int getIntOr(String key, int defaultValue) {
default int getInt(String key, int defaultValue) {
return getOr(key).map(i -> Integer.parseInt(i)).orElse(defaultValue);
}

Expand Down Expand Up @@ -1166,7 +1166,7 @@ default int[] getAllInt(String key) {
* @param defaultValues default values
* @return values
*/
default int[] getAllIntOr(String key, int... defaultValues) {
default int[] getAllIntElse(String key, int... defaultValues) {
return getAllIntOr(key).orElse(defaultValues);
}

Expand Down Expand Up @@ -1201,7 +1201,7 @@ default short getShort(String key) {
* @param defaultValue default value
* @return value or default
*/
default short getShortOr(String key, short defaultValue) {
default short getShort(String key, short defaultValue) {
return getOr(key).map(i -> Short.parseShort(i)).orElse(defaultValue);
}

Expand Down Expand Up @@ -1236,7 +1236,7 @@ default short[] getAllShort(String key) {
* @param defaultValues default values
* @return values
*/
default short[] getAllShortOr(String key, short... defaultValues) {
default short[] getAllShortElse(String key, short... defaultValues) {
return getAllShortOr(key).orElse(defaultValues);
}

Expand Down Expand Up @@ -1272,7 +1272,7 @@ default float getFloat(String key) {
* @param defaultValue default value
* @return value or default
*/
default float getFloatOr(String key, float defaultValue) {
default float getFloat(String key, float defaultValue) {
return getOr(key).map(i -> Float.parseFloat(i)).orElse(defaultValue);
}

Expand Down Expand Up @@ -1307,7 +1307,7 @@ default float[] getAllFloat(String key) {
* @param defaultValues default values
* @return values
*/
default float[] getAllFloatOr(String key, float... defaultValues) {
default float[] getAllFloatElse(String key, float... defaultValues) {
return getAllFloatOr(key).orElse(defaultValues);
}

Expand Down Expand Up @@ -1343,7 +1343,7 @@ default boolean getBoolean(String key) {
* @param defaultValue default value
* @return value or default
*/
default boolean getBooleanOr(String key, boolean defaultValue) {
default boolean getBoolean(String key, boolean defaultValue) {
return getOr(key).map(i -> Boolean.parseBoolean(i)).orElse(defaultValue);
}

Expand Down Expand Up @@ -1377,7 +1377,7 @@ default boolean[] getAllBoolean(String key) {
* @param key key
* @return optional value
*/
default boolean[] getAllBooleanOr(String key, boolean[] defaultValues) {
default boolean[] getAllBooleanElse(String key, boolean... defaultValues) {
return getAllBooleanOr(key).orElse(defaultValues);
}

Expand Down
49 changes: 48 additions & 1 deletion lib/src/main/java/com/sshtools/jini/INI.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,14 @@ public enum EscapeMode {
*/
ALWAYS
}

public static String[] merge(String[]... vals) {
var l = new ArrayList<String>();
for(var val : vals) {
l.addAll(Arrays.asList(val));
}
return l.toArray(new String[0]);
}

/**
* Helper for lazy initialisation of an empty read onlyt document.
Expand Down Expand Up @@ -392,7 +400,7 @@ static abstract class AbstractIOBuilder<B extends AbstractIOBuilder<B>> {
char valueSeparator = '=';
char commentCharacter = ';';
boolean trimmedValue = true;
MultiValueMode multiValueMode = MultiValueMode.REPEATED_KEY;
MultiValueMode multiValueMode = MultiValueMode.SEPARATED;
char multiValueSeparator = ',';
boolean emptyValues = true;
EscapeMode escapeMode = EscapeMode.QUOTED;
Expand Down Expand Up @@ -775,6 +783,45 @@ public INI readOnly() {
Collections.unmodifiableMap(values), Collections.unmodifiableMap(s), interpolator, variablePattern, missingVariableMode);
}

public enum MergeMode {
FLATTEN_SECTIONS
}

/**
* Merge one or more documents to make a new document that contains all the
* sections and keys of both.
*
* @param document document
* @return read only document
*/
public INI merge(MergeMode mergeMode, INI... others) {
var newDoc = create();
for(var other : others) {
merge(mergeMode, newDoc, other);
}
return newDoc;
}

protected void merge(MergeMode mergeMode, AbstractData newDoc, AbstractData other) {
newDoc.values.putAll(other.values);
for(var sec : other.sections.entrySet()) {
switch(mergeMode) {
case FLATTEN_SECTIONS:

break;
default:
throw new UnsupportedOperationException();
}
// if(newDoc.sections.containsKey(sec.getKey())) {
// merge(newDoc.sections.get(sec.getKey()), sec.getValue());
// }
// else {
//
// }
}
}


@Override
public String toString() {
return new INIWriter.Builder().build().write(this);
Expand Down
43 changes: 41 additions & 2 deletions lib/src/main/java/com/sshtools/jini/INIReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.nio.file.Files;
Expand Down Expand Up @@ -96,7 +98,13 @@ public enum MultiValueMode {
/**
* Multiple values are expressed as value keys repeating in the content.
*/
@Deprecated
REPEATED_KEY,
/**
* Multiple values are not allowed at all, a value will always be treated
* as a single value.
*/
OFF,
/**
* Multiple values are expressed as a single key, with it's string value being
* made up of (comma by default) separated values.
Expand Down Expand Up @@ -459,6 +467,33 @@ public INI read(String content) throws IOException, ParseException {
return read(rdr);
}
}

/**
* Create an {@link INI} document instance by reading a stream with content in
* INI format. The current default character set encoding will be used.
*
* @param input stream of INI content
* @return document
* @throws IOException on I/O error
* @throws ParseException on parsing error
*/
public INI read(InputStream input) throws IOException, ParseException {
return read(new InputStreamReader(input));
}

/**
* Create an {@link INI} document instance by reading a stream with content in
* INI format.
*
* @param input stream of INI content
* @param charset character set
* @return document
* @throws IOException on I/O error
* @throws ParseException on parsing error
*/
public INI read(InputStream input, String charset) throws IOException, ParseException {
return read(new InputStreamReader(input, charset));
}

/**
* Create an {@link INI} document instance by reading a stream with content in
Expand Down Expand Up @@ -701,20 +736,24 @@ public INI read(Reader reader) throws IOException, ParseException {
}

String[] values;
var dupAction = duplicateKeysAction;
if (multiValueMode == MultiValueMode.REPEATED_KEY) {
values = new String[] { val };
} else {
dupAction = DuplicateAction.APPEND;
} else if(multiValueMode == MultiValueMode.SEPARATED) {
values = tokenize(val, multiValueSeparator);
if (trimmedValue)
values = trim(values);
} else {
values = new String[] { val };
}

var valuesForKey = sectionProperties.get(key);
if (valuesForKey == null) {
/* Doesn't exist, just add */
sectionProperties.put(key, values);
} else {
switch (duplicateKeysAction) {
switch (dupAction) {
case ABORT:
throw new ParseException(MessageFormat.format("Duplicate property key {0}.", key), offset);
case REPLACE:
Expand Down
28 changes: 14 additions & 14 deletions lib/src/test/java/com/sshtools/jini/INITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -390,82 +390,82 @@ protected void assertTypes(INI ini) {
assertTrue(ini.contains("A_String"));
assertEquals("HelloWorld!", ini.get("A_String"));
assertTrue(ini.getOr("A_Missing_String").isEmpty());
assertEquals("ZZZZZ", ini.getOr("A_Missing_String", "ZZZZZ"));
assertEquals("ZZZZZ", ini.get("A_Missing_String", "ZZZZZ"));

assertTrue(ini.contains("A_Boolean"));
assertEquals(true, ini.getBoolean("A_Boolean"));
assertTrue(ini.getBooleanOr("A_Missing_Boolean").isEmpty());
assertFalse(ini.getBooleanOr("A_Missing_Boolean", false));
assertFalse(ini.getBoolean("A_Missing_Boolean", false));

assertTrue(ini.contains("An_Integer"));
assertEquals(12, ini.getInt("An_Integer"));
assertTrue(ini.getIntOr("A_Missing_Integer").isEmpty());
assertEquals(456, ini.getIntOr("A_Missing_Integer", 456));
assertEquals(456, ini.getInt("A_Missing_Integer", 456));

assertTrue(ini.contains("A_Float"));
assertEquals(456.789f, ini.getFloat("A_Float"));
assertTrue(ini.getFloatOr("A_Missing_Float").isEmpty());
assertEquals(123.987f, ini.getFloatOr("A_Missing_Float", 123.987f));
assertEquals(123.987f, ini.getFloat("A_Missing_Float", 123.987f));

assertTrue(ini.contains("A_Long"));
assertEquals(12345678901234l, ini.getLong("A_Long"));
assertTrue(ini.getLongOr("A_Missing_Long").isEmpty());
assertEquals(7895634635223l, ini.getLongOr("A_Missing_Long", 7895634635223l));
assertEquals(7895634635223l, ini.getLong("A_Missing_Long", 7895634635223l));

assertTrue(ini.contains("A_Double"));
assertEquals(12345678901234.12345678901234, ini.getDouble("A_Double"));
assertTrue(ini.getDoubleOr("A_Missing_Double").isEmpty());
assertEquals(67894562342134.123112342345d, ini.getDoubleOr("A_Missing_Double", 67894562342134.123112342345d));
assertEquals(67894562342134.123112342345d, ini.getDouble("A_Missing_Double", 67894562342134.123112342345d));

assertTrue(ini.contains("A_Short"));
assertEquals(345, ini.getShort("A_Short"));
assertTrue(ini.getShortOr("A_Missing_Short").isEmpty());
assertEquals(111, ini.getShortOr("A_Missing_Short", (short) 111));
assertEquals(111, ini.getShort("A_Missing_Short", (short) 111));

assertTrue(ini.contains("A_Boolean_ARRAY"));
assertArrayEquals(new boolean[] { true, false, true, false }, ini.getAllBoolean("A_Boolean_ARRAY"));
assertTrue(ini.getAllBooleanOr("A_Missing_Boolean_ARRAY").isEmpty());
assertArrayEquals(new boolean[] { false, true },
ini.getAllBooleanOr("A_Missing_Boolean_ARRAY", new boolean[] { false, true }));
ini.getAllBooleanElse("A_Missing_Boolean_ARRAY", new boolean[] { false, true }));

assertTrue(ini.contains("An_Integer_ARRAY"));
assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, ini.getAllInt("An_Integer_ARRAY"));
assertTrue(ini.getAllIntOr("A_Missing_Integer_ARRAY").isEmpty());
assertArrayEquals(new int[] { 9, 8, 7 }, ini.getAllIntOr("A_Missing_Integer_ARRAY", new int[] { 9, 8, 7 }));
assertArrayEquals(new int[] { 9, 8, 7 }, ini.getAllIntElse("A_Missing_Integer_ARRAY", new int[] { 9, 8, 7 }));

assertTrue(ini.contains("A_Float_ARRAY"));
assertArrayEquals(new float[] { 111.222f, 777.333f, 898.676f }, ini.getAllFloat("A_Float_ARRAY"));
assertTrue(ini.getAllFloatOr("A_Missing_Float_ARRAY").isEmpty());
assertArrayEquals(new float[] { 9.234f, 8.6543f, 7.2198f },
ini.getAllFloatOr("A_Missing_Float_ARRAY", new float[] { 9.234f, 8.6543f, 7.2198f }));
ini.getAllFloatElse("A_Missing_Float_ARRAY", new float[] { 9.234f, 8.6543f, 7.2198f }));

assertTrue(ini.contains("A_Long_ARRAY"));
assertArrayEquals(new long[] { 345457856321234l, 923234568524587l, 675621354569053l, 679452356886031l },
ini.getAllLong("A_Long_ARRAY"));
assertTrue(ini.getAllIntOr("A_Missing_Long_ARRAY").isEmpty());
assertArrayEquals(new long[] { 23346457352453649l, 3434457923678l, 22345680047l }, ini
.getAllLongOr("A_Missing_Long_ARRAY", new long[] { 23346457352453649l, 3434457923678l, 22345680047l }));
.getAllLongElse("A_Missing_Long_ARRAY", new long[] { 23346457352453649l, 3434457923678l, 22345680047l }));

assertTrue(ini.contains("A_Double_ARRAY"));
assertArrayEquals(
new double[] { 34436346234235.2323423423525, 789784563235345.589344583458, 91298234782345.13264136 },
ini.getAllDouble("A_Double_ARRAY"));
assertTrue(ini.getAllDoubleOr("A_Missing_Double_ARRAY").isEmpty());
assertArrayEquals(new double[] { 5678346345.344563462345, 23237233467.232323523476 }, ini.getAllDoubleOr(
assertArrayEquals(new double[] { 5678346345.344563462345, 23237233467.232323523476 }, ini.getAllDoubleElse(
"A_Missing_Double_ARRAY", new double[] { 5678346345.344563462345, 23237233467.232323523476 }));

assertTrue(ini.contains("A_Short_ARRAY"));
assertArrayEquals(new short[] { 789, 2121, 343, 4346, 5111 }, ini.getAllShort("A_Short_ARRAY"));
assertTrue(ini.getAllShortOr("A_Missing_Short_ARRAY").isEmpty());
assertArrayEquals(new short[] { 912, 87, 333 },
ini.getAllShortOr("A_Missing_Short_ARRAY", new short[] { 912, 87, 333 }));
ini.getAllShortElse("A_Missing_Short_ARRAY", new short[] { 912, 87, 333 }));

assertTrue(ini.contains("A_String_ARRAY"));
assertArrayEquals(new String[] { "ABCDEFGHIJKLM", "NOPQRSTUVWXYZ", "abcdefghijklm", "nopqrstuvwxyz" },
ini.getAll("A_String_ARRAY"));
assertTrue(ini.getAllOr("A_Missing_String_ARRAY").isEmpty());
assertArrayEquals(new String[] { "zz", "xx" },
ini.getAllOr("A_Missing_String_ARRAY", new String[] { "zz", "xx" }));
ini.getAllElse("A_Missing_String_ARRAY", new String[] { "zz", "xx" }));
}

static void assertBasicCaseSensitive(INI ini) {
Expand Down
Loading

0 comments on commit 119ad69

Please sign in to comment.