diff --git a/common/base/src/main/java/it/angrybear/yagl/utils/ObjectUtils.java b/common/base/src/main/java/it/angrybear/yagl/utils/ObjectUtils.java index 1bb9cfd4b..c4fc5ac21 100644 --- a/common/base/src/main/java/it/angrybear/yagl/utils/ObjectUtils.java +++ b/common/base/src/main/java/it/angrybear/yagl/utils/ObjectUtils.java @@ -1,6 +1,7 @@ package it.angrybear.yagl.utils; import it.fulminazzo.fulmicollection.objects.Refl; +import it.fulminazzo.fulmicollection.structures.tuples.Tuple; import it.fulminazzo.fulmicollection.utils.ReflectionUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -20,6 +21,52 @@ @SuppressWarnings("unchecked") @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ObjectUtils { + private static final String EMPTY_IDENTIFIER = ""; + + /** + * Prints the given object in a JSON format. + * If the object (or an object contained in it) is "empty", + * it will be printed as {@link #EMPTY_IDENTIFIER}. + * + * @param object the object + * @return the output + */ + public static String printAsJSON(@Nullable Object object) { + if (object == null) return EMPTY_IDENTIFIER; + else if (object instanceof Enum) return ((Enum) object).name(); + else if (object instanceof String) { + String s = object.toString(); + if (s.isEmpty()) return EMPTY_IDENTIFIER; + else return String.format("\"%s\"", s); + } else if (object instanceof Number) { + Number n = (Number) object; + if (n.doubleValue() > 0) return n.toString(); + else return EMPTY_IDENTIFIER; + } else if (ReflectionUtils.isPrimitiveOrWrapper(object.getClass())) return object.toString(); + else if (object instanceof Collection) { + Collection collection = (Collection) object; + String output = collection.stream().map(ObjectUtils::printAsJSON).collect(Collectors.joining(", ")); + if (output.matches("(, )*")) return EMPTY_IDENTIFIER; + else return String.format("[%s]", output); + } else if (!(object instanceof Map)) { + Map map = new LinkedHashMap<>(); + Refl refl = new Refl<>(object); + for (final Field field : refl.getNonStaticFields()) { + Object obj = refl.getFieldObject(field); + map.put(field.getName(), obj); + } + object = map; + } + Map map = (Map) object; + StringBuilder output = new StringBuilder(); + map.entrySet().stream() + .map(e -> new Tuple<>(printAsJSON(e.getKey()), printAsJSON(e.getValue()))) + .filter(t -> !t.getKey().equals(EMPTY_IDENTIFIER) && !t.getValue().equals(EMPTY_IDENTIFIER)) + .forEach(t -> output.append(t.getKey()).append(": ").append(t.getValue()).append(", ")); + String result = output.toString(); + if (result.matches("(: , )*")) return EMPTY_IDENTIFIER; + else return String.format("{%s}", result.substring(0, result.length() - 2)); + } /** * Copies the given object to a new one. diff --git a/item/base/src/main/java/it/angrybear/yagl/items/ItemImpl.java b/item/base/src/main/java/it/angrybear/yagl/items/ItemImpl.java index c8a464a47..b5d29fef4 100644 --- a/item/base/src/main/java/it/angrybear/yagl/items/ItemImpl.java +++ b/item/base/src/main/java/it/angrybear/yagl/items/ItemImpl.java @@ -4,9 +4,9 @@ import it.angrybear.yagl.items.fields.ItemFlag; import it.angrybear.yagl.structures.EnchantmentSet; import it.angrybear.yagl.utils.MessageUtils; +import it.angrybear.yagl.utils.ObjectUtils; import it.angrybear.yagl.wrappers.Enchantment; import it.fulminazzo.fulmicollection.objects.FieldEquable; -import it.fulminazzo.fulmicollection.objects.Printable; import it.fulminazzo.fulmicollection.utils.ReflectionUtils; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -118,6 +118,6 @@ protected Class clazz() { @Override public @NotNull String toString() { - return Printable.convertToJson(this); + return ObjectUtils.printAsJSON(this); } } diff --git a/item/base/src/test/java/it/angrybear/yagl/items/ItemImplTest.java b/item/base/src/test/java/it/angrybear/yagl/items/ItemImplTest.java index 8f0feae1e..70947e39e 100644 --- a/item/base/src/test/java/it/angrybear/yagl/items/ItemImplTest.java +++ b/item/base/src/test/java/it/angrybear/yagl/items/ItemImplTest.java @@ -2,8 +2,11 @@ import it.angrybear.yagl.items.fields.ItemField; import it.angrybear.yagl.items.fields.ItemFlag; +import it.fulminazzo.fulmicollection.objects.Printable; import org.junit.jupiter.api.Test; +import java.util.Arrays; + import static org.junit.jupiter.api.Assertions.*; class ItemImplTest { @@ -41,11 +44,28 @@ void testSimilarity() { @Test void testPrint() { - assertDoesNotThrow(new ItemImpl() + Item item = new ItemImpl() .setMaterial("material") .setAmount(2) + .setDurability(4) + .setDisplayName("Hello world") .addLore("lore") + .setCustomModelData(2) .addEnchantments("enchant1", "enchant2") - .addItemFlags(ItemFlag.HIDE_ATTRIBUTES)::toString); + .addItemFlags(ItemFlag.HIDE_ATTRIBUTES) + .setUnbreakable(true); + String output = item.toString(); + String expected = Printable.convertToJson(item); + assertEquals(expected, output); } + + @Test + void testStrippedPrint() { + String output = new ItemImpl() + .setMaterial("stone") + .setAmount(2).toString(); + for (String s : Arrays.asList("durability", "displayName", "lore", "enchantments", "itemFlags", "customModelData")) + assertFalse(output.contains(s), String.format("'%s' should not contain %s", output, s)); + } + } \ No newline at end of file diff --git a/wrappers/base/src/test/java/it/angrybear/yagl/wrappers/WrapperTest.java b/wrappers/base/src/test/java/it/angrybear/yagl/wrappers/WrapperTest.java index 21bc4b1dd..8943bfaf5 100644 --- a/wrappers/base/src/test/java/it/angrybear/yagl/wrappers/WrapperTest.java +++ b/wrappers/base/src/test/java/it/angrybear/yagl/wrappers/WrapperTest.java @@ -55,7 +55,6 @@ void testSettersRanges(ConsumerException consumer, Integer min, Int final String message = e.getMessage(); assertNotNull(message, "Error message should have not been null"); - System.out.println(message); if (min != null) { assertTrue(message.contains(String.valueOf(min)), "Error message should contain min value");