fix tests - add invokeAndWait

This commit is contained in:
Vladimir Krivosheev
2015-02-19 07:01:27 +01:00
parent a91b27c191
commit 1afa92e745
@@ -2,15 +2,12 @@ package com.intellij.compiler;
import com.intellij.compiler.server.BuildManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.application.impl.ApplicationImpl;
import com.intellij.openapi.components.*;
import com.intellij.openapi.components.impl.stores.ComponentStoreImpl;
import com.intellij.openapi.components.impl.stores.StateStorageManager;
import com.intellij.openapi.components.impl.stores.StoreUtil;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
@@ -20,24 +17,7 @@ import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.util.JDOMExternalizable;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.NamedJDOMExternalizable;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess;
import com.intellij.util.SystemProperties;
import junit.framework.AssertionFailedError;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.serialization.JDomSerializationUtil;
import org.junit.Assert;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@@ -61,80 +41,27 @@ public class CompilerTestUtil {
}
public static void saveApplicationSettings() {
saveApplicationComponent(ProjectJdkTable.getInstance());
saveApplicationComponent(FileTypeManager.getInstance());
ApplicationManager.getApplication().invokeAndWait(new Runnable() {
@Override
public void run() {
doSaveComponent(ProjectJdkTable.getInstance());
doSaveComponent(FileTypeManager.getInstance());
}
}, ModalityState.any());
}
public static void saveApplicationComponent(Object appComponent) {
//noinspection ConstantConditions
if (true) {
//noinspection TestOnlyProblems
((ComponentStoreImpl)((ApplicationImpl)ApplicationManager.getApplication()).getStateStore()).saveApplicationComponent(appComponent);
}
try {
final File file;
String componentName;
State state = StoreUtil.getStateSpec(appComponent.getClass());
if (state != null) {
componentName = state.name();
Storage storageToWrite = findNonDeprecated(state.storages());
StateStorageManager storageManager = ((ApplicationImpl)ApplicationManager.getApplication()).getStateStore().getStateStorageManager();
file = new File(storageManager.expandMacros(storageToWrite.file()));
public static void saveApplicationComponent(final Object appComponent) {
ApplicationManager.getApplication().invokeAndWait(new Runnable() {
@Override
public void run() {
doSaveComponent(appComponent);
}
else if (appComponent instanceof ExportableApplicationComponent && appComponent instanceof NamedJDOMExternalizable) {
componentName = ((ExportableApplicationComponent)appComponent).getComponentName();
file = PathManager.getOptionsFile((NamedJDOMExternalizable)appComponent);
}
else {
throw new AssertionError( appComponent.getClass() + " doesn't have @State annotation and doesn't implement ExportableApplicationComponent");
}
final Element root = new Element("application");
Element element = JDomSerializationUtil.createComponentElement(componentName);
if (appComponent instanceof JDOMExternalizable) {
((JDOMExternalizable)appComponent).writeExternal(element);
}
else {
//noinspection unchecked
element.addContent(((PersistentStateComponent<Element>)appComponent).getState().cloneContent());
}
root.addContent(element);
Assert.assertTrue("Cannot create " + file, FileUtil.createIfDoesntExist(file));
new WriteAction() {
@Override
protected void run(@NotNull final Result result) throws IOException {
VfsRootAccess.allowRootAccess(file.getAbsolutePath());
try {
VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file);
Assert.assertNotNull(file.getAbsolutePath(), virtualFile);
//emulate save via 'saveSettings' so file won't be treated as changed externally
OutputStream stream = virtualFile.getOutputStream(new SaveSessionRequestor());
try {
JDOMUtil.writeParent(root, stream, SystemProperties.getLineSeparator());
}
finally {
stream.close();
}
}
finally {
VfsRootAccess.disallowRootAccess(file.getAbsolutePath());
}
}
}.execute().throwException();
}
catch (WriteExternalException e) {
throw new RuntimeException(e);
}
}, ModalityState.any());
}
private static Storage findNonDeprecated(Storage[] storages) {
for (Storage storage : storages) {
if (!storage.deprecated()) {
return storage;
}
}
throw new AssertionFailedError("All storages are deprecated");
private static void doSaveComponent(Object appComponent) {
//noinspection TestOnlyProblems
((ComponentStoreImpl)((ApplicationImpl)ApplicationManager.getApplication()).getStateStore()).saveApplicationComponent(appComponent);
}
public static void enableExternalCompiler() {
@@ -171,10 +98,4 @@ public class CompilerTestUtil {
}
}.execute();
}
private static class SaveSessionRequestor implements StateStorage.SaveSession {
@Override
public void save() {
}
}
}