blob: b03e35f2bbbcaf04dd7d28d83c8d437bb2bedf27 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.refactoring.nls.search;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.resources.IFile;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.text.AbstractTextSearchResult;
import org.eclipse.search.ui.text.Match;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchParticipant;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.internal.corext.refactoring.nls.NLSRefactoring;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.internal.corext.util.SearchUtils;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaUIStatus;
import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
public class NLSSearchQuery implements ISearchQuery {
private NLSSearchResult fResult;
private IJavaElement[] fWrapperClass;
private IFile[] fPropertiesFile;
private IJavaSearchScope fScope;
private String fScopeDescription;
public NLSSearchQuery(IJavaElement[] wrapperClass, IFile[] propertiesFile, IJavaSearchScope scope, String scopeDescription) {
fWrapperClass= wrapperClass;
fPropertiesFile= propertiesFile;
fScope= scope;
fScopeDescription= scopeDescription;
}
/*
* @see org.eclipse.search.ui.ISearchQuery#run(org.eclipse.core.runtime.IProgressMonitor)
*/
public IStatus run(IProgressMonitor monitor) {
monitor.beginTask("", 5 * fWrapperClass.length); //$NON-NLS-1$
try {
final AbstractTextSearchResult textResult= (AbstractTextSearchResult) getSearchResult();
textResult.removeAll();
AppearanceAwareLabelProvider labelProvider= new AppearanceAwareLabelProvider(JavaElementLabels.ALL_POST_QUALIFIED, 0);
for (int i= 0; i < fWrapperClass.length; i++) {
IJavaElement wrapperClass= fWrapperClass[i];
IFile propertieFile= fPropertiesFile[i];
if (! wrapperClass.exists())
return JavaUIStatus.createError(0, Messages.format(NLSSearchMessages.NLSSearchQuery_wrapperNotExists, wrapperClass.getElementName()), null);
if (! wrapperClass.exists())
return JavaUIStatus.createError(0, Messages.format(NLSSearchMessages.NLSSearchQuery_propertiesNotExists, propertieFile.getName()), null);
SearchPattern pattern= SearchPattern.createPattern(wrapperClass, IJavaSearchConstants.REFERENCES, SearchUtils.GENERICS_AGNOSTIC_MATCH_RULE);
SearchParticipant[] participants= new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()};
NLSSearchResultRequestor requestor= new NLSSearchResultRequestor(propertieFile, fResult);
try {
SearchEngine engine= new SearchEngine();
engine.search(pattern, participants, fScope, requestor, new SubProgressMonitor(monitor, 4));
requestor.reportUnusedPropertyNames(new SubProgressMonitor(monitor, 1));
ICompilationUnit compilationUnit= ((IType)wrapperClass).getCompilationUnit();
CompilationUnitEntry groupElement= new CompilationUnitEntry(Messages.format(NLSSearchMessages.NLSSearchResultCollector_unusedKeys, labelProvider.getText(compilationUnit)), compilationUnit);
boolean hasUnusedPropertie= false;
IField[] fields= ((IType)wrapperClass).getFields();
for (int j= 0; j < fields.length; j++) {
IField field= fields[j];
if (isNLSField(field)) {
ISourceRange sourceRange= field.getSourceRange();
if (sourceRange != null) {
String fieldName= field.getElementName();
if (!requestor.hasPropertyKey(fieldName)) {
fResult.addMatch(new Match(compilationUnit, sourceRange.getOffset(), sourceRange.getLength()));
}
if (!requestor.isUsedPropertyKey(fieldName)) {
hasUnusedPropertie= true;
fResult.addMatch(new Match(groupElement, sourceRange.getOffset(), sourceRange.getLength()));
}
}
}
}
if (hasUnusedPropertie)
fResult.addCompilationUnitGroup(groupElement);
} catch (CoreException e) {
JavaPlugin.log(e);
}
}
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
private boolean isNLSField(IField field) throws JavaModelException {
int flags= field.getFlags();
if (!Flags.isPublic(flags))
return false;
if (!Flags.isStatic(flags))
return false;
String fieldName= field.getElementName();
if (NLSRefactoring.BUNDLE_NAME.equals(fieldName))
return false;
if ("RESOURCE_BUNDLE".equals(fieldName)) //$NON-NLS-1$
return false;
return true;
}
/*
* @see org.eclipse.search.ui.ISearchQuery#getLabel()
*/
public String getLabel() {
return NLSSearchMessages.NLSSearchQuery_label;
}
public String getResultLabel(int nMatches) {
if (fWrapperClass.length == 1) {
if (nMatches == 1) {
String[] args= new String[] {fWrapperClass[0].getElementName(), fScopeDescription};
return Messages.format(NLSSearchMessages.SearchOperation_singularLabelPostfix, args);
}
String[] args= new String[] {fWrapperClass[0].getElementName(), String.valueOf(nMatches), fScopeDescription};
return Messages.format(NLSSearchMessages.SearchOperation_pluralLabelPatternPostfix, args);
} else {
if (nMatches == 1) {
return Messages.format(NLSSearchMessages.NLSSearchQuery_oneProblemInScope_description, fScopeDescription);
}
return Messages.format(NLSSearchMessages.NLSSearchQuery_xProblemsInScope_description, new Object[] {String.valueOf(nMatches), fScopeDescription});
}
}
/*
* @see org.eclipse.search.ui.ISearchQuery#canRerun()
*/
public boolean canRerun() {
return true;
}
/*
* @see org.eclipse.search.ui.ISearchQuery#canRunInBackground()
*/
public boolean canRunInBackground() {
return true;
}
/*
* @see org.eclipse.search.ui.ISearchQuery#getSearchResult()
*/
public ISearchResult getSearchResult() {
if (fResult == null)
fResult= new NLSSearchResult(this);
return fResult;
}
}