From d96fee007ac462f2a55f56ea91a893e51e1ff680 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Wed, 22 Mar 2017 21:37:33 +0100 Subject: [PATCH] Rework the BackstringSet solution --- .../massivecraft/massivecore/MassiveCore.java | 6 +- ...EnumSet.java => AdapterBackstringSet.java} | 17 +- .../collections/BackstringEnumSet.java | 77 --------- .../collections/BackstringIterator.java | 79 --------- .../collections/BackstringSet.java | 163 ++++++++++++------ .../command/type/RegistryType.java | 10 +- ...ingEnumSet.java => TypeBackstringSet.java} | 16 +- .../type/enumeration/TypeSpawnReason.java | 18 ++ 8 files changed, 154 insertions(+), 232 deletions(-) rename src/com/massivecraft/massivecore/adapter/{AdapterBackstringEnumSet.java => AdapterBackstringSet.java} (66%) delete mode 100644 src/com/massivecraft/massivecore/collections/BackstringEnumSet.java delete mode 100644 src/com/massivecraft/massivecore/collections/BackstringIterator.java rename src/com/massivecraft/massivecore/command/type/container/{TypeBackStringEnumSet.java => TypeBackstringSet.java} (56%) create mode 100644 src/com/massivecraft/massivecore/command/type/enumeration/TypeSpawnReason.java diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index 7152adbb..55f0e550 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -13,7 +13,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import com.massivecraft.massivecore.adapter.AdapterBackstringEnumSet; +import com.massivecraft.massivecore.adapter.AdapterBackstringSet; import com.massivecraft.massivecore.adapter.AdapterBannerPatterns; import com.massivecraft.massivecore.adapter.AdapterEntry; import com.massivecraft.massivecore.adapter.AdapterInventory; @@ -30,7 +30,7 @@ import com.massivecraft.massivecore.adapter.AdapterMsonEvent; import com.massivecraft.massivecore.adapter.AdapterPlayerInventory; import com.massivecraft.massivecore.adapter.AdapterSound; import com.massivecraft.massivecore.adapter.AdapterUUID; -import com.massivecraft.massivecore.collections.BackstringEnumSet; +import com.massivecraft.massivecore.collections.BackstringSet; import com.massivecraft.massivecore.collections.MassiveList; import com.massivecraft.massivecore.collections.MassiveListDef; import com.massivecraft.massivecore.collections.MassiveMap; @@ -195,7 +195,7 @@ public class MassiveCore extends MassivePlugin ret.registerTypeAdapter(Entry.class, AdapterEntry.get()); // Assorted Custom - ret.registerTypeAdapter(BackstringEnumSet.class, AdapterBackstringEnumSet.get()); + ret.registerTypeAdapter(BackstringSet.class, AdapterBackstringSet.get()); ret.registerTypeAdapter(PS.class, PSAdapter.get()); ret.registerTypeAdapter(Sound.class, AdapterSound.get()); ret.registerTypeAdapter(UUID.class, AdapterUUID.get()); diff --git a/src/com/massivecraft/massivecore/adapter/AdapterBackstringEnumSet.java b/src/com/massivecraft/massivecore/adapter/AdapterBackstringSet.java similarity index 66% rename from src/com/massivecraft/massivecore/adapter/AdapterBackstringEnumSet.java rename to src/com/massivecraft/massivecore/adapter/AdapterBackstringSet.java index 59a0202f..9bdd111d 100644 --- a/src/com/massivecraft/massivecore/adapter/AdapterBackstringEnumSet.java +++ b/src/com/massivecraft/massivecore/adapter/AdapterBackstringSet.java @@ -4,7 +4,8 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Set; -import com.massivecraft.massivecore.collections.BackstringEnumSet; +import com.massivecraft.massivecore.collections.BackstringSet; +import com.massivecraft.massivecore.command.type.RegistryType; import com.massivecraft.massivecore.xlib.gson.JsonDeserializationContext; import com.massivecraft.massivecore.xlib.gson.JsonDeserializer; import com.massivecraft.massivecore.xlib.gson.JsonElement; @@ -13,7 +14,7 @@ import com.massivecraft.massivecore.xlib.gson.JsonSerializationContext; import com.massivecraft.massivecore.xlib.gson.JsonSerializer; import com.massivecraft.massivecore.xlib.gson.reflect.TypeToken; -public class AdapterBackstringEnumSet implements JsonDeserializer>, JsonSerializer> +public class AdapterBackstringSet implements JsonDeserializer>, JsonSerializer> { // -------------------------------------------- // // CONSTANTS @@ -25,30 +26,28 @@ public class AdapterBackstringEnumSet implements JsonDeserializer src, Type type, JsonSerializationContext context) + public JsonElement serialize(BackstringSet src, Type type, JsonSerializationContext context) { return context.serialize(src.getStringSet(), stringSetType); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - public BackstringEnumSet deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException + public BackstringSet deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { Set stringSet = context.deserialize(json, stringSetType); - ParameterizedType ptype = (ParameterizedType) type; Type[] args = ptype.getActualTypeArguments(); Class clazz = (Class) args[0]; - - return new BackstringEnumSet(clazz, stringSet); + return new BackstringSet(RegistryType.getType(clazz), stringSet); } } diff --git a/src/com/massivecraft/massivecore/collections/BackstringEnumSet.java b/src/com/massivecraft/massivecore/collections/BackstringEnumSet.java deleted file mode 100644 index 57583fb9..00000000 --- a/src/com/massivecraft/massivecore/collections/BackstringEnumSet.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.massivecraft.massivecore.collections; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; - -public class BackstringEnumSet> extends BackstringSet -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private Class clazz; - private Map name2enum = new LinkedHashMap(); - - private void init(Class clazz) - { - this.clazz = clazz; - for (T t : this.clazz.getEnumConstants()) - { - name2enum.put(t.name(), t); - } - } - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public BackstringEnumSet(Class clazz) - { - super(); - init(clazz); - } - - public BackstringEnumSet(Class clazz, Collection c) - { - super(c); - init(clazz); - } - - public BackstringEnumSet(Class clazz, Object... objects) - { - super(objects); - init(clazz); - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public T convertFromString(String string) - { - return this.name2enum.get(string); - } - - @Override - public String convertToString(Object t) - { - if (t == null) return null; - - if (t instanceof Enum) - { - Enum e = (Enum)t; - return e.name(); - } - - return t.toString(); - } - - @Override - public Map getStringToTypeMap() - { - return this.name2enum; - } - -} diff --git a/src/com/massivecraft/massivecore/collections/BackstringIterator.java b/src/com/massivecraft/massivecore/collections/BackstringIterator.java deleted file mode 100644 index a156bd53..00000000 --- a/src/com/massivecraft/massivecore/collections/BackstringIterator.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.massivecraft.massivecore.collections; - -import java.util.Iterator; - -@Deprecated -public class BackstringIterator implements Iterator -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private final Iterator iterator; - private final BackstringSet set; - private String next = null; - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public BackstringIterator(Iterator iterator, BackstringSet set) - { - this.iterator = iterator; - this.set = set; - this.prepareNext(); - } - - // -------------------------------------------- // - // INTERNAL - // -------------------------------------------- // - - private void prepareNext() - { - String perhaps = null; - while (this.iterator.hasNext()) - { - perhaps = this.iterator.next(); - if (this.set.convertFromString(perhaps) != null) - { - this.next = perhaps; - break; - } - } - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public boolean hasNext() - { - return (this.next != null); - } - - @Override - public E next() - { - String current = this.next; - this.prepareNext(); - if (current == null) return null; - return this.set.convertFromString(current); - } - - @Override - public void remove() - { - throw new UnsupportedOperationException(); - } - - // -------------------------------------------- // - // EXTRAS - // -------------------------------------------- // - - public String peek() - { - return next; - } - -} diff --git a/src/com/massivecraft/massivecore/collections/BackstringSet.java b/src/com/massivecraft/massivecore/collections/BackstringSet.java index 93b78a35..d816853c 100644 --- a/src/com/massivecraft/massivecore/collections/BackstringSet.java +++ b/src/com/massivecraft/massivecore/collections/BackstringSet.java @@ -1,56 +1,98 @@ package com.massivecraft.massivecore.collections; +import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.command.type.RegistryType; +import com.massivecraft.massivecore.command.type.Type; + import java.util.AbstractSet; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Set; -public abstract class BackstringSet extends AbstractSet +public class BackstringSet extends AbstractSet { // -------------------------------------------- // // FIELDS // -------------------------------------------- // - private Set stringSet = new LinkedHashSet(); + private final Type type; + + private final Set stringSet; public Set getStringSet() { return this.stringSet; } // -------------------------------------------- // - // ABSTRACT CONVERSION + // CONVTERT // -------------------------------------------- // - public abstract T convertFromString(String string); - public abstract String convertToString(Object t); + private T convertFromString(String string) throws MassiveException + { + if (string == null) return null; + return this.type.read(string); + } - public abstract Map getStringToTypeMap(); + @SuppressWarnings("unchecked") + private String convertToString(Object object) + { + if (object == null) return null; + + if (object instanceof String) + { + return (String)object; + } + + return this.type.getId((T) object); + } // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - public BackstringSet() + public BackstringSet(Type type) { - + this.type = type; + this.stringSet = new MassiveSet<>(); } - public BackstringSet(Collection c) + public BackstringSet(Type type, Collection collection) { - if (c != null) + this(type); + if (collection != null) { - for (Object o : c) + for (Object object : collection) { - this.stringSet.add(this.convertToString(o)); + String string = this.convertToString(object); + this.stringSet.add(string); } } } - public BackstringSet(Object... objects) + public BackstringSet(Type type, Object... objects) { - this(Arrays.asList(objects)); + this(type, Arrays.asList(objects)); + } + + // -------------------------------------------- // + // MOAR CONSTRUCT + // -------------------------------------------- // + + @SuppressWarnings("unchecked") + public BackstringSet(Class clazz) + { + this((Type) RegistryType.getType(clazz)); + } + + @SuppressWarnings("unchecked") + public BackstringSet(Class clazz, Collection collection) + { + this((Type) RegistryType.getType(clazz), collection); + } + + @SuppressWarnings("unchecked") + public BackstringSet(Class clazz, Object... objects) + { + this((Type) RegistryType.getType(clazz), objects); } // -------------------------------------------- // @@ -61,20 +103,45 @@ public abstract class BackstringSet extends AbstractSet public Iterator iterator() { // Create - List ret = new ArrayList<>(); - - // Get our conversion map - Map typeMap = this.getStringToTypeMap(); + List temporaryList = new MassiveList<>(); // Fill - for (String key: this.getStringSet()) + for (String string : this.getStringSet()) { - T value = typeMap.get(key); - if (value != null) ret.add(value); + try + { + T value = this.convertFromString(string); + if (value != null) temporaryList.add(value); + } + catch (MassiveException ignored) + { + // ignored + } } // Return - return ret.iterator(); + final Iterator temporaryIterator = temporaryList.iterator(); + return new Iterator() + { + @Override + public boolean hasNext() + { + return temporaryIterator.hasNext(); + } + + @Override + public T next() + { + return temporaryIterator.next(); + } + + @Override + public void remove() + { + String message = String.format("%s iterator does not support removal.", BackstringSet.class.getSimpleName()); + throw new UnsupportedOperationException(message); + } + }; } @Override @@ -84,42 +151,34 @@ public abstract class BackstringSet extends AbstractSet } @Override - public boolean contains(Object o) + public boolean contains(Object object) { - if (o == null) - { - return this.stringSet.contains(null); - } - else - { - return this.stringSet.contains(this.convertToString(o)); - } + String string = this.convertToString(object); + return this.stringSet.contains(string); } @Override - public boolean add(T e) + public boolean add(T object) { - if (e == null) - { - return this.stringSet.add(null); - } - else - { - return this.stringSet.add(this.convertToString(e)); - } + return this.addObject(object); + } + + public boolean addString(String string) + { + return this.addObject(string); + } + + private boolean addObject(Object object) + { + String string = this.convertToString(object); + return this.stringSet.add(string); } @Override - public boolean remove(Object o) + public boolean remove(Object object) { - if (o == null) - { - return this.stringSet.remove(null); - } - else - { - return this.stringSet.remove(this.convertToString(o)); - } + String string = this.convertToString(object); + return this.stringSet.remove(string); } @Override diff --git a/src/com/massivecraft/massivecore/command/type/RegistryType.java b/src/com/massivecraft/massivecore/command/type/RegistryType.java index 183b5891..92dff00c 100644 --- a/src/com/massivecraft/massivecore/command/type/RegistryType.java +++ b/src/com/massivecraft/massivecore/command/type/RegistryType.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.massivecraft.massivecore.collections.BackstringEnumSet; +import com.massivecraft.massivecore.collections.BackstringSet; import com.massivecraft.massivecore.collections.ExceptionSet; import com.massivecraft.massivecore.collections.MassiveList; import com.massivecraft.massivecore.collections.MassiveMap; @@ -18,7 +18,7 @@ import com.massivecraft.massivecore.command.type.combined.TypeDataPotionEffect; import com.massivecraft.massivecore.command.type.combined.TypeEntry; import com.massivecraft.massivecore.command.type.combined.TypePotionEffectWrap; import com.massivecraft.massivecore.command.type.combined.TypeSoundEffect; -import com.massivecraft.massivecore.command.type.container.TypeBackStringEnumSet; +import com.massivecraft.massivecore.command.type.container.TypeBackstringSet; import com.massivecraft.massivecore.command.type.container.TypeExceptionSet; import com.massivecraft.massivecore.command.type.container.TypeList; import com.massivecraft.massivecore.command.type.container.TypeMap; @@ -43,6 +43,7 @@ import com.massivecraft.massivecore.command.type.enumeration.TypeParticleEffect; import com.massivecraft.massivecore.command.type.enumeration.TypeRabbitType; import com.massivecraft.massivecore.command.type.enumeration.TypeSkeletonType; import com.massivecraft.massivecore.command.type.enumeration.TypeSound; +import com.massivecraft.massivecore.command.type.enumeration.TypeSpawnReason; import com.massivecraft.massivecore.command.type.enumeration.TypeVillagerProfession; import com.massivecraft.massivecore.command.type.enumeration.TypeWorldType; import com.massivecraft.massivecore.command.type.primitive.TypeBooleanTrue; @@ -131,10 +132,10 @@ public class RegistryType Class fieldClass = field == null ? null : field.getType(); List> innerTypes; - if (ReflectionUtil.isRawTypeAssignableFromAny(BackstringEnumSet.class, fieldType, fieldClass)) + if (ReflectionUtil.isRawTypeAssignableFromAny(BackstringSet.class, fieldType, fieldClass)) { innerTypes = getInnerTypes(field, fieldType, 1); - return TypeBackStringEnumSet.get((Type)innerTypes.get(0)); + return TypeBackstringSet.get((Type)innerTypes.get(0)); } if (ReflectionUtil.isRawTypeAssignableFromAny(List.class, fieldType, fieldClass)) @@ -316,6 +317,7 @@ public class RegistryType register(TypeMaterial.get()); register(TypeOcelotType.get()); register(TypeParticleEffect.get()); + register(TypeSpawnReason.get()); // 1.7 Compat try diff --git a/src/com/massivecraft/massivecore/command/type/container/TypeBackStringEnumSet.java b/src/com/massivecraft/massivecore/command/type/container/TypeBackstringSet.java similarity index 56% rename from src/com/massivecraft/massivecore/command/type/container/TypeBackStringEnumSet.java rename to src/com/massivecraft/massivecore/command/type/container/TypeBackstringSet.java index 5b8b135d..d1ec1cfa 100644 --- a/src/com/massivecraft/massivecore/command/type/container/TypeBackStringEnumSet.java +++ b/src/com/massivecraft/massivecore/command/type/container/TypeBackstringSet.java @@ -1,11 +1,11 @@ package com.massivecraft.massivecore.command.type.container; -import com.massivecraft.massivecore.collections.BackstringEnumSet; +import com.massivecraft.massivecore.collections.BackstringSet; import com.massivecraft.massivecore.command.type.Type; import java.util.Set; -public class TypeBackStringEnumSet> extends TypeContainer, E> +public class TypeBackstringSet> extends TypeContainer, E> { // -------------------------------------------- // // FIELDS @@ -17,14 +17,14 @@ public class TypeBackStringEnumSet> extends TypeContainer> TypeBackStringEnumSet get(Type innerType) + public static > TypeBackstringSet get(Type innerType) { - return new TypeBackStringEnumSet(innerType); + return new TypeBackstringSet(innerType); } - public TypeBackStringEnumSet(Type innerType) + public TypeBackstringSet(Type innerType) { - super(BackstringEnumSet.class, innerType); + super(BackstringSet.class, innerType); this.innerTypeClass = innerType.getClazz(); } @@ -33,9 +33,9 @@ public class TypeBackStringEnumSet> extends TypeContainer createNewInstance() + public BackstringSet createNewInstance() { - return new BackstringEnumSet((Class) innerTypeClass); + return new BackstringSet((Class) innerTypeClass); } } diff --git a/src/com/massivecraft/massivecore/command/type/enumeration/TypeSpawnReason.java b/src/com/massivecraft/massivecore/command/type/enumeration/TypeSpawnReason.java new file mode 100644 index 00000000..3f164476 --- /dev/null +++ b/src/com/massivecraft/massivecore/command/type/enumeration/TypeSpawnReason.java @@ -0,0 +1,18 @@ +package com.massivecraft.massivecore.command.type.enumeration; + +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; + +public class TypeSpawnReason extends TypeEnum +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static TypeSpawnReason i = new TypeSpawnReason(); + public static TypeSpawnReason get() { return i; } + public TypeSpawnReason() + { + super(SpawnReason.class); + } + +}