Skip to content

Commit

Permalink
Merge branch 'wso2:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
kalaiyarasiganeshalingam authored Nov 7, 2024
2 parents 19c9e46 + 3f7d461 commit 74dbf1c
Show file tree
Hide file tree
Showing 52 changed files with 717 additions and 50 deletions.
2 changes: 1 addition & 1 deletion modules/commons/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.synapse</groupId>
<artifactId>Apache-Synapse</artifactId>
<version>4.0.0-wso2v129-SNAPSHOT</version>
<version>4.0.0-wso2v133-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion modules/core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<parent>
<groupId>org.apache.synapse</groupId>
<artifactId>Apache-Synapse</artifactId>
<version>4.0.0-wso2v129-SNAPSHOT</version>
<version>4.0.0-wso2v133-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
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 @@ -49,6 +49,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
* Controls Jaeger spans, with respect to various events received during Synapse message flow.
Expand Down Expand Up @@ -203,13 +204,13 @@ private void startSpan(StatisticDataUnit statisticDataUnit, MessageContext synCt
Span span;
Map<String, String> tracerSpecificCarrier = new HashMap<>();

Map headersMap = (Map) ((Axis2MessageContext) synCtx).getAxis2MessageContext()
.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
Map headersMap = new ConcurrentHashMap<>((Map) ((Axis2MessageContext) synCtx).getAxis2MessageContext()
.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS));
Object statusCode = ((Axis2MessageContext) synCtx).getAxis2MessageContext().getProperty("HTTP_SC");
Object statusDescription = ((Axis2MessageContext) synCtx).getAxis2MessageContext().getProperty("HTTP_DESC");
// We only need to extract span context from headers when there are trp headers available
if (headersMap == null) {
headersMap = new HashMap();
headersMap = new ConcurrentHashMap();
}
if (isOuterLevelSpan(statisticDataUnit, spanStore)) {
// Extract span context from headers
Expand Down
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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,12 @@ private void handleMessage(String messageID ,MessageContext response,
synapseInMessageContext.setProperty(
(String) key, synapseOutMsgCtx.getProperty((String) key));
}


for (Object key : synapseOutMsgCtx.getVariableKeySet()) {
synapseInMessageContext.setVariable(
(String) key, synapseOutMsgCtx.getVariable((String) key));
}

if(failOver){
//we may required to handle same message for failover cases only other than that
//should treat based on the incoming message
Expand Down Expand Up @@ -615,6 +620,11 @@ private void handleMessage(String messageID ,MessageContext response,
(String) key, synapseOutMsgCtx.getProperty((String) key));
}

for (Object key : synapseOutMsgCtx.getVariableKeySet()) {
synapseInMessageContext.setVariable(
(String) key, synapseOutMsgCtx.getVariable((String) key));
}

if (successfulEndpoint instanceof OAuthConfiguredHTTPEndpoint) {

OAuthConfiguredHTTPEndpoint httpEndpoint = (OAuthConfiguredHTTPEndpoint) successfulEndpoint;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ public void undeploy(String fileName) throws DeploymentException {
} else {
String msg = "Artifact representing the filename " + fileName
+ " is not deployed on Synapse";
log.error(msg);
log.warn(msg);
throw new DeploymentException(msg);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.apache.synapse.SynapseLog;
import org.apache.synapse.aspects.flow.statistics.collectors.RuntimeStatisticCollector;
import org.apache.synapse.aspects.flow.statistics.data.artifact.ArtifactHolder;
import org.apache.synapse.commons.json.Constants;
import org.apache.synapse.config.SynapsePropertiesLoader;
import org.apache.synapse.core.SynapseEnvironment;
import org.apache.synapse.core.axis2.Axis2MessageContext;
Expand All @@ -54,7 +55,11 @@ public abstract class AbstractListMediator extends AbstractMediator
implements ListMediator {

private static final String MSG_BUILD_FAILURE_EXCEPTION_PATTERN = ".*(Wstx)(.*Exception)" +
"|.*MalformedJsonException|.*(synapse\\.commons\\.staxon\\.core)|.*(com\\.fasterxml\\.jackson\\.core)";
"|.*MalformedJsonException|.*(synapse\\.commons\\.staxon\\.core)|.*(com\\.fasterxml\\.jackson\\.core)" +
"|.*JsonSyntaxException";

private static final String ORG_APACHE_SYNAPSE_COMMONS_JSON_IS_JSON_OBJECT =
"org.apache.synapse.commons.json.JsonInputStream.IsJsonObject";

// Create a Pattern object
protected Pattern msgBuildFailureExpattern = Pattern.compile(MSG_BUILD_FAILURE_EXCEPTION_PATTERN);
Expand Down Expand Up @@ -274,6 +279,13 @@ private void consumeInputOnOmException(MessageContext synCtx) {
} catch (AxisFault axisFault) {
log.error("Exception while consuming the input stream on Om Exception", axisFault);
}
//removing JSONstream from the message Context since it is outdated.
org.apache.axis2.context.MessageContext axis2MessageContext =
((Axis2MessageContext) synCtx).getAxis2MessageContext();
axis2MessageContext.removeProperty(Constants.ORG_APACHE_SYNAPSE_COMMONS_JSON_JSON_INPUT_STREAM);
axis2MessageContext.removeProperty(ORG_APACHE_SYNAPSE_COMMONS_JSON_IS_JSON_OBJECT);
//Clearing the buffered input stream when there is an build exception occurred.
axis2MessageContext.setProperty(PassThroughConstants.BUFFERED_INPUT_STREAM, null);
SOAPEnvelope soapEnvelope;
if (synCtx.isSOAP11()) {
soapEnvelope = OMAbstractFactory.getSOAP11Factory().createSOAPEnvelope();
Expand Down
Loading

0 comments on commit 74dbf1c

Please sign in to comment.