/*
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.wso2.carbon.mediator.property;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.util.JavaUtils;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.SynapseConfigUtils;
import org.apache.synapse.config.xml.*;
import org.jaxen.JaxenException;
import org.wso2.carbon.mediator.service.ui.AbstractMediator;
import org.wso2.carbon.mediator.service.MediatorException;
import javax.xml.namespace.QName;
public class PropertyMediator extends AbstractMediator {
private String name = null;
private String value = null;
private SynapsePath expression = null;
public static final int ACTION_SET = 0;
public static final int ACTION_REMOVE = 1;
/* Defaults to ACTION_SET */
private int action = ACTION_SET;
private static final QName ATT_SCOPE = new QName("scope");
private static final QName ATT_ACTION = new QName("action");
private static final QName ATT_PATTERN = new QName("pattern");
private static final QName ATT_GROUP = new QName("group");
private static final QName ATT_TYPE = new QName("type");
private String scope = null;
private String type = null;
private int group = 0;
private String pattern = null;
private OMElement valueElement = null;
public String getScope() {
return scope;
}
public int getAction() {
return action;
}
public SynapsePath getExpression() {
return expression;
}
public String getValue() {
return value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setValue(String value) {
this.value = value;
}
public void setExpression(SynapsePath expression) {
this.expression = expression;
}
public void setAction(int action) {
this.action = action;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getType() {
return type;
}
public int getGroup() {
return group;
}
public String getPattern() {
return pattern;
}
public void setType(String type) {
this.type = type;
}
public void setGroup(int group) {
this.group = group;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public OMElement getValueElement() {
return valueElement;
}
public void setValueElement(OMElement valueElement) {
this.valueElement = valueElement;
}
public String getTagLocalName() {
return "property";
}
public OMElement serialize(OMElement parent) {
OMElement property = fac.createOMElement("property", synNS);
saveTracingState(property, this);
if (name != null) {
property.addAttribute(fac.createOMAttribute(
"name", nullNS, name));
} else {
throw new MediatorException("Property name not specified");
}
if (action == ACTION_SET) {
if (value != null) {
property.addAttribute(fac.createOMAttribute(
"value", nullNS, value));
} else if (expression != null) {
SynapsePathSerializer.serializePath(expression, property, "expression");
} else if (valueElement != null) {
property.addChild(valueElement);
} else {
throw new MediatorException("Property value, expression or inline " +
"element must be set");
}
if (pattern != null) {
property.addAttribute(fac.createOMAttribute("pattern", nullNS, pattern));
if (group != 0) {
property.addAttribute(fac.createOMAttribute("group", nullNS,
Integer.toString(group)));
}
}
} else if (action == ACTION_REMOVE) {
property.addAttribute(fac.createOMAttribute(
"action", nullNS, "remove"));
}
if (scope != null) {
// if we have already built a mediator with scope, scope should be valid, now save it
property.addAttribute(fac.createOMAttribute("scope", nullNS, scope));
}
if (type != null) {
property.addAttribute(fac.createOMAttribute("type", nullNS, type));
}
if (parent != null) {
parent.addChild(property);
}
return property;
}
public void build(OMElement elem) {
OMAttribute nameAttr = elem.getAttribute(ATT_NAME);
OMAttribute valueAttr = elem.getAttribute(ATT_VALUE);
OMAttribute expressionAttr = elem.getAttribute(ATT_EXPRN);
OMAttribute scopeAttr = elem.getAttribute(ATT_SCOPE);
OMAttribute actionAttr = elem.getAttribute(ATT_ACTION);
OMAttribute typeAttr = elem.getAttribute(ATT_TYPE);
OMAttribute patternAttr = elem.getAttribute(ATT_PATTERN);
OMAttribute groupAttr = elem.getAttribute(ATT_GROUP);
OMElement valueElement = elem.getFirstElement();
if (nameAttr == null) {
String msg = "'name' attribute is required for the configuration of a property mediator";
throw new MediatorException(msg);
} else if ((valueAttr == null && valueElement == null && expressionAttr == null) &&
!(actionAttr != null && "remove".equals(actionAttr.getAttributeValue()))) {
String msg = "A child element or 'value' attribute or 'expression' attribute is " +
"required for a property mediator when action is SET";
throw new MediatorException(msg);
}
this.name = nameAttr.getAttributeValue();
// The action attribute is optional, if provided and equals to 'remove' the
// property mediator will act as a property remove mediator
if (actionAttr != null && "remove".equals(actionAttr.getAttributeValue())) {
this.action = ACTION_REMOVE;
}
if (valueAttr != null) {
this.value = valueAttr.getAttributeValue();
} else if (valueElement != null) {
this.valueElement = valueElement;
} else if (expressionAttr != null) {
try {
this.expression = SynapsePathFactory.getSynapsePath(elem, ATT_EXPRN);
} catch (JaxenException e) {
String msg = "Invalid XPath expression for attribute 'expression' : " + expressionAttr.getAttributeValue();
throw new MediatorException(msg);
}
}
if (scopeAttr != null) {
String valueStr = scopeAttr.getAttributeValue();
if (!XMLConfigConstants.SCOPE_AXIS2.equals(valueStr)
&& !XMLConfigConstants.SCOPE_TRANSPORT.equals(valueStr)
&& !XMLConfigConstants.SCOPE_OPERATION.equals(valueStr)
&& !XMLConfigConstants.SCOPE_DEFAULT.equals(valueStr)
&& !XMLConfigConstants.SCOPE_CLIENT.equals(valueStr)
&& !XMLConfigConstants.SCOPE_REGISTRY.equals(valueStr)) {
String msg = "Only '" + XMLConfigConstants.SCOPE_AXIS2
+ "' or '" + XMLConfigConstants.SCOPE_TRANSPORT
+ "' or '" + XMLConfigConstants.SCOPE_CLIENT
+ "' or '" + XMLConfigConstants.SCOPE_OPERATION
+ "' or '" + XMLConfigConstants.SCOPE_DEFAULT
+ "' or '" + XMLConfigConstants.SCOPE_REGISTRY
+ "' values are allowed for attribute scope for a property mediator"
+ ", Unsupported scope " + valueStr;
throw new MediatorException(msg);
}
this.scope = valueStr;
}
if (typeAttr != null) {
type = typeAttr.getAttributeValue();
}
if (patternAttr != null) {
pattern = patternAttr.getAttributeValue();
if (groupAttr != null) {
group = Integer.parseInt(groupAttr.getAttributeValue());
}
}
if(value != null && type != null){
convertValue(value, type); // checking property type validation
}
// after successfully creating the mediator
// set its common attributes such as tracing etc
processAuditStatus(this, elem);
}
private Object convertValue(String value, String type) {
if (type == null) {
// If no type is set we simply return the string value
return value;
}
try {
XMLConfigConstants.DATA_TYPES dataType = XMLConfigConstants.DATA_TYPES.valueOf(type);
switch (dataType) {
case BOOLEAN : return JavaUtils.isTrueExplicitly(value);
case DOUBLE : return Double.parseDouble(value);
case FLOAT : return Float.parseFloat(value);
case INTEGER : return Integer.parseInt(value);
case LONG : return Long.parseLong(value);
case OM : return SynapseConfigUtils.stringToOM(value);
case SHORT : return Short.parseShort(value);
default : return value;
}
} catch (IllegalArgumentException e) {
String msg = "For value [" +value+ " ] unknown type : [" + type + "] for the property mediator or the " +
"property value cannot be converted into the specified type.";
throw new SynapseException(msg, e);
}
}
}