org.jboss.tools.seam.ui.search.SeamSearchScope.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.seam.ui.search.SeamSearchScope.java

Source

/*******************************************************************************
 * 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) {
    }

}