blob: a2282f387b054af3cb1b7a6aae06589bd11e4966 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package vogar;
import java.io.File;
import java.util.List;
import vogar.commands.Command;
import vogar.commands.Mkdir;
public class HostFileCache implements FileCache {
private final File CACHE_ROOT = new File("/tmp/vogar-md5-cache");
private final Log log;
private final Mkdir mkdir;
public HostFileCache(Log log, Mkdir mkdir) {
this.log = log;
this.mkdir = mkdir;
}
private void cp(File source, File destination) {
List<String> rawResult = new Command.Builder(log).args("cp", source, destination).execute();
// A successful copy returns no results.
if (!rawResult.isEmpty()) {
throw new RuntimeException("Couldn't copy " + source + " to " + destination
+ ": " + rawResult.get(0));
}
}
private void mv(File source, File destination) {
List<String> rawResult = new Command.Builder(log).args("mv", source, destination).execute();
// A successful move returns no results.
if (!rawResult.isEmpty()) {
throw new RuntimeException("Couldn't move " + source + " to " + destination
+ ": " + rawResult.get(0));
}
}
public void copyFromCache(String key, File destination) {
File cachedFile = new File(CACHE_ROOT, key);
cp(cachedFile, destination);
}
public void copyToCache(File source, String key) {
File cachedFile = new File(CACHE_ROOT, key);
mkdir.mkdirs(CACHE_ROOT);
// Copy it onto the same file system first, then atomically move it into place.
// That way, if we fail, we don't leave anything dangerous lying around.
File temporary = new File(cachedFile + ".tmp");
cp(source, temporary);
mv(temporary, cachedFile);
}
public boolean existsInCache(String key) {
return new File(CACHE_ROOT, key).exists();
}
}