
com.mindsnacks.zinc.classes.data.ZincManifest Maven / Gradle / Ivy
package com.mindsnacks.zinc.classes.data;
import com.google.gson.annotations.SerializedName;
import com.mindsnacks.zinc.exceptions.ZincRuntimeException;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* User: NachoSoto
* Date: 9/10/13
*/
public class ZincManifest {
@SerializedName("flavors")
private final List mFlavors;
@SerializedName("catalog")
private final String mIdentifier;
@SerializedName("version")
private final int mVersion;
@SerializedName("bundle")
private final String mBundleName;
@SerializedName("files")
private final Map mFiles;
transient private Map> mFilesForFlavor;
public ZincManifest(final List flavors,
final String identifier,
final int version,
final String bundleName, final Map files) {
mFlavors = flavors;
mIdentifier = identifier;
mVersion = version;
mBundleName = bundleName;
mFiles = files;
}
public List getFlavors() {
return mFlavors;
}
public String getIdentifier() {
return mIdentifier;
}
public int getVersion() {
return mVersion;
}
public String getBundleName() {
return mBundleName;
}
private Map> getFilesMap() {
if (mFilesForFlavor == null) {
mFilesForFlavor = new HashMap>();
}
return mFilesForFlavor;
}
/**
* @return Map (filename => FileInfo)
*/
public Map getFilesWithFlavor(final String flavor) {
final Map> filesMap = getFilesMap();
if (filesMap.get(flavor) == null) {
final Map result = new HashMap();
for (final Map.Entry entry : mFiles.entrySet()) {
final String filename = entry.getKey();
final FileInfo fileInfo = entry.getValue();
if (fileInfo.getFlavors().contains(flavor)) {
result.put(filename, fileInfo);
}
}
filesMap.put(flavor, result);
}
return filesMap.get(flavor);
}
public boolean archiveExists(final String flavor) {
/**
* Archives are only created for bundles with at least 2 files
*/
return (getFilesWithFlavor(flavor).size() > 1);
}
public boolean containsFiles(final String flavor) {
return (!getFilesWithFlavor(flavor).isEmpty());
}
/**
* This method can only be used if !archiveExists() && containsFiles
* to obtain the single file in a bundle.
*/
public FileInfo getFileWithFlavor(final String flavor) {
return getFilesWithFlavor(flavor).get(getFilenameWithFlavor(flavor));
}
/**
* This method can only be used if !archiveExists() && containsFiles
* to obtain the single filename in a bundle.
*/
public String getFilenameWithFlavor(final String flavor) {
final Map files = getFilesWithFlavor(flavor);
if (archiveExists(flavor) || !containsFiles(flavor)) {
throw new ZincRuntimeException(String.format("This manifest has %d files for flavor '%s'", files.size(), flavor));
}
return files.keySet().iterator().next();
}
public static class FileInfo {
public static final String GZIPPED_FORMAT = "gz";
@SerializedName("flavors")
private final Set mFlavors;
@SerializedName("sha")
private final String mHash;
@SerializedName("formats")
private final Map> mFormats;
public FileInfo() {
mFlavors = null;
mHash = null;
mFormats = null;
}
public FileInfo(final Set flavors, final String hash, final Map> formats) {
mFlavors = flavors;
mHash = hash;
mFormats = formats;
}
public Set getFlavors() {
return mFlavors;
}
public String getHash() {
return mHash;
}
/**
* @return relative path for file in the repo.
*/
public String getFilePath() {
// sha[0:2]/sha[2:4]/sha.extension
return mHash.substring(0, 2) + File.separator + mHash.substring(2, 4) + File.separator + getHashWithExtension();
}
public String getHashWithExtension() {
if (isGzipped()) {
return getHash() + "." + GZIPPED_FORMAT;
} else {
return getHash();
}
}
public boolean isGzipped() {
return mFormats.containsKey(GZIPPED_FORMAT);
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return mHash.equals(((FileInfo) o).mHash);
}
@Override
public int hashCode() {
return mHash.hashCode();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy