package org.netbeans.gradle.project;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.netbeans.gradle.model.util.CollectionUtils;
import org.netbeans.gradle.project.extensions.NbGradleExtensionRef;
import org.openide.util.Lookup;
final class UpdatableProjectExtensions implements NbGradleProjectExtensions {
private final Lookup combinedLookup;
private volatile ExtensionCollection extensions;
public UpdatableProjectExtensions(Lookup combinedLookup) {
this.combinedLookup = combinedLookup;
this.extensions = ExtensionCollection.EMPTY;
}
public void setExtensions(Collection<? extends NbGradleExtensionRef> extensions) {
this.extensions = new ExtensionCollection(extensions);
}
@Override
public <T> Collection<? extends T> lookupAllExtensionObjs(Class<T> type) {
return combinedLookup.lookupAll(type);
}
@Override
public <T> T lookupExtensionObj(Class<T> type) {
return combinedLookup.lookup(type);
}
@Override
public Lookup getCombinedExtensionLookup() {
return combinedLookup;
}
@Override
public List<NbGradleExtensionRef> getExtensionRefs() {
return extensions.getExtensionRefs();
}
@Override
public boolean hasExtension(String extensionName) {
return extensions.hasExtension(extensionName);
}
private static final class ExtensionCollection {
public static final ExtensionCollection EMPTY
= new ExtensionCollection(Collections.<NbGradleExtensionRef>emptySet());
private final List<NbGradleExtensionRef> extensionRefs;
private final Set<String> extensionNames;
public ExtensionCollection(Collection<? extends NbGradleExtensionRef> extensions) {
this.extensionRefs = Collections.unmodifiableList(new ArrayList<>(extensions));
Set<String> newExtensionNames = CollectionUtils.newHashSet(extensions.size());
for (NbGradleExtensionRef extension: this.extensionRefs) {
newExtensionNames.add(extension.getName());
}
this.extensionNames = Collections.unmodifiableSet(newExtensionNames);
}
public List<NbGradleExtensionRef> getExtensionRefs() {
return extensionRefs;
}
public boolean hasExtension(String extensionName) {
return extensionNames.contains(extensionName);
}
}
}