/*
* 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.script;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.llom.OMTextImpl;
import org.apache.synapse.config.xml.ValueFactory;
import org.apache.synapse.config.xml.ValueSerializer;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.mediators.Value;
import org.wso2.carbon.mediator.service.MediatorException;
import org.wso2.carbon.mediator.service.ui.AbstractMediator;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamConstants;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class ScriptMediator extends AbstractMediator {
private static final QName INCLUDE_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "include");
/**
* The registry entry key for a script loaded from the registry
*/
private Value key;
/**
* The language of the script code
*/
private String language;
/**
* The map of included scripts; key = registry entry key, value = script source
*/
private Map<String, Object> includes = new TreeMap<String, Object>();
/**
* The optional name of the function to be invoked, defaults to mediate
*/
private String function = "";
/**
* The source code of the script
*/
private String scriptSourceCode;
public String getLanguage() {
return language;
}
public Value getKey() {
return key;
}
public String getFunction() {
return function;
}
public String getScriptSrc() {
return scriptSourceCode;
}
public String getTagLocalName() {
return "script";
}
public String getScriptSourceCode() {
return scriptSourceCode;
}
public Map<String, Object> getIncludes() {
return includes;
}
public void setIncludes(Map<String, Object> includes) {
this.includes = includes;
}
public void setLanguage(String language) {
this.language = language;
}
public void setFunction(String function) {
this.function = function;
}
public void setScriptSourceCode(String scriptSourceCode) {
this.scriptSourceCode = scriptSourceCode;
}
public void setKey(Value key) {
this.key = key;
}
public OMElement serialize(OMElement parent) {
OMElement script = fac.createOMElement("script", synNS);
if (key != null) {
script.addAttribute(fac.createOMAttribute("language", nullNS, language));
// Use KeySerializer to serialize Key
ValueSerializer keySerializer = new ValueSerializer();
keySerializer.serializeValue(key, XMLConfigConstants.KEY, script);
if (!function.equals("mediate")) {
script.addAttribute(fac.createOMAttribute("function", nullNS, function));
}
} else {
script.addAttribute(fac.createOMAttribute("language", nullNS, language));
OMTextImpl textData = (OMTextImpl) fac.createOMText(
scriptSourceCode.trim());
textData.setType(XMLStreamConstants.CDATA);
script.addChild(textData);
}
Map<String, Object> includeMap = includes;
for (String includeKey : includeMap.keySet()) {
if (includeKey != null && includeKey.length() != 0) {
OMElement includeKeyElement = fac.createOMElement("include", synNS);
includeKeyElement.addAttribute(fac.createOMAttribute("key", nullNS, includeKey));
script.addChild(includeKeyElement);
}
}
saveTracingState(script, this);
if (parent != null) {
parent.addChild(script);
}
return script;
}
public void build(OMElement elem) {
includes.clear();
OMAttribute keyAtt = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE,
"key"));
OMAttribute langAtt = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE,
"language"));
OMAttribute funcAtt = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE,
"function"));
if (langAtt == null) {
throw new MediatorException("The 'language' attribute is required for" +
" a script mediator");
}
if (keyAtt == null && funcAtt != null) {
throw new MediatorException("Cannot use 'function' attribute without 'key' " +
"attribute for a script mediator");
}
getIncludeKeysMap(elem);
if (keyAtt != null) {
String functionName = (funcAtt == null ? null : funcAtt.getAttributeValue());
this.language = langAtt.getAttributeValue();
this.function = functionName;
//Use KeyFactory to create Key
ValueFactory keyFactory = new ValueFactory();
key = keyFactory.createValue(XMLConfigConstants.KEY, elem);
} else {
this.language = langAtt.getAttributeValue();
this.scriptSourceCode = elem.getText();
}
processAuditStatus(this, elem);
}
private void getIncludeKeysMap(OMElement elem) {
// get <include /> scripts
// map key = registry entry key, value = script source
// at this time map values are null, later loaded
// from void ScriptMediator.prepareExternalScript(MessageContext synCtx)
// TreeMap used to keep given scripts order if needed
Iterator iter = elem.getChildrenWithName(INCLUDE_Q);
while (iter.hasNext()) {
OMElement includeElem = (OMElement) iter.next();
OMAttribute key = includeElem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE,
"key"));
if (key == null) {
throw new MediatorException("Cannot use 'include' element without 'key'" +
" attribute for a script mediator");
}
String keyText = key.getAttributeValue();
includes.put(keyText, null);
}
}
}