Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
* Container holds a reference to an optional qualified container name and set of aliases.
Expand All @@ -37,6 +38,7 @@ public final class Container {

private final String name;
private final Map<String, String> aliases;
private final Map<String, String[]> candidateNameCache = new ConcurrentHashMap<>();

/** NewContainer creates a new Container with the fully-qualified name. */
public static Container newContainer(ContainerOption... opts) {
Expand Down Expand Up @@ -108,6 +110,10 @@ public Container extend(ContainerOption... opts) {
* precedence over containerized names.
*/
public String[] resolveCandidateNames(String name) {
return candidateNameCache.computeIfAbsent(name, this::computeCandidateNames).clone();
}

private String[] computeCandidateNames(String name) {
if (name.startsWith(".")) {
String qn = name.substring(1);
String alias = findAlias(qn);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@ void ResolveCandidateNames_EmptyContainer() {
assertThat(names).containsExactly(want);
}

@Test
void ResolveCandidateNames_ReturnsDefensiveArrayCopy() {
Container c = newContainer(name("a.b.c.M.N"));
String[] names = c.resolveCandidateNames("R.s");
names[0] = "mutated";

assertThat(c.resolveCandidateNames("R.s"))
.containsExactly("a.b.c.M.N.R.s", "a.b.c.M.R.s", "a.b.c.R.s", "a.b.R.s", "a.R.s", "R.s");
}

@Test
void Abbrevs() {
Container abbr = defaultContainer.extend(abbrevs("my.alias.R"));
Expand Down
Loading