/*
* SK's Minecraft Launcher
* Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
* Please see LICENSE.txt for license information.
*/
package com.skcraft.launcher.model.modpack;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import com.google.common.io.Files;
import com.skcraft.launcher.install.InstallLog;
import com.skcraft.launcher.install.InstallLogFileMover;
import com.skcraft.launcher.install.Installer;
import com.skcraft.launcher.install.UpdateCache;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.skcraft.launcher.LauncherUtils.concat;
@Data
@EqualsAndHashCode(callSuper = false)
public class FileInstall extends ManifestEntry {
private static HashFunction hf = Hashing.sha1();
private String version;
private String hash;
private String location;
private String to;
private long size;
private boolean userFile;
@JsonIgnore
public String getImpliedVersion() {
return checkNotNull(version != null ? version : hash);
}
@JsonIgnore
public String getTargetPath() {
return checkNotNull(this.to != null ? this.to : location);
}
@Override
public void install(@NonNull Installer installer, @NonNull InstallLog log,
@NonNull UpdateCache cache, @NonNull File contentDir) throws IOException {
if (getWhen() != null && !getWhen().matches()) {
return;
}
String targetPath = getTargetPath();
File targetFile = new File(contentDir, targetPath);
String fileVersion = getImpliedVersion();
URL url = concat(getManifest().getObjectsUrl(), getLocation());
if (shouldUpdate(cache, targetFile)) {
long size = this.size;
if (size <= 0) {
size = 10 * 1024;
}
File tempFile = installer.getDownloader().download(url, fileVersion, size, to);
installer.queue(new InstallLogFileMover(log, tempFile, targetFile));
} else {
log.add(to, to);
}
}
private boolean shouldUpdate(UpdateCache cache, File targetFile) throws IOException {
if (targetFile.exists() && isUserFile()) {
return false;
}
if (!targetFile.exists()) {
return true;
}
if (hash != null) {
String existingHash = Files.hash(targetFile, hf).toString();
if (existingHash.equalsIgnoreCase(hash)) {
return false;
}
}
return cache.mark(FilenameUtils.normalize(getTargetPath()), getImpliedVersion());
}
}