summaryrefslogtreecommitdiff
path: root/dicore3/command/src/main/java/io/dico/dicore/command/ModifiableCommandAddress.java
diff options
context:
space:
mode:
Diffstat (limited to 'dicore3/command/src/main/java/io/dico/dicore/command/ModifiableCommandAddress.java')
-rw-r--r--dicore3/command/src/main/java/io/dico/dicore/command/ModifiableCommandAddress.java51
1 files changed, 44 insertions, 7 deletions
diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/ModifiableCommandAddress.java b/dicore3/command/src/main/java/io/dico/dicore/command/ModifiableCommandAddress.java
index 484eb5e..6871462 100644
--- a/dicore3/command/src/main/java/io/dico/dicore/command/ModifiableCommandAddress.java
+++ b/dicore3/command/src/main/java/io/dico/dicore/command/ModifiableCommandAddress.java
@@ -10,10 +10,13 @@ import java.util.*;
public abstract class ModifiableCommandAddress implements ICommandAddress {
Map<String, ChildCommandAddress> children;
+ Collection<String> childrenMainKeys = Collections.emptyList();
+
// the chat controller as configured by the programmer
IChatController chatController;
// cache for the algorithm that finds the first chat controller going up the tree
transient IChatController chatControllerCache;
+
ModifiableCommandAddress helpChild;
public ModifiableCommandAddress() {
@@ -111,6 +114,21 @@ public abstract class ModifiableCommandAddress implements ICommandAddress {
}
@Override
+ public boolean hasChildren() {
+ return !children.isEmpty();
+ }
+
+ @Override
+ public int getNumberOfRealChildren() {
+ return childrenMainKeys.size();
+ }
+
+ @Override
+ public Collection<String> getChildrenMainKeys() {
+ return Collections.unmodifiableCollection(childrenMainKeys);
+ }
+
+ @Override
public Map<String, ? extends ModifiableCommandAddress> getChildren() {
return Collections.unmodifiableMap(children);
}
@@ -140,7 +158,16 @@ public abstract class ModifiableCommandAddress implements ICommandAddress {
}
Iterator<String> names = mChild.modifiableNamesIterator();
- children.put(names.next(), mChild);
+ String mainKey = names.next();
+
+ if (!childrenMainKeys.contains(mainKey)) {
+ if (!(childrenMainKeys instanceof ArrayList)) {
+ childrenMainKeys = new ArrayList<>();
+ }
+ childrenMainKeys.add(mainKey);
+ }
+
+ children.put(mainKey, mChild);
while (names.hasNext()) {
String name = names.next();
@@ -168,19 +195,29 @@ public abstract class ModifiableCommandAddress implements ICommandAddress {
}
if (removeAliases) {
- for (Iterator<String> iterator = keyTarget.namesModifiable.iterator(); iterator.hasNext(); ) {
+ Iterator<String> iterator = keyTarget.namesModifiable.iterator();
+ boolean first = true;
+ while (iterator.hasNext()) {
String alias = iterator.next();
ChildCommandAddress aliasTarget = getChild(key);
if (aliasTarget == keyTarget) {
+ if (first) {
+ childrenMainKeys.remove(alias);
+ }
children.remove(alias);
- iterator.remove();
}
+ iterator.remove();
+ first = false;
}
- continue;
- }
- children.remove(key);
- keyTarget.namesModifiable.remove(key);
+ } else {
+ if (key.equals(keyTarget.getMainKey())) {
+ childrenMainKeys.remove(key);
+ }
+
+ children.remove(key);
+ keyTarget.namesModifiable.remove(key);
+ }
}
}