diff --git a/src/com/massivecraft/massivecore/command/MassiveCommand.java b/src/com/massivecraft/massivecore/command/MassiveCommand.java index 656d8465..08304212 100644 --- a/src/com/massivecraft/massivecore/command/MassiveCommand.java +++ b/src/com/massivecraft/massivecore/command/MassiveCommand.java @@ -545,12 +545,27 @@ public class MassiveCommand // WITHOUT 4 - // Without defaultValue, reqFromConsole, defaultDesc & concat . + // Without defaultValue, reqFromConsole, defaultDesc & concat. public Parameter addParameter(Type type, String name) { return this.addParameter(new Parameter(type, name)); } + // Without defaultValue, name, reqFromConsole & defaultDesc. + public Parameter addParameter(Type type, boolean concatFromHere) + { + return this.addParameter(new Parameter(type), concatFromHere); + } + + // Without 5 + + // Without defaultValue, name, reqFromConsole, defaultDesc & concat. + public Parameter addParameter(Type type) + { + return this.addParameter(new Parameter(type)); + } + + // -------------------------------------------- // // PREPROCESS // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/Parameter.java b/src/com/massivecraft/massivecore/command/Parameter.java index 438da24c..c92f8edc 100644 --- a/src/com/massivecraft/massivecore/command/Parameter.java +++ b/src/com/massivecraft/massivecore/command/Parameter.java @@ -145,6 +145,12 @@ public class Parameter this(type, REQUIRED_FROM_CONSOLE_DEFAULT, name, DEFAULT_DESC_DEFAULT); } + // Without defaultValue, name, reqFromConsole and defaultDesc. + public Parameter(Type type) + { + this(type, REQUIRED_FROM_CONSOLE_DEFAULT, type.getTypeName(), DEFAULT_DESC_DEFAULT); + } + // -------------------------------------------- // // CONVENIENCE // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java index 41d5f937..4808968d 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAbstract.java @@ -1,13 +1,14 @@ package com.massivecraft.massivecore.command.editor; +import java.util.AbstractMap.SimpleImmutableEntry; import java.util.List; -import java.util.AbstractMap.SimpleEntry; import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.command.requirement.RequirementEditorPropertyCreated; import com.massivecraft.massivecore.command.type.Type; import com.massivecraft.massivecore.command.type.TypeNullable; import com.massivecraft.massivecore.util.ContainerUtil; +import com.massivecraft.massivecore.util.Txt; public abstract class CommandEditContainerAbstract extends CommandEditAbstract { @@ -38,8 +39,6 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst @Override public void perform() throws MassiveException { - // Type - // Create V container = this.getProperty().getRaw(this.getObject()); List elements = this.getValueType().getContainerElementsOrdered(container); @@ -59,17 +58,26 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst } // After + elements = this.getValueType().getContainerElementsOrdered(elements); V after = this.getValueType().createNewInstance(); ContainerUtil.addElements(after, elements); - // Order - elements = this.getValueType().getContainerElementsOrdered(after); - ContainerUtil.setElements(after, elements); - // Apply this.attemptSet(after); } + @Override + public String createCommandAlias() + { + // Split at uppercase letters + String name = this.getClass().getSimpleName(); + name = name.substring("CommandEditContainer".length()); + final String[] words = name.split("(?=[A-Z])"); + String alias = Txt.implode(words, ""); + alias = Txt.lowerCaseFirst(alias); + return alias; + } + // -------------------------------------------- // // ABSTRACT // -------------------------------------------- // @@ -77,43 +85,33 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst public abstract void alter(List elements) throws MassiveException; // -------------------------------------------- // - // MAP + // PARAMETER // -------------------------------------------- // public boolean isCollection() { Type type = this.getValueType(); - if (type.isContainerCollection()) - { - return true; - } - else if (type.isContainerMap()) - { - return false; - } - else - { - throw new RuntimeException("Neither Collection nor Map."); - } + if (type.isContainerCollection()) return true; + if (type.isContainerMap()) return false; + throw new RuntimeException("Neither Collection nor Map."); } public void addParametersElement(boolean strict) { - Type type = this.getValueType(); - Type innerType = type.getInnerType(); + Type innerType = this.getValueInnerType(); - if (type.isContainerCollection()) + if (this.isCollection()) { - this.addParameter(innerType, innerType.getTypeName(), true); + this.addParameter(innerType, true); } - else if (type.isContainerMap()) + else { Type keyType = innerType.getInnerType(0); Type valueType = innerType.getInnerType(1); if (strict) { - this.addParameter(keyType, keyType.getTypeName()); - this.addParameter(valueType, valueType.getTypeName()); + this.addParameter(keyType); + this.addParameter(valueType); } else { @@ -121,10 +119,6 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst this.addParameter(null, TypeNullable.get(valueType, "any", "all"), valueType.getTypeName(), "any"); } } - else - { - throw new RuntimeException("Neither Collection nor Map."); - } } public Object readElement() throws MassiveException @@ -137,7 +131,7 @@ public abstract class CommandEditContainerAbstract extends CommandEditAbst { Object key = this.readArg(); Object value = this.readArg(); - return new SimpleEntry(key, value); + return new SimpleImmutableEntry(key, value); } } diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java index dad9edf9..1e23a4bd 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerAdd.java @@ -16,7 +16,7 @@ public class CommandEditContainerAdd extends CommandEditContainerAbstract< super(settings, property); // Aliases - this.setAliases("add", "put"); + this.addAliases("put"); // Parameters this.addParametersElement(true); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java index 417b4814..74f86e77 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerClear.java @@ -14,9 +14,6 @@ public class CommandEditContainerClear extends CommandEditContainerAbstrac { // Super super(settings, property); - - // Aliases - this.setAliases("clear"); } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java index d9bdbe4f..e165544f 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerInsert.java @@ -16,9 +16,6 @@ public class CommandEditContainerInsert extends CommandEditContainerAbstra // Super super(settings, property); - // Aliases - this.setAliases("insert"); - // Parameters this.addParameter(TypeInteger.get(), "index"); this.addParametersElement(true); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java index 03918887..fb0eb0e7 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerMove.java @@ -16,9 +16,6 @@ public class CommandEditContainerMove extends CommandEditContainerAbstract // Super super(settings, property); - // Aliases - this.setAliases("move"); - // Parameters this.addParameter(TypeInteger.get(), "indexFrom"); this.addParameter(TypeInteger.get(), "indexTo"); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java index f432950b..85c9e0fa 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemove.java @@ -18,9 +18,6 @@ public class CommandEditContainerRemove extends CommandEditContainerAbstra // Super super(settings, property); - // Aliases - this.setAliases("remove"); - // Parameters this.addParametersElement(false); } @@ -52,12 +49,11 @@ public class CommandEditContainerRemove extends CommandEditContainerAbstra Object element = this.readElement(); // Alter - Iterator iterator = elements.iterator(); - while (iterator.hasNext()) + for (Iterator it = elements.iterator(); it.hasNext();) { - Object other = iterator.hasNext(); + Object other = it.next(); if ( ! this.getValueInnerType().equals(other, element)) continue; - iterator.remove(); + it.remove(); } } @@ -76,15 +72,14 @@ public class CommandEditContainerRemove extends CommandEditContainerAbstra if (key == null && value == null) throw new MassiveException().addMsg("Please supply key and/or value."); // Alter - Iterator iterator = elements.iterator(); - while (iterator.hasNext()) + for (Iterator it = elements.iterator(); it.hasNext();) { - Entry other = (Entry) iterator.next(); + Entry other = (Entry) it.next(); if (key != null && ! MUtil.equals(key, other.getKey())) continue; if (value != null && ! MUtil.equals(value, other.getValue())) continue; - iterator.remove(); + it.remove(); } } diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java index 39e6823e..42752aaa 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerRemoveIndex.java @@ -16,9 +16,6 @@ public class CommandEditContainerRemoveIndex extends CommandEditContainerA // Super super(settings, property); - // Aliases - this.setAliases("removeIndex"); - // Parameters this.addParameter(TypeInteger.get(), "index"); } diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java index f9718f22..c729e630 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSet.java @@ -16,9 +16,6 @@ public class CommandEditContainerSet extends CommandEditContainerAbstract< // Super super(settings, property); - // Aliases - this.setAliases("set"); - // Parameters this.addParameter(TypeInteger.get(), "index"); this.addParametersElement(true); diff --git a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java index 40fb4421..0df0111e 100644 --- a/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java +++ b/src/com/massivecraft/massivecore/command/editor/CommandEditContainerSwap.java @@ -1,5 +1,6 @@ package com.massivecraft.massivecore.command.editor; +import java.util.Collections; import java.util.List; import com.massivecraft.massivecore.MassiveException; @@ -16,9 +17,6 @@ public class CommandEditContainerSwap extends CommandEditContainerAbstract // Super super(settings, property); - // Aliases - this.setAliases("swap"); - // Parameters this.addParameter(TypeInteger.get(), "indexOne"); this.addParameter(TypeInteger.get(), "indexTwo"); @@ -36,10 +34,7 @@ public class CommandEditContainerSwap extends CommandEditContainerAbstract int indexTwo = this.readArg(); // Alter - Object elementOne = elements.get(indexOne); - Object elementTwo = elements.get(indexTwo); - elements.set(indexOne, elementTwo); - elements.set(indexTwo, elementOne); + Collections.swap(elements, indexOne, indexTwo); } } diff --git a/src/com/massivecraft/massivecore/command/type/Type.java b/src/com/massivecraft/massivecore/command/type/Type.java index 37c5b3f4..dff137c3 100644 --- a/src/com/massivecraft/massivecore/command/type/Type.java +++ b/src/com/massivecraft/massivecore/command/type/Type.java @@ -25,9 +25,9 @@ public interface Type // INNER // -------------------------------------------- // - public > List getInnerTypes(); - public > I getInnerType(int index); - public > I getInnerType(); + public > List getInnerTypes(); + public > I getInnerType(int index); + public > I getInnerType(); public void setInnerTypes(Collection> innerTypes); public void setInnerTypes(Type... innerTypes); diff --git a/src/com/massivecraft/massivecore/command/type/TypeAbstract.java b/src/com/massivecraft/massivecore/command/type/TypeAbstract.java index f0ddc784..d20314d1 100644 --- a/src/com/massivecraft/massivecore/command/type/TypeAbstract.java +++ b/src/com/massivecraft/massivecore/command/type/TypeAbstract.java @@ -60,13 +60,13 @@ public abstract class TypeAbstract implements Type // INNER // -------------------------------------------- // - protected List> innerTypes = new MassiveList>(); + protected List> innerTypes = new MassiveList<>(); @SuppressWarnings("unchecked") - public > List getInnerTypes() { return (List) this.innerTypes; } + public > List getInnerTypes() { return (List) this.innerTypes; } @SuppressWarnings("unchecked") - public > I getInnerType(int index) { return (I) this.getInnerTypes().get(index); } - public > I getInnerType() { return this.getInnerType(0); } + public > I getInnerType(int index) { return (I) this.getInnerTypes().get(index); } + public > I getInnerType() { return this.getInnerType(0); } @SuppressWarnings({ "unchecked", "rawtypes" }) public void setInnerTypes(Collection> innerTypes) { this.innerTypes = new MassiveList(innerTypes); } diff --git a/src/com/massivecraft/massivecore/command/type/combined/TypeEntry.java b/src/com/massivecraft/massivecore/command/type/combined/TypeEntry.java index b7676834..b9cedbaf 100644 --- a/src/com/massivecraft/massivecore/command/type/combined/TypeEntry.java +++ b/src/com/massivecraft/massivecore/command/type/combined/TypeEntry.java @@ -1,15 +1,21 @@ package com.massivecraft.massivecore.command.type.combined; +import java.util.AbstractMap.SimpleImmutableEntry; +import java.util.Arrays; import java.util.List; import java.util.Map.Entry; -import java.util.AbstractMap.SimpleEntry; - -import com.massivecraft.massivecore.collections.MassiveList; import com.massivecraft.massivecore.command.type.Type; public class TypeEntry extends TypeCombined> { + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + private static final Entry ENTRY_EMPTY = new SimpleImmutableEntry<>(null, null); + @SuppressWarnings("unchecked") public static Entry getEntryEmpty() { return (Entry) ENTRY_EMPTY; } + // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // @@ -41,36 +47,17 @@ public class TypeEntry extends TypeCombined> @Override public Entry combine(List parts) { - // Create - K key = null; - V value = null; - - // Fill - for (int i = 0 ; i < parts.size() ; i++) - { - Object part = parts.get(i); - - if (i == 0) - { - key = (K)part; - } - else if (i == 1) - { - value = (V)part; - } - } + if (parts.isEmpty()) return getEntryEmpty(); + if (parts.size() == 1) return new SimpleImmutableEntry<>((K)parts.get(0), null); + if (parts.size() == 2) return new SimpleImmutableEntry<>((K)parts.get(0), (V) parts.get(1)); - // Return - return new SimpleEntry(key, value); + throw new RuntimeException(parts.size() + " parts"); } @Override public List split(Entry entry) { - return new MassiveList( - entry.getKey(), - entry.getValue() - ); + return Arrays.asList(entry.getKey(), entry.getValue()); } @Override diff --git a/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java b/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java index 096f6965..bab2722a 100644 --- a/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java +++ b/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java @@ -40,7 +40,7 @@ public abstract class TypeContainer extends TypeAbstract public String getCollectionTypeName() { - return "Container"; + return super.getTypeName(); } // -------------------------------------------- // @@ -111,8 +111,8 @@ public abstract class TypeContainer extends TypeAbstract List parts = new MassiveList(); // Fill - List elements = this.getContainerElementsOrdered(container); Type innerType = this.getInnerType(); + List elements = this.getContainerElementsOrdered(container); for (E element : elements) { String part = innerType.getIdInner(element); @@ -146,10 +146,9 @@ public abstract class TypeContainer extends TypeAbstract } // Fill - String[] elementArgs = Txt.PATTERN_WHITESPACE.split(arg); - for (String elementArg : elementArgs) + Type innerType = this.getInnerType(); + for (String elementArg : Txt.PATTERN_WHITESPACE.split(arg)) { - Type innerType = this.getInnerType(); E element = innerType.read(elementArg, sender); ContainerUtil.addElement(ret, element); } diff --git a/src/com/massivecraft/massivecore/command/type/container/TypeList.java b/src/com/massivecraft/massivecore/command/type/container/TypeList.java index 8ceb8fb4..b35f9318 100644 --- a/src/com/massivecraft/massivecore/command/type/container/TypeList.java +++ b/src/com/massivecraft/massivecore/command/type/container/TypeList.java @@ -24,12 +24,6 @@ public class TypeList extends TypeContainer, E> // -------------------------------------------- // // OVERRIDE // -------------------------------------------- // - - @Override - public String getCollectionTypeName() - { - return "List"; - } @Override public List createNewInstance() diff --git a/src/com/massivecraft/massivecore/command/type/container/TypeMap.java b/src/com/massivecraft/massivecore/command/type/container/TypeMap.java index 32cd2a6b..a966a45b 100644 --- a/src/com/massivecraft/massivecore/command/type/container/TypeMap.java +++ b/src/com/massivecraft/massivecore/command/type/container/TypeMap.java @@ -34,13 +34,7 @@ public class TypeMap extends TypeContainer, Entry> // -------------------------------------------- // // OVERRIDE // -------------------------------------------- // - - @Override - public String getCollectionTypeName() - { - return "Map"; - } - + @Override public Map createNewInstance() { diff --git a/src/com/massivecraft/massivecore/command/type/container/TypeSet.java b/src/com/massivecraft/massivecore/command/type/container/TypeSet.java index 6d5e4b0f..dd767162 100644 --- a/src/com/massivecraft/massivecore/command/type/container/TypeSet.java +++ b/src/com/massivecraft/massivecore/command/type/container/TypeSet.java @@ -24,12 +24,6 @@ public class TypeSet extends TypeContainer, E> // -------------------------------------------- // // OVERRIDE // -------------------------------------------- // - - @Override - public String getCollectionTypeName() - { - return "Set"; - } @Override public Set createNewInstance() diff --git a/src/com/massivecraft/massivecore/util/ContainerUtil.java b/src/com/massivecraft/massivecore/util/ContainerUtil.java index 15ff7a85..44bac52a 100644 --- a/src/com/massivecraft/massivecore/util/ContainerUtil.java +++ b/src/com/massivecraft/massivecore/util/ContainerUtil.java @@ -2,11 +2,12 @@ package com.massivecraft.massivecore.util; import java.util.Collection; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.SortedMap; import java.util.SortedSet; -import java.util.Map.Entry; /** * The ContainerUtil provides an imaginary super class to Collection and Map. @@ -51,12 +52,12 @@ public class ContainerUtil public static boolean isOrdered(Object container) { - return container instanceof List || container instanceof LinkedHashMap; + return container instanceof List || container instanceof LinkedHashMap || container instanceof LinkedHashSet; } public static boolean isSorted(Object container) { - return container instanceof SortedSet || container instanceof SortedMap; + return container instanceof SortedSet || container instanceof SortedMap; } // -------------------------------------------- // @@ -64,14 +65,14 @@ public class ContainerUtil // -------------------------------------------- // @SuppressWarnings("unchecked") - public static > C asCollection(Object container) + public static > C asCollection(Object container) { if ( ! isCollection(container)) return null; return (C)container; } @SuppressWarnings("unchecked") - public static > M asMap(Object container) + public static > M asMap(Object container) { if ( ! isMap(container)) return null; return (M)container; @@ -83,6 +84,8 @@ public class ContainerUtil public static boolean isEmpty(Object container) { + if (container == null) throw new NullPointerException("container"); + Collection collection = asCollection(container); if (collection != null) { @@ -95,11 +98,13 @@ public class ContainerUtil return map.isEmpty(); } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(container.getClass().getName() + " is not a container."); } public static int size(Object container) { + if (container == null) throw new NullPointerException("container"); + Collection collection = asCollection(container); if (collection != null) { @@ -112,7 +117,7 @@ public class ContainerUtil return map.size(); } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(container.getClass().getName() + " is not a container."); } // -------------------------------------------- // @@ -122,6 +127,8 @@ public class ContainerUtil @SuppressWarnings("unchecked") public static Collection getElements(Object container) { + if (container == null) throw new NullPointerException("container"); + Collection collection = asCollection(container); if (collection != null) { @@ -134,7 +141,7 @@ public class ContainerUtil return (Collection) map.entrySet(); } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(container.getClass().getName() + " is not a container."); } // -------------------------------------------- // @@ -143,6 +150,8 @@ public class ContainerUtil public static void clear(Object container) { + if (container == null) throw new NullPointerException("container"); + Collection collection = asCollection(container); if (collection != null) { @@ -157,7 +166,7 @@ public class ContainerUtil return; } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(container.getClass().getName() + " is not a container."); } public static void setElements(Object container, Iterable elements) @@ -169,6 +178,8 @@ public class ContainerUtil @SuppressWarnings("unchecked") public static boolean addElement(Object container, Object element) { + if (container == null) throw new NullPointerException("container"); + Collection collection = asCollection(container); if (collection != null) { @@ -185,11 +196,14 @@ public class ContainerUtil return ! MUtil.equals(after, before); } - throw new IllegalArgumentException(); + throw new IllegalArgumentException(container.getClass().getName() + " is not a container."); } public static void addElements(Object container, Iterable elements) { + if (container == null) throw new NullPointerException("container"); + if (elements == null) throw new NullPointerException("elements"); + for (Object element : elements) { addElement(container, element); diff --git a/src/com/massivecraft/massivecore/util/Txt.java b/src/com/massivecraft/massivecore/util/Txt.java index 273659bc..b79e6561 100644 --- a/src/com/massivecraft/massivecore/util/Txt.java +++ b/src/com/massivecraft/massivecore/util/Txt.java @@ -235,6 +235,12 @@ public class Txt if (string.length() == 0) return string; return string.substring(0, 1).toUpperCase() + string.substring(1); } + public static String lowerCaseFirst(String string) + { + if (string == null) return null; + if (string.length() == 0) return string; + return string.substring(0, 1).toLowerCase() + string.substring(1); + } public static String repeat(String string, int times) {