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