/**
* Copyright (c) 2008, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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.filter;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.synapse.config.xml.*;
import org.apache.synapse.util.xpath.SynapseXPath;
import org.jaxen.JaxenException;
import org.wso2.carbon.mediator.service.ui.AbstractListMediator;
import org.wso2.carbon.mediator.service.ui.Mediator;
import org.wso2.carbon.mediator.service.MediatorException;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class FilterMediator extends AbstractListMediator {
private SynapsePath source = null;
private Pattern regex = null;
private SynapsePath xpath = null;
private String thenKey = null;
private String elseKey = null;
public FilterMediator() {
addChild(new ThenMediator());
addChild(new ElseMediator());
}
public SynapsePath getSource() {
return source;
}
public void setSource(SynapsePath source) {
this.source = source;
}
public Pattern getRegex() {
return regex;
}
public void setRegex(Pattern regex) {
this.regex = regex;
}
public SynapsePath getXpath() {
return xpath;
}
public void setXpath(SynapsePath xpath) {
this.xpath = xpath;
}
public String getThenKey() {
return thenKey;
}
public void setThenKey(String thenKey) {
this.thenKey = thenKey;
}
public String getElseKey() {
return elseKey;
}
public void setElseKey(String elseKey) {
this.elseKey = elseKey;
}
public String getTagLocalName() {
return "filter";
}
public OMElement serialize(OMElement parent) {
OMElement filter = fac.createOMElement("filter", synNS);
if (getSource() != null && getRegex() != null) {
SynapsePathSerializer.serializePath(getSource(), filter, "source");
filter.addAttribute(fac.createOMAttribute(
"regex", nullNS, getRegex().pattern()));
} else if (getXpath() != null) {
SynapsePathSerializer.serializePath(getXpath(), filter, "xpath");
} else {
// TODO exception
}
saveTracingState(filter, this);
serializeChildren(filter, getList());
if (parent != null) {
parent.addChild(filter);
}
return filter;
}
public void build(OMElement elem) {
// REMOVE the existing sub elements
getList().clear();
OMAttribute attXpath = elem.getAttribute(ATT_XPATH);
OMAttribute attSource = elem.getAttribute(ATT_SOURCE);
OMAttribute attRegex = elem.getAttribute(ATT_REGEX);
if (attXpath != null) {
if (attXpath.getAttributeValue() != null &&
attXpath.getAttributeValue().trim().length() == 0) {
//TODO error
} else {
try {
setXpath(SynapsePathFactory.getSynapsePath(elem, ATT_XPATH));
} catch (JaxenException e) {
// TODO error
}
}
} else if (attSource != null && attRegex != null) {
if ((attSource.getAttributeValue() != null &&
attSource.getAttributeValue().trim().length() == 0) || (attRegex.getAttributeValue()
!= null && attRegex.getAttributeValue().trim().length() == 0) ){
//TODO error
} else {
try {
setSource(SynapsePathFactory.getSynapsePath(elem, ATT_SOURCE));
} catch (JaxenException e) {
// TODO error
}
try {
setRegex(Pattern.compile(attRegex.getAttributeValue()));
} catch (PatternSyntaxException pse) {
// TODO error
}
}
} else {
// TODO error
}
// after successfully creating the mediator
// set its common attributes such as tracing etc
processAuditStatus(this, elem);
addChildren(elem, this);
boolean thenPresent = false;
boolean elsePresent = false;
for (Mediator m : getList()) {
if (m instanceof ThenMediator) {
thenPresent = true;
} else if (m instanceof ElseMediator) {
elsePresent = true;
}
}
if (!thenPresent) {
if (elsePresent) {
throw new MediatorException("Else without Then, Invalid syntax.");
}
ThenMediator thenMediator = new ThenMediator();
for (Mediator m : getList()) {
thenMediator.addChild(m);
}
getList().clear();
addChild(thenMediator);
addChild(new ElseMediator());
}
}
}