package org.ovirt.engine.core.vdsbroker.irsbroker;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.vdsbroker.vdsbroker.VdsProperties;
public final class FileStatsReturn extends StatusReturn {
private Map<String, Map<String, Object>> fileStats;
@SuppressWarnings("unchecked")
public FileStatsReturn(Map<String, Object> innerMap) {
super(innerMap);
// New VDSM returns a map with file names as key and file stats as value.
// The map contains all files even those without proper permissions.
fileStats = (Map<String, Map<String, Object>>) innerMap.get(VdsProperties.file_stats);
if (fileStats != null) {
removeFilesWithoutPermissions();
} else {
fileStats = new HashMap<>();
// Old VDSM returns only a list of file names but files without proper
// permissions are already filtered by VDSM.
Object[] fileNames = (Object[]) innerMap.get(VdsProperties.iso_list);
if (fileNames != null) {
// Since returned value is a list we have to bridge a gap and translate it into a map.
// Caller should not worry about returned type.
createDefaultFileStats(fileNames);
}
}
}
private void removeFilesWithoutPermissions() {
List<String> filesWithoutPermissions = getFilesWithoutPermissions();
for (String file : filesWithoutPermissions) {
fileStats.remove(file);
}
}
private List<String> getFilesWithoutPermissions() {
List<String> filesWithoutPermissions = new ArrayList<>();
for (Map.Entry<String, Map<String, Object>> fileEntry : fileStats.entrySet()) {
if (!isPermittedFile(fileEntry)) {
filesWithoutPermissions.add(fileEntry.getKey());
}
}
return filesWithoutPermissions;
}
private boolean isPermittedFile(Map.Entry<String, Map<String, Object>> fileEntry) {
return (Integer) fileEntry.getValue().get(VdsProperties.status) == 0;
}
private void createDefaultFileStats(Object[] fileNames) {
for (Object fileName : fileNames) {
fileStats.put((String) fileName, Collections.emptyMap());
}
}
public Map<String, Map<String, Object>> getFileStats() {
return fileStats;
}
}