package eclipseutils.core.extensions; import org.eclipse.core.expressions.EvaluationResult; import org.eclipse.core.expressions.Expression; import org.eclipse.core.expressions.ExpressionConverter; import org.eclipse.core.expressions.ExpressionTagNames; import org.eclipse.core.expressions.IEvaluationContext; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IConfigurationElement; import patterns.visitor.Visitor; public final class ExpressionEvaluatingVisitor<T> implements Visitor<IConfigurationElement, T> { private final IEvaluationContext context; private final String enablementName; private final Visitor<IConfigurationElement, T> delegated; private final boolean enablementRequired; public ExpressionEvaluatingVisitor(IEvaluationContext context, String enablementName, boolean enablementRequired, Visitor<IConfigurationElement, T> delegated) { this.context = context; this.enablementName = enablementName; this.delegated = delegated; this.enablementRequired = enablementRequired; } public ExpressionEvaluatingVisitor(IEvaluationContext context, String enablementName, Visitor<IConfigurationElement, T> delegated) { this(context, enablementName, true, delegated); } public ExpressionEvaluatingVisitor(IEvaluationContext context, boolean enablementRequired, Visitor<IConfigurationElement, T> delegated) { this(context, ExpressionTagNames.ENABLEMENT, enablementRequired, delegated); } public ExpressionEvaluatingVisitor(IEvaluationContext context, Visitor<IConfigurationElement, T> delegated) { this(context, ExpressionTagNames.ENABLEMENT, true, delegated); } public T visit(IConfigurationElement config) { final IConfigurationElement[] elements = config .getChildren(this.enablementName); if (elements.length == 0) { return enablementRequired ? null : delegated.visit(config); } try { Assert.isTrue(elements.length == 1); Expression exp = ExpressionConverter.getDefault().perform( elements[0]); if (EvaluationResult.FALSE == exp.evaluate(context)) { return null; } // EvaluationResult.NOT_LOADED means a match too return delegated.visit(config); } catch (Exception e) { return null; } } }