import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.util.io.FileUtilRt;
-import com.intellij.util.io.DataExternalizer;
-import com.intellij.util.io.EnumeratorStringDescriptor;
-import com.intellij.util.io.PersistentEnumeratorBase;
-import com.intellij.util.io.PersistentHashMap;
+import com.intellij.openapi.vfs.newvfs.persistent.FlushingDaemon;
+import com.intellij.util.io.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.Date;
+import java.util.concurrent.ScheduledFuture;
/**
* @author Dmitry Avdeev
private static final Logger LOG = Logger.getInstance(TestStateStorage.class);
private PersistentHashMap<String, Record> myMap;
+ private volatile ScheduledFuture<?> myMapFlusher;
public static TestStateStorage getInstance(@NotNull Project project) {
return ServiceManager.getService(project, TestStateStorage.class);
FileUtilRt.createParentDirs(file);
try {
myMap = create(file);
- }
- catch (PersistentEnumeratorBase.CorruptedException e) {
- PersistentHashMap.deleteFilesStartingWith(file);
- try {
- myMap = create(file);
- }
- catch (IOException e1) {
- LOG.error(e1);
- }
- }
- catch (IOException e) {
+ } catch (IOException e) {
LOG.error(e);
}
+ myMapFlusher = FlushingDaemon.everyFiveSeconds(new Runnable() {
+ @Override
+ public void run() {
+ if (myMapFlusher == null) return; // disposed
+ if (myMap != null && myMap.isDirty()) myMap.force();
+ }
+ });
Disposer.register(project, this);
}
@NotNull
- private static PersistentHashMap<String, Record> create(File file) throws IOException {
- return new PersistentHashMap<String, Record>(file, new EnumeratorStringDescriptor(), new DataExternalizer<Record>() {
- @Override
- public void save(@NotNull DataOutput out, Record value) throws IOException {
- out.writeInt(value.magnitude);
- out.writeLong(value.date.getTime());
- }
-
+ private static PersistentHashMap<String, Record> create(final File file) throws IOException {
+ return IOUtil.openCleanOrResetBroken(new ThrowableComputable<PersistentHashMap<String, Record>, IOException>() {
@Override
- public Record read(@NotNull DataInput in) throws IOException {
- return new Record(in.readInt(), new Date(in.readLong()));
+ public PersistentHashMap<String, Record> compute() throws IOException {
+ return new PersistentHashMap<String, Record>(file, new EnumeratorStringDescriptor(), new DataExternalizer<Record>() {
+ @Override
+ public void save(@NotNull DataOutput out, Record value) throws IOException {
+ out.writeInt(value.magnitude);
+ out.writeLong(value.date.getTime());
+ }
+
+ @Override
+ public Record read(@NotNull DataInput in) throws IOException {
+ return new Record(in.readInt(), new Date(in.readLong()));
+ }
+ });
}
- });
+ }, file);
}
@Nullable
@Override
public synchronized void dispose() {
+ myMapFlusher.cancel(false);
+ myMapFlusher = null;
try {
myMap.close();
}