package org.jboss.windup.reporting.config;
import java.util.HashSet;
import java.util.Set;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.operation.iteration.AbstractIterationFilter;
import org.jboss.windup.graph.model.FileReferenceModel;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.reporting.model.ClassificationModel;
import org.jboss.windup.reporting.model.InlineHintModel;
import org.jboss.windup.reporting.service.InlineHintService;
import org.jboss.windup.util.ExecutionStatistics;
import org.ocpsoft.rewrite.context.EvaluationContext;
import org.ocpsoft.rewrite.param.ParameterStore;
import org.ocpsoft.rewrite.param.Parameterized;
import org.ocpsoft.rewrite.param.ParameterizedPatternResult;
import org.ocpsoft.rewrite.param.RegexParameterizedPatternParser;
/**
* An implementation of {@link AbstractIterationFilter} to filter models based on the existence of a
* {@link ClassificationModel} attached to the given payload.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public class HasHint extends AbstractIterationFilter<WindupVertexFrame> implements Parameterized
{
private RegexParameterizedPatternParser messagePattern;
@Override
public boolean evaluate(GraphRewrite event, EvaluationContext context, WindupVertexFrame payload)
{
ExecutionStatistics.get().begin(HasHint.class.getCanonicalName());
try
{
boolean result = false;
InlineHintService service = new InlineHintService(event.getGraphContext());
if (payload instanceof FileReferenceModel)
{
Iterable<InlineHintModel> hints = service.getHintsForFileReference((FileReferenceModel) payload);
if (messagePattern == null)
{
result = hints.iterator().hasNext();
}
else
{
for (InlineHintModel c : hints)
{
ParameterizedPatternResult parseResult = messagePattern.parse(c.getHint());
if (parseResult.matches() && parseResult.isValid(event, context))
{
result = true;
break;
}
}
}
}
if (payload instanceof FileModel)
{
Iterable<InlineHintModel> hints = service.getHintsForFile((FileModel) payload);
if (messagePattern == null)
{
result = hints.iterator().hasNext();
}
else
{
for (InlineHintModel c : hints)
{
ParameterizedPatternResult parseResult = messagePattern.parse(c.getHint());
if (parseResult.matches() && parseResult.isValid(event, context))
{
result = true;
break;
}
}
}
}
return result;
}
finally
{
ExecutionStatistics.get().end(HasHint.class.getCanonicalName());
}
}
/**
* Get the pattern for which this filter should match. (May be <code>null</code>.)
*/
public String getMessagePattern()
{
if (messagePattern != null)
return messagePattern.getPattern();
else
return null;
}
/**
* Set the pattern for which this filter should match. (May be <code>null</code>.)
*/
public void setMessagePattern(String titlePattern)
{
if (titlePattern != null)
this.messagePattern = new RegexParameterizedPatternParser(titlePattern);
}
@Override
public Set<String> getRequiredParameterNames()
{
Set<String> result = new HashSet<>();
if (messagePattern != null)
result.addAll(messagePattern.getRequiredParameterNames());
return result;
}
@Override
public void setParameterStore(ParameterStore store)
{
if (messagePattern != null)
messagePattern.setParameterStore(store);
}
}