/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.ui.search;
import java.util.ArrayList;
import java.util.HashMap;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceProxy;
import org.eclipse.core.resources.IResourceProxyVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.search.core.text.TextSearchScope;
import org.eclipse.search.internal.ui.Messages;
import org.eclipse.search.ui.text.FileTextSearchScope;
import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.ui.SeamGuiPlugin;
/**
* Seam Search Scope object
*
* @author Jeremy
*
*/
public class SeamSearchScope extends TextSearchScope implements IJavaSearchScope {
public static final int SEARCH_FOR_DECLARATIONS = IJavaSearchConstants.DECLARATIONS;
public static final int SEARCH_FOR_REFERENCES = IJavaSearchConstants.REFERENCES;
private static final String[] FILE_NAMES = new String[] {
"*"
};
int fLimitTo;
String fDescription;
FileTextSearchScope fFileTextSearchScope;
IJavaSearchScope fJavaSearchScope;
/**
* Constructs SeamSearchScope object using a given {@link IJavaSearchScope}
*
* @param javaScope
* @param limitTo
*/
public SeamSearchScope(IJavaSearchScope javaScope, int limitTo) {
fJavaSearchScope = javaScope;
ProjectVisitor projectVisitor = new ProjectVisitor(fJavaSearchScope);
try {
ResourcesPlugin.getWorkspace().getRoot().accept(projectVisitor, 0);
}
catch (CoreException e) {
// e.printStackTrace();
SeamGuiPlugin.getPluginLog().logError(e);
}
IResource[] projects = projectVisitor.getProjects();
fFileTextSearchScope = FileTextSearchScope.newSearchScope(projects,
FILE_NAMES, true);
fDescription = getScopeDescription(projects);
fLimitTo = limitTo;
}
/**
* Constructs SeamSearchScope object using a given {@link IResources} set
*
* @param javaScope
* @param limitTo
*/
public SeamSearchScope(IResource[] resources, int limitTo) {
fFileTextSearchScope = FileTextSearchScope.newSearchScope(resources,
FILE_NAMES, true);
fDescription = getScopeDescription(resources);
fLimitTo = limitTo;
}
private String getScopeDescription(IResource[] resources) {
String description;
if (resources.length == 0) {
description= SeamCoreMessages.SeamSearchScope_scope_empty;
} else if (resources.length == 1) {
String label= SeamCoreMessages.SeamSearchScope_scope_single;
description= Messages.format(label, resources[0].getName());
} else if (resources.length == 2) {
String label= SeamCoreMessages.SeamSearchScope_scope_double;
description= Messages.format(label, new String[] { resources[0].getName(), resources[1].getName()});
} else {
String label= SeamCoreMessages.SeamSearchScope_scope_multiple;
description= Messages.format(label, new String[] { resources[0].getName(), resources[1].getName()});
}
return description;
}
/**
* Returns limitTo flag value
*/
public int getLimitTo() {
return fLimitTo;
}
@Override
public boolean contains(IResourceProxy proxy) {
return fFileTextSearchScope.contains(proxy);
}
/**
* Returns the file name pattern configured for this scope or <code>null</code> to match
* all file names.
*
* @return the file name pattern strings
*/
public String[] getFileNamePatterns() {
return fFileTextSearchScope.getFileNamePatterns();
}
/**
* Returns the description of the scope
*
* @return the description of the scope
*/
public String getDescription() {
return fDescription;
}
/**
* Returns the description of the scope
*
* @return the description of the scope
*/
public String getLimitToDescription() {
return SeamSearchEngine.isSearchForDeclarations(getLimitTo()) ?
SeamCoreMessages.SeamSearchScope_scope_LimitToDeclarations :
SeamCoreMessages.SeamSearchScope_scope_LimitToReferences;
}
/**
* Returns a description describing the file name patterns and content types.
*
* @return the description of the scope
*/
public String getFilterDescription() {
return fFileTextSearchScope.getFilterDescription();
}
/**
* Returns the resources that form the root. Roots can not contain each other. Root elements are only part of the
* scope if they are also accepted by {@link #contains(IResourceProxy)}.
*
* @return returns the set of root resources. The default behavior is to return the workspace root.
*/
public IResource[] getRoots() {
return fFileTextSearchScope.getRoots();
}
/**
* Evaluates all Seam Projects in this scope.
*
* @param status a {@link MultiStatus} to collect the error status that occurred while collecting resources.
* @return returns the files in the scope.
*/
public ISeamProject[] evaluateSeamProjectsInScope(MultiStatus status) {
IFile[] files = evaluateFilesInScope(status);
ArrayList<IProject> projects = new ArrayList<IProject>();
ArrayList<ISeamProject> seamProjects = new ArrayList<ISeamProject>();
for (int i = 0; files != null && i < files.length; i++) {
IProject project = (files[i] == null ? null : files[i].getProject());
if (project == null || projects.contains(project))
continue;
ISeamProject seamProject = SeamCorePlugin.getSeamProject(project, true);
if (seamProject != null && !seamProjects.contains(seamProject)) {
projects.add(project);
seamProjects.add(seamProject);
}
}
return (ISeamProject[]) seamProjects.toArray(new ISeamProject[seamProjects.size()]);
}
// visitor that retieves all the files for JavaScope in workspace
class ProjectVisitor implements IResourceProxyVisitor {
// hash map forces only one of each file
private HashMap fProjects = new HashMap();
IJavaSearchScope fScope = null;
public ProjectVisitor(IJavaSearchScope scope) {
this.fScope = scope;
}
public boolean visit(IResourceProxy proxy) throws CoreException {
if(SeamSearchEngine.getInstance().isCanceled())
return false;
if (proxy.getType() == IResource.PROJECT) {
IProject project = (IProject)proxy.requestResource();
fProjects.put(project.getParent().getFullPath(), project);
return true;
}
if (proxy.getType() == IResource.FILE) {
// don't search deeper for files
return false;
}
return true;
}
public IProject[] getProjects() {
return (IProject[]) fProjects.values().toArray(new IProject[fProjects.size()]);
}
}
/**
* (non-Javadoc)
* @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(java.lang.String)
*/
public boolean encloses(String resourcePath) {
return (fJavaSearchScope == null ? true : fJavaSearchScope.encloses(resourcePath));
}
/**
* (non-Javadoc)
* @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(org.eclipse.jdt.core.IJavaElement)
*/
public boolean encloses(IJavaElement element) {
return (fJavaSearchScope == null ? true : fJavaSearchScope.encloses(element));
}
/**
* (non-Javadoc)
* @see org.eclipse.jdt.core.search.IJavaSearchScope#enclosingProjectsAndJars()
*/
public IPath[] enclosingProjectsAndJars() {
return (fJavaSearchScope == null ? new IPath[0] : fJavaSearchScope.enclosingProjectsAndJars());
}
/**
* (non-Javadoc)
* @see org.eclipse.jdt.core.search.IJavaSearchScope#includesBinaries()
*/
public boolean includesBinaries() {
return (fJavaSearchScope == null ? true : fJavaSearchScope.includesBinaries());
}
/**
* (non-Javadoc)
* @see org.eclipse.jdt.core.search.IJavaSearchScope#includesClasspaths()
*/
public boolean includesClasspaths() {
return (fJavaSearchScope == null ? true : fJavaSearchScope.includesClasspaths());
}
/**
* (non-Javadoc)
* @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesBinaries(boolean)
*/
public void setIncludesBinaries(boolean includesBinaries) {
}
/**
* (non-Javadoc)
* @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesClasspaths(boolean)
*/
public void setIncludesClasspaths(boolean includesClasspaths) {
}
}