Merge branch 'optimize_param_parsing' into 'master'

Optimize FileSection.parse()/parseMap().

See merge request core-developers/forge!2340
This commit is contained in:
Myrd
2019-12-20 16:37:31 +00:00
14 changed files with 57 additions and 52 deletions

View File

@@ -303,7 +303,7 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
tokenNormalized
);
FileSection section = FileSection.parse(contents.get("metadata"), "=");
FileSection section = FileSection.parse(contents.get("metadata"), FileSection.EQUALS_KV_SEPARATOR);
res.name = section.get("name");
res.date = parseDate(section.get("date"));
res.code = section.get("code");

View File

@@ -27,7 +27,7 @@ public class DeckSerializer {
}
final List<String> metadata = map.get("metadata");
if (metadata != null) {
return new DeckFileHeader(FileSection.parse(metadata, "="));
return new DeckFileHeader(FileSection.parse(metadata, FileSection.EQUALS_KV_SEPARATOR));
}
final List<String> general = map.get("general");
if (general != null) {

View File

@@ -108,7 +108,7 @@ public class PreconDeck implements InventoryItemFromSet {
// To be able to read "shops" section in overloads
protected PreconDeck getPreconDeckFromSections(final Map<String, List<String>> sections) {
FileSection kv = FileSection.parse(sections.get("metadata"), "=");
FileSection kv = FileSection.parse(sections.get("metadata"), FileSection.EQUALS_KV_SEPARATOR);
String imageFilename = kv.get("Image");
String description = kv.get("Description");
String deckEdition = kv.get("set");

View File

@@ -17,9 +17,12 @@
*/
package forge.util;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -56,34 +59,40 @@ public class FileSection {
protected FileSection(Map<String, String> lines0) {
lines = lines0;
}
/**
* Parses the.
*
* @param line the line
* @param kvSeparator the kv separator
* @param pairSeparator the pair separator
* @return the file section
*/
public static FileSection parse(final String line, final String kvSeparator, final String pairSeparator) {
Map<String, String> map = parseToMap(line, kvSeparator, pairSeparator);
return new FileSection(map);
}
public static Map<String, String> parseToMap(final String line, final String kvSeparator, final String pairSeparator) {
Map<String, String> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
if (!StringUtils.isEmpty(line)) {
final String[] pairs = line.split(Pattern.quote(pairSeparator));
final Pattern splitter = Pattern.compile(Pattern.quote(kvSeparator));
for (final String dd : pairs) {
final String[] v = splitter.split(dd, 2);
result.put(v[0].trim(), v.length > 1 ? v[1].trim() : "");
}
public static final Pattern DOLLAR_SIGN_KV_SEPARATOR = Pattern.compile(Pattern.quote("$"));
public static final Pattern ARROW_KV_SEPARATOR = Pattern.compile(Pattern.quote("->"));
public static final Pattern EQUALS_KV_SEPARATOR = Pattern.compile(Pattern.quote("="));
public static final Pattern COLON_KV_SEPARATOR = Pattern.compile(Pattern.quote(":"));
private static final String BAR_PAIR_SPLITTER = Pattern.quote("|");
private static Table<String, Pattern, Map<String, String>> parseToMapCache = HashBasedTable.create();
public static Map<String, String> parseToMap(final String line, final Pattern kvSeparator) {
Map<String, String> result = parseToMapCache.get(line, kvSeparator);
if (result != null) {
return result;
}
result = parseToMapImpl(line, kvSeparator);
parseToMapCache.put(line, kvSeparator, result);
return result;
}
private static Map<String, String> parseToMapImpl(final String line, final Pattern kvSeparator) {
if (StringUtils.isEmpty(line)) {
return Collections.emptyMap();
}
final Map<String, String> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
final String[] pairs = line.split(BAR_PAIR_SPLITTER);
for (final String dd : pairs) {
final String[] v = kvSeparator.split(dd, 2);
result.put(v[0].trim(), v.length > 1 ? v[1].trim() : "");
}
return Collections.unmodifiableMap(result);
}
/**
* Parses the.
*
@@ -91,11 +100,10 @@ public class FileSection {
* @param kvSeparator the kv separator
* @return the file section
*/
public static FileSection parse(final Iterable<String> lines, final String kvSeparator) {
public static FileSection parse(final Iterable<String> lines, final Pattern kvSeparator) {
final FileSection result = new FileSection();
final Pattern splitter = Pattern.compile(Pattern.quote(kvSeparator));
for (final String dd : lines) {
final String[] v = splitter.split(dd, 2);
final String[] v = kvSeparator.split(dd, 2);
result.lines.put(v[0].trim(), v.length > 1 ? v[1].trim() : "");
}