Java tutorial
/******************************************************************************* * 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$ } } }