/*******************************************************************************
* Copyright (c) 2015 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.batch.ui.participants;
import java.util.Collection;
import java.util.HashSet;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
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.search.ui.text.Match;
import org.jboss.tools.batch.core.BatchConstants;
import org.jboss.tools.batch.core.IBatchArtifact;
import org.jboss.tools.batch.core.IBatchProject;
import org.jboss.tools.batch.core.IBatchProperty;
import org.jboss.tools.batch.internal.core.impl.BatchProject;
import org.jboss.tools.batch.internal.core.impl.BatchProjectFactory;
import org.jboss.tools.batch.internal.core.impl.BatchUtil;
import org.jboss.tools.common.text.ITextSourceReference;
public class BatchArtifactSearchParticipant implements IQueryParticipant {
@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();
BatchProject batchProject = (BatchProject) BatchProjectFactory.getBatchProjectWithProgress(project);
if (batchProject == null) {
return;
}
if (containsInSearchScope(querySpecification, project.getFullPath())) {
searchInProject(requestor, querySpecification, batchProject, monitor, element);
}
BatchProject[] projects = batchProject.getAllDependentProjects(true);
for (BatchProject p : projects) {
if (containsInSearchScope(querySpecification, p.getProject().getFullPath())) {
searchInProject(requestor, querySpecification, p, monitor, element);
}
}
}
}
private static boolean containsInSearchScope(QuerySpecification querySpecification, IPath projectPath) {
IJavaSearchScope searchScope = querySpecification.getScope();
if (searchScope == null)
return true;
IPath[] paths = searchScope.enclosingProjectsAndJars();
for (IPath path : paths) {
if (path.equals(projectPath))
return true;
}
return false;
}
private void searchInProject(ISearchRequestor requestor, QuerySpecification querySpecification,
IBatchProject batchProject, IProgressMonitor monitor, IJavaElement element) {
int worked = 0;
monitor.beginTask(BatchParticipantMessages.Searching_For_Batch_Artifacts_References, batchProject
.getDeclaredBatchJobs().size());
Collection<ITextSourceReference> references = new HashSet<ITextSourceReference>();
if (element instanceof IType) {
IType type = (IType) element;
IBatchArtifact artifact = batchProject.getArtifact(type);
if (artifact != null) {
for (IFile file : batchProject.getDeclaredBatchJobs()) {
if (monitor.isCanceled()) {
return;
}
references.addAll(BatchUtil.getAttributeReferences(file, BatchConstants.ATTR_REF,
artifact.getName()));
monitor.worked(++worked);
}
} else {
for (IFile file : batchProject.getDeclaredBatchJobs()) {
if (monitor.isCanceled()) {
return;
}
references.addAll(BatchUtil.getAttributeReferences(file, BatchConstants.ATTR_CLASS,
type.getFullyQualifiedName()));
monitor.worked(++worked);
}
}
} else if (element instanceof IField) {
IField field = (IField) element;
IType type = field.getDeclaringType();
IBatchArtifact artifact = batchProject.getArtifact(type);
if (artifact != null) {
for (IBatchProperty property : artifact.getProperties()) {
if (property.getField().equals(field)) {
for (IFile file : batchProject.getDeclaredBatchJobs()) {
if (monitor.isCanceled()) {
return;
}
references.addAll(BatchUtil.getPropertyAttributeReferences(file, artifact.getName(),
property.getPropertyName()));
monitor.worked(++worked);
}
}
}
}
}
for (ITextSourceReference reference : references) {
Match match = new Match((IFile) reference.getResource(), reference.getStartPosition(),
reference.getLength());
requestor.reportMatch(match);
}
monitor.done();
}
@Override
public int estimateTicks(QuerySpecification specification) {
return 500;
}
@Override
public IMatchPresentation getUIParticipant() {
return null;
}
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;
}
}