/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.plugin.scripting.filter; import static org.mule.plugin.scripting.component.Scriptable.BINDING_MESSAGE; import static org.mule.runtime.core.DefaultEventContext.create; import static org.mule.runtime.core.api.construct.Flow.builder; import static org.mule.runtime.dsl.api.component.config.DefaultComponentLocation.fromSingleComponent; import org.mule.plugin.scripting.component.Scriptable; import org.mule.runtime.api.lifecycle.Disposable; import org.mule.runtime.api.lifecycle.Initialisable; import org.mule.runtime.api.lifecycle.InitialisationException; import org.mule.runtime.api.message.Message; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.api.construct.Flow; import org.mule.runtime.core.api.lifecycle.LifecycleUtils; import org.mule.runtime.core.api.routing.filter.Filter; import org.mule.runtime.core.processor.AbstractFilteringMessageProcessor; import javax.script.Bindings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ScriptFilter extends AbstractFilteringMessageProcessor implements Filter, Initialisable, Disposable { private static final Logger LOGGER = LoggerFactory.getLogger(ScriptFilter.class); private Scriptable script; private String name; @Override public void initialise() throws InitialisationException { LifecycleUtils.initialiseIfNeeded(script, muleContext); } @Override public void dispose() { LifecycleUtils.disposeIfNeeded(script, LOGGER); } @Override public boolean accept(Event event, Event.Builder builder) { Bindings bindings = script.getScriptEngine().createBindings(); script.populateBindings(bindings, event, builder); try { return (Boolean) script.runScript(bindings); } catch (Throwable e) { // TODO MULE-9356 ScriptFilter should rethrow exceptions, or at least log, not ignore them return false; } finally { builder.message((Message) bindings.get(BINDING_MESSAGE)); } } @Override public boolean accept(Message message, Event.Builder builder) { Bindings bindings = script.getScriptEngine().createBindings(); // TODO MULE-9341 Remove Filters. Flow flow = builder("ScriptFilterFlow", muleContext).build(); Event event = Event.builder(create(flow, fromSingleComponent("ScriptFilter"))).message(message).flow(flow).build(); script.populateBindings(bindings, event, builder); try { return (Boolean) script.runScript(bindings); } catch (Throwable e) { // TODO MULE-9356 ScriptFilter should rethrow exceptions, or at least log, not ignore them return false; } } public Scriptable getScript() { return script; } public void setScript(Scriptable script) { this.script = script; } public String getName() { return name; } public void setName(String name) { this.name = name; } }