/*
* 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.mediation.service.templates;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.wso2.carbon.mediator.service.builtin.SequenceMediator;
import org.wso2.carbon.mediator.service.ui.Mediator;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class TemplateMediator extends SequenceMediator {
private static final QName TEMPLATE_Q
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "template");
private static final QName TEMPLATE_BODY_Q
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "sequence");
public static final QName PARAMETER_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "parameter");
private Collection<String> paramNames = new ArrayList<String>() ;
private String eipPatternName;
public void setParameters(Collection<String> paramNames) {
this.paramNames = paramNames;
}
public void addParameter(String paramName){
if (paramName!=null && !"".equals(paramName)) {
this.paramNames.add(paramName);
}
}
public Collection<String> getParameters() {
return paramNames;
}
public void setName(String name) {
this.eipPatternName = name;
}
public String getName() {
return eipPatternName;
}
public OMElement serialize(OMElement parent) {
TemplateMediator mediator = this;
OMElement templateElem = fac.createOMElement("template", synNS);
if (mediator.getName() != null) {
templateElem.addAttribute(fac.createOMAttribute(
"name", nullNS, mediator.getName()));
if (mediator.getErrorHandler() != null) {
templateElem.addAttribute(fac.createOMAttribute(
"onError", nullNS, mediator.getErrorHandler()));
}
serializeParams(templateElem,mediator);
serializeBody(templateElem, mediator.getList());
saveTracingState(templateElem, mediator);
}
return templateElem;
}
private void serializeParams(OMElement templateElem, TemplateMediator mediator) {
Collection<String> params = mediator.getParameters();
Iterator<String> paramIterator = params.iterator();
while (paramIterator.hasNext()){
String paramName = paramIterator.next();
if(!"".equals(paramName)){
OMElement paramEl = fac.createOMElement("parameter", synNS);
paramEl.addAttribute(fac.createOMAttribute("name",nullNS,paramName));
templateElem.addChild(paramEl);
}
}
}
private void serializeBody(OMElement templateElem, List<Mediator> childMediatorList){
OMElement seqEl = fac.createOMElement("sequence", synNS);
templateElem.addChild(seqEl);
serializeChildren(seqEl, childMediatorList);
}
public void build(OMElement elem) {
OMElement templateElem = elem;
OMAttribute nameAttr = templateElem.getAttribute(ATT_NAME);
OMAttribute errorHandlerAttr = templateElem.getAttribute(ATT_ONERROR);
if (nameAttr != null) {
setName(nameAttr.getAttributeValue());
if (errorHandlerAttr != null) {
setErrorHandler(errorHandlerAttr.getAttributeValue());
}
processAuditStatus(this, templateElem);
initParameters(templateElem);
OMElement templateBodyElem = templateElem.getFirstChildWithName(TEMPLATE_BODY_Q);
addChildren(templateBodyElem, this);
} else {
String msg = "A EIP template should be a named mediator .";
}
}
private void initParameters(OMElement templateElem) {
Iterator subElements = templateElem.getChildElements();
Collection<String> paramNames = new ArrayList<String>();
while (subElements.hasNext()) {
OMElement child = (OMElement) subElements.next();
if (child.getQName().equals(PARAMETER_Q)) {
OMAttribute paramNameAttr = child.getAttribute(ATT_NAME);
if (paramNameAttr != null) {
paramNames.add(paramNameAttr.getAttributeValue());
}
child.detach();
}
}
this.setParameters(paramNames);
}
}