package jetbrains.mps.ide.vcs.test.merge;
/*Generated by MPS */
import com.intellij.openapi.project.Project;
import jetbrains.mps.ide.platform.watching.ReloadManager;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.FileStatusManager;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import com.intellij.openapi.vcs.FileStatusListener;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
import com.intellij.openapi.vcs.changes.ChangeListManagerImpl;
import jetbrains.mps.vcs.changesmanager.CurrentDifferenceRegistry;
import jetbrains.mps.ide.platform.watching.ReloadListener;
public class ChangesManagerTestWaitHelper {
private boolean myWaitCompleted = true;
private final Object myWaitLock = new Object();
private Project myProject;
private Runnable myAfterReloadTask;
private ChangesManagerTestWaitHelper.MyReloadListener myReloadListener = new ChangesManagerTestWaitHelper.MyReloadListener();
public ChangesManagerTestWaitHelper(Project p) {
myProject = p;
ReloadManager.getInstance().addReloadListener(this.myReloadListener);
}
public void dispose() {
ReloadManager.getInstance().removeReloadListener(myReloadListener);
}
public void waitForFileStatusChange(@NotNull final VirtualFile file, @NotNull final FileStatus expectedFileStatus) {
final FileStatusManager fsm = FileStatusManager.getInstance(myProject);
waitForSomething(new Runnable() {
public void run() {
final Wrappers._T<FileStatusListener> listener = new Wrappers._T<FileStatusListener>();
final _FunctionTypes._void_P0_E0 stopIfNeeded = new _FunctionTypes._void_P0_E0() {
public void invoke() {
if (expectedFileStatus == fsm.getStatus(file)) {
fsm.removeFileStatusListener(listener.value);
// Wait until changes manager is notified about changed file status
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
waitCompleted();
}
}
};
listener.value = new FileStatusListener() {
@Override
public void fileStatusesChanged() {
stopIfNeeded.invoke();
}
@Override
public void fileStatusChanged(@NotNull VirtualFile f) {
stopIfNeeded.invoke();
}
};
fsm.addFileStatusListener(listener.value);
VcsDirtyScopeManager.getInstance(myProject).fileDirty(file);
ChangeListManagerImpl.getInstanceImpl(myProject).scheduleUpdate();
stopIfNeeded.invoke();
}
});
}
public void waitForChangesManager() {
waitForSomething(new Runnable() {
public void run() {
CurrentDifferenceRegistry.getInstance(myProject).getCommandQueue().addTask(new Runnable() {
public void run() {
waitCompleted();
}
});
}
});
}
public void waitForReloadFinished() {
waitForSomething(new Runnable() {
public void run() {
synchronized (ChangesManagerTestWaitHelper.this) {
myAfterReloadTask = new Runnable() {
public void run() {
synchronized (ChangesManagerTestWaitHelper.this) {
myAfterReloadTask = null;
}
waitCompleted();
}
};
}
}
});
}
private void waitForSomething(Runnable waitScheduling) {
synchronized (myWaitLock) {
assert myWaitCompleted;
myWaitCompleted = false;
waitScheduling.run();
while (!(myWaitCompleted)) {
try {
myWaitLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private void waitCompleted() {
synchronized (myWaitLock) {
assert !(myWaitCompleted);
myWaitCompleted = true;
myWaitLock.notify();
}
}
private class MyReloadListener implements ReloadListener {
public MyReloadListener() {
}
@Override
public void reloadStarted() {
}
@Override
public void reloadFinished() {
synchronized (this) {
check_6valm7_a0a0a2w(myAfterReloadTask);
}
}
}
private static void check_6valm7_a0a0a2w(Runnable checkedDotOperand) {
if (null != checkedDotOperand) {
checkedDotOperand.run();
}
}
}