Skip to content

Commit

Permalink
Add new variable mediator
Browse files Browse the repository at this point in the history
  • Loading branch information
SanojPunchihewa committed Oct 24, 2024
1 parent 33e7ad1 commit b5df7b1
Show file tree
Hide file tree
Showing 13 changed files with 636 additions and 2 deletions.
23 changes: 23 additions & 0 deletions modules/core/src/main/java/org/apache/synapse/MessageContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -457,4 +457,27 @@ public interface MessageContext {
* @param tracingState Set whether the message flowtracing is enabled or not
*/
public void setMessageFlowTracingState(int tracingState);

/**
* Get the value of a variable on the message instance
*
* @param key key to look up variable
* @return value for the given key
*/
public Object getVariable(String key);

/**
* Set a variable with the given name on the message instance
*
* @param key key to be used
* @param value value to be saved
*/
public void setVariable(String key, Object value);

/**
* Returns the Set of keys over the variables on this message context
*
* @return a Set of keys over message variables
*/
public Set getVariableKeySet();
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ public abstract class AbstractMediatorFactory implements MediatorFactory {
= new QName(XMLConfigConstants.STATISTICS_ATTRIB_NAME);
protected static final QName PROP_Q
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "property");
protected static final QName VARIABLE_Q
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "variable");
protected static final QName PROPERTY_GROUP_Q
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "propertyGroup");
protected static final QName FEATURE_Q
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ public class MediatorFactoryFinder implements XMLToObjectMapper {
CommentMediatorFactory.class,
ForEachMediatorFactory.class,
JSONTransformMediatorFactory.class,
NTLMMediatorFactory.class
NTLMMediatorFactory.class,
VariableMediatorFactory.class
};

private final static MediatorFactoryFinder instance = new MediatorFactoryFinder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ public class MediatorSerializerFinder {
CommentMediatorSerializer.class,
ForEachMediatorSerializer.class,
JSONTransformMediatorSerializer.class,
NTLMMediatorSerializer.class
NTLMMediatorSerializer.class,
VariableMediatorSerializer.class
};

private final static MediatorSerializerFinder instance = new MediatorSerializerFinder();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* Copyright (c) 2024, WSO2 LLC. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 LLC. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.apache.synapse.config.xml;

import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.synapse.Mediator;
import org.apache.synapse.SynapseException;
import org.apache.synapse.mediators.v2.VariableMediator;
import org.jaxen.JaxenException;

import java.util.Properties;
import javax.xml.namespace.QName;

/**
* Creates a variable mediator through the supplied XML configuration
* <p/>
* <pre>
* &lt;variable name="string" [action=set/remove] (value="literal" | expression="expression") type="string|integer|JSON"/&gt;
* </pre>
*/
public class VariableMediatorFactory extends AbstractMediatorFactory {

private static final QName ATT_ACTION = new QName("action");
private static final QName ATT_TYPE = new QName("type");

public Mediator createSpecificMediator(OMElement elem, Properties properties) {

VariableMediator variableMediator = new VariableMediator();
OMAttribute name = elem.getAttribute(ATT_NAME);
OMAttribute value = elem.getAttribute(ATT_VALUE);
OMAttribute expression = elem.getAttribute(ATT_EXPRN);
OMAttribute action = elem.getAttribute(ATT_ACTION);
OMAttribute type = elem.getAttribute(ATT_TYPE);

if (name == null || name.getAttributeValue().isEmpty()) {
String msg = "The 'name' attribute is required for the configuration of a variable mediator";
log.error(msg);
throw new SynapseException(msg);
} else if ((value == null && expression == null) &&
!(action != null && "remove".equals(action.getAttributeValue()))) {
String msg = "'value' or 'expression' attributes is required for a variable mediator when action is SET";
log.error(msg);
throw new SynapseException(msg);
}
variableMediator.setName(name.getAttributeValue());

String dataType = null;
if (type != null) {
dataType = type.getAttributeValue();
}

if (value != null) {
variableMediator.setValue(value.getAttributeValue(), dataType);
} else if (expression != null) {
try {
variableMediator.setExpression(SynapsePathFactory.getSynapsePath(elem, ATT_EXPRN),
dataType);
} catch (JaxenException e) {
String msg = "Invalid expression for attribute 'expression' : " +
expression.getAttributeValue();
log.error(msg);
throw new SynapseException(msg);
}
}

if (action != null && "remove".equals(action.getAttributeValue())) {
variableMediator.setAction(VariableMediator.ACTION_REMOVE);
}
processAuditStatus(variableMediator, elem);
addAllCommentChildrenToList(elem, variableMediator.getCommentsList());
return variableMediator;
}

public QName getTagQName() {

return VARIABLE_Q;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (c) 2024, WSO2 LLC. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 LLC. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.apache.synapse.config.xml;

import org.apache.axiom.om.OMElement;
import org.apache.synapse.Mediator;
import org.apache.synapse.mediators.v2.VariableMediator;

/**
* <pre>
* &lt;variable name="string" [action=set/remove] (value="literal" | expression="expression") type="string|integer|JSON"/&gt;
* </pre>
*/
public class VariableMediatorSerializer extends AbstractMediatorSerializer {

public OMElement serializeSpecificMediator(Mediator m) {

if (!(m instanceof VariableMediator)) {
handleException("Unsupported mediator passed in for serialization : " + m.getType());
}

VariableMediator mediator = (VariableMediator) m;
OMElement variable = fac.createOMElement("variable", synNS);
saveTracingState(variable, mediator);

if (mediator.getName() != null) {
variable.addAttribute(fac.createOMAttribute(
"name", nullNS, mediator.getName()));
} else {
handleException("Invalid variable mediator. Name is required");
}

if (mediator.getValue() != null) {
variable.addAttribute(fac.createOMAttribute(
"value", nullNS, mediator.getValue().toString()));
} else if (mediator.getExpression() != null) {
SynapsePathSerializer.serializePath((SynapsePath) mediator.getExpression(),
variable, "expression");
} else if (mediator.getAction() == VariableMediator.ACTION_SET) {
handleException("Invalid variable mediator. Value or expression is required if " +
"action is SET");
}

if (mediator.getAction() == VariableMediator.ACTION_REMOVE) {
variable.addAttribute(fac.createOMAttribute(
"action", nullNS, "remove"));
} else if (mediator.getType() != null) {
variable.addAttribute(fac.createOMAttribute(
"type", nullNS, mediator.getType()));
}

serializeComments(variable, mediator.getCommentsList());

return variable;
}

public String getMediatorClassName() {

return VariableMediator.class.getName();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@ public class Axis2MessageContext implements MessageContext {
*/
private final Map<String, Object> properties = new HashMap<String, Object>();

/**
* Synapse Message Context variables
*/
private final Map<String, Object> variables = new HashMap<>();

/**
* Local entries fetched from the configuration or from the registry for the transactional
* resource access
Expand Down Expand Up @@ -725,4 +730,22 @@ public HashMap<String, Object> getAnalyticsMetadata() {
//noinspection unchecked
return (HashMap<String, Object>) getProperty(SynapseConstants.ANALYTICS_METADATA);
}

@Override
public Object getVariable(String key) {
return variables.get(key);
}

@Override
public void setVariable(String key, Object value) {
if (value == null) {
return;
}
variables.put(key, value);
}

@Override
public Set getVariableKeySet() {
return variables.keySet();
}
}
Loading

0 comments on commit b5df7b1

Please sign in to comment.