From e1cf81a6b90523a377792c4daf0c2d874b38a3be Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 21 Mar 2012 17:42:48 +0100 Subject: [PATCH] testng incompatibility warnings and ability to change the jar from the notification (cherry picked from commit 2e592a0) --- .../updateSettings/impl/PluginDownloader.java | 8 +-- .../configuration/TestNGVersionChecker.java | 62 +++++++++++-------- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginDownloader.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginDownloader.java index 75a7c922e459..5c91df5975d4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginDownloader.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/PluginDownloader.java @@ -29,7 +29,6 @@ import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.BuildNumber; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.VirtualFileSystem; @@ -151,13 +150,13 @@ public class PluginDownloader { return true; } - public static void replaceLib(String libPath, String libName, VirtualFile fromFile) throws IOException { + public static void replaceLib(String libPath, String libName, File fromFile) throws IOException { final File source = new File(libPath, libName); StartupActionScriptManager.ActionCommand deleteOld = new StartupActionScriptManager.DeleteCommand(source); StartupActionScriptManager.addActionCommand(deleteOld); - StartupActionScriptManager.ActionCommand addNew = new StartupActionScriptManager.CopyCommand(VfsUtil.virtualToIoFile(fromFile), source); + StartupActionScriptManager.ActionCommand addNew = new StartupActionScriptManager.CopyCommand(fromFile, source); StartupActionScriptManager.addActionCommand(addNew); } @@ -329,8 +328,7 @@ public class PluginDownloader { if (fileName == null || !PathUtil.isValidFileName(fileName)) { FileUtil.delete(file); - LOG.warn("Invalid file name (header=" + contentDisposition + "; url=" + connection.getURL() + "; name=" + fileName + ")"); - throw new IOException("Invalid filename returned by the server"); + throw new IOException("Invalid filename returned by a server"); } return fileName; diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGVersionChecker.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGVersionChecker.java index d43ade482b77..76c7e718bef7 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGVersionChecker.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGVersionChecker.java @@ -28,10 +28,7 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.updateSettings.impl.PluginDownloader; -import com.intellij.openapi.vfs.JarFileSystem; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileSystem; +import com.intellij.openapi.vfs.*; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; @@ -63,39 +60,52 @@ public class TestNGVersionChecker { final PsiClass psiProtocolClass = JavaPsiFacade.getInstance(project).findClass(protocolClassMessageClass, scope); if (psiProtocolClass != null) { final String instanceFieldName = "m_instanceName"; + try { + final boolean userHasNewJar = psiProtocolClass.findFieldByName(instanceFieldName, false) != null; + + boolean ideaHasNewJar = true; + final Class aClass = Class.forName(protocolClassMessageClass); + try { + aClass.getDeclaredField(instanceFieldName); + } + catch (NoSuchFieldException e) { + ideaHasNewJar = false; + } + + if (userHasNewJar != ideaHasNewJar) { + return getIncompatibilityMessage(project, scope, pathToBundledJar); + } + } + catch (Exception ignore) { + } + } + return null; + } + + @Nullable + private static String getIncompatibilityMessage(Project project, GlobalSearchScope scope, String pathToBundledJar) { + final String protocolClassMessageClass = TestResultMessage.class.getName(); + final PsiClass psiProtocolClass = JavaPsiFacade.getInstance(project).findClass(protocolClassMessageClass, scope); + if (psiProtocolClass != null) { final ZipFile workingLibrary = getZipLibrary(project, scope); if (workingLibrary != null) { final VirtualFile bundledJar = LocalFileSystem.getInstance().findFileByPath(pathToBundledJar); if (bundledJar != null) { final String jarVersion = JarVersionDetectionUtil.detectJarVersion(workingLibrary); - final JarFileSystem jarFileSystem = JarFileSystem.getInstance(); - final VirtualFile bundledJarJar = jarFileSystem.getJarRootForLocalFile(bundledJar); + final VirtualFile bundledJarJar = JarFileSystem.getInstance().getJarRootForLocalFile(bundledJar); if (bundledJarJar == null) return null; String bundledVersion; try { - bundledVersion = JarVersionDetectionUtil.detectJarVersion(jarFileSystem.getJarFile(bundledJarJar)); + bundledVersion = JarVersionDetectionUtil.detectJarVersion(JarFileSystem.getInstance().getJarFile(bundledJarJar)); } catch (IOException e) { return null; } - final String incompatibilityMessage = TEST_NG_VERSIONS_INCOMPATIBILITY + - "Right now " + ApplicationNamesInfo.getInstance().getFullProductName() + - " does not support testng version (v." + jarVersion + ") used in your project due to the protocol changes on the TestNG side.
" + - "Bundled jar (v." + bundledVersion + ") was used instead to run your tests.
" + COPY_MESSAGE; - try { - final Class aClass = Class.forName(protocolClassMessageClass); - aClass.getDeclaredField(instanceFieldName); - if (psiProtocolClass.findFieldByName(instanceFieldName, false) == null) { - return incompatibilityMessage; - } - } - catch (NoSuchFieldException e) { - if (psiProtocolClass.findFieldByName(instanceFieldName, false) != null) { - return incompatibilityMessage; - } - } - catch (Exception ignore) { - } + return TEST_NG_VERSIONS_INCOMPATIBILITY + + "Right now " + ApplicationNamesInfo.getInstance().getFullProductName() + + " does not support testng version (v." + jarVersion + ") used in your project due to the protocol changes on the TestNG side.
" + + "Bundled jar (v." + bundledVersion + ") was used instead to run your tests.
" + + COPY_MESSAGE; } } } @@ -162,7 +172,7 @@ public class TestNGVersionChecker { if (library != null) { try { final String jarName = new File(PathUtil.getJarPathForClass(AfterClass.class)).getName(); - PluginDownloader.replaceLib(testNGPluginLibPath, jarName, library); + PluginDownloader.replaceLib(testNGPluginLibPath, jarName, VfsUtil.virtualToIoFile(library)); final Application app = ApplicationManager.getApplication(); final String updateSuccessfullyMessage = "Internal testng.jar was successfully updated. "; if (app.isRestartCapable()) {