package org.jboss.windup.project.condition; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.condition.EvaluationStrategy; import org.jboss.windup.config.condition.NoopEvaluationStrategy; import org.jboss.windup.config.parameters.FrameContext; import org.jboss.windup.config.parameters.FrameCreationContext; import org.jboss.windup.config.parameters.ParameterizedGraphCondition; import org.jboss.windup.graph.model.ProjectDependencyModel; 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.rules.apps.java.model.project.MavenProjectModel; import org.ocpsoft.rewrite.config.ConditionBuilder; import org.ocpsoft.rewrite.context.EvaluationContext; import org.ocpsoft.rewrite.param.ParameterStore; import org.ocpsoft.rewrite.util.Maps; /** * Condition used to search the projects based on {@link Artifact} within the graph. * * @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a> * */ public class Project extends ParameterizedGraphCondition { private Artifact artifact; /** * Specify the Artifact for which the condition should search for. * * @param artifact * @return */ public static Project dependsOnArtifact(Artifact artifact) { Project project = new Project(); project.artifact = artifact; return project; } public static ProjectFrom from(String from) { return new ProjectFrom(from); } public void setArtifact(Artifact artifact) { this.artifact = artifact; } public Artifact getArtifact() { return artifact; } public boolean evaluate(GraphRewrite event, EvaluationContext context, final EvaluationStrategy evaluationStrategy) { // TODO:handle from attribute GraphService<ProjectModel> projectService = new GraphService<>(event.getGraphContext(), ProjectModel.class); Iterable<ProjectModel> findAll = projectService.findAll(); List<WindupVertexFrame> result = new ArrayList<>(); for (ProjectModel payload : findAll) { Iterable<ProjectDependencyModel> dependencies = payload.getDependencies(); for (ProjectDependencyModel dependency : dependencies) { ProjectModel projectModel = dependency.getProjectModel(); if (projectModel instanceof MavenProjectModel) { boolean passed = true; MavenProjectModel maven = (MavenProjectModel) projectModel; if (artifact.getGroupId() != null) { passed = passed && artifact.getGroupId().parse(maven.getGroupId()).matches(); } if (artifact.getArtifactId() != null) { passed = passed && artifact.getArtifactId().parse(maven.getArtifactId()).matches(); } if (passed && artifact.getVersion() != null) { passed = passed && artifact.getVersion().validate(maven.getVersion()); } if (passed) { dependency.getFileLocationReference().forEach(location -> { result.add(location); evaluationStrategy.modelMatched(); evaluationStrategy.modelSubmitted(location); }); } } } } if (result.isEmpty()) { return false; } else { setResults(event, getOutputVariablesName(), result); return true; } } public ConditionBuilder as(String as) { super.setOutputVariablesName(as); return this; } public String toString() { return "Project.dependsOnArtifact(" + artifact.toString() + ")"; } @Override @SuppressWarnings("unchecked") protected boolean evaluateAndPopulateValueStores(GraphRewrite event, EvaluationContext context, final FrameCreationContext frameCreationContext) { return evaluate(event, context, new EvaluationStrategy() { private LinkedHashMap<String, List<WindupVertexFrame>> variables; @Override @SuppressWarnings("rawtypes") public void modelMatched() { this.variables = new LinkedHashMap<>(); frameCreationContext.beginNew((Map) variables); } @Override public void modelSubmitted(WindupVertexFrame model) { Maps.addListValue(this.variables, getVarname(), model); } @Override public void modelSubmissionRejected() { frameCreationContext.rollback(); } }); } @Override protected boolean evaluateWithValueStore(GraphRewrite event, EvaluationContext context, final FrameContext frameContext) { boolean result = evaluate(event, context, new NoopEvaluationStrategy()); if (!result) frameContext.reject(); return result; } @Override protected String getVarname() { return getOutputVariablesName(); } @Override public Set<String> getRequiredParameterNames() { Set<String> result = new HashSet<>(); if (artifact != null) result.addAll(artifact.getRequiredParameterNames()); return result; } @Override public void setParameterStore(ParameterStore store) { if (artifact != null) artifact.setParameterStore(store); } }