package org.jboss.windup.reporting.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.model.WindupVertexFrame;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.frames.Adjacency;
import com.tinkerpop.frames.modules.javahandler.JavaHandler;
import com.tinkerpop.frames.modules.javahandler.JavaHandlerContext;
import com.tinkerpop.frames.modules.typedgraph.TypeValue;
/**
* This lists all of the top level reports within the application report (eg, Application classes report, Hibernate
* entity report, EJB report, etc). Potential uses include navigation bars within a report.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*
*/
@TypeValue("ApplicationReportIndexModel")
public interface ApplicationReportIndexModel extends WindupVertexFrame
{
String APPLICATION_REPORT_INDEX_TO_PROJECT_MODEL = "appReportIndexToProjectModel";
String APPLICATION_REPORT_INDEX_TO_REPORT_MODEL = "appReportIndexToAppReportModel";
/**
* Get all ReportModels that should be displayed in the index in ascending order, according to priority
*/
@JavaHandler
List<ApplicationReportModel> getApplicationReportModelsSortedByPriority();
/**
* Get all ReportModels that should be displayed in the index
*/
@Adjacency(label = APPLICATION_REPORT_INDEX_TO_REPORT_MODEL, direction = Direction.OUT)
Iterable<ApplicationReportModel> getApplicationReportModels();
/**
* Adds a ReportModel that should be displayed in the index
*/
@Adjacency(label = APPLICATION_REPORT_INDEX_TO_REPORT_MODEL, direction = Direction.OUT)
void addApplicationReportModel(ApplicationReportModel reportModel);
/**
* Associates a Set of ProjectModels with this index. This allows us to get from any Project Model to the associated
* index.
*
* NOTE: This should generally include the projectmodel and all child projects (flattened) to make searching easier.
*/
@Adjacency(label = APPLICATION_REPORT_INDEX_TO_PROJECT_MODEL, direction = Direction.OUT)
Iterable<ProjectModel> getProjectModels();
/**
* Associates a Set of ProjectModels with this index. This allows us to get from any Project Model to the associated
* index.
*
* NOTE: This should generally include the projectmodel and all child projects (flattened) to make searching easier.
*/
@Adjacency(label = APPLICATION_REPORT_INDEX_TO_PROJECT_MODEL, direction = Direction.OUT)
void addProjectModel(ProjectModel projectModel);
abstract class Impl implements ApplicationReportIndexModel, JavaHandlerContext<Vertex>
{
public List<ApplicationReportModel> getApplicationReportModelsSortedByPriority()
{
List<ApplicationReportModel> reports = new ArrayList<>();
for (ApplicationReportModel m : getApplicationReportModels())
{
reports.add(m);
}
Collections.sort(reports, new Comparator<ApplicationReportModel>()
{
@Override
public int compare(ApplicationReportModel o1, ApplicationReportModel o2)
{
return o1.getReportPriority() - o2.getReportPriority();
}
});
return reports;
}
}
}