package org.jboss.windup.reporting.service;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.graph.service.GraphService;
import org.jboss.windup.reporting.model.ApplicationReportModel;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.gremlin.java.GremlinPipeline;
import org.jboss.windup.util.Logging;
import java.util.logging.Logger;
/**
* This class provides helpful utility methods for creating and finding {@link ApplicationReportModel} vertices.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
* @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a>
*
*/
public class ApplicationReportService extends GraphService<ApplicationReportModel>
{
private static final Logger LOG = Logging.get(ApplicationReportService.class);
public ApplicationReportService(GraphContext context)
{
super(context, ApplicationReportModel.class);
}
/**
* Overrides GraphService.create() to create the object with some reasonable defaults
*/
public ApplicationReportModel create()
{
ApplicationReportModel applicationReportModel = super.create();
applicationReportModel.setDisplayInApplicationReportIndex(false);
applicationReportModel.setMainApplicationReport(false);
applicationReportModel.setReportPriority(Integer.MAX_VALUE);
return applicationReportModel;
}
/**
* Takes the first {@link ApplicationReportModel} that has set boolean value {@link ApplicationReportModel.MAIN_APPLICATION_REPORT} to true and whose
* projectModel is the same as the rootProjectModel of the given file
* @param fileModel A FileModel for which we are looking for the main application report to link to.
* @return
*/
public ApplicationReportModel getMainApplicationReportForFile(FileModel fileModel)
{
GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<>(getGraphContext().getGraph());
pipe.V(WindupVertexFrame.TYPE_PROP, ApplicationReportModel.TYPE);
pipe.has(ApplicationReportModel.MAIN_APPLICATION_REPORT, true);
pipe.as("applicationReport");
pipe.out(ApplicationReportModel.REPORT_TO_PROJECT_MODEL);
// check that the project for this application report is the same as the root project for the provided fileModel
ProjectModel rootProjectModel = fileModel.getProjectModel();
if (rootProjectModel == null)
{
return null;
}
else
{
rootProjectModel = rootProjectModel.getRootProjectModel();
}
String rootFilePath = rootProjectModel.getRootFileModel().getFilePath();
pipe.out(ProjectModel.ROOT_FILE_MODEL);
pipe.has(FileModel.FILE_PATH, rootFilePath);
pipe.back("applicationReport");
if (pipe.iterator().hasNext())
{
Vertex v = pipe.iterator().next();
ApplicationReportModel mainAppReport = frame(v);
if(pipe.iterator().hasNext()) {
LOG.warning("There are multiple ApplicationReportModels for a single file " + fileModel.getFilePath() +". This may cause some broken"
+ "links in the report file");
}
return mainAppReport;
}
return null;
}
}