package codeine.jsons.labels;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.inject.Inject;
import codeine.configuration.PathHelper;
import codeine.model.Constants;
import codeine.utils.JsonFileUtils;
import com.google.common.collect.Maps;
public class LabelJsonFromFileProvider implements LabelJsonProvider {
private @Inject JsonFileUtils jsonFileUtils;
private @Inject PathHelper pathHelper;
private Map<String, Set<ProjectLabelVersionJson>> labels = Maps.newConcurrentMap();
private Set<ProjectLabelVersionJson> forProject(String project){
if (!labels.containsKey(project)){
Set<ProjectLabelVersionJson> versions = Collections.newSetFromMap(new ConcurrentHashMap<ProjectLabelVersionJson, Boolean>());
versions.addAll(jsonFileUtils.getConfFromFile(pathHelper.getVersionLabelFile(project), new VersionLabelSetJson()).versions());
labels.put(project, versions);
}
return labels.get(project);
}
@Override
public Set<ProjectLabelVersionJson> versions(String project) {
return forProject(project);
}
private void store(String projectName, VersionLabelSetJson versionLabelSetJson) {
jsonFileUtils.setContent(pathHelper.getVersionLabelFile(projectName), versionLabelSetJson);
}
@Override
public void updateLabel(ProjectLabelVersionJson versionLabelJson) {
deleteLabel(versionLabelJson.label(), versionLabelJson.project());
addLabel(versionLabelJson, versionLabelJson.project());
}
private void addLabel(ProjectLabelVersionJson versionLabelJson, String projectName) {
Set<ProjectLabelVersionJson> versions = versions(projectName);
versions.add(versionLabelJson);
VersionLabelSetJson versionLabelSetJson = new VersionLabelSetJson(versions);
store(projectName, versionLabelSetJson);
}
@Override
public void deleteLabel(String alias, String projectName) {
Set<ProjectLabelVersionJson> versions2 = versions(projectName);
synchronized (versions2) {
for (Iterator<ProjectLabelVersionJson> iterator = versions2.iterator(); iterator.hasNext();) {
ProjectLabelVersionJson versionLabelJson2 = (ProjectLabelVersionJson) iterator.next();
if (versionLabelJson2.label().equals(alias)){
iterator.remove();
}
}
}
VersionLabelSetJson versionLabelSetJson = new VersionLabelSetJson(versions2);
store(projectName, versionLabelSetJson);
}
@Override
public String labelForVersion(String version, String projectName) {
Set<ProjectLabelVersionJson> versions = versions(projectName);
for (ProjectLabelVersionJson versionLabelJson : versions) {
if (versionLabelJson.name().equals(version)){
return versionLabelJson.label();
}
}
return version;
}
@Override
public String versionForLabel(String label, String projectName) {
if (Constants.ALL_VERSION.equals(label)){
return label;
}
Set<ProjectLabelVersionJson> versions = versions(projectName);
for (ProjectLabelVersionJson versionLabelJson : versions) {
if (versionLabelJson.label().equals(label)){
return versionLabelJson.name();
}
}
return label;
}
}