package org.axway.grapes.server.core.reports;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.yammer.dropwizard.views.View;
import org.axway.grapes.commons.datamodel.Artifact;
import org.axway.grapes.commons.datamodel.Dependency;
import org.axway.grapes.server.db.DataUtils;
import org.axway.grapes.server.db.datamodel.DbArtifact;
import java.util.*;
/**
* Dependency Report
*
* <p>This class has been design to provide a quick feedback about module dependencies.</p>
*
* @author jdcoffre
*/
@JsonSerialize(using=DependencyReportSerializer.class)
public class DependencyReport extends View {
private String title;
private List<Dependency> dependencies = new ArrayList<Dependency>();
private List<String> shouldNotBeUsed = new ArrayList<String>();
public List<Dependency> getDependencies() {
return dependencies;
}
private Map<String, String> lastVersion = new HashMap<String,String>();
public DependencyReport(final String title) {
super("DependencyReport.ftl");
this.title = title;
}
public String getTitle(){
return title;
}
public void addDependency(final Dependency dependency, final String lastRelease) {
final String depId = DbArtifact.generateGAVC(dependency.getTarget());
if(!dependencies.contains(dependency)){
dependencies.add(dependency);
}
if(!lastVersion.containsKey(depId)){
lastVersion.put(depId, lastRelease);
}
}
public List<Artifact> getDependencyTargets(){
final List<Artifact> targets = new ArrayList<Artifact>();
final List<String> gavcs = new ArrayList<String>();
for(Dependency dependency: dependencies){
final String depGavc = DbArtifact.generateGAVC(dependency.getTarget());
if(!gavcs.contains(depGavc)){
targets.add(dependency.getTarget());
gavcs.add(depGavc);
}
}
DataUtils.sort(targets);
return targets;
}
public List<String> getVersions(final Artifact target){
final List<String> versions = new ArrayList<String>();
for(Dependency dependency: dependencies){
final String depGavc = DbArtifact.generateGAVC(dependency.getTarget());
if(depGavc.equals(DbArtifact.generateGAVC(target))
&& !versions.contains(dependency.getTarget().getVersion())){
versions.add(dependency.getTarget().getVersion());
}
}
return versions;
}
public String getLastVersion(final Artifact artifact){
final String version = lastVersion.get(artifact.getGavc());
if(version == null){
return "not available";
}
return version;
}
public int getNbEntry(final Artifact artifact){
int nbEntries = 0;
final List<String> versions = getVersions(artifact);
for(String version: versions){
nbEntries += getDependencies(artifact, version).size();
}
return nbEntries;
}
public List<Dependency> getDependencies(final Artifact target, final String version) {
final List<Dependency> sources = new ArrayList<Dependency>();
for(Dependency dependency: dependencies){
if(target.getGavc().equals(dependency.getTarget().getGavc()) &&
version.equals(dependency.getTarget().getVersion())){
sources.add(dependency);
}
}
int n = sources.size();
while(n != 0){
int newn = 0;
for(int i = 1 ; i <= n-1 ; i++){
if (sources.get(i-1).getSourceName().compareTo(sources.get(i).getSourceName()) > 0){
Collections.swap(sources,i-1,i);
newn = i;
}
}
n = newn;
}
return sources;
}
public void addShouldNotUse(final String gavc){
shouldNotBeUsed.add(gavc);
}
/**
* Return 1 if the targeted artifact has the flag "DO_NOT_USE" otherwise 0
*
* @param gavc
* @return int
*/
public int shouldNotBeUsed(final String gavc){
if(shouldNotBeUsed.contains(gavc)){
return 1;
}
return 0;
}
}