package com.wix;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.wix.utils.FileUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
/**
* Lint target file thread local storage
*/
public class ThreadLocalActualFile extends ThreadLocal<String> {
private final String baseName;
private final String extension;
private final VirtualFile originalFile;
private File tempFile;
private static final Logger LOG = Logger.getInstance(Util.LOG_ID);
public boolean isTemp;
private static final String SCSS_LINT_TMP = "_scsslint_tmp";
private static final String TEMP_DIR_NAME = "intellij-scsslint-temp";
public ThreadLocalActualFile(@NotNull VirtualFile originalFile) {
this.baseName = originalFile.getNameWithoutExtension();
this.extension = FileUtils.getExtensionWithDot(originalFile);
this.originalFile = originalFile;
}
public VirtualFile getFile() {
return originalFile;
}
@Nullable
public File getOrCreateFile() {
String path = super.get();
if (path != null) {
File file = new File(path);
if (file.isFile()) {
return file;
}
}
File file = createFile();
if (file != null) {
set(file.getAbsolutePath());
tempFile = file;
return file;
}
return null;
}
@Nullable
public static File getOrCreateTempDir() {
File tmpDir = new File(FileUtil.getTempDirectory());
File dir = new File(tmpDir, TEMP_DIR_NAME);
if (dir.isDirectory() || dir.mkdirs()) {
return dir;
}
try {
return FileUtil.createTempDirectory(tmpDir, TEMP_DIR_NAME, null);
} catch (IOException ignored) {
LOG.warn("Can't create '" + TEMP_DIR_NAME + "' temporary directory.");
}
return null;
}
private File createFileAsSibling() {
File retFile;
try {
// try to create a temp file next to original file
retFile = File.createTempFile(this.baseName + SCSS_LINT_TMP, this.extension, new File(originalFile.getParent().getPath()));
isTemp = true;
return retFile;
} catch (IOException e) {
LOG.warn("Can not create temp file", e);
}
return null;
}
@Nullable
private File createFile() {
// File retFile = new File(file.getParent().getPath(), file.getNameWithoutExtension() + "_jscs_tmp." + file.getExtension());
File retFile = createFileAsSibling();
if (retFile != null) {
return retFile;
}
// try to create a temp file in temp folder
File dir = getOrCreateTempDir();
if (dir == null) {
return null;
}
File file = new File(dir, this.baseName + this.extension);
boolean created = false;
if (!file.exists()) {
try {
created = file.createNewFile();
} catch (IOException ignored) {
LOG.warn("Can not create " + file.getAbsolutePath());
}
}
if (!created) {
try {
file = FileUtil.createTempFile(dir, this.baseName, this.extension);
} catch (IOException e) {
LOG.warn("Can not create temp file", e);
return null;
}
}
file.deleteOnExit();
return file;
}
}