package org.wildfly.swarm.spi.api.config;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* A multi-segment configuration key.
*
* @author Bob McWhirter
*/
public class CompositeKey implements ConfigKey {
public CompositeKey() {
}
public CompositeKey(SimpleKey... parts) {
this.parts = Arrays.asList(parts);
}
public CompositeKey(String... parts) {
this.parts = Arrays.asList(parts).stream().map(SimpleKey::new).collect(Collectors.toList());
}
public CompositeKey(CompositeKey parent, ConfigKey child) {
this.parts = new ArrayList<>();
this.parts.addAll(parent.parts);
if (child == ConfigKey.EMPTY) {
// skip
} else if (child instanceof SimpleKey) {
this.parts.add((SimpleKey) child);
} else if (child instanceof CompositeKey) {
this.parts.addAll(((CompositeKey) child).parts);
}
}
public CompositeKey(CompositeKey parent, String child) {
this(parent, new SimpleKey(child));
}
CompositeKey(List<SimpleKey> parts) {
this.parts = parts;
}
@Override
public SimpleKey head() {
if (this.parts.isEmpty()) {
return ConfigKey.EMPTY;
}
return this.parts.get(0);
}
@Override
public ConfigKey subkey(int offset) {
if (this.parts.size() <= offset) {
return ConfigKey.EMPTY;
}
List<SimpleKey> subParts = this.parts.subList(offset, this.parts.size());
if (subParts.size() == 1) {
return subParts.get(0);
}
return new CompositeKey(subParts);
}
@Override
public String name() {
return String.join(".",
this.parts.stream().map(SimpleKey::propertyName).collect(Collectors.toList()));
}
@Override
public String propertyName() {
return String.join(".",
this.parts.stream().map(SimpleKey::propertyName).collect(Collectors.toList()));
}
public CompositeKey append(String... names) {
return append(ConfigKey.of(names));
}
public CompositeKey append(ConfigKey key) {
return new CompositeKey(this, key);
}
@Override
public int hashCode() {
return this.parts.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof CompositeKey) {
return this.parts.equals(((CompositeKey) obj).parts);
}
return false;
}
@Override
public String toString() {
return name();
}
private List<SimpleKey> parts;
}