From 1d604df44f4537680fd007c3bca0111f058818f7 Mon Sep 17 00:00:00 2001 From: Josh Larson Date: Tue, 19 Feb 2019 10:07:04 -0600 Subject: [PATCH] Updated mongodb logging functions to be more inclusive --- .../java/com/projectswg/common/data/CRC.java | 18 +- .../customization/CustomizationString.java | 5 +- .../data/encodables/mongo/MongoData.java | 196 +++++++++++------- 3 files changed, 141 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/projectswg/common/data/CRC.java b/src/main/java/com/projectswg/common/data/CRC.java index 56dbd67..8319ed9 100644 --- a/src/main/java/com/projectswg/common/data/CRC.java +++ b/src/main/java/com/projectswg/common/data/CRC.java @@ -26,6 +26,8 @@ ***********************************************************************************/ package com.projectswg.common.data; +import com.projectswg.common.data.encodables.mongo.MongoData; +import com.projectswg.common.data.encodables.mongo.MongoPersistable; import com.projectswg.common.encoding.Encodable; import com.projectswg.common.network.NetBuffer; import com.projectswg.common.network.NetBufferStream; @@ -33,7 +35,7 @@ import com.projectswg.common.persistable.Persistable; import java.nio.charset.StandardCharsets; -public class CRC implements Encodable, Persistable { +public class CRC implements Encodable, Persistable, MongoPersistable { private static final int CRC_TABLE[] = { 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, @@ -119,14 +121,24 @@ public class CRC implements Encodable, Persistable { return 4; } + @Override + public void read(NetBufferStream stream) { + crc = stream.getInt(); + } + @Override public void save(NetBufferStream stream) { stream.addInt(crc); } @Override - public void read(NetBufferStream stream) { - crc = stream.getInt(); + public void readMongo(MongoData data) { + crc = data.getInteger("crc", 0); + } + + @Override + public void saveMongo(MongoData data) { + data.putInteger("crc", crc); } @Override diff --git a/src/main/java/com/projectswg/common/data/customization/CustomizationString.java b/src/main/java/com/projectswg/common/data/customization/CustomizationString.java index 7a24d6b..ffc3f58 100644 --- a/src/main/java/com/projectswg/common/data/customization/CustomizationString.java +++ b/src/main/java/com/projectswg/common/data/customization/CustomizationString.java @@ -43,7 +43,6 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.function.BiConsumer; -import java.util.function.Function; /** * The Customization string is used to set special properties @@ -127,13 +126,13 @@ public class CustomizationString implements Encodable, Persistable, MongoPersist @Override public void saveMongo(MongoData data) { - data.putMap("variables", variables, Function.identity()); + data.putMap("variables", variables); } @Override public void readMongo(MongoData data) { variables.clear(); - variables.putAll(data.getMap("variables", Integer.class)); + variables.putAll(data.getMap("variables", String.class, Integer.class)); } public Integer put(String name, int value) { diff --git a/src/main/java/com/projectswg/common/data/encodables/mongo/MongoData.java b/src/main/java/com/projectswg/common/data/encodables/mongo/MongoData.java index 909b384..48bede0 100644 --- a/src/main/java/com/projectswg/common/data/encodables/mongo/MongoData.java +++ b/src/main/java/com/projectswg/common/data/encodables/mongo/MongoData.java @@ -33,9 +33,10 @@ import org.bson.types.ObjectId; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.time.Instant; import java.util.*; -import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -172,15 +173,7 @@ public class MongoData implements Map { List mdbArray = doc.get(key, List.class); List ret = new ArrayList<>(mdbArray.size()); for (Object o : mdbArray) { - if (o == null) - ret.add(null); - else if (klass == Instant.class) - //noinspection UseOfObsoleteDateTimeApi - ret.add(klass.cast(((Date) o).toInstant())); - else if (klass == MongoData.class) - ret.add(klass.cast(new MongoData((Document) o))); - else - ret.add(klass.cast(o)); + ret.add(translateGet(o, klass)); } return ret; } @@ -190,13 +183,7 @@ public class MongoData implements Map { List mdbArray = doc.get(key, List.class); List ret = new ArrayList<>(mdbArray.size()); for (Object o : mdbArray) { - if (o == null) { - ret.add(null); - } else { - T t = generator.get(); - t.readMongo(new MongoData((Document) o)); - ret.add(t); - } + ret.add(translateGet(o, generator)); } return ret; } @@ -206,11 +193,7 @@ public class MongoData implements Map { List mdbArray = doc.get(key, List.class); List ret = new ArrayList<>(mdbArray.size()); for (Object o : mdbArray) { - if (o == null) { - ret.add(null); - } else { - ret.add(generator.apply(new MongoData((Document) o))); - } + ret.add(translateGet(o, generator)); } return ret; } @@ -236,46 +219,82 @@ public class MongoData implements Map { } @NotNull - public Map getMap(String key, Class klass) { - return getMap(key, klass, Function.identity(), (k, v) -> v); + public Map getMap(String key, Class keyClass, Class valueClass) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyClass), translateGet(val.get("val"), valueClass)); + } + return ret; } @NotNull - public Map getMap(String key, Class klass, Supplier supplier) { - return getMap(key, MongoData.class, Function.identity(), (k, v) -> { - T ret = supplier.get(); - ret.readMongo(v); - return ret; - }); + public Map getMap(String key, Supplier keyGen, Class valueClass) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyGen), translateGet(val.get("val"), valueClass)); + } + return ret; } @NotNull - public Map getMap(String key, Class klass, Function valueParser) { - return getMap(key, klass, Function.identity(), valueParser); + public Map getMap(String key, Function keyGen, Class valueClass) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyGen), translateGet(val.get("val"), valueClass)); + } + return ret; } @NotNull - public Map getMap(String key, Class klass, Function keyParser, Function valueParser) { - return getMap(key, klass, keyParser, (k, v) -> valueParser.apply(v)); + public Map getMap(String key, Class keyClass, Supplier valueGen) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyClass), translateGet(val.get("val"), valueGen)); + } + return ret; } @NotNull - public Map getMap(String key, Class klass, Function keyParser, BiFunction valueParser) { - Document mdbMap = doc.get(key, Document.class); - Map ret = new HashMap<>(mdbMap.size()); - for (Entry e : mdbMap.entrySet()) { - K childKey = keyParser.apply(e.getKey()); - Object o = e.getValue(); - if (o == null) { - ret.put(childKey, null); - } else if (klass == Instant.class) { - //noinspection UseOfObsoleteDateTimeApi - ret.put(childKey, valueParser.apply(childKey, klass.cast(((Date) o).toInstant()))); - } else if (MongoData.class.isAssignableFrom(klass)) { - ret.put(childKey, valueParser.apply(childKey, klass.cast(new MongoData((Document) o)))); - } else { - ret.put(childKey, valueParser.apply(childKey, klass.cast(o))); - } + public Map getMap(String key, Class keyClass, Function valueGen) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyClass), translateGet(val.get("val"), valueGen)); + } + return ret; + } + + @NotNull + public Map getMap(String key, Supplier keyGen, Supplier valueGen) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyGen), translateGet(val.get("val"), valueGen)); + } + return ret; + } + + @NotNull + public Map getMap(String key, Function keyGen, Supplier valueGen) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyGen), translateGet(val.get("val"), valueGen)); + } + return ret; + } + + @NotNull + public Map getMap(String key, Supplier keyGen, Function valueGen) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyGen), translateGet(val.get("val"), valueGen)); + } + return ret; + } + + @NotNull + public Map getMap(String key, Function keyGen, Function valueGen) { + Map ret = new HashMap<>(); + for (MongoData val : getArray(key, MongoData.class)) { + ret.put(translateGet(val.get("key"), keyGen), translateGet(val.get("val"), valueGen)); } return ret; } @@ -394,36 +413,69 @@ public class MongoData implements Map { } } - public void putMap(String key, Map data) { - MongoData doc = new MongoData(); - for (Entry e : data.entrySet()) { - doc.doc.put(e.getKey(), translatePut(e.getValue())); + public void putMap(String key, Map data) { + List map = new ArrayList<>(); + for (Entry e : data.entrySet()) { + MongoData val = new MongoData(); + val.doc.put("key", translatePut(e.getKey())); + val.doc.put("val", translatePut(e.getValue())); + map.add(val); } - putDocument(key, doc); + putArray(key, map); } - public void putMap(String key, Map data, Function keyExtractor) { - MongoData doc = new MongoData(); - for (Entry e : data.entrySet()) { - doc.doc.put(keyExtractor.apply(e.getKey()), translatePut(e.getValue())); + public void putMap(String key, Map data, Function keyTransform, Function valTransform) { + List map = new ArrayList<>(); + for (Entry e : data.entrySet()) { + MongoData val = new MongoData(); + val.doc.put("key", translatePut(keyTransform.apply(e.getKey()))); + val.doc.put("val", translatePut(valTransform.apply(e.getValue()))); + map.add(val); } - putDocument(key, doc); + putArray(key, map); } - public void putMap(String key, Map data, Function keyExtractor, Function valueExtractor) { - MongoData doc = new MongoData(); - for (Entry e : data.entrySet()) { - doc.doc.put(keyExtractor.apply(e.getKey()), translatePut(valueExtractor.apply(e.getValue()))); - } - putDocument(key, doc); + private T translateGet(Object input, Class klass) { + if (input == null) + return null; + else if (klass == Instant.class) + //noinspection UseOfObsoleteDateTimeApi + return klass.cast(((Date) input).toInstant()); + else if (klass == MongoData.class) + return klass.cast(new MongoData((Document) input)); + else if (MongoPersistable.class.isAssignableFrom(klass)) { + try { + Constructor smartConstructor = klass.getConstructor(MongoData.class); + return smartConstructor.newInstance(new MongoData((Document) input)); + } catch (NoSuchMethodException e) { + try { + Constructor defaultConstructor = klass.getConstructor(); + T instance = defaultConstructor.newInstance(); + ((MongoPersistable) instance).readMongo(new MongoData((Document) input)); + return instance; + } catch (NoSuchMethodException e1) { + throw new IllegalArgumentException("Unable to find suitable constructor for: " + klass.getSimpleName()); + } catch (IllegalAccessException | InstantiationException | InvocationTargetException e1) { + throw new IllegalArgumentException("Unable to create new default instance of " + klass.getSimpleName(), e1); + } + } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) { + throw new IllegalArgumentException("Unable to create new smart instance of " + klass.getSimpleName(), e); + } + } else + return klass.cast(input); } - public void putMap(String key, Map data, Function keyExtractor, BiFunction valueExtractor) { - MongoData doc = new MongoData(); - for (Entry e : data.entrySet()) { - doc.doc.put(keyExtractor.apply(e.getKey()), translatePut(valueExtractor.apply(e.getKey(), e.getValue()))); - } - putDocument(key, doc); + private T translateGet(Object input, Supplier generator) { + if (input == null) + return null; + + T t = generator.get(); + t.readMongo(new MongoData((Document) input)); + return t; + } + + private T translateGet(Object input, Function generator) { + return input == null ? null : generator.apply(new MongoData((Document) input)); } @SuppressWarnings("UseOfObsoleteDateTimeApi")