/*******************************************************************************
* Copyright (c) 2007, 2010 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.junit.ui;
import java.util.ArrayList;
import org.eclipse.swt.graphics.Image;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.NullChange;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.junit.JUnitCorePlugin;
import org.eclipse.jdt.internal.junit.buildpath.BuildPathSupport;
import org.eclipse.jdt.internal.junit.util.JUnitStubUtility;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.text.java.ClasspathFixProcessor;
public class JUnitClasspathFixProcessor extends ClasspathFixProcessor {
private static class JUnitClasspathFixProposal extends ClasspathFixProposal {
private final boolean fIsJunit4;
private final int fRelevance;
private final IJavaProject fProject;
public JUnitClasspathFixProposal(IJavaProject project, boolean isJunit4, int relevance) {
fProject= project;
fIsJunit4= isJunit4;
fRelevance= relevance;
}
@Override
public String getAdditionalProposalInfo() {
if (fIsJunit4) {
return JUnitMessages.JUnitAddLibraryProposal_junit4_info;
}
return JUnitMessages.JUnitAddLibraryProposal_info;
}
@Override
public Change createChange(IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor= new NullProgressMonitor();
}
monitor.beginTask(JUnitMessages.JUnitClasspathFixProcessor_progress_desc, 1);
try {
IClasspathEntry entry= null;
if (fIsJunit4) {
entry= BuildPathSupport.getJUnit4ClasspathEntry();
} else {
entry= BuildPathSupport.getJUnit3ClasspathEntry();
}
IClasspathEntry[] oldEntries= fProject.getRawClasspath();
ArrayList<IClasspathEntry> newEntries= new ArrayList<>(oldEntries.length + 1);
boolean added= false;
for (int i= 0; i < oldEntries.length; i++) {
IClasspathEntry curr= oldEntries[i];
if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
IPath path= curr.getPath();
if (path.equals(entry.getPath())) {
return new NullChange(); // already on build path
} else if (path.matchingFirstSegments(entry.getPath()) > 0) {
if (!added) {
curr= entry; // replace
added= true;
} else {
curr= null;
}
}
} else if (curr.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
IPath path= curr.getPath();
if (path.segmentCount() > 0 && JUnitCorePlugin.JUNIT_HOME.equals(path.segment(0))) {
if (!added) {
curr= entry; // replace
added= true;
} else {
curr= null;
}
}
}
if (curr != null) {
newEntries.add(curr);
}
}
if (!added) {
newEntries.add(entry);
}
final IClasspathEntry[] newCPEntries= newEntries.toArray(new IClasspathEntry[newEntries.size()]);
Change newClasspathChange= newClasspathChange(fProject, newCPEntries, fProject.getOutputLocation());
if (newClasspathChange != null) {
return newClasspathChange;
}
} finally {
monitor.done();
}
return new NullChange();
}
@Override
public String getDisplayString() {
if (fIsJunit4) {
return JUnitMessages.JUnitAddLibraryProposa_junit4_label;
}
return JUnitMessages.JUnitAddLibraryProposal_label;
}
@Override
public Image getImage() {
return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
}
@Override
public int getRelevance() {
return fRelevance;
}
}
private static final int JUNIT3= 1;
private static final int JUNIT4= 2;
@Override
public ClasspathFixProposal[] getFixImportProposals(IJavaProject project, String missingType) throws CoreException {
String s= missingType;
int res= 0;
if (s.startsWith("org.junit.")) { //$NON-NLS-1$
res= JUNIT4;
} else if (s.equals("TestCase") || s.equals("TestSuite") || s.startsWith("junit.")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
res= JUNIT3;
} else if (s.equals("Test")) { //$NON-NLS-1$
res= JUNIT3 | JUNIT4;
} else if (s.equals("RunWith")) { //$NON-NLS-1$
res= JUNIT4;
}
if (res != 0) {
ArrayList<JUnitClasspathFixProposal> proposals= new ArrayList<>();
if ((res & JUNIT4) != 0 && JUnitStubUtility.is50OrHigher(project)) {
proposals.add(new JUnitClasspathFixProposal(project, true, 15));
}
if ((res & JUNIT3) != 0) {
proposals.add(new JUnitClasspathFixProposal(project, false, 15));
}
return proposals.toArray(new ClasspathFixProposal[proposals.size()]);
}
return null;
}
}