package com.intellij.javascript.karma.coverage;
import com.google.gson.JsonElement;
import com.intellij.javascript.karma.server.KarmaServer;
import com.intellij.javascript.karma.server.StreamEventHandler;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ObjectUtils;
import com.intellij.webcore.util.JsonUtil;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
/**
* @author Sergey Simonchik
*/
public class KarmaCoveragePeer {
private static final Logger LOG = Logger.getInstance(KarmaCoveragePeer.class);
private final File myCoverageTempDir;
private volatile KarmaCoverageSession myActiveCoverageSession;
public KarmaCoveragePeer() throws IOException {
myCoverageTempDir = FileUtil.createTempDirectory("karma-intellij-coverage-", null);
}
@NotNull
public File getCoverageTempDir() {
return myCoverageTempDir;
}
public void startCoverageSession(@NotNull KarmaCoverageSession coverageSession) {
// clear directory
if (myCoverageTempDir.isDirectory()) {
File[] children = ObjectUtils.notNull(myCoverageTempDir.listFiles(), ArrayUtil.EMPTY_FILE_ARRAY);
for (File child : children) {
FileUtil.delete(child);
}
}
else {
FileUtil.createDirectory(myCoverageTempDir);
}
myActiveCoverageSession = coverageSession;
}
public void registerEventHandlers(@NotNull final KarmaServer server) {
server.registerStreamEventHandler(new StreamEventHandler() {
@NotNull
@Override
public String getEventType() {
return "coverageFinished";
}
@Override
public void handle(@NotNull JsonElement eventBody) {
KarmaCoverageSession coverageSession = myActiveCoverageSession;
myActiveCoverageSession = null;
if (coverageSession != null) {
String path = JsonUtil.getString(eventBody);
if (path != null) {
File file = new File(path);
if (file.isAbsolute() && file.isFile()) {
coverageSession.onCoverageSessionFinished(file);
}
else {
coverageSession.onCoverageSessionFinished(null);
}
}
else {
coverageSession.onCoverageSessionFinished(null);
}
}
}
});
}
}