blob: 6b9a72861848d1f783b4ac89e72a3c28af4749cd [file] [log] [blame]
package org.jetbrains.jps.android;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.incremental.storage.StorageOwner;
import java.io.*;
import java.util.Map;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidProGuardStateStorage implements StorageOwner {
private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.android.AndroidProGuardStateStorage");
private final File myFile;
public AndroidProGuardStateStorage(@NotNull File file) throws IOException {
myFile = file;
}
@Override
public void flush(boolean memoryCachesOnly) {
}
@Override
public void clean() throws IOException {
FileUtil.delete(myFile);
}
@Override
public void close() throws IOException {
}
@Nullable
public MyState read() {
try {
final DataInputStream input = new DataInputStream(new FileInputStream(myFile));
try {
final boolean hasValue = input.readBoolean();
if (!hasValue) {
return null;
}
final int n = input.readInt();
final Map<String, Long> cfgFiles = new HashMap<String, Long>();
for (int i = 0; i < n; i++) {
final String path = input.readUTF();
final long timestamp = input.readLong();
cfgFiles.put(path, timestamp);
}
return new MyState(cfgFiles);
}
finally {
input.close();
}
}
catch (FileNotFoundException ignored) {
}
catch (IOException e) {
LOG.info(e);
}
return null;
}
public void update(@Nullable MyState state) {
FileUtil.createParentDirs(myFile);
try {
final DataOutputStream output = new DataOutputStream(new FileOutputStream(myFile));
try {
output.writeBoolean(state != null);
if (state != null) {
output.writeInt(state.myProGuardConfigFiles.size());
for (Map.Entry<String, Long> entry : state.myProGuardConfigFiles.entrySet()) {
final String path = entry.getKey();
final Long timestamp = entry.getValue();
output.writeUTF(path);
output.writeLong(timestamp);
}
}
}
finally {
output.close();
}
}
catch (IOException e) {
LOG.info(e);
}
}
public static class MyState {
private final Map<String, Long> myProGuardConfigFiles;
public MyState(@NotNull File[] proGuardCfgFiles) {
myProGuardConfigFiles = new HashMap<String, Long>();
for (File file : proGuardCfgFiles) {
myProGuardConfigFiles.put(file.getPath(), file.lastModified());
}
}
private MyState(@NotNull Map<String, Long> proGuardConfigFiles) {
myProGuardConfigFiles = proGuardConfigFiles;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyState state = (MyState)o;
if (!myProGuardConfigFiles.equals(state.myProGuardConfigFiles)) return false;
return true;
}
@Override
public int hashCode() {
return myProGuardConfigFiles.hashCode();
}
}
}