package org.jenkinsci.plugins.activemq; import hudson.Extension; import hudson.model.AbstractProject; import hudson.model.BuildableItem; import hudson.model.Item; import hudson.triggers.Trigger; import hudson.triggers.TriggerDescriptor; import hudson.util.FormValidation; import jenkins.model.Jenkins; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.slf4j.Logger; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.util.Map; import java.util.TreeMap; import static java.lang.Boolean.TRUE; import static java.util.Collections.singletonMap; import static org.apache.commons.lang.StringUtils.trimToNull; import static org.jenkinsci.plugins.activemq.ActiveMqClient.BuildRequest; import static org.slf4j.LoggerFactory.getLogger; public class ActiveMqBuildTrigger extends Trigger { private static final Logger log = getLogger(ActiveMqBuildTrigger.class); private String expression; private transient ActiveMqPlugin plugin; private transient ScriptEngine engine; @DataBoundConstructor public ActiveMqBuildTrigger(String expression) { log.info("ActiveMqBuildTrigger.ActiveMqBuildTrigger"); log.info("expression = " + expression); this.expression = expression; } @Override public void start(AbstractProject project, boolean newInstance) { super.start(project, newInstance); plugin = Jenkins.getInstance().getPlugin(ActiveMqPlugin.class); log.info("ActiveMqBuildTrigger.start"); compileExpression(); } public String getExpression() { log.info("ActiveMqBuildTrigger.getExpression"); return expression; } public void setExpression(String expression) { this.expression = expression; } private void compileExpression() { log.info("ActiveMqBuildTrigger.compileExpression: expression={}", expression); if (expression == null) { return; } try { engine = plugin.createEngine(); engine.eval(expression); if (checkEngine(engine)) { log.warn("Invalid expression: {}", expression); } } catch (Exception e) { log.warn("Unable to compile expression", e); } } public boolean matches(BuildRequest req) { if (engine == null) { return false; } Map parameters = new TreeMap(req.parameters); Map> context = singletonMap("parameters", parameters); try { Object o = ((Invocable) engine).invokeFunction("match", parameters); log.info("o = " + o); Boolean b = null; if (o instanceof Boolean) { b = (Boolean) o; } return b != null && b; } catch (Exception e) { log.warn("Could not evaluate expression:"); log.warn(expression); log.warn("Context:"); for (Map.Entry> entry : context.entrySet()) { log.warn("{} = {}", entry.getKey(), entry.getValue()); } log.warn("Exception", e); return false; } } @Extension public static class DescriptorImpl extends TriggerDescriptor { @Override public boolean isApplicable(Item item) { return item instanceof BuildableItem; } @Override public String getDisplayName() { return "ActiveMQ Trigger"; } public FormValidation doCheckExpression(@QueryParameter String expression) { log.info("ActiveMqBuildTrigger.doCheckExpression"); expression = trimToNull(expression); if (expression == null) { return FormValidation.ok(); } try { ActiveMqPlugin plugin = Jenkins.getInstance().getPlugin(ActiveMqPlugin.class); ScriptEngine engine = plugin.createEngine(); engine.eval(expression); if (checkEngine(engine)) { return FormValidation.ok(); } return FormValidation.warning("The expression must define a function named 'match'"); } catch (ScriptException e) { return FormValidation.error("Could not evaluate expression: " + e.getMessage()); } catch (Exception e) { return FormValidation.error(e, "Could not evaluate expression"); } } } private static boolean checkEngine(ScriptEngine engine) throws ScriptException { Object o = engine.eval("typeof match === 'function'"); return TRUE.equals(o); } }