package org.netbeans.gradle.project; import java.nio.file.Path; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.jtrim.concurrent.GenericUpdateTaskExecutor; import org.jtrim.concurrent.TaskExecutor; import org.jtrim.concurrent.UpdateTaskExecutor; import org.jtrim.utils.ExceptionHelper; import org.netbeans.api.project.Project; import org.netbeans.api.project.ui.OpenProjects; import org.netbeans.gradle.project.model.DefaultGradleModelLoader; import org.netbeans.gradle.project.model.NbGradleModel; import org.netbeans.gradle.project.model.NbGradleMultiProjectDef; import org.netbeans.gradle.project.model.ProjectModelChangeListener; import org.netbeans.gradle.project.util.NbConsumer; import org.netbeans.gradle.project.util.NbTaskExecutors; public final class ModelCacheSizeAutoUpdater implements ProjectModelChangeListener { private static final ModelCacheSizeAutoUpdater DEFAULT = new ModelCacheSizeAutoUpdater(NbTaskExecutors.newDefaultUpdateExecutor(), new NbConsumer<Integer>() { @Override public void accept(Integer requiredCacheSize) { DefaultGradleModelLoader.ensureCacheSize(requiredCacheSize); } }); private final UpdateTaskExecutor cacheSizeCheckExecutor; private final NbConsumer<? super Integer> cacheSizeUpdater; public ModelCacheSizeAutoUpdater(TaskExecutor cacheSizeCheckExecutor, NbConsumer<? super Integer> cacheSizeUpdater) { this(new GenericUpdateTaskExecutor(cacheSizeCheckExecutor), cacheSizeUpdater); } public ModelCacheSizeAutoUpdater(UpdateTaskExecutor cacheSizeCheckExecutor, NbConsumer<? super Integer> cacheSizeUpdater) { ExceptionHelper.checkNotNullArgument(cacheSizeCheckExecutor, "cacheSizeCheckExecutor"); ExceptionHelper.checkNotNullArgument(cacheSizeUpdater, "cacheSizeUpdater"); this.cacheSizeCheckExecutor = cacheSizeCheckExecutor; this.cacheSizeUpdater = cacheSizeUpdater; } public static ModelCacheSizeAutoUpdater getDefault() { return DEFAULT; } @Override public void onModelChanged() { cacheSizeCheckExecutor.execute(new Runnable() { @Override public void run() { checkCacheSize(); } }); } private void checkCacheSize() { Project[] projects = OpenProjects.getDefault().getOpenProjects(); Map<Path, Integer> projectSizes = getProjectSizes(projects); int requiredCacheSize = sum(projectSizes.values()); cacheSizeUpdater.accept(requiredCacheSize); } private static int sum(Collection<Integer> values) { int result = 0; for (Integer value: values) { result += value; } return result; } private static Map<Path, Integer> getProjectSizes(Project[] projects) { Map<Path, Integer> projectSizes = null; for (Project project: projects) { NbGradleProject gradleProject = project.getLookup().lookup(NbGradleProject.class); if (gradleProject != null && gradleProject.wasModelEverSet()) { NbGradleModel projectModel = gradleProject.currentModel().getValue(); NbGradleMultiProjectDef projectDef = projectModel.getGenericInfo().getProjectDef(); int numberOfProjectsInThisBuild = projectDef.getNumberOfProjectsInThisBuild(); if (projectSizes == null) { projectSizes = new HashMap<>(); } // +1 for a possible buildSrc projectSizes.put(projectModel.getSettingsDir(), numberOfProjectsInThisBuild + 1); } } return projectSizes != null ? projectSizes : Collections.<Path, Integer>emptyMap(); } }