/* * 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.iterate; import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMElement; import org.apache.synapse.config.xml.SynapseXPathFactory; import org.apache.synapse.config.xml.SynapseXPathSerializer; import org.apache.synapse.config.xml.OMElementUtils; import org.apache.synapse.util.xpath.SynapseXPath; import org.jaxen.JaxenException; import org.wso2.carbon.mediator.service.MediatorException; import org.wso2.carbon.mediator.service.ui.AbstractListMediator; import org.wso2.carbon.mediator.service.ui.Mediator; import org.wso2.carbon.mediator.target.TargetMediator; import javax.xml.namespace.QName; public class IterateMediator extends AbstractListMediator { private static final QName ATT_CONTPAR = new QName("continueParent"); private static final QName ATT_PREPLD = new QName("preservePayload"); private static final QName ATT_ATTACHPATH = new QName("attachPath"); private static final QName ATT_ID = new QName("id"); private static final QName ATT_SEQUENTIAL = new QName("sequential"); private boolean continueParent = false; private boolean preservePayload = false; private SynapseXPath expression = null; private SynapseXPath attachPath = null; private String id; private boolean sequential = false; public IterateMediator() { //addChild(new TargetMediator()); } public boolean isContinueParent() { return continueParent; } public boolean isPreservePayload() { return preservePayload; } public SynapseXPath getExpression() { return expression; } public SynapseXPath getAttachPath() { return attachPath; } public void setContinueParent(boolean continueParent) { this.continueParent = continueParent; } public void setPreservePayload(boolean preservePayload) { this.preservePayload = preservePayload; } public void setExpression(SynapseXPath expression) { this.expression = expression; } public void setAttachPath(SynapseXPath attachPath) { this.attachPath = attachPath; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setSequential(boolean sequential) { this.sequential = sequential; } public boolean isSequential() { return sequential; } public String getTagLocalName() { return "iterate"; } public OMElement serialize(OMElement parent) { OMElement itrElem = fac.createOMElement("iterate", synNS); saveTracingState(itrElem, this); if (continueParent) { itrElem.addAttribute("continueParent", Boolean.toString(true), nullNS); } if (preservePayload) { itrElem.addAttribute("preservePayload", Boolean.toString(true), nullNS); } if (attachPath != null && !".".equals(attachPath.toString())) { SynapseXPathSerializer.serializeXPath(attachPath, itrElem, "attachPath"); } if (expression != null) { SynapseXPathSerializer.serializeXPath(expression, itrElem, "expression"); } else { throw new MediatorException("Missing expression of the IterateMediator which is required."); } if(id != null) { itrElem.addAttribute("id", id, nullNS); } if (sequential) { itrElem.addAttribute("sequential", Boolean.toString(true), nullNS); } serializeChildren(itrElem, getList()); // attach the serialized element to the parent if specified if (parent != null) { parent.addChild(itrElem); } return itrElem; } public void build(OMElement elem) { if (getList() != null) { getList().clear(); } processAuditStatus(this, elem); OMAttribute idAttr = elem.getAttribute(ATT_ID); if(idAttr !=null) { this.id = idAttr.getAttributeValue(); } OMAttribute sequentialAttr = elem.getAttribute(ATT_SEQUENTIAL); if(sequentialAttr !=null) { this.sequential=Boolean.valueOf(sequentialAttr.getAttributeValue()); } OMAttribute continueParent = elem.getAttribute(ATT_CONTPAR); if (continueParent != null) { this.continueParent = Boolean.valueOf(continueParent.getAttributeValue()); } OMAttribute preservePayload = elem.getAttribute(ATT_PREPLD); if (preservePayload != null) { this.preservePayload = Boolean.valueOf(preservePayload.getAttributeValue()); } OMAttribute expression = elem.getAttribute(ATT_EXPRN); if (expression != null) { try { this.expression = SynapseXPathFactory.getSynapseXPath(elem, ATT_EXPRN); } catch (JaxenException e) { throw new MediatorException("Unable to build the IterateMediator. " + "Invalid XPATH " + expression.getAttributeValue()); } } else { throw new MediatorException("XPATH expression is required " + "for an IterateMediator under the \"expression\" attribute"); } OMAttribute attachPath = elem.getAttribute(ATT_ATTACHPATH); String attachPathValue = ""; if (attachPath != null && !this.preservePayload) { throw new MediatorException("Wrong configuration for the iterate mediator " + ":: if the iterator should not preserve payload, " + "then attachPath can not be present"); } else if (attachPath != null) { attachPathValue = attachPath.getAttributeValue(); } if (!attachPathValue.equals("")) { try { SynapseXPath xp = new SynapseXPath(attachPathValue); OMElementUtils.addNameSpaces(xp, elem, null); this.attachPath = xp; } catch (JaxenException e) { throw new MediatorException("Unable to build the IterateMediator. Invalid XPATH " + attachPathValue); } } OMElement targetElement = elem.getFirstChildWithName(TARGET_Q); if (targetElement != null) { addChildren(elem, this); } else { throw new MediatorException("Target for an iterate mediator is required :: missing target"); } } }