1 /*******************************************************************************
2  * Copyright (c) 2014-2016 Red Hat Inc., and others
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     Mickael Istria (Red Hat Inc.) - initial API and implementation
13  ******************************************************************************/
14 package org.eclipse.ui.internal.wizards.datatransfer;
15 
16 import java.io.File;
17 import java.util.HashSet;
18 import java.util.LinkedHashSet;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.Set;
22 
23 import org.eclipse.core.resources.IContainer;
24 import org.eclipse.core.resources.IFolder;
25 import org.eclipse.core.resources.IProject;
26 import org.eclipse.core.resources.IProjectDescription;
27 import org.eclipse.core.resources.IResource;
28 import org.eclipse.core.runtime.CoreException;
29 import org.eclipse.core.runtime.IPath;
30 import org.eclipse.core.runtime.IProgressMonitor;
31 import org.eclipse.core.runtime.Path;
32 import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
33 import org.eclipse.ui.wizards.datatransfer.ProjectConfigurator;
34 
35 /**
36  * A {@link ProjectConfigurator} that detects Eclipse projects (folder with
37  * .project)
38  *
39  * @since 3.12
40  *
41  */
42 public class EclipseProjectConfigurator implements ProjectConfigurator {
43 
44 	@Override
findConfigurableLocations(File root, IProgressMonitor monitor)45 	public Set<File> findConfigurableLocations(File root, IProgressMonitor monitor) {
46 		Set<File> projectFiles = new LinkedHashSet<>();
47 		Set<String> visitedDirectories = new HashSet<>();
48 		WizardProjectsImportPage.collectProjectFilesFromDirectory(projectFiles, root, visitedDirectories, true,
49 				monitor);
50 		Set<File> res = new LinkedHashSet<>();
51 		for (File projectFile : projectFiles) {
52 			res.add(projectFile.getParentFile());
53 		}
54 		return res;
55 	}
56 
57 	@Override
shouldBeAnEclipseProject(IContainer container, IProgressMonitor monitor)58 	public boolean shouldBeAnEclipseProject(IContainer container, IProgressMonitor monitor) {
59 		return container.getFile(new Path(IProjectDescription.DESCRIPTION_FILE_NAME)).exists();
60 	}
61 
62 	@Override
getFoldersToIgnore(IProject project, IProgressMonitor monitor)63 	public Set<IFolder> getFoldersToIgnore(IProject project, IProgressMonitor monitor) {
64 		return null;
65 	}
66 
67 	@Override
canConfigure(IProject project, Set<IPath> ignoredPaths, IProgressMonitor monitor)68 	public boolean canConfigure(IProject project, Set<IPath> ignoredPaths, IProgressMonitor monitor) {
69 		return true;
70 	}
71 
72 	@Override
removeDirtyDirectories(Map<File, List<ProjectConfigurator>> proposals)73 	public void removeDirtyDirectories(Map<File, List<ProjectConfigurator>> proposals) {
74 		// nothing to do: we cannot infer that a directory is dirty from
75 		// .project
76 	}
77 
78 	@Override
configure(IProject project, Set<IPath> excludedDirectories, IProgressMonitor monitor)79 	public void configure(IProject project, Set<IPath> excludedDirectories, IProgressMonitor monitor) {
80 		try {
81 			project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
82 		} catch (CoreException ex) {
83 			IDEWorkbenchPlugin.log(ex.getMessage(), ex);
84 		}
85 	}
86 
87 }
88