/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkModificator; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.impl.ProjectRootManagerImpl; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import gw.fs.IDirectory; import gw.lang.reflect.TypeSystem; import gw.lang.reflect.module.IJreModule; import gw.lang.reflect.module.IModule; import gw.plugin.ij.core.PluginLoaderUtil; import gw.plugin.ij.framework.GosuTestCase; import gw.plugin.ij.sdk.GosuSdkAdditionalData; import gw.plugin.ij.sdk.GosuSdkUtils; import gw.plugin.ij.util.ExecutionUtil; import gw.plugin.ij.util.SafeRunnable; import gw.plugin.ij.util.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.net.MalformedURLException; import java.util.List; public class SDKModificationTest extends GosuTestCase { IModule oldRootModule; protected boolean runInDispatchThread() { return false; } public void before() { oldRootModule = TypeSystem.getGlobalModule(); } private void after() { TypeSystem.pushModule(oldRootModule); } public void testChangingToNewSdkWorks() throws InterruptedException { before(); try { assertTrue(PluginLoaderUtil.instance(getProject()).isStarted()); final Sdk gosuSdk = GosuSdkUtils.getDefaultGosuSdk(); final GosuSdkAdditionalData sdkAdditionalData = (GosuSdkAdditionalData) gosuSdk.getSdkAdditionalData(); final Sdk javaSdk = sdkAdditionalData.getJavaSdk(); setSDK(javaSdk); assertTrue(PluginLoaderUtil.instance(getProject()).isStarted()); assertEquals(javaSdk, ((IJreModule)TypeSystem.getExecutionEnvironment( PluginLoaderUtil.getFrom( getProject() ) ).getJreModule()).getNativeSDK()); setSDK(gosuSdk); } finally { after(); } } public void testModifitingTheSdkWorks() throws InterruptedException, MalformedURLException { before(); try { final List<IDirectory> cp1 = TypeSystem.getExecutionEnvironment( PluginLoaderUtil.getFrom( getProject() ) ).getJreModule().getJavaClassPath(); assertTrue(PluginLoaderUtil.instance(getProject()).isStarted()); String addedJar = modifySDK(); assertTrue(PluginLoaderUtil.instance(getProject()).isStarted()); final List<IDirectory> cp2 = TypeSystem.getExecutionEnvironment( PluginLoaderUtil.getFrom( getProject() ) ).getJreModule().getJavaClassPath(); assertEquals(1, cp2.size() - cp1.size()); cp2.removeAll(cp1); assertEquals(cp2.get(0), addedJar); } finally { after(); } } // private @NotNull String modifySDK() throws InterruptedException { final GosuSdkAdditionalData sdkAdditionalData = (GosuSdkAdditionalData) GosuSdkUtils.getDefaultGosuSdk().getSdkAdditionalData(); final Sdk javaSdk = sdkAdditionalData.getJavaSdk(); final String jar = javaSdk.getHomePath() + File.separator + "lib" + File.separator + "htmlconverter.jar"; ExecutionUtil.execute(ExecutionUtil.WRITE | ExecutionUtil.DISPATCH | ExecutionUtil.BLOCKING, new SafeRunnable() { public void execute() { try { final SdkModificator sdkModificator = GosuSdkUtils.getDefaultGosuSdk().getSdkModificator(); VirtualFile file = VfsUtil.findFileByURL(new File(jar).toURL()); if (file == null) { throw new IllegalStateException("Cannot find htmlconverter.jar!"); } sdkModificator.addRoot(file, OrderRootType.CLASSES); sdkModificator.commitChanges(); } catch (MalformedURLException e) { throw new RuntimeException(e); } } }); Thread.sleep(5000); UIUtil.settleModalEventQueue(); return jar; } @Nullable Sdk setSDK(final Sdk sdk) throws InterruptedException { final ProjectRootManager instance = ProjectRootManagerImpl.getInstance(getProject()); final Sdk oldSDK = instance.getProjectSdk(); ExecutionUtil.execute(ExecutionUtil.WRITE | ExecutionUtil.DISPATCH | ExecutionUtil.BLOCKING, new SafeRunnable() { public void execute() { instance.setProjectSdk(sdk); } }); Thread.sleep(5000); UIUtil.settleModalEventQueue(); return oldSDK; } }