package org.netbeans.gradle.project.properties;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jtrim.event.ListenerRegistries;
import org.jtrim.property.PropertySource;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.api.java.platform.JavaPlatformManager;
import org.netbeans.gradle.project.api.entry.GradleProjectPlatformQuery;
import org.netbeans.gradle.project.api.entry.ProjectPlatform;
import org.netbeans.gradle.project.api.event.NbListenerRef;
import org.netbeans.gradle.project.api.event.NbListenerRefs;
import org.netbeans.gradle.project.properties.global.CommonGlobalSettings;
import org.netbeans.gradle.project.properties.global.PlatformOrder;
import org.netbeans.gradle.project.properties.standard.JavaPlatformUtils;
import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = GradleProjectPlatformQuery.class, position = 1000)
public final class DefaultGradleProjectPlatformQuery
implements
GradleProjectPlatformQuery {
private final Set<String> knownPlatforms;
public DefaultGradleProjectPlatformQuery() {
this.knownPlatforms = new HashSet<>(Arrays.asList("j2se"));
}
private static PropertySource<PlatformOrder> orderProperty() {
return CommonGlobalSettings.getDefault().platformPreferenceOrder().getActiveSource();
}
@Override
public NbListenerRef addPlatformChangeListener(final Runnable listener) {
ExceptionHelper.checkNotNullArgument(listener, "listener");
return NbListenerRefs.asNbRef(ListenerRegistries.combineListenerRefs(
JavaPlatformUtils.installedPlatforms().addChangeListener(listener),
orderProperty().addChangeListener(listener)));
}
@Override
public boolean isOwnerQuery(String platformName) {
return knownPlatforms.contains(platformName);
}
@Override
public Collection<ProjectPlatform> getAvailablePlatforms() {
JavaPlatform[] allPlatforms = JavaPlatformManager.getDefault().getInstalledPlatforms();
List<JavaPlatform> platforms = orderProperty().getValue().filterIndistinguishable(allPlatforms);
List<ProjectPlatform> result = new ArrayList<>(platforms.size());
for (JavaPlatform platform: platforms) {
result.add(JavaPlatformUtils.getJavaPlatform(platform));
}
return result;
}
@Override
public ProjectPlatform tryFindPlatformByName(String name, String version) {
JavaPlatform platform = JavaPlatformUtils.tryFindPlatform(name, version, orderProperty().getValue());
return platform != null
? JavaPlatformUtils.getJavaPlatform(platform)
: null;
}
@Override
public ProjectPlatform tryFindPlatformByUri(URI uri) {
return null;
}
}