| package org.jetbrains.android.compiler; |
| |
| import com.intellij.compiler.CompilerIOUtil; |
| import com.intellij.ide.highlighter.ArchiveFileType; |
| import com.intellij.openapi.compiler.ValidityState; |
| import com.intellij.openapi.fileTypes.StdFileTypes; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.util.containers.HashSet; |
| import org.jetbrains.annotations.NotNull; |
| |
| import java.io.DataInput; |
| import java.io.DataOutput; |
| import java.io.IOException; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * @author Eugene.Kudelevsky |
| */ |
| class ClassesAndJarsValidityState implements ValidityState { |
| private Map<String, Long> myFiles; |
| |
| private void fillMap(VirtualFile file, Set<VirtualFile> visited) { |
| if (file.isDirectory() && visited.add(file)) { |
| for (VirtualFile child : file.getChildren()) { |
| fillMap(child, visited); |
| } |
| } |
| else if (StdFileTypes.CLASS.equals(file.getFileType()) || file.getFileType() instanceof ArchiveFileType) { |
| if (file.isValid()) { |
| myFiles.put(file.getPath(), file.getTimeStamp()); |
| } |
| } |
| } |
| |
| public ClassesAndJarsValidityState(@NotNull Collection<VirtualFile> files) { |
| myFiles = new HashMap<String, Long>(); |
| Set<VirtualFile> visited = new HashSet<VirtualFile>(); |
| for (VirtualFile file : files) { |
| fillMap(file, visited); |
| } |
| } |
| |
| public ClassesAndJarsValidityState(@NotNull DataInput in) throws IOException { |
| myFiles = new HashMap<String, Long>(); |
| int size = in.readInt(); |
| while (size-- > 0) { |
| final String path = CompilerIOUtil.readString(in); |
| final long timestamp = in.readLong(); |
| myFiles.put(path, timestamp); |
| } |
| } |
| |
| @Override |
| public boolean equalsTo(ValidityState otherState) { |
| return otherState instanceof ClassesAndJarsValidityState |
| && myFiles.equals(((ClassesAndJarsValidityState)otherState).myFiles); |
| } |
| |
| @Override |
| public void save(DataOutput out) throws IOException { |
| out.writeInt(myFiles.size()); |
| for (String dependency : myFiles.keySet()) { |
| CompilerIOUtil.writeString(dependency, out); |
| out.writeLong(myFiles.get(dependency)); |
| } |
| } |
| } |