From 13c57844544f5475fe26a91649207a490783788a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 23 Feb 2016 20:24:15 +0100 Subject: [PATCH] Editor map fixes --- .../command/editor/CommandEditContainer.java | 15 +++- .../editor/CommandEditContainerAbstract.java | 48 +++++++++--- .../editor/CommandEditContainerAdd.java | 7 +- .../editor/CommandEditContainerClear.java | 7 +- .../editor/CommandEditContainerInsert.java | 2 +- .../editor/CommandEditContainerMove.java | 2 +- .../editor/CommandEditContainerRemove.java | 13 ++-- .../CommandEditContainerRemoveIndex.java | 2 +- .../editor/CommandEditContainerSet.java | 2 +- .../editor/CommandEditContainerSwap.java | 2 +- .../massivecore/command/type/Type.java | 5 ++ .../command/type/TypeAbstract.java | 16 ++++ .../command/type/combined/TypeCombined.java | 10 ++- .../massivecore/util/ContainerUtil.java | 73 +++++++++++++++++-- 14 files changed, 160 insertions(+), 44 deletions(-) diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainer.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainer.java index 904c6fa0..4530225c 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainer.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainer.java @@ -23,12 +23,19 @@ public class CommandEditContainer extends CommandEditAbstract if (property.isEditable()) { this.addChild(new CommandEditContainerAdd(settings, property)); - this.addChild(new CommandEditContainerInsert(settings, property)); - this.addChild(new CommandEditContainerSet(settings, property)); + + // These are not suitable for maps. + if (property.getValueType().isContainerCollection()) + { + this.addChild(new CommandEditContainerInsert(settings, property)); + this.addChild(new CommandEditContainerSet(settings, property)); + } + this.addChild(new CommandEditContainerRemove(settings, property)); this.addChild(new CommandEditContainerRemoveIndex(settings, property)); - - if ( ! property.getValueType().isContainerSorted() && property.getValueType().getContainerComparator() == null) + + // The container must not be sorted, and must be ordered. + if ( ! property.getValueType().isContainerSorted() && property.getValueType().getContainerComparator() == null && property.getValueType().isContainerOrdered()) { this.addChild(new CommandEditContainerMove(settings, property)); this.addChild(new CommandEditContainerSwap(settings, property)); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java index 47e2402c..208abc86 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java @@ -46,13 +46,18 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst public void perform() throws MassiveException { // Create - V container = this.getProperty().getRaw(this.getObject()); - List elements = this.getValueType().getContainerElementsOrdered(container); + V before = this.getProperty().getRaw(this.getObject()); + + // We must use a container of the correct type. + // Otherwise the elements list for maps, + // could have two entries with the same key. + // That obviously caused issues. + V container = ContainerUtil.getCopy(before); // Alter try { - this.alter(elements); + this.alter(container); } catch (MassiveException e) { @@ -64,8 +69,8 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst } // After - elements = this.getValueType().getContainerElementsOrdered(elements); V after = this.getValueType().createNewInstance(); + List elements = this.getValueType().getContainerElementsOrdered(container); ContainerUtil.addElements(after, elements); // Apply @@ -135,8 +140,21 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst // -------------------------------------------- // // ABSTRACT // -------------------------------------------- // + // Not actually abstract, but one of these must be implemented; - public abstract void alter(List elements) throws MassiveException; + public void alter(V container) throws MassiveException + { + List elements = toElements(container); + + this.alterElements(elements); + + ContainerUtil.setElements(container, elements); + } + + public void alterElements(List elements) throws MassiveException + { + throw new MassiveException().addMsg("Not yet implemented."); + } // -------------------------------------------- // // PARAMETER @@ -160,17 +178,17 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst } else { - Type keyType = innerType.getInnerType(0); - Type valueType = innerType.getInnerType(1); + Type keyType = innerType.getInnerType(innerType.getIndexUser(0)); + Type valueType = innerType.getInnerType(innerType.getIndexUser(1)); if (strict) { this.addParameter(keyType); - this.addParameter(valueType); + this.addParameter(valueType, true); } else { this.addParameter(null, TypeNullable.get(keyType, "any", "all"), keyType.getTypeName(), "any"); - this.addParameter(null, TypeNullable.get(valueType, "any", "all"), valueType.getTypeName(), "any"); + this.addParameter(null, TypeNullable.get(valueType, "any", "all"), valueType.getTypeName(), "any", true); } } } @@ -183,10 +201,18 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst } else { - Object key = this.readArg(); - Object value = this.readArg(); + Object key = this.readArgAt(this.getValueInnerType().getIndexTech(0)); + Object value = this.readArgAt(this.getValueInnerType().getIndexTech(1)); return new SimpleImmutableEntry(key, value); } } + + // -------------------------------------------- // + // ELEMENTS UTIL + // -------------------------------------------- // + public List toElements(V container) + { + return this.getValueType().getContainerElementsOrdered(container); + } } diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java index 1e23a4bd..d156cde4 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java @@ -1,8 +1,7 @@ package com.massivecraft.massivecore.command.editor; -import java.util.List; - import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.util.ContainerUtil; public class CommandEditContainerAdd extends CommandEditContainerAbstract { @@ -27,13 +26,13 @@ public class CommandEditContainerAdd extends CommandEditContainerAbstract< // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alter(V container) throws MassiveException { // Args Object element = this.readElement(); // Alter - elements.add(element); + ContainerUtil.addElement(container, element); } } diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java index 74f86e77..945fc105 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java @@ -1,8 +1,7 @@ package com.massivecraft.massivecore.command.editor; -import java.util.List; - import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.util.ContainerUtil; public class CommandEditContainerClear extends CommandEditContainerAbstract { @@ -21,10 +20,10 @@ public class CommandEditContainerClear extends CommandEditContainerAbstrac // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alter(V container) throws MassiveException { // Apply - elements.clear(); + ContainerUtil.clear(container); } } diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java index e165544f..b830d6f5 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java @@ -26,7 +26,7 @@ public class CommandEditContainerInsert extends CommandEditContainerAbstra // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alterElements(List elements) throws MassiveException { // Args int index = this.readArg(); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java index fb0eb0e7..1e985bc8 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java @@ -26,7 +26,7 @@ public class CommandEditContainerMove extends CommandEditContainerAbstract // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alterElements(List elements) throws MassiveException { // Args int indexFrom = this.readArg(); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java index 85c9e0fa..77203690 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java @@ -2,6 +2,7 @@ package com.massivecraft.massivecore.command.editor; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import com.massivecraft.massivecore.MassiveException; @@ -27,15 +28,15 @@ public class CommandEditContainerRemove extends CommandEditContainerAbstra // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alter(V container) throws MassiveException { if (this.isCollection()) { - this.alterCollection(elements); + this.alterCollection((List) container); } else { - this.alterMap(elements); + this.alterMap((Map)container); } } @@ -43,7 +44,7 @@ public class CommandEditContainerRemove extends CommandEditContainerAbstra // OVERRIDE > COLLECTION // -------------------------------------------- // - public void alterCollection(List elements) throws MassiveException + public void alterCollection(List elements) throws MassiveException { // Args Object element = this.readElement(); @@ -62,7 +63,7 @@ public class CommandEditContainerRemove extends CommandEditContainerAbstra // -------------------------------------------- // @SuppressWarnings("unchecked") - public void alterMap(List elements) throws MassiveException + public void alterMap(Map elements) throws MassiveException { // Args Object key = this.readArg(); @@ -72,7 +73,7 @@ public class CommandEditContainerRemove extends CommandEditContainerAbstra if (key == null && value == null) throw new MassiveException().addMsg("Please supply key and/or value."); // Alter - for (Iterator it = elements.iterator(); it.hasNext();) + for (Iterator it = elements.entrySet().iterator(); it.hasNext();) { Entry other = (Entry) it.next(); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java index 42752aaa..820f2a54 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java @@ -25,7 +25,7 @@ public class CommandEditContainerRemoveIndex extends CommandEditContainerA // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alterElements(List elements) throws MassiveException { // Args int index = this.readArg(); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java index c729e630..bbcfbd2a 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java @@ -26,7 +26,7 @@ public class CommandEditContainerSet extends CommandEditContainerAbstract< // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alterElements(List elements) throws MassiveException { // Args int index = this.readArg(); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java index 0df0111e..7e339987 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java @@ -27,7 +27,7 @@ public class CommandEditContainerSwap extends CommandEditContainerAbstract // -------------------------------------------- // @Override - public void alter(List elements) throws MassiveException + public void alterElements(List elements) throws MassiveException { // Args int indexOne = this.readArg(); diff --git a/src/com/massivecraft/massivecore/command/type/Type.java b/src/com/massivecraft/massivecore/command/type/Type.java index cb71bca2..abb3deaa 100644 --- a/src/com/massivecraft/massivecore/command/type/Type.java +++ b/src/com/massivecraft/massivecore/command/type/Type.java @@ -35,6 +35,11 @@ public interface Type public void setInnerTypes(Type... innerTypes); public void setInnerType(Type innerType); + public void setUserOrder(List userOrder); + public void setUserOrder(Integer... userOrder); + public int getIndexUser(int indexTechy); + public int getIndexTech(int indexUser); + // -------------------------------------------- // // WRITE VISUAL COLOR // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/type/TypeAbstract.java b/src/com/massivecraft/massivecore/command/type/TypeAbstract.java index 5528ed66..51cfcbb8 100644 --- a/src/com/massivecraft/massivecore/command/type/TypeAbstract.java +++ b/src/com/massivecraft/massivecore/command/type/TypeAbstract.java @@ -81,6 +81,22 @@ public abstract class TypeAbstract implements Type public void setInnerTypes(Type... innerTypes) { this.setInnerTypes(Arrays.asList(innerTypes)); }; public void setInnerType(Type innerType) { this.setInnerTypes(innerType); } + private List userOrder = null; + @Override public void setUserOrder(List userOrder) { this.userOrder = userOrder; } + @Override public void setUserOrder(Integer... userOrder) { this.setUserOrder(Arrays.asList(userOrder)); } + @Override + public int getIndexUser(int indexTechy) + { + if (this.userOrder == null) return indexTechy; + return userOrder.get(indexTechy); + } + @Override + public int getIndexTech(int indexUser) + { + if (this.userOrder == null) return indexUser; + return userOrder.indexOf(indexUser); + } + // -------------------------------------------- // // WRITE VISUAL COLOR // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/type/combined/TypeCombined.java b/src/com/massivecraft/massivecore/command/type/combined/TypeCombined.java index 87a5d7f7..44f95602 100644 --- a/src/com/massivecraft/massivecore/command/type/combined/TypeCombined.java +++ b/src/com/massivecraft/massivecore/command/type/combined/TypeCombined.java @@ -139,6 +139,7 @@ public abstract class TypeCombined extends TypeAbstract // WRITE VISUAL // -------------------------------------------- // + @SuppressWarnings("unchecked") @Override public String getVisualInner(T value, CommandSender sender) { @@ -146,9 +147,10 @@ public abstract class TypeCombined extends TypeAbstract List parts = new MassiveList(); // Fill - for (Entry, Object> entry : this.splitEntries(value)) + List, Object>> entries = this.splitEntries(value); + for (int i = 0; i < entries.size(); i++) { - @SuppressWarnings("unchecked") + Entry, Object> entry = entries.get(this.getIndexTech(i)); Type type = (Type) entry.getKey(); String part = type.getVisual(entry.getValue(), sender); if ( ! this.isVisualNullIncluded() && part == null) continue; @@ -231,7 +233,7 @@ public abstract class TypeCombined extends TypeAbstract for (int i = 0; i < innerArgs.size(); i++) { String innerArg = innerArgs.get(i); - Type innerType = this.getInnerTypes().get(i); + Type innerType = this.getInnerTypes().get(getIndexUser(i)); Object part = innerType.read(innerArg, sender); ret.add(part); } @@ -287,7 +289,7 @@ public abstract class TypeCombined extends TypeAbstract List args = this.getArgs(string); if (args.isEmpty()) return null; if (args.size() > this.getInnerTypes().size()) return null; - return this.getInnerType(args.size() - 1); + return this.getInnerType(getIndexTech(args.size() - 1)); } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/util/ContainerUtil.java b/src/com/massivecraft/massivecore/util/ContainerUtil.java index 8528a0a1..81bbbdc5 100644 --- a/src/com/massivecraft/massivecore/util/ContainerUtil.java +++ b/src/com/massivecraft/massivecore/util/ContainerUtil.java @@ -5,14 +5,15 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; - -import com.massivecraft.massivecore.collections.MassiveSet; - +import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; +import com.massivecraft.massivecore.collections.MassiveList; +import com.massivecraft.massivecore.collections.MassiveMap; +import com.massivecraft.massivecore.collections.MassiveSet; + /** * The ContainerUtil provides an imaginary super class to Collection and Map. * In Java they do not have a common interface yet many methods are similar and exists in both. @@ -37,12 +38,22 @@ public class ContainerUtil public static boolean isCollection(Object container) { - return container instanceof Collection; + return container instanceof Collection; } public static boolean isMap(Object container) { - return container instanceof Map; + return container instanceof Map; + } + + public static boolean isList(Object container) + { + return container instanceof List; + } + + public static boolean isSet(Object container) + { + return container instanceof Set; } // -------------------------------------------- // @@ -82,6 +93,20 @@ public class ContainerUtil return (M)container; } + @SuppressWarnings("unchecked") + public static > S asSet(Object container) + { + if ( ! isSet(container)) return null; + return (S)container; + } + + @SuppressWarnings("unchecked") + public static > L asList(Object container) + { + if ( ! isList(container)) return null; + return (L)container; + } + // -------------------------------------------- // // METHODS > SIZE // -------------------------------------------- // @@ -234,4 +259,40 @@ public class ContainerUtil return ret; } + // -------------------------------------------- // + // COPY + // -------------------------------------------- // + + // For this method we must make a distinction between list and set. + @SuppressWarnings("unchecked") + public static V getCopy(V container) + { + List list = asList(container); + if (list != null) + { + return (V) new MassiveList<>(list); + } + + Set set = asSet(container); + if (set != null) + { + return (V) new MassiveSet<>(set); + } + + Collection collection = asCollection(container); + if (collection != null) + { + // Use list as fallback, when neither list nor set. + return (V) new MassiveList<>(collection); + } + + Map map = asMap(container); + if (map != null) + { + return (V) new MassiveMap<>(map); + } + + return null; + } + }