Editor map fixes

This commit is contained in:
BuildTools 2016-02-23 20:24:15 +01:00 committed by Olof Larsson
parent ee907f1d6a
commit 13c5784454
14 changed files with 160 additions and 44 deletions

View File

@ -23,12 +23,19 @@ public class CommandEditContainer<O, V> extends CommandEditAbstract<O, V>
if (property.isEditable()) if (property.isEditable())
{ {
this.addChild(new CommandEditContainerAdd<O, V>(settings, property)); this.addChild(new CommandEditContainerAdd<O, V>(settings, property));
this.addChild(new CommandEditContainerInsert<O, V>(settings, property));
this.addChild(new CommandEditContainerSet<O, V>(settings, property)); // These are not suitable for maps.
if (property.getValueType().isContainerCollection())
{
this.addChild(new CommandEditContainerInsert<O, V>(settings, property));
this.addChild(new CommandEditContainerSet<O, V>(settings, property));
}
this.addChild(new CommandEditContainerRemove<O, V>(settings, property)); this.addChild(new CommandEditContainerRemove<O, V>(settings, property));
this.addChild(new CommandEditContainerRemoveIndex<O, V>(settings, property)); this.addChild(new CommandEditContainerRemoveIndex<O, V>(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<O, V>(settings, property)); this.addChild(new CommandEditContainerMove<O, V>(settings, property));
this.addChild(new CommandEditContainerSwap<O, V>(settings, property)); this.addChild(new CommandEditContainerSwap<O, V>(settings, property));

View File

@ -46,13 +46,18 @@ public abstract class CommandEditContainerAbstract<O, V> extends CommandEditAbst
public void perform() throws MassiveException public void perform() throws MassiveException
{ {
// Create // Create
V container = this.getProperty().getRaw(this.getObject()); V before = this.getProperty().getRaw(this.getObject());
List<Object> elements = this.getValueType().getContainerElementsOrdered(container);
// 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 // Alter
try try
{ {
this.alter(elements); this.alter(container);
} }
catch (MassiveException e) catch (MassiveException e)
{ {
@ -64,8 +69,8 @@ public abstract class CommandEditContainerAbstract<O, V> extends CommandEditAbst
} }
// After // After
elements = this.getValueType().getContainerElementsOrdered(elements);
V after = this.getValueType().createNewInstance(); V after = this.getValueType().createNewInstance();
List<Object> elements = this.getValueType().getContainerElementsOrdered(container);
ContainerUtil.addElements(after, elements); ContainerUtil.addElements(after, elements);
// Apply // Apply
@ -135,8 +140,21 @@ public abstract class CommandEditContainerAbstract<O, V> extends CommandEditAbst
// -------------------------------------------- // // -------------------------------------------- //
// ABSTRACT // ABSTRACT
// -------------------------------------------- // // -------------------------------------------- //
// Not actually abstract, but one of these must be implemented;
public abstract void alter(List<Object> elements) throws MassiveException; public void alter(V container) throws MassiveException
{
List<Object> elements = toElements(container);
this.alterElements(elements);
ContainerUtil.setElements(container, elements);
}
public void alterElements(List<Object> elements) throws MassiveException
{
throw new MassiveException().addMsg("<b>Not yet implemented.");
}
// -------------------------------------------- // // -------------------------------------------- //
// PARAMETER // PARAMETER
@ -160,17 +178,17 @@ public abstract class CommandEditContainerAbstract<O, V> extends CommandEditAbst
} }
else else
{ {
Type<Object> keyType = innerType.getInnerType(0); Type<Object> keyType = innerType.getInnerType(innerType.getIndexUser(0));
Type<Object> valueType = innerType.getInnerType(1); Type<Object> valueType = innerType.getInnerType(innerType.getIndexUser(1));
if (strict) if (strict)
{ {
this.addParameter(keyType); this.addParameter(keyType);
this.addParameter(valueType); this.addParameter(valueType, true);
} }
else else
{ {
this.addParameter(null, TypeNullable.get(keyType, "any", "all"), keyType.getTypeName(), "any"); 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<O, V> extends CommandEditAbst
} }
else else
{ {
Object key = this.readArg(); Object key = this.readArgAt(this.getValueInnerType().getIndexTech(0));
Object value = this.readArg(); Object value = this.readArgAt(this.getValueInnerType().getIndexTech(1));
return new SimpleImmutableEntry<Object, Object>(key, value); return new SimpleImmutableEntry<Object, Object>(key, value);
} }
} }
// -------------------------------------------- //
// ELEMENTS UTIL
// -------------------------------------------- //
public List<Object> toElements(V container)
{
return this.getValueType().getContainerElementsOrdered(container);
}
} }

View File

@ -1,8 +1,7 @@
package com.massivecraft.massivecore.command.editor; package com.massivecraft.massivecore.command.editor;
import java.util.List;
import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.util.ContainerUtil;
public class CommandEditContainerAdd<O, V> extends CommandEditContainerAbstract<O, V> public class CommandEditContainerAdd<O, V> extends CommandEditContainerAbstract<O, V>
{ {
@ -27,13 +26,13 @@ public class CommandEditContainerAdd<O, V> extends CommandEditContainerAbstract<
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alter(V container) throws MassiveException
{ {
// Args // Args
Object element = this.readElement(); Object element = this.readElement();
// Alter // Alter
elements.add(element); ContainerUtil.addElement(container, element);
} }
} }

View File

@ -1,8 +1,7 @@
package com.massivecraft.massivecore.command.editor; package com.massivecraft.massivecore.command.editor;
import java.util.List;
import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.util.ContainerUtil;
public class CommandEditContainerClear<O, V> extends CommandEditContainerAbstract<O, V> public class CommandEditContainerClear<O, V> extends CommandEditContainerAbstract<O, V>
{ {
@ -21,10 +20,10 @@ public class CommandEditContainerClear<O, V> extends CommandEditContainerAbstrac
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alter(V container) throws MassiveException
{ {
// Apply // Apply
elements.clear(); ContainerUtil.clear(container);
} }
} }

View File

@ -26,7 +26,7 @@ public class CommandEditContainerInsert<O, V> extends CommandEditContainerAbstra
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alterElements(List<Object> elements) throws MassiveException
{ {
// Args // Args
int index = this.readArg(); int index = this.readArg();

View File

@ -26,7 +26,7 @@ public class CommandEditContainerMove<O, V> extends CommandEditContainerAbstract
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alterElements(List<Object> elements) throws MassiveException
{ {
// Args // Args
int indexFrom = this.readArg(); int indexFrom = this.readArg();

View File

@ -2,6 +2,7 @@ package com.massivecraft.massivecore.command.editor;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.MassiveException;
@ -27,15 +28,15 @@ public class CommandEditContainerRemove<O, V> extends CommandEditContainerAbstra
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alter(V container) throws MassiveException
{ {
if (this.isCollection()) if (this.isCollection())
{ {
this.alterCollection(elements); this.alterCollection((List<?>) container);
} }
else else
{ {
this.alterMap(elements); this.alterMap((Map<?, ?>)container);
} }
} }
@ -43,7 +44,7 @@ public class CommandEditContainerRemove<O, V> extends CommandEditContainerAbstra
// OVERRIDE > COLLECTION // OVERRIDE > COLLECTION
// -------------------------------------------- // // -------------------------------------------- //
public void alterCollection(List<Object> elements) throws MassiveException public void alterCollection(List<?> elements) throws MassiveException
{ {
// Args // Args
Object element = this.readElement(); Object element = this.readElement();
@ -62,7 +63,7 @@ public class CommandEditContainerRemove<O, V> extends CommandEditContainerAbstra
// -------------------------------------------- // // -------------------------------------------- //
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void alterMap(List<Object> elements) throws MassiveException public void alterMap(Map<?, ?> elements) throws MassiveException
{ {
// Args // Args
Object key = this.readArg(); Object key = this.readArg();
@ -72,7 +73,7 @@ public class CommandEditContainerRemove<O, V> extends CommandEditContainerAbstra
if (key == null && value == null) throw new MassiveException().addMsg("<b>Please supply key and/or value."); if (key == null && value == null) throw new MassiveException().addMsg("<b>Please supply key and/or value.");
// Alter // Alter
for (Iterator<?> it = elements.iterator(); it.hasNext();) for (Iterator<?> it = elements.entrySet().iterator(); it.hasNext();)
{ {
Entry<Object, Object> other = (Entry<Object, Object>) it.next(); Entry<Object, Object> other = (Entry<Object, Object>) it.next();

View File

@ -25,7 +25,7 @@ public class CommandEditContainerRemoveIndex<O, V> extends CommandEditContainerA
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alterElements(List<Object> elements) throws MassiveException
{ {
// Args // Args
int index = this.readArg(); int index = this.readArg();

View File

@ -26,7 +26,7 @@ public class CommandEditContainerSet<O, V> extends CommandEditContainerAbstract<
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alterElements(List<Object> elements) throws MassiveException
{ {
// Args // Args
int index = this.readArg(); int index = this.readArg();

View File

@ -27,7 +27,7 @@ public class CommandEditContainerSwap<O, V> extends CommandEditContainerAbstract
// -------------------------------------------- // // -------------------------------------------- //
@Override @Override
public void alter(List<Object> elements) throws MassiveException public void alterElements(List<Object> elements) throws MassiveException
{ {
// Args // Args
int indexOne = this.readArg(); int indexOne = this.readArg();

View File

@ -35,6 +35,11 @@ public interface Type<T>
public void setInnerTypes(Type<?>... innerTypes); public void setInnerTypes(Type<?>... innerTypes);
public void setInnerType(Type<?> innerType); public void setInnerType(Type<?> innerType);
public void setUserOrder(List<Integer> userOrder);
public void setUserOrder(Integer... userOrder);
public int getIndexUser(int indexTechy);
public int getIndexTech(int indexUser);
// -------------------------------------------- // // -------------------------------------------- //
// WRITE VISUAL COLOR // WRITE VISUAL COLOR
// -------------------------------------------- // // -------------------------------------------- //

View File

@ -81,6 +81,22 @@ public abstract class TypeAbstract<T> implements Type<T>
public void setInnerTypes(Type<?>... innerTypes) { this.setInnerTypes(Arrays.asList(innerTypes)); }; public void setInnerTypes(Type<?>... innerTypes) { this.setInnerTypes(Arrays.asList(innerTypes)); };
public void setInnerType(Type<?> innerType) { this.setInnerTypes(innerType); } public void setInnerType(Type<?> innerType) { this.setInnerTypes(innerType); }
private List<Integer> userOrder = null;
@Override public void setUserOrder(List<Integer> 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 // WRITE VISUAL COLOR
// -------------------------------------------- // // -------------------------------------------- //

View File

@ -139,6 +139,7 @@ public abstract class TypeCombined<T> extends TypeAbstract<T>
// WRITE VISUAL // WRITE VISUAL
// -------------------------------------------- // // -------------------------------------------- //
@SuppressWarnings("unchecked")
@Override @Override
public String getVisualInner(T value, CommandSender sender) public String getVisualInner(T value, CommandSender sender)
{ {
@ -146,9 +147,10 @@ public abstract class TypeCombined<T> extends TypeAbstract<T>
List<String> parts = new MassiveList<String>(); List<String> parts = new MassiveList<String>();
// Fill // Fill
for (Entry<Type<?>, Object> entry : this.splitEntries(value)) List<Entry<Type<?>, Object>> entries = this.splitEntries(value);
for (int i = 0; i < entries.size(); i++)
{ {
@SuppressWarnings("unchecked") Entry<Type<?>, Object> entry = entries.get(this.getIndexTech(i));
Type<Object> type = (Type<Object>) entry.getKey(); Type<Object> type = (Type<Object>) entry.getKey();
String part = type.getVisual(entry.getValue(), sender); String part = type.getVisual(entry.getValue(), sender);
if ( ! this.isVisualNullIncluded() && part == null) continue; if ( ! this.isVisualNullIncluded() && part == null) continue;
@ -231,7 +233,7 @@ public abstract class TypeCombined<T> extends TypeAbstract<T>
for (int i = 0; i < innerArgs.size(); i++) for (int i = 0; i < innerArgs.size(); i++)
{ {
String innerArg = innerArgs.get(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); Object part = innerType.read(innerArg, sender);
ret.add(part); ret.add(part);
} }
@ -287,7 +289,7 @@ public abstract class TypeCombined<T> extends TypeAbstract<T>
List<String> args = this.getArgs(string); List<String> args = this.getArgs(string);
if (args.isEmpty()) return null; if (args.isEmpty()) return null;
if (args.size() > this.getInnerTypes().size()) return null; if (args.size() > this.getInnerTypes().size()) return null;
return this.getInnerType(args.size() - 1); return this.getInnerType(getIndexTech(args.size() - 1));
} }
// -------------------------------------------- // // -------------------------------------------- //

View File

@ -5,14 +5,15 @@ import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import com.massivecraft.massivecore.collections.MassiveSet;
import java.util.SortedMap; import java.util.SortedMap;
import java.util.SortedSet; 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. * 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. * 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) public static boolean isCollection(Object container)
{ {
return container instanceof Collection<?>; return container instanceof Collection;
} }
public static boolean isMap(Object container) 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; return (M)container;
} }
@SuppressWarnings("unchecked")
public static <S extends Set<?>> S asSet(Object container)
{
if ( ! isSet(container)) return null;
return (S)container;
}
@SuppressWarnings("unchecked")
public static <L extends List<?>> L asList(Object container)
{
if ( ! isList(container)) return null;
return (L)container;
}
// -------------------------------------------- // // -------------------------------------------- //
// METHODS > SIZE // METHODS > SIZE
// -------------------------------------------- // // -------------------------------------------- //
@ -234,4 +259,40 @@ public class ContainerUtil
return ret; return ret;
} }
// -------------------------------------------- //
// COPY
// -------------------------------------------- //
// For this method we must make a distinction between list and set.
@SuppressWarnings("unchecked")
public static <V> V getCopy(V container)
{
List<Object> list = asList(container);
if (list != null)
{
return (V) new MassiveList<>(list);
}
Set<Object> set = asSet(container);
if (set != null)
{
return (V) new MassiveSet<>(set);
}
Collection<Object> collection = asCollection(container);
if (collection != null)
{
// Use list as fallback, when neither list nor set.
return (V) new MassiveList<>(collection);
}
Map<Object, Object> map = asMap(container);
if (map != null)
{
return (V) new MassiveMap<>(map);
}
return null;
}
} }