package org.netbeans.gradle.project.properties.global; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import org.netbeans.api.java.platform.JavaPlatform; import org.netbeans.gradle.model.util.CollectionUtils; import org.netbeans.gradle.project.properties.standard.PlatformId; import org.openide.filesystems.FileObject; public final class PlatformOrder { private static final int DEFAULT_ORDER_INDEX = Integer.MAX_VALUE; public static final PlatformOrder DEFAULT_ORDER = new PlatformOrder(Collections.<String>emptyList(), false); private final Map<String, Integer> pathToOrder; private final List<String> platformIds; public PlatformOrder(List<JavaPlatform> platformPaths) { pathToOrder = CollectionUtils.newHashMap(platformPaths.size()); platformIds = new ArrayList<>(platformPaths.size()); int index = 0; for (JavaPlatform platform: platformPaths) { String platformId = getPlatformId(platform); pathToOrder.put(platformId, index); platformIds.add(platformId); index++; } } private PlatformOrder(List<String> platformIds, boolean copyList) { this.platformIds = copyList ? CollectionUtils.copyNullSafeList(platformIds) : platformIds; int index = 0; pathToOrder = CollectionUtils.newHashMap(platformIds.size()); for (String platformId: this.platformIds) { pathToOrder.put(platformId, index); index++; } } public static PlatformOrder fromPlatformIds(List<String> platformIds) { return new PlatformOrder(platformIds, true); } public List<String> getPlatformIds() { return platformIds; } public List<JavaPlatform> orderPlatforms(Collection<? extends JavaPlatform> src) { List<PlatformAndOrder> srcWithOrder = new ArrayList<>(src.size()); for (JavaPlatform platform: src) { Integer order = pathToOrder.get(getPlatformId(platform)); PlatformAndOrder platformWithOrder; if (order == null) { platformWithOrder = new PlatformAndOrder(platform, DEFAULT_ORDER_INDEX); } else { platformWithOrder = new PlatformAndOrder(platform, order); } srcWithOrder.add(platformWithOrder); } Collections.sort(srcWithOrder); List<JavaPlatform> result = new ArrayList<>(srcWithOrder.size()); for (PlatformAndOrder platform: srcWithOrder) { result.add(platform.platform); } return result; } public List<JavaPlatform> filterIndistinguishable(JavaPlatform[] platforms) { return filterIndistinguishable(Arrays.asList(platforms)); } public List<JavaPlatform> filterIndistinguishable(Collection<JavaPlatform> platforms) { List<JavaPlatform> result = new ArrayList<>(platforms.size()); Set<PlatformId> foundVersions = CollectionUtils.newHashSet(platforms.size()); for (JavaPlatform platform: orderPlatforms(platforms)) { PlatformId platformId = PlatformId.tryGetIdOfPlatform(platform); if (platformId != null && foundVersions.add(platformId)) { result.add(platform); } } return result; } private static String getPlatformId(JavaPlatform platform) { StringBuilder result = new StringBuilder(1024); for (FileObject installFolder: platform.getInstallFolders()) { String path = installFolder.getPath(); if (result.length() > 0) { result.append(";"); } result.append(path); } return result.toString(); } private static final class PlatformAndOrder implements Comparable<PlatformAndOrder> { public final JavaPlatform platform; public final int order; public PlatformAndOrder(JavaPlatform platform, int order) { this.platform = platform; this.order = order; } @Override public int compareTo(PlatformAndOrder o) { return Integer.compare(order, o.order); } } }