package org.jboss.windup.reporting.query;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.query.QueryGremlinCriterion;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.FileLocationModel;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.graph.model.resource.SourceFileModel;
import org.jboss.windup.reporting.model.ClassificationModel;
import org.jboss.windup.reporting.model.InlineHintModel;
import org.jboss.windup.reporting.model.TechnologyTagLevel;
import org.jboss.windup.reporting.model.TechnologyTagModel;
import com.thinkaurelius.titan.core.attribute.Text;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.gremlin.java.GremlinPipeline;
/**
* This provides a helper class that can be used in a Windup Query call to execute a Gremlin search returning all FileModels that have associated
* {@link FileLocationModel}s or @{link ClassificationModel}s.
*/
public class FindSourceReportFilesGremlinCriterion implements QueryGremlinCriterion
{
@SuppressWarnings("unchecked")
@Override
public void query(GraphRewrite event, GremlinPipeline<Vertex, Vertex> pipeline)
{
GraphContext context = event.getGraphContext();
// create a pipeline to get all hinted items
GremlinPipeline<Vertex, Vertex> hintPipeline = new GremlinPipeline<>(
context.getQuery().type(FileModel.class).vertices());
hintPipeline.as("fileModel1").in(FileLocationModel.FILE_MODEL)
.has(WindupVertexFrame.TYPE_PROP, Text.CONTAINS, InlineHintModel.TYPE).back("fileModel1");
// create a pipeline to get all items with attached classifications
GremlinPipeline<Vertex, Vertex> classificationPipeline = new GremlinPipeline<>(
context.getQuery().type(FileModel.class).vertices());
classificationPipeline.as("fileModel2").in(ClassificationModel.FILE_MODEL)
.has(WindupVertexFrame.TYPE_PROP, Text.CONTAINS, ClassificationModel.TYPE)
.back("fileModel2");
// create a pipeline to get all items with attached technology tags
GremlinPipeline<Vertex, Vertex> technologyTagPipeline = new GremlinPipeline<>(
context.getQuery().type(FileModel.class).vertices());
technologyTagPipeline.as("fileModel3").in(TechnologyTagModel.TECH_TAG_TO_FILE_MODEL)
.has(WindupVertexFrame.TYPE_PROP, Text.CONTAINS, TechnologyTagModel.TYPE)
.has(TechnologyTagModel.LEVEL, TechnologyTagLevel.IMPORTANT.toString())
.back("fileModel3");
// Also return SourceFileModel results with the generate source flag set to true
GremlinPipeline<Vertex, Vertex> generateSourceReportPropertyPipeline = new GremlinPipeline<>(
context.getQuery().type(SourceFileModel.class).vertices());
generateSourceReportPropertyPipeline
.has(SourceFileModel.GENERATE_SOURCE_REPORT, true);
// combine these to get all file models that have either classifications or blacklists
pipeline.or(hintPipeline, classificationPipeline, technologyTagPipeline, generateSourceReportPropertyPipeline);
}
}