/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.compiler;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Set;
public class FileDependencyInfo {
private final VirtualFile file;
private final Set<VirtualFile> dependencies;
private final Set<String> displayKeys;
private final long fingerprint;
private final int compileTime; // milliseconds
public FileDependencyInfo(VirtualFile file, Set<VirtualFile> dependencies, Set<String> displayKeys, long fingerprint, int compileTime) {
this.file = file;
this.dependencies = ImmutableSet.copyOf(Sets.difference(dependencies, ImmutableSet.of(file)));
this.displayKeys = ImmutableSet.copyOf(displayKeys);
this.fingerprint = fingerprint;
this.compileTime = compileTime;
}
public VirtualFile getFile() {
return file;
}
public Set<VirtualFile> getDependencies() {
return dependencies;
}
public Set<String> getDisplayKeys() {
return displayKeys;
}
public boolean doesDependOn(VirtualFile file) {
return dependencies.contains(file);
}
public long getFingerprint() {
return fingerprint;
}
public int getCompileTime() {
return compileTime;
}
// Save/Load
@Nullable
private static VirtualFile findFile(String path) {
return LocalFileSystem.getInstance().findFileByIoFile(new File(path));
}
public static void write(@NotNull FileDependencyInfo info, @NotNull DataOutputStream out) throws IOException {
out.writeUTF(info.file.getPath());
out.writeLong(info.fingerprint);
out.writeInt(info.compileTime);
out.writeInt(info.dependencies.size());
for (VirtualFile dependent : info.dependencies) {
out.writeUTF(dependent.getPath());
}
out.writeInt(info.displayKeys.size());
for (String key : info.displayKeys) {
out.writeUTF(key);
}
}
@Nullable
public static FileDependencyInfo read(@NotNull DataInputStream in) throws IOException {
final VirtualFile file = findFile(in.readUTF());
final long fingerprint = in.readLong();
final int compileTime = in.readInt();
final Set<VirtualFile> dependents = Sets.newHashSet();
final Set<String> displayKeys = Sets.newHashSet();
int size = in.readInt();
for (int i = 0; i < size; ++i) {
final VirtualFile dependent = findFile(in.readUTF());
if (dependent != null) {
dependents.add(dependent);
}
}
size = in.readInt();
for (int i = 0; i < size; ++i) {
final String key = in.readUTF();
if (key != null) {
displayKeys.add(key);
}
}
return file != null ? new FileDependencyInfo(file, dependents, displayKeys, fingerprint, compileTime) : null;
}
}