moving to tiny map instead of LinkedHashMap because of memory hogging, update to gradle 6.6.1
This commit is contained in:
parent
7fb5d52466
commit
2e19c8829a
16 changed files with 75 additions and 59 deletions
|
@ -55,13 +55,15 @@ public class ConfigLoader {
|
|||
return settings;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("no config found for " + applicationName + " "+ Arrays.asList(fileNamesWithoutSuffix));
|
||||
throw new IllegalArgumentException("no config found for " + applicationName + " " +
|
||||
Arrays.asList(fileNamesWithoutSuffix));
|
||||
}
|
||||
|
||||
private Settings.Builder createClasspathSettings(ClassLoader classLoader, String applicationName, String fileNameWithoutSuffix)
|
||||
throws IOException {
|
||||
for (String suffix : List.of(YML, YAML, JSON)) {
|
||||
InputStream inputStream = classLoader.getResourceAsStream(applicationName + '-' + fileNameWithoutSuffix + suffix);
|
||||
InputStream inputStream = classLoader.getResourceAsStream(applicationName + '-' +
|
||||
fileNameWithoutSuffix + suffix);
|
||||
if (inputStream != null) {
|
||||
logger.info("found resource: " + applicationName + '-' + fileNameWithoutSuffix + suffix);
|
||||
Settings.Builder settings = createSettingsFromStream(inputStream, suffix);
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* Classes for configurations.
|
||||
*/
|
||||
package org.xbib.content.config;
|
|
@ -1,3 +1,4 @@
|
|||
dependencies {
|
||||
api "com.fasterxml.jackson.core:jackson-core:${project.property('jackson.version')}"
|
||||
api "org.xbib:datastructures-tiny:${project.property('xbib-datastructures-tiny.version')}"
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ module org.xbib.content.core {
|
|||
exports org.xbib.content.settings;
|
||||
exports org.xbib.content.util.geo;
|
||||
exports org.xbib.content.util.unit;
|
||||
requires org.xbib.datastructures.tiny;
|
||||
requires transitive com.fasterxml.jackson.core;
|
||||
provides org.xbib.content.XContent with
|
||||
org.xbib.content.json.JsonXContent;
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package org.xbib.content;
|
||||
|
||||
import org.xbib.datastructures.tiny.TinyMap;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -13,8 +13,11 @@ import java.util.Map;
|
|||
public abstract class AbstractXContentParser implements XContentParser {
|
||||
|
||||
private static final MapFactory SIMPLE_MAP_FACTORY = HashMap::new;
|
||||
private static final MapFactory ORDERED_MAP_FACTORY = LinkedHashMap::new;
|
||||
|
||||
private static final MapFactory TINY_MAP_FACTORY = TinyMap::builder;
|
||||
|
||||
private boolean losslessDecimals;
|
||||
|
||||
private boolean base16Checks;
|
||||
|
||||
private static Map<String, Object> readMap(XContentParser parser) throws IOException {
|
||||
|
@ -22,7 +25,7 @@ public abstract class AbstractXContentParser implements XContentParser {
|
|||
}
|
||||
|
||||
private static Map<String, Object> readOrderedMap(XContentParser parser) throws IOException {
|
||||
return readMap(parser, ORDERED_MAP_FACTORY);
|
||||
return readMap(parser, TINY_MAP_FACTORY);
|
||||
}
|
||||
|
||||
private static Map<String, Object> readMap(XContentParser parser, MapFactory mapFactory) throws IOException {
|
||||
|
|
|
@ -6,16 +6,15 @@ import org.xbib.content.XContentGenerator;
|
|||
import org.xbib.content.XContentParser;
|
||||
import org.xbib.content.io.BytesReference;
|
||||
import org.xbib.content.io.BytesStreamOutput;
|
||||
|
||||
import org.xbib.datastructures.tiny.TinyMap;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Settings loader that loads (parses) the settings in a XContent format by flattening them
|
||||
* into a map.
|
||||
* Settings loader that loads (parses) the settings in a XContent format
|
||||
* by flattening them into a map.
|
||||
*/
|
||||
public abstract class AbstractSettingsLoader implements SettingsLoader {
|
||||
|
||||
|
@ -43,14 +42,14 @@ public abstract class AbstractSettingsLoader implements SettingsLoader {
|
|||
|
||||
public Map<String, String> load(XContentParser xContentParser) throws IOException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
Map<String, String> map = new LinkedHashMap<>();
|
||||
TinyMap.Builder<String, String> map = TinyMap.builder();
|
||||
List<String> path = new ArrayList<>();
|
||||
XContentParser.Token token = xContentParser.nextToken();
|
||||
if (token == null) {
|
||||
return map;
|
||||
return map.build();
|
||||
}
|
||||
parseObject(map, sb, path, xContentParser, null);
|
||||
return map;
|
||||
return map.build();
|
||||
}
|
||||
|
||||
public String flatMapAsString(BytesReference bytesReference) throws IOException {
|
||||
|
|
|
@ -2,11 +2,10 @@ package org.xbib.content.settings;
|
|||
|
||||
import static org.xbib.content.util.unit.ByteSizeValue.parseBytesSizeValue;
|
||||
import static org.xbib.content.util.unit.TimeValue.parseTimeValue;
|
||||
|
||||
import org.xbib.content.json.JsonSettingsLoader;
|
||||
import org.xbib.datastructures.tiny.TinyMap;
|
||||
import org.xbib.content.util.unit.ByteSizeValue;
|
||||
import org.xbib.content.util.unit.TimeValue;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
|
@ -21,9 +20,6 @@ import java.time.DateTimeException;
|
|||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Executors;
|
||||
|
@ -51,13 +47,15 @@ public class Settings implements AutoCloseable {
|
|||
}
|
||||
|
||||
private Settings(Map<String, String> map, Path path, long initialDelay, long period, TimeUnit timeUnit) {
|
||||
this.map = new LinkedHashMap<>(map);
|
||||
TinyMap.Builder<String, String> builder = TinyMap.builder();
|
||||
builder.putAll(map);
|
||||
this.map = builder.build();
|
||||
if (path != null && initialDelay >= 0L && period > 0L) {
|
||||
this.refresher = new DefaultSettingsRefresher(path, initialDelay, period, timeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
public static Settings readSettingsFromMap(Map<String, Object> map) throws IOException {
|
||||
public static Settings readSettingsFromMap(Map<String, Object> map) {
|
||||
Builder builder = new Builder();
|
||||
for (Map.Entry<String, Object> entry : map.entrySet()) {
|
||||
builder.put(entry.getKey(), entry.getValue() != null ? entry.getValue().toString() : null);
|
||||
|
@ -65,7 +63,7 @@ public class Settings implements AutoCloseable {
|
|||
return builder.build();
|
||||
}
|
||||
|
||||
public static void writeSettingsToMap(Settings settings, Map<String, Object> map) throws IOException {
|
||||
public static void writeSettingsToMap(Settings settings, Map<String, Object> map) {
|
||||
for (String key : settings.getAsMap().keySet()) {
|
||||
map.put(key, settings.get(key));
|
||||
}
|
||||
|
@ -145,7 +143,7 @@ public class Settings implements AutoCloseable {
|
|||
}
|
||||
|
||||
public Map<String, Object> getAsStructuredMap() {
|
||||
Map<String, Object> stringObjectMap = new HashMap<>(2);
|
||||
TinyMap.Builder<String, Object> stringObjectMap = TinyMap.builder();
|
||||
for (Map.Entry<String, String> entry : this.map.entrySet()) {
|
||||
processSetting(stringObjectMap, "", entry.getKey(), entry.getValue());
|
||||
}
|
||||
|
@ -156,7 +154,7 @@ public class Settings implements AutoCloseable {
|
|||
entry.setValue(convertMapsToArrays(valMap));
|
||||
}
|
||||
}
|
||||
return stringObjectMap;
|
||||
return stringObjectMap.build();
|
||||
}
|
||||
|
||||
public Settings getByPrefix(String prefix) {
|
||||
|
@ -295,7 +293,7 @@ public class Settings implements AutoCloseable {
|
|||
settingPrefix = settingPrefix + ".";
|
||||
}
|
||||
// we don't really care that it might happen twice
|
||||
Map<String, Map<String, String>> hashMap = new LinkedHashMap<>();
|
||||
TinyMap.Builder<String, Map<String, String>> hashMap = TinyMap.builder();
|
||||
for (Object o : this.map.keySet()) {
|
||||
String setting = (String) o;
|
||||
if (setting.startsWith(settingPrefix)) {
|
||||
|
@ -308,15 +306,15 @@ public class Settings implements AutoCloseable {
|
|||
}
|
||||
String name = nameValue.substring(0, dotIndex);
|
||||
String value = nameValue.substring(dotIndex + 1);
|
||||
Map<String, String> groupSettings = hashMap.computeIfAbsent(name, k -> new LinkedHashMap<>());
|
||||
Map<String, String> groupSettings = hashMap.computeIfAbsent(name, k -> TinyMap.builder());
|
||||
groupSettings.put(value, get(setting));
|
||||
}
|
||||
}
|
||||
Map<String, Settings> retVal = new LinkedHashMap<>();
|
||||
TinyMap.Builder<String, Settings> retVal = TinyMap.builder();
|
||||
for (Map.Entry<String, Map<String, String>> entry : hashMap.entrySet()) {
|
||||
retVal.put(entry.getKey(), new Settings(Collections.unmodifiableMap(entry.getValue())));
|
||||
retVal.put(entry.getKey(), new Settings(entry.getValue()));
|
||||
}
|
||||
return Collections.unmodifiableMap(retVal);
|
||||
return retVal.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -345,7 +343,7 @@ public class Settings implements AutoCloseable {
|
|||
String rest = setting.substring(prefixLength + 1);
|
||||
Object existingValue = map.get(prefix + key);
|
||||
if (existingValue == null) {
|
||||
Map<String, Object> newMap = new HashMap<>(2);
|
||||
Map<String, Object> newMap = TinyMap.builder();
|
||||
processSetting(newMap, "", rest, value);
|
||||
map.put(key, newMap);
|
||||
} else {
|
||||
|
@ -412,7 +410,7 @@ public class Settings implements AutoCloseable {
|
|||
*/
|
||||
public static class Builder {
|
||||
|
||||
private final Map<String, String> map = new LinkedHashMap<>();
|
||||
private final Map<String, String> map;
|
||||
|
||||
private Path path;
|
||||
|
||||
|
@ -423,10 +421,7 @@ public class Settings implements AutoCloseable {
|
|||
private TimeUnit timeUnit;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Map<String, String> internalMap() {
|
||||
return this.map;
|
||||
map = TinyMap.builder();
|
||||
}
|
||||
|
||||
public String remove(String key) {
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
package org.xbib.content;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.xbib.content.json.JsonXContent;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class XContentParserTest {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(XContentParserTest.class.getName());
|
||||
|
||||
@Test
|
||||
public void simpleParse() throws IOException {
|
||||
XContentParser parser = JsonXContent.jsonContent().createParser("{\"a\":1,\"b\":2,\"c\":3}");
|
||||
Map<String, Object> map = parser.mapOrderedAndClose();
|
||||
logger.log(Level.INFO, map.getClass().getName().toString());
|
||||
assertEquals("{a=1, b=2, c=3}", map.toString());
|
||||
parser = JsonXContent.jsonContent().createParser("{\"a\":1,\"b\":2,\"c\":3}");
|
||||
map = parser.mapAndClose();
|
||||
logger.log(Level.INFO, map.getClass().getName().toString());
|
||||
}
|
||||
}
|
|
@ -2,7 +2,6 @@ package org.xbib.content.settings;
|
|||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.xbib.content.XContentHelper;
|
||||
|
@ -10,7 +9,6 @@ import org.xbib.content.io.BytesArray;
|
|||
import org.xbib.content.io.BytesReference;
|
||||
import org.xbib.content.json.JsonSettingsLoader;
|
||||
import org.xbib.content.json.JsonXContent;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
|
@ -60,7 +58,7 @@ public class SettingsTest {
|
|||
for (Map.Entry<String, Object> entry : map.entrySet()) {
|
||||
list.add((Map<String, Object>) entry.getValue());
|
||||
}
|
||||
assertEquals("[{name=Name 0, code=Code 0}, {name=Name 1, code=Code 1}]", list.toString());
|
||||
assertEquals("[{code=Code 0, name=Name 0}, {code=Code 1, name=Name 1}]", list.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
2
content-yaml/src/test/java/YamlTest.java
Normal file
2
content-yaml/src/test/java/YamlTest.java
Normal file
|
@ -0,0 +1,2 @@
|
|||
public class YamlTest {
|
||||
}
|
|
@ -1,12 +1,13 @@
|
|||
group = org.xbib
|
||||
name = content
|
||||
version = 2.4.0
|
||||
version = 2.5.0
|
||||
|
||||
gradle.wrapper.version = 6.4.1
|
||||
gradle.wrapper.version = 6.6.1
|
||||
xbib.net.version = 2.1.0
|
||||
jackson.version = 2.11.1
|
||||
jackson.databind.version = 2.11.1
|
||||
woodstox.version = 6.2.1
|
||||
snakeyaml.version = 1.26
|
||||
xbib-datastructures-tiny.version = 0.0.1
|
||||
mockito.version = 3.3.3
|
||||
asciidoclet.version = 1.5.6
|
||||
|
|
|
@ -11,7 +11,7 @@ dependencies {
|
|||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
failFast = true
|
||||
failFast = false
|
||||
testLogging {
|
||||
events 'STARTED', 'PASSED', 'FAILED', 'SKIPPED'
|
||||
}
|
||||
|
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,5 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
2
gradlew
vendored
2
gradlew
vendored
|
@ -130,7 +130,7 @@ fi
|
|||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
|
|
21
gradlew.bat
vendored
21
gradlew.bat
vendored
|
@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
|||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
@ -54,7 +54,7 @@ goto fail
|
|||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
|
@ -64,21 +64,6 @@ echo location of your Java installation.
|
|||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
|
@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
|
|
Loading…
Reference in a new issue