package org.testng.eclipse.ui; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.util.BusyIndicatorRunnableContext; import org.eclipse.jdt.ui.ISharedImages; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jdt.ui.text.java.IInvocationContext; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.testng.eclipse.buildpath.BuildPathSupport; import org.testng.eclipse.util.ResourceUtil; public class TestNGAddLibraryProposal implements IJavaCompletionProposal { private IInvocationContext invocationContext; private boolean importTestNGAnnotationPackage; private int relevance; public TestNGAddLibraryProposal(IInvocationContext context, int relevance) { this(context, relevance, false); } public TestNGAddLibraryProposal(IInvocationContext context, int relevance, boolean alsoImportTestNGAnnotationPackage) { this.invocationContext = context; this.relevance = relevance; this.importTestNGAnnotationPackage = alsoImportTestNGAnnotationPackage; } public int getRelevance() { return relevance; } public void apply(IDocument document) { IJavaProject project = invocationContext.getCompilationUnit().getJavaProject(); IClasspathEntry entry = BuildPathSupport.getTestNGClasspathEntry(); if (entry != null) { Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); try { addToClasspath(shell, project, entry, new BusyIndicatorRunnableContext()); } catch (JavaModelException e) { ErrorDialog.openError(shell, ResourceUtil.getString("AddTestNGLibraryProposal.error"), //$NON-NLS-1$ ResourceUtil.getString("AddTestNGLibraryProposal.cannotAdd"), //$NON-NLS-1$ e.getStatus()); } } forceReconcile(document); } private void forceReconcile(IDocument document) { try { // force a reconcile int offset = invocationContext.getSelectionOffset(); int length = invocationContext.getSelectionLength(); String s = document.get(offset, length); document.replace(offset, length, s); } catch (BadLocationException e) { // ignore } } public String getAdditionalProposalInfo() { return ResourceUtil.getString("AddTestNGLibraryProposal.info"); //$NON-NLS-1$ } public IContextInformation getContextInformation() { return null; } public String getDisplayString() { return ResourceUtil.getString("AddTestNGLibraryProposal.label"); //$NON-NLS-1$ } public Image getImage() { return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY); } public Point getSelection(IDocument document) { // TODO Auto-generated method stub return null; } private static boolean addToClasspath(Shell shell, final IJavaProject project, IClasspathEntry entry, IRunnableContext context) throws JavaModelException { if (BuildPathSupport.projectContainsClasspathEntry(project, entry)) { // We don't need to add the TestNG Classpath Entry again return true; } IClasspathEntry[] oldEntries = project.getRawClasspath(); int nEntries = oldEntries.length; final IClasspathEntry[] newEntries = new IClasspathEntry[nEntries + 1]; System.arraycopy(oldEntries, 0, newEntries, 0, nEntries); newEntries[nEntries] = entry; try { context.run(true, false, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { project.setRawClasspath(newEntries, monitor); } catch (JavaModelException e) { throw new InvocationTargetException(e); } } }); return true; } catch (InvocationTargetException e) { Throwable t = e.getTargetException(); if (t instanceof CoreException) { ErrorDialog.openError(shell, ResourceUtil.getString("AddTestNGLibraryProposal.error"), //$NON-NLS-1$ ResourceUtil.getString("AddTestNGLibraryProposal.cannotAdd"), //$NON-NLS-1$ ((CoreException) t).getStatus()); } return false; } catch (InterruptedException e) { return false; } } }