package org.jboss.windup.reporting.service; import java.util.Iterator; 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.service.GraphService; import org.jboss.windup.reporting.model.ApplicationReportIndexModel; import org.jboss.windup.reporting.model.ApplicationReportModel; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.gremlin.java.GremlinPipeline; import com.tinkerpop.pipes.PipeFunction; /** * Service methods for finding and creating {@link ApplicationReportIndexModel} objects. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class ApplicationReportIndexService extends GraphService<ApplicationReportIndexModel> { public ApplicationReportIndexService(GraphContext context) { super(context, ApplicationReportIndexModel.class); } /** * Return a global application index (not associated with a specific {@link ProjectModel}). */ public ApplicationReportIndexModel getOrCreateGlobalApplicationIndex() { GremlinPipeline<Vertex, Vertex> pipeline = new GremlinPipeline<>(getGraphContext().getGraph()); pipeline.V(); pipeline.has(WindupVertexFrame.TYPE_PROP, ApplicationReportModel.TYPE); pipeline.filter(new PipeFunction<Vertex, Boolean>() { @Override public Boolean compute(Vertex it) { // only include items that have no project models associated return !it.getEdges(Direction.OUT, ApplicationReportIndexModel.APPLICATION_REPORT_INDEX_TO_PROJECT_MODEL).iterator().hasNext(); } }); Iterator<Vertex> pipeIterator = pipeline.iterator(); final ApplicationReportIndexModel result = pipeIterator.hasNext() ? frame(pipeIterator.next()) : create(); return result; } /** * Returns the {@link ApplicationReportIndexModel} associated with the provided ProjectModel */ public ApplicationReportIndexModel getApplicationReportIndexForProjectModel(ProjectModel projectModel) { GremlinPipeline<Vertex, Vertex> pipeline = new GremlinPipeline<>(projectModel.asVertex()); pipeline.in(ApplicationReportIndexModel.APPLICATION_REPORT_INDEX_TO_PROJECT_MODEL); ApplicationReportIndexModel applicationReportIndex = null; if (pipeline.hasNext()) { applicationReportIndex = frame(pipeline.next()); } return applicationReportIndex; } }