package org.jboss.windup.config.parameters; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.Variables; import org.jboss.windup.config.operation.Iteration; import org.jboss.windup.config.query.Query; import org.jboss.windup.config.query.QueryBuilderFrom; import org.jboss.windup.config.query.QueryPropertyComparisonType; import org.jboss.windup.graph.model.WindupVertexFrame; import org.ocpsoft.rewrite.config.ConditionBuilder; import org.ocpsoft.rewrite.context.EvaluationContext; import org.ocpsoft.rewrite.param.DefaultParameterStore; import org.ocpsoft.rewrite.param.ParameterStore; import org.ocpsoft.rewrite.param.Parameterized; import org.ocpsoft.rewrite.param.ParameterizedPatternResult; import org.ocpsoft.rewrite.param.RegexParameterizedPatternParser; import org.ocpsoft.rewrite.util.Maps; public class ParameterWiringTestModelCondition extends ParameterizedGraphCondition implements Parameterized { private RegexParameterizedPatternParser pattern; private String varname = Iteration.DEFAULT_VARIABLE_LIST_STRING; private String fromVarname; public ParameterWiringTestModelCondition(String pattern) { this.pattern = new RegexParameterizedPatternParser(pattern); } public static ParameterWiringTestModelCondition matchesValue(String pattern) { return new ParameterWiringTestModelCondition(pattern); } public ParameterWiringTestModelCondition from(String varname) { this.fromVarname = varname; return this; } public ConditionBuilder as(String varname) { this.varname = varname; return this; } @Override @SuppressWarnings({ "unchecked", "rawtypes" }) protected boolean evaluateAndPopulateValueStores(GraphRewrite event, EvaluationContext context, FrameCreationContext frameCreationContext) { ParameterStore store = DefaultParameterStore.getInstance(context); QueryBuilderFrom query = Query.fromType(ParameterWiringTestModel.class); if (!StringUtils.isBlank(fromVarname)) { query = Query.from(fromVarname); } Pattern compiledPattern = pattern.getCompiledPattern(store); query.withProperty(ParameterWiringTestModel.VALUE, QueryPropertyComparisonType.REGEX, compiledPattern.pattern()); String uuid = UUID.randomUUID().toString(); query.as(uuid); List<WindupVertexFrame> allFrameResults = new ArrayList<>(); if (query.evaluate(event, context)) { Iterable<? extends WindupVertexFrame> frames = Variables.instance(event).findVariable(uuid); for (WindupVertexFrame frame : frames) { ParameterWiringTestModel model = (ParameterWiringTestModel) frame; ParameterizedPatternResult parseResult = pattern.parse(model.getValue()); if (parseResult.matches()) { Map<String, List<WindupVertexFrame>> variables = new LinkedHashMap<>(); frameCreationContext.beginNew((Map) variables); if (parseResult.submit(event, context)) { allFrameResults.add(model); Maps.addListValue(variables, varname, model); } else { System.out.println("nope: " + model); frameCreationContext.rollback(); } } else { System.out.println("nope: " + model); } } Variables.instance(event).removeVariable(uuid); Variables.instance(event).setVariable(varname, allFrameResults); return true; } return false; } @Override protected boolean evaluateWithValueStore(GraphRewrite event, EvaluationContext context, FrameContext frameContext) { ParameterStore store = DefaultParameterStore.getInstance(context); QueryBuilderFrom query = Query.fromType(ParameterWiringTestModel.class); if (!StringUtils.isBlank(fromVarname)) { query = Query.from(fromVarname); } Pattern compiledPattern = pattern.getCompiledPattern(store); query.withProperty(ParameterWiringTestModel.VALUE, QueryPropertyComparisonType.REGEX, compiledPattern.pattern()); String uuid = UUID.randomUUID().toString(); query.as(uuid); if (query.evaluate(event, context)) { boolean result = false; List<WindupVertexFrame> results = new ArrayList<>(); Iterable<? extends WindupVertexFrame> frames = Variables.instance(event).findVariable(uuid); for (WindupVertexFrame frame : frames) { ParameterWiringTestModel model = (ParameterWiringTestModel) frame; String value = model.getValue(); ParameterizedPatternResult parseResult = pattern.parse(value); if (parseResult.submit(event, context)) { result = true; results.add(model); } } Variables.instance(event).removeVariable(uuid); if (result) { Variables.instance(event).setVariable(varname, results); return true; } } frameContext.reject(); return false; } @Override public Set<String> getRequiredParameterNames() { return pattern.getRequiredParameterNames(); } @Override public void setParameterStore(ParameterStore store) { pattern.setParameterStore(store); } @Override protected String getVarname() { return varname; } }