/**
* This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details.
*/
package edu.illinois.codingspectator.refactoringproblems.logger;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaModelMarker;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation;
/**
*
* @author Balaji Ambresh Rajkumar
* @author Mohsen Vakilian
* @author nchen
* @author Stas Negara
*
*/
@SuppressWarnings("restriction")
public class ProblemsFinder {
Set<DefaultProblemWrapper> problems;
Set<ICompilationUnit> affectedCompilationUnits;
private final static Set<String> problemMarkersToReport;
static {
problemMarkersToReport= new HashSet<String>();
problemMarkersToReport.add(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);
}
/**
*
* This method is based on org.eclipse.jdt.internal.core.ICompilationUnit#reconcile(int, int,
* WorkingCopyOwner, IProgressMonitor)
*
* @param compilationUnit
* @throws JavaModelException
*/
@SuppressWarnings("unchecked")
private void computeProblems(ICompilationUnit compilationUnit) throws JavaModelException {
ReconcileWorkingCopyOperation op= new ReconcileWorkingCopyOperation(compilationUnit, ICompilationUnit.NO_AST, ICompilationUnit.FORCE_PROBLEM_DETECTION, DefaultWorkingCopyOwner.PRIMARY);
JavaModelManager manager= JavaModelManager.getJavaModelManager();
try {
manager.cacheZipFiles(this); // cache zip files for performance (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=134172)
op.runOperation(new NullProgressMonitor());
Map<String, CategorizedProblem[]> cuJavaProblems= op.problems;
problems.addAll(convertRepresentationOfProblems(cuJavaProblems));
} finally {
manager.flushZipFiles(this);
}
}
public Set<DefaultProblemWrapper> computeProblems(Set<ICompilationUnit> affectedCompilationUnits) throws JavaModelException {
this.affectedCompilationUnits= affectedCompilationUnits;
problems= new HashSet<DefaultProblemWrapper>();
for (ICompilationUnit compilationUnit : affectedCompilationUnits) {
if (compilationUnit.exists()) {
computeProblems(compilationUnit);
}
}
return problems;
}
private static Set<DefaultProblemWrapper> convertRepresentationOfProblems(Map<String, CategorizedProblem[]> cuJavaProblems) {
Set<DefaultProblemWrapper> convertedRepresentations= new HashSet<DefaultProblemWrapper>();
for (String problemMarker : cuJavaProblems.keySet()) {
if (problemMarkersToReport.contains(problemMarker)) {
CategorizedProblem[] defaultProblems= cuJavaProblems.get(problemMarker);
Set<DefaultProblemWrapper> convertedRepresentation= DefaultProblemWrapper.initializeFromArrays(problemMarker, defaultProblems);
convertedRepresentations.addAll(convertedRepresentation);
}
}
return convertedRepresentations;
}
}