fix loop in loading settings from map

This commit is contained in:
Jörg Prante 2019-11-22 14:56:38 +01:00
parent 1f80fa1740
commit 74a3a2d75e
8 changed files with 106 additions and 41 deletions

View file

@ -184,8 +184,9 @@ subprojects {
}
}
}
nexusStaging {
packageGroup = "org.xbib"
}
}
nexusStaging {
packageGroup = "org.xbib"
//stagingProfileId = "org.xbib"
}

View file

@ -1,6 +1,7 @@
package org.xbib.content.settings;
import org.xbib.content.XContent;
import org.xbib.content.XContentBuilder;
import org.xbib.content.XContentGenerator;
import org.xbib.content.XContentParser;
import org.xbib.content.io.BytesReference;
@ -8,7 +9,7 @@ import org.xbib.content.io.BytesStreamOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -33,10 +34,36 @@ public abstract class AbstractSettingsLoader implements SettingsLoader {
}
}
@Override
public Map<String, String> load(Map<String, Object> map) throws IOException {
XContentBuilder builder = XContentBuilder.builder(content());
builder.map(map);
return load(builder.string());
}
public Map<String, String> load(XContentParser xContentParser) throws IOException {
StringBuilder sb = new StringBuilder();
Map<String, String> map = new LinkedHashMap<>();
List<String> path = new ArrayList<>();
XContentParser.Token token = xContentParser.nextToken();
if (token == null) {
return map;
}
parseObject(map, sb, path, xContentParser, null);
return map;
}
public String flatMapAsString(BytesReference bytesReference) throws IOException {
try (XContentParser parser = content().createParser(bytesReference);
BytesStreamOutput bytesStreamOutput = new BytesStreamOutput();
XContentGenerator generator = content().createGenerator(bytesStreamOutput)) {
return flatMapAsString(parser, bytesStreamOutput, generator);
}
}
private String flatMapAsString(XContentParser parser,
BytesStreamOutput bytesStreamOutput,
XContentGenerator generator) throws IOException {
generator.writeStartObject();
for (Map.Entry<String, String> entry : load(parser).entrySet()) {
generator.writeFieldName(entry.getKey());
@ -51,21 +78,8 @@ public abstract class AbstractSettingsLoader implements SettingsLoader {
generator.flush();
return bytesStreamOutput.bytes().toUtf8();
}
}
public Map<String, String> load(XContentParser xContentParser) throws IOException {
StringBuilder sb = new StringBuilder();
Map<String, String> map = new HashMap<>();
List<String> path = new ArrayList<>();
XContentParser.Token token = xContentParser.nextToken();
if (token == null) {
return map;
}
parseObject(map, sb, path, xContentParser, null);
return map;
}
private void parseObject(Map<String, String> settings, StringBuilder sb, List<String> path,
private void parseObject(Map<String, String> map, StringBuilder sb, List<String> path,
XContentParser parser, String objFieldName) throws IOException {
if (objFieldName != null) {
path.add(objFieldName);
@ -75,13 +89,13 @@ public abstract class AbstractSettingsLoader implements SettingsLoader {
XContentParser.Token token;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.START_OBJECT) {
parseObject(settings, sb, path, parser, currentFieldName);
parseObject(map, sb, path, parser, currentFieldName);
} else if (token == XContentParser.Token.START_ARRAY) {
parseArray(settings, sb, path, parser, currentFieldName);
parseArray(map, sb, path, parser, currentFieldName);
} else if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
} else {
parseValue(settings, sb, path, parser, currentFieldName);
parseValue(map, sb, path, parser, currentFieldName);
}
}
@ -90,31 +104,31 @@ public abstract class AbstractSettingsLoader implements SettingsLoader {
}
}
private void parseArray(Map<String, String> settings, StringBuilder sb, List<String> path,
private void parseArray(Map<String, String> map, StringBuilder sb, List<String> path,
XContentParser parser, String name) throws IOException {
XContentParser.Token token;
int counter = 0;
String fieldName = name;
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
if (token == XContentParser.Token.START_OBJECT) {
parseObject(settings, sb, path, parser, fieldName + '.' + (counter++));
parseObject(map, sb, path, parser, fieldName + '.' + (counter++));
} else if (token == XContentParser.Token.START_ARRAY) {
parseArray(settings, sb, path, parser, fieldName + '.' + (counter++));
parseArray(map, sb, path, parser, fieldName + '.' + (counter++));
} else if (token == XContentParser.Token.FIELD_NAME) {
fieldName = parser.currentName();
} else {
parseValue(settings, sb, path, parser, fieldName + '.' + (counter++));
parseValue(map, sb, path, parser, fieldName + '.' + (counter++));
}
}
}
private void parseValue(Map<String, String> settings, StringBuilder sb, List<String> path,
private void parseValue(Map<String, String> map, StringBuilder sb, List<String> path,
XContentParser parser, String fieldName) throws IOException {
sb.setLength(0);
for (String s : path) {
sb.append(s).append('.');
}
sb.append(fieldName);
settings.put(sb.toString(), parser.text());
map.put(sb.toString(), parser.text());
}
}

View file

@ -1,6 +1,9 @@
package org.xbib.content.settings;
import org.xbib.content.io.BytesReference;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.Collections;
import java.util.HashMap;
@ -34,6 +37,30 @@ public class PropertiesSettingsLoader implements SettingsLoader {
}
}
@Override
public Map<String, String> load(BytesReference ref) throws IOException {
Properties props = new Properties();
try (Reader reader = new InputStreamReader(ref.streamInput())) {
props.load(reader);
Map<String, String> result = new HashMap<>();
for (Map.Entry<Object, Object> entry : props.entrySet()) {
result.put((String) entry.getKey(), (String) entry.getValue());
}
return result;
}
}
@Override
public Map<String, String> load(Map<String, Object> source) throws IOException {
Properties props = new Properties();
props.putAll(source);
Map<String, String> result = new HashMap<>();
for (Map.Entry<Object, Object> entry : props.entrySet()) {
result.put((String) entry.getKey(), (String) entry.getValue());
}
return result;
}
@Override
public boolean canLoad(String source) {
return true;

View file

@ -3,9 +3,7 @@ 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.XContentBuilder;
import org.xbib.content.json.JsonSettingsLoader;
import org.xbib.content.json.JsonXContent;
import org.xbib.content.util.unit.ByteSizeValue;
import org.xbib.content.util.unit.TimeValue;
@ -614,8 +612,9 @@ public class Settings {
* @return builder
*/
public Builder loadFromMap(Map<String, Object> map) {
try (XContentBuilder builder = JsonXContent.contentBuilder()) {
put(new JsonSettingsLoader().load(builder.map(map).string()));
SettingsLoader settingsLoader = new JsonSettingsLoader();
try {
put(settingsLoader.load(map));
} catch (Exception e) {
throw new SettingsException("Failed to load settings from [" + map + "]", e);
}

View file

@ -1,5 +1,6 @@
package org.xbib.content.settings;
import org.xbib.content.io.BytesReference;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
@ -24,5 +25,9 @@ public interface SettingsLoader {
*/
Map<String, String> load(String source) throws IOException;
Map<String, String> load(BytesReference bytesReference) throws IOException;
Map<String, String> load(Map<String, Object> source) throws IOException;
boolean canLoad(String source);
}

View file

@ -15,6 +15,7 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
@ -156,4 +157,22 @@ public class SettingsTest extends Assert {
String result = loader.flatMapAsString(ref);
assertEquals("{\"a.b\":\"c\"}", result);
}
@Test
public void testLoadFromMap() throws IOException {
Map<String, Object> map = new LinkedHashMap<>();
Map<String, Object> code = new LinkedHashMap<>();
code.put("a", "b");
code.put("b", "c");
Map<String, Object> name = new LinkedHashMap<>();
name.put("a", "b");
name.put("b", "c");
List<String> list = Arrays.asList("a","b");
map.put("code", code);
map.put("name", name);
map.put("list", list);
JsonSettingsLoader loader = new JsonSettingsLoader();
Map<String, String> result = loader.load(map);
assertEquals("{code.a=b, code.b=c, name.a=b, name.b=c, list.0=a, list.1=b}", result.toString());
}
}

View file

@ -1,6 +1,6 @@
group = org.xbib
name = content
version = 2.0.4
version = 2.0.5
xbib-net.version = 2.0.3
jackson.version = 2.9.10

View file

@ -1,5 +1,5 @@
#Sun Sep 15 22:30:22 CEST 2019
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6-all.zip
#Fri Nov 22 14:55:55 CET 2019
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists