package org.netbeans.gradle.project.view; import java.awt.event.ActionEvent; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import org.jtrim.cancel.Cancellation; import org.jtrim.cancel.CancellationToken; import org.jtrim.concurrent.CancelableTask; import org.jtrim.utils.ExceptionHelper; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectManager; import org.netbeans.api.project.ui.OpenProjects; import org.netbeans.gradle.project.NbGradleProjectFactory; import org.netbeans.gradle.project.model.NbGradleProjectTree; import org.netbeans.gradle.project.util.NbTaskExecutors; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; @SuppressWarnings("serial") // don't care public final class OpenProjectsAction extends AbstractAction { private static final Logger LOGGER = Logger.getLogger(OpenProjectsAction.class.getName()); private final Collection<File> projectDirs; public static OpenProjectsAction createFromModules( String caption, Collection<? extends NbGradleProjectTree> projects) { Collection<File> projectDirs = new ArrayList<>(projects.size()); for (NbGradleProjectTree project: projects) { projectDirs.add(project.getProjectDir()); } return new OpenProjectsAction(caption, projectDirs); } public static OpenProjectsAction createFromProjectDirs( String caption, Collection<File> projectDirs) { Collection<File> safeProjectDirs = new ArrayList<>(projectDirs); ExceptionHelper.checkNotNullElements(safeProjectDirs, "projectDirs"); return new OpenProjectsAction(caption, safeProjectDirs); } private OpenProjectsAction(String caption, Collection<File> projectDirs) { super(caption); this.projectDirs = projectDirs; } public static void openProject(Path projectDir) { openProject(projectDir.toFile()); } public static void openProject(File projectDir) { LOGGER.log(Level.FINE, "Trying to open project: {0}", projectDir.getName()); FileObject projectDirObj = FileUtil.toFileObject(projectDir); if (projectDirObj == null) { LOGGER.log(Level.WARNING, "Directory of the project does not exist: {0}", projectDir); return; } try { ProjectManager projectManager = ProjectManager.getDefault(); try (Closeable safeToOpenKey = NbGradleProjectFactory.safeToOpen(projectDirObj)) { assert safeToOpenKey != null; // Avoid warning // We have to clear this list because if the project // does not have build.gradle, NetBeans might have // already determined that the directory does not // contain a project. projectManager.clearNonProjectCache(); Project subProject = projectManager.findProject(projectDirObj); if (subProject == null) { LOGGER.log(Level.WARNING, "Project cannot be found: {0}", projectDir); return; } OpenProjects.getDefault().open(new Project[]{subProject}, false); } } catch (IOException ex) { LOGGER.log(Level.WARNING, "Error while trying to load the project: " + projectDir, ex); } } @Override public void actionPerformed(ActionEvent e) { NbTaskExecutors.DEFAULT_EXECUTOR.execute(Cancellation.UNCANCELABLE_TOKEN, new CancelableTask() { @Override public void execute(CancellationToken cancelToken) { for (File projectDir: projectDirs) { openProject(projectDir); } } }, null); } }