blob: 00d06fe6b0aeccc7f63c6172a88d07b314797554 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.search;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.browsing.LogicalPackage;
import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
import org.eclipse.jdt.internal.ui.workingsets.WorkingSetComparator;
public class JavaSearchScopeFactory {
public static final int JRE= IJavaSearchScope.SYSTEM_LIBRARIES;
public static final int LIBS= IJavaSearchScope.APPLICATION_LIBRARIES;
public static final int PROJECTS= IJavaSearchScope.REFERENCED_PROJECTS;
public static final int SOURCES= IJavaSearchScope.SOURCES;
public static final int ALL= JRE | LIBS | PROJECTS | SOURCES;
public static final int NO_PROJ= JRE | LIBS | SOURCES;
public static final int NO_JRE= LIBS | PROJECTS | SOURCES;
public static final int NO_JRE_NO_PROJ= LIBS | PROJECTS | SOURCES;
private static JavaSearchScopeFactory fgInstance;
private final IJavaSearchScope EMPTY_SCOPE= SearchEngine.createJavaSearchScope(new IJavaElement[] {});
private JavaSearchScopeFactory() {
}
public static JavaSearchScopeFactory getInstance() {
if (fgInstance == null)
fgInstance= new JavaSearchScopeFactory();
return fgInstance;
}
public IWorkingSet[] queryWorkingSets() throws InterruptedException {
Shell shell= JavaPlugin.getActiveWorkbenchShell();
if (shell == null)
return null;
IWorkingSetSelectionDialog dialog= PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetSelectionDialog(shell, true);
if (dialog.open() != Window.OK) {
throw new InterruptedException();
}
IWorkingSet[] workingSets= dialog.getSelection();
if (workingSets.length > 0)
return workingSets;
return null; // 'no working set' selected
}
public IJavaSearchScope createJavaSearchScope(IWorkingSet[] workingSets, boolean includeJRE) {
return createJavaSearchScope(workingSets, includeJRE ? ALL : NO_JRE);
}
public IJavaSearchScope createJavaSearchScope(IWorkingSet[] workingSets, int includeMask) {
if (workingSets == null || workingSets.length < 1)
return EMPTY_SCOPE;
Set<IJavaElement> javaElements= new HashSet<IJavaElement>(workingSets.length * 10);
for (int i= 0; i < workingSets.length; i++) {
IWorkingSet workingSet= workingSets[i];
if (workingSet.isEmpty() && workingSet.isAggregateWorkingSet()) {
return createWorkspaceScope(includeMask);
}
addJavaElements(javaElements, workingSet);
}
return createJavaSearchScope(javaElements, includeMask);
}
public IJavaSearchScope createJavaSearchScope(IWorkingSet workingSet, boolean includeJRE) {
return createJavaSearchScope(workingSet, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ);
}
public IJavaSearchScope createJavaSearchScope(IWorkingSet workingSet, int includeMask) {
Set<IJavaElement> javaElements= new HashSet<IJavaElement>(10);
if (workingSet.isEmpty() && workingSet.isAggregateWorkingSet()) {
return createWorkspaceScope(includeMask);
}
addJavaElements(javaElements, workingSet);
return createJavaSearchScope(javaElements, includeMask);
}
public IJavaSearchScope createJavaSearchScope(IResource[] resources, boolean includeJRE) {
return createJavaSearchScope(resources, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ);
}
public IJavaSearchScope createJavaSearchScope(IResource[] resources, int includeMask) {
if (resources == null)
return EMPTY_SCOPE;
Set<IJavaElement> javaElements= new HashSet<IJavaElement>(resources.length);
addJavaElements(javaElements, resources);
return createJavaSearchScope(javaElements, includeMask);
}
public IJavaSearchScope createJavaSearchScope(ISelection selection, boolean includeJRE) {
return createJavaSearchScope(selection, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ);
}
public IJavaSearchScope createJavaSearchScope(ISelection selection, int includeMask) {
return createJavaSearchScope(getJavaElements(selection), includeMask);
}
public IJavaSearchScope createJavaProjectSearchScope(String[] projectNames, boolean includeJRE) {
return createJavaProjectSearchScope(projectNames, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ);
}
public IJavaSearchScope createJavaProjectSearchScope(String[] projectNames, int includeMask) {
ArrayList<IJavaElement> res= new ArrayList<IJavaElement>();
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
for (int i= 0; i < projectNames.length; i++) {
IJavaProject project= JavaCore.create(root.getProject(projectNames[i]));
if (project.exists()) {
res.add(project);
}
}
return createJavaSearchScope(res, includeMask);
}
public IJavaSearchScope createJavaProjectSearchScope(IJavaProject project, boolean includeJRE) {
return createJavaProjectSearchScope(project, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ);
}
public IJavaSearchScope createJavaProjectSearchScope(IJavaProject project, int includeMask) {
return SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, getSearchFlags(includeMask));
}
public IJavaSearchScope createJavaProjectSearchScope(IEditorInput editorInput, boolean includeJRE) {
return createJavaProjectSearchScope(editorInput, includeJRE ? ALL : NO_JRE);
}
public IJavaSearchScope createJavaProjectSearchScope(IEditorInput editorInput, int includeMask) {
IJavaElement elem= JavaUI.getEditorInputJavaElement(editorInput);
if (elem != null) {
IJavaProject project= elem.getJavaProject();
if (project != null) {
return createJavaProjectSearchScope(project, includeMask);
}
}
return EMPTY_SCOPE;
}
public String getWorkspaceScopeDescription(boolean includeJRE) {
return includeJRE ? SearchMessages.WorkspaceScope : SearchMessages.WorkspaceScopeNoJRE;
}
public String getWorkspaceScopeDescription(int includeMask) {
return getWorkspaceScopeDescription((includeMask & JRE) != 0);
}
public String getProjectScopeDescription(String[] projectNames, int includeMask) {
if (projectNames.length == 0) {
return SearchMessages.JavaSearchScopeFactory_undefined_projects;
}
boolean includeJRE= (includeMask & JRE) != 0;
String scopeDescription;
if (projectNames.length == 1) {
String label= includeJRE ? SearchMessages.EnclosingProjectScope : SearchMessages.EnclosingProjectScopeNoJRE;
scopeDescription= Messages.format(label, BasicElementLabels.getJavaElementName(projectNames[0]));
} else if (projectNames.length == 2) {
String label= includeJRE ? SearchMessages.EnclosingProjectsScope2 : SearchMessages.EnclosingProjectsScope2NoJRE;
scopeDescription= Messages.format(label, new String[] { BasicElementLabels.getJavaElementName(projectNames[0]), BasicElementLabels.getJavaElementName(projectNames[1])});
} else {
String label= includeJRE ? SearchMessages.EnclosingProjectsScope : SearchMessages.EnclosingProjectsScopeNoJRE;
scopeDescription= Messages.format(label, new String[] { BasicElementLabels.getJavaElementName(projectNames[0]), BasicElementLabels.getJavaElementName(projectNames[1])});
}
return scopeDescription;
}
public String getProjectScopeDescription(IJavaProject project, boolean includeJRE) {
if (includeJRE) {
return Messages.format(SearchMessages.ProjectScope, BasicElementLabels.getJavaElementName(project.getElementName()));
} else {
return Messages.format(SearchMessages.ProjectScopeNoJRE, BasicElementLabels.getJavaElementName(project.getElementName()));
}
}
public String getProjectScopeDescription(IEditorInput editorInput, boolean includeJRE) {
IJavaElement elem= JavaUI.getEditorInputJavaElement(editorInput);
if (elem != null) {
IJavaProject project= elem.getJavaProject();
if (project != null) {
return getProjectScopeDescription(project, includeJRE);
}
}
return Messages.format(SearchMessages.ProjectScope, ""); //$NON-NLS-1$
}
public String getHierarchyScopeDescription(IType type) {
return Messages.format(SearchMessages.HierarchyScope, new String[] { JavaElementLabels.getElementLabel(type, JavaElementLabels.ALL_DEFAULT) });
}
public String getSelectionScopeDescription(IJavaElement[] javaElements, int includeMask) {
return getSelectionScopeDescription(javaElements, (includeMask & JRE) != 0);
}
public String getSelectionScopeDescription(IJavaElement[] javaElements, boolean includeJRE) {
if (javaElements.length == 0) {
return SearchMessages.JavaSearchScopeFactory_undefined_selection;
}
String scopeDescription;
if (javaElements.length == 1) {
String label= includeJRE ? SearchMessages.SingleSelectionScope : SearchMessages.SingleSelectionScopeNoJRE;
scopeDescription= Messages.format(label, JavaElementLabels.getElementLabel(javaElements[0], JavaElementLabels.ALL_DEFAULT));
} else if (javaElements.length == 2) {
String label= includeJRE ? SearchMessages.DoubleSelectionScope : SearchMessages.DoubleSelectionScopeNoJRE;
scopeDescription= Messages.format(label, new String[] { JavaElementLabels.getElementLabel(javaElements[0], JavaElementLabels.ALL_DEFAULT), JavaElementLabels.getElementLabel(javaElements[1], JavaElementLabels.ALL_DEFAULT)});
} else {
String label= includeJRE ? SearchMessages.SelectionScope : SearchMessages.SelectionScopeNoJRE;
scopeDescription= Messages.format(label, new String[] { JavaElementLabels.getElementLabel(javaElements[0], JavaElementLabels.ALL_DEFAULT), JavaElementLabels.getElementLabel(javaElements[1], JavaElementLabels.ALL_DEFAULT)});
}
return scopeDescription;
}
public String getWorkingSetScopeDescription(IWorkingSet[] workingSets, int includeMask) {
return getWorkingSetScopeDescription(workingSets, (includeMask & JRE) != 0);
}
public String getWorkingSetScopeDescription(IWorkingSet[] workingSets, boolean includeJRE) {
if (workingSets.length == 0) {
return SearchMessages.JavaSearchScopeFactory_undefined_workingsets;
}
if (workingSets.length == 1) {
String label= includeJRE ? SearchMessages.SingleWorkingSetScope : SearchMessages.SingleWorkingSetScopeNoJRE;
return Messages.format(label, BasicElementLabels.getWorkingSetLabel(workingSets[0]));
}
Arrays.sort(workingSets, new WorkingSetComparator());
if (workingSets.length == 2) {
String label= includeJRE ? SearchMessages.DoubleWorkingSetScope : SearchMessages.DoubleWorkingSetScopeNoJRE;
return Messages.format(label, new String[] { BasicElementLabels.getWorkingSetLabel(workingSets[0]), BasicElementLabels.getWorkingSetLabel(workingSets[1])});
}
String label= includeJRE ? SearchMessages.WorkingSetsScope : SearchMessages.WorkingSetsScopeNoJRE;
return Messages.format(label, new String[] { BasicElementLabels.getWorkingSetLabel(workingSets[0]), BasicElementLabels.getWorkingSetLabel(workingSets[1])});
}
public IProject[] getProjects(IJavaSearchScope scope) {
IPath[] paths= scope.enclosingProjectsAndJars();
HashSet<IResource> temp= new HashSet<IResource>();
for (int i= 0; i < paths.length; i++) {
IResource resource= ResourcesPlugin.getWorkspace().getRoot().findMember(paths[i]);
if (resource != null && resource.getType() == IResource.PROJECT)
temp.add(resource);
}
return temp.toArray(new IProject[temp.size()]);
}
public IJavaElement[] getJavaElements(ISelection selection) {
if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
return getJavaElements(((IStructuredSelection)selection).toArray());
} else {
return new IJavaElement[0];
}
}
private IJavaElement[] getJavaElements(Object[] elements) {
if (elements.length == 0)
return new IJavaElement[0];
Set<IJavaElement> result= new HashSet<IJavaElement>(elements.length);
for (int i= 0; i < elements.length; i++) {
Object selectedElement= elements[i];
if (selectedElement instanceof IJavaElement) {
addJavaElements(result, (IJavaElement) selectedElement);
} else if (selectedElement instanceof IResource) {
addJavaElements(result, (IResource) selectedElement);
} else if (selectedElement instanceof LogicalPackage) {
addJavaElements(result, (LogicalPackage) selectedElement);
} else if (selectedElement instanceof IWorkingSet) {
IWorkingSet ws= (IWorkingSet)selectedElement;
addJavaElements(result, ws);
} else if (selectedElement instanceof IAdaptable) {
IResource resource= (IResource) ((IAdaptable) selectedElement).getAdapter(IResource.class);
if (resource != null)
addJavaElements(result, resource);
}
}
return result.toArray(new IJavaElement[result.size()]);
}
public IJavaSearchScope createJavaSearchScope(IJavaElement[] javaElements, boolean includeJRE) {
return createJavaSearchScope(javaElements, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ);
}
public IJavaSearchScope createJavaSearchScope(IJavaElement[] javaElements, int includeMask) {
if (javaElements.length == 0)
return EMPTY_SCOPE;
return SearchEngine.createJavaSearchScope(javaElements, getSearchFlags(includeMask));
}
private IJavaSearchScope createJavaSearchScope(Collection<IJavaElement> javaElements, int includeMask) {
if (javaElements.isEmpty())
return EMPTY_SCOPE;
IJavaElement[] elementArray= javaElements.toArray(new IJavaElement[javaElements.size()]);
return SearchEngine.createJavaSearchScope(elementArray, getSearchFlags(includeMask));
}
private static int getSearchFlags(int includeMask) {
return includeMask;
}
private void addJavaElements(Set<IJavaElement> javaElements, IResource[] resources) {
for (int i= 0; i < resources.length; i++)
addJavaElements(javaElements, resources[i]);
}
private void addJavaElements(Set<IJavaElement> javaElements, IResource resource) {
IJavaElement javaElement= (IJavaElement)resource.getAdapter(IJavaElement.class);
if (javaElement == null)
// not a Java resource
return;
if (javaElement.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
// add other possible package fragments
try {
addJavaElements(javaElements, ((IFolder)resource).members());
} catch (CoreException ex) {
// don't add elements
}
}
javaElements.add(javaElement);
}
private void addJavaElements(Set<IJavaElement> javaElements, IJavaElement javaElement) {
javaElements.add(javaElement);
}
private void addJavaElements(Set<IJavaElement> javaElements, IWorkingSet workingSet) {
if (workingSet == null)
return;
if (workingSet.isAggregateWorkingSet() && workingSet.isEmpty()) {
try {
IJavaProject[] projects= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects();
javaElements.addAll(Arrays.asList(projects));
} catch (JavaModelException e) {
JavaPlugin.log(e);
}
return;
}
IAdaptable[] elements= workingSet.getElements();
for (int i= 0; i < elements.length; i++) {
IJavaElement javaElement=(IJavaElement) elements[i].getAdapter(IJavaElement.class);
if (javaElement != null) {
addJavaElements(javaElements, javaElement);
continue;
}
IResource resource= (IResource)elements[i].getAdapter(IResource.class);
if (resource != null) {
addJavaElements(javaElements, resource);
}
// else we don't know what to do with it, ignore.
}
}
private void addJavaElements(Set<IJavaElement> javaElements, LogicalPackage selectedElement) {
IPackageFragment[] packages= selectedElement.getFragments();
for (int i= 0; i < packages.length; i++)
addJavaElements(javaElements, packages[i]);
}
public IJavaSearchScope createWorkspaceScope(boolean includeJRE) {
return createWorkspaceScope(includeJRE ? ALL : NO_JRE);
}
public IJavaSearchScope createWorkspaceScope(int includeMask) {
if ((includeMask & NO_PROJ) != NO_PROJ) {
try {
IJavaProject[] projects= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects();
return SearchEngine.createJavaSearchScope(projects, getSearchFlags(includeMask));
} catch (JavaModelException e) {
// ignore, use workspace scope instead
}
}
return SearchEngine.createWorkspaceScope();
}
public boolean isInsideJRE(IJavaElement element) {
IPackageFragmentRoot root= (IPackageFragmentRoot) element.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
if (root != null) {
try {
IClasspathEntry entry= root.getRawClasspathEntry();
if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
IClasspathContainer container= JavaCore.getClasspathContainer(entry.getPath(), root.getJavaProject());
return container != null && container.getKind() == IClasspathContainer.K_DEFAULT_SYSTEM;
}
return false;
} catch (JavaModelException e) {
JavaPlugin.log(e);
}
}
return true; // include JRE in doubt
}
}