/* * 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.runtime.core.el.mvel; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.api.Event; import org.mule.mvel2.ParserConfiguration; import org.mule.mvel2.integration.VariableResolver; public class VariableVariableResolverFactory extends MuleBaseVariableResolverFactory { private static final long serialVersionUID = -4433478558175131280L; private Event event; private Event.Builder eventBuilder; // TODO MULE-10471 Immutable event used in MEL/Scripting should be shared for consistency public VariableVariableResolverFactory(ParserConfiguration parserConfiguration, MuleContext muleContext, Event event, Event.Builder eventBuilder) { this.event = event; this.eventBuilder = eventBuilder; } @SuppressWarnings("deprecation") @Override public boolean isTarget(String name) { if (event == null) { return false; } return event.getVariableNames().contains(name) || (event.getSession() != null && event.getSession().getPropertyNamesAsSet().contains(name)); } @SuppressWarnings("deprecation") @Override public VariableResolver getVariableResolver(String name) { if (event != null && event.getVariableNames().contains(name)) { return new FlowVariableVariableResolver(name); } else if (event != null && event.getSession().getPropertyNamesAsSet().contains(name)) { return new SessionVariableVariableResolver(name); } else { return super.getNextFactoryVariableResolver(name); } } @SuppressWarnings("rawtypes") class FlowVariableVariableResolver implements VariableResolver { private static final long serialVersionUID = -4847663330454657440L; String name; public FlowVariableVariableResolver(String name) { this.name = name; } @Override public String getName() { return name; } @Override public Class getType() { return Object.class; } @Override public void setStaticType(Class type) {} @Override public int getFlags() { return 0; } @Override public Object getValue() { return event.getVariable(name).getValue(); } @Override public void setValue(Object value) { eventBuilder.addVariable(name, value); event = eventBuilder.build(); } } @SuppressWarnings({"deprecation", "rawtypes"}) class SessionVariableVariableResolver implements VariableResolver { private static final long serialVersionUID = 7658449705305592397L; private String name; public SessionVariableVariableResolver(String name) { this.name = name; } @Override public String getName() { return name; } @Override public Class getType() { return Object.class; } @Override public void setStaticType(Class type) {} @Override public int getFlags() { return 0; } @Override public Object getValue() { return event.getSession().getProperty(name); } @Override public void setValue(Object value) { event.getSession().setProperty(name, value); } } }