org.jboss.tools.cdi.ui.search.CDIBeanQueryParticipant.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.cdi.ui.search.CDIBeanQueryParticipant.java

Source

/*******************************************************************************
 * Copyright (c) 2011 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.cdi.ui.search;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.search.ElementQuerySpecification;
import org.eclipse.jdt.ui.search.IMatchPresentation;
import org.eclipse.jdt.ui.search.IQueryParticipant;
import org.eclipse.jdt.ui.search.ISearchRequestor;
import org.eclipse.jdt.ui.search.QuerySpecification;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.search.ui.text.Match;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PartInitException;
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.CDICorePlugin;
import org.jboss.tools.cdi.core.CDIImages;
import org.jboss.tools.cdi.core.IBean;
import org.jboss.tools.cdi.core.ICDIElement;
import org.jboss.tools.cdi.core.ICDIProject;
import org.jboss.tools.cdi.core.IInjectionPoint;
import org.jboss.tools.cdi.core.util.BeanPresentationUtil;
import org.jboss.tools.cdi.ui.CDIUIMessages;
import org.jboss.tools.cdi.ui.CDIUIPlugin;
import org.jboss.tools.common.java.IParametedType;

public class CDIBeanQueryParticipant implements IQueryParticipant {
    static CDIBeanLabelProvider labelProvider = new CDIBeanLabelProvider();

    @Override
    public void search(ISearchRequestor requestor, QuerySpecification querySpecification, IProgressMonitor monitor)
            throws CoreException {
        if (querySpecification instanceof ElementQuerySpecification) {
            if (!isSearchForReferences(querySpecification.getLimitTo())) {
                return;
            }

            ElementQuerySpecification qs = (ElementQuerySpecification) querySpecification;
            IJavaElement element = qs.getElement();
            IProject project = element.getJavaProject().getProject();

            ICDIProject cdiProject = CDICorePlugin.getCDIProject(project, true);

            if (cdiProject == null) {
                return;
            }

            searchInProject(requestor, querySpecification, cdiProject, monitor, element);

            CDICoreNature[] natures = cdiProject.getNature().getAllDependentProjects(true);
            for (CDICoreNature nature : natures) {
                ICDIProject p = nature.getDelegate();
                if (p != null) {
                    searchInProject(requestor, querySpecification, p, monitor, element);
                }
            }

        }
    }

    private void searchInProject(ISearchRequestor requestor, QuerySpecification querySpecification,
            ICDIProject cdiProject, IProgressMonitor monitor, IJavaElement element) {
        Collection<IBean> sourceBeans = cdiProject.getBeans(element);

        Set<IInjectionPoint> injectionPoints = new HashSet<IInjectionPoint>();
        for (IBean b : sourceBeans) {
            for (IParametedType t : b.getLegalTypes()) {
                injectionPoints.addAll(cdiProject.getInjections(t.getType().getFullyQualifiedName()));
            }
        }

        monitor.beginTask(CDIUIMessages.CDI_BEAN_QUERY_PARTICIPANT_TASK, injectionPoints.size());

        for (IInjectionPoint injectionPoint : injectionPoints) {
            if (monitor.isCanceled())
                break;
            Collection<IBean> resultBeans = cdiProject.getBeans(false, injectionPoint);
            monitor.worked(1);

            for (IBean cBean : resultBeans) {
                if (sourceBeans.contains(cBean)
                        && InjectionPointQueryParticipant.containsInSearchScope(querySpecification, cBean)) {
                    Match match = new CDIMatch(injectionPoint);
                    requestor.reportMatch(match);
                    break;
                }
            }
        }
        monitor.done();

    }

    public boolean isSearchForReferences(int limitTo) {
        int maskedLimitTo = limitTo
                & ~(IJavaSearchConstants.IGNORE_DECLARING_TYPE + IJavaSearchConstants.IGNORE_RETURN_TYPE);
        if (maskedLimitTo == IJavaSearchConstants.REFERENCES
                || maskedLimitTo == IJavaSearchConstants.ALL_OCCURRENCES) {
            return true;
        }

        return false;
    }

    @Override
    public int estimateTicks(QuerySpecification specification) {
        return 10;
    }

    @Override
    public IMatchPresentation getUIParticipant() {
        return new CDIBeanMatchPresentation();
    }

    class CDIBeanMatchPresentation implements IMatchPresentation {

        @Override
        public ILabelProvider createLabelProvider() {
            return labelProvider;
        }

        @Override
        public void showMatch(Match match, int currentOffset, int currentLength, boolean activate)
                throws PartInitException {
            if (match instanceof CDIMatch) {
                IJavaElement element = ((CDIMatch) match).getJavaElement();
                if (element != null) {
                    try {
                        JavaUI.openInEditor(element);
                    } catch (JavaModelException ex) {
                        CDIUIPlugin.getDefault().logError(ex);
                    } catch (PartInitException ex) {
                        CDIUIPlugin.getDefault().logError(ex);
                    }
                }
            }

        }

    }

    static class CDIBeanLabelProvider implements ILabelProvider {

        @Override
        public void addListener(ILabelProviderListener listener) {
        }

        @Override
        public void dispose() {
        }

        @Override
        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        @Override
        public void removeListener(ILabelProviderListener listener) {
        }

        @Override
        public Image getImage(Object element) {
            if (element instanceof CDIElementWrapper) {
                return CDIImages.getImageByElement(((CDIElementWrapper) element).getCDIElement());
            }
            return CDIImages.getImage(CDIImages.WELD_IMAGE);
        }

        @Override
        public String getText(Object element) {
            if (element instanceof CDIElementWrapper) {
                ICDIElement cdiElement = ((CDIElementWrapper) element).getCDIElement();
                String kind = BeanPresentationUtil.getCDIElementKind(cdiElement);
                String text = "";
                if (kind != null) {
                    text = kind + " ";
                }
                return text + cdiElement.getElementName()
                        + BeanPresentationUtil.getCDIElementLocation(cdiElement, false);
            }
            return ""; //$NON-NLS-1$
        }
    }
}