/*
* OpenCredo-Esper - simplifies adopting Esper in Java applications.
* Copyright (C) 2010 OpenCredo Ltd.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.opencredo.esper.integration.config.xml;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
public class EsperWireTapParser extends AbstractBeanDefinitionParser {
@Override
protected boolean shouldGenerateId() {
return false;
}
@Override
protected boolean shouldGenerateIdAsFallback() {
return true;
}
@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.genericBeanDefinition(EsperIntegrationNamespaceUtils.BASE_PACKAGE + ".interceptor.EsperWireTap");
initializeEsperTemplate(element, builder);
setSourceId(element, builder);
initialiseSendContextProperty(element, builder);
configureNotificationStrategy(element, builder);
return builder.getBeanDefinition();
}
private void initializeEsperTemplate(Element element, BeanDefinitionBuilder builder) {
String templateRef = element.getAttribute(EsperIntegrationNamespaceUtils.TEMPLATE_REF_ATTRIBUTE_NAME);
builder.addConstructorArgReference(templateRef);
}
private void initialiseSendContextProperty(Element element, BeanDefinitionBuilder builder) {
String sendContext = element.getAttribute(EsperIntegrationNamespaceUtils.SEND_CONTEXT_ATTRIBUTE_NAME);
if ((sendContext != null) && (!"".equals(sendContext))) {
builder.addPropertyValue("sendContext", Boolean.parseBoolean(sendContext));
}
}
private void setSourceId(Element element, BeanDefinitionBuilder builder) {
String sourceId = element.getAttribute("sourceId");
Assert.hasText(sourceId, "sourceId attribute is required");
builder.addConstructorArgValue(sourceId);
}
private void configureNotificationStrategy(Element element, BeanDefinitionBuilder builder) {
String preSendFlag = element.getAttribute(EsperIntegrationNamespaceUtils.PRE_SEND_ATTRIBUTE_NAME);
String postSendFlag = element.getAttribute(EsperIntegrationNamespaceUtils.POST_SEND_ATTRIBUTE_NAME);
String preReceiveFlag = element.getAttribute(EsperIntegrationNamespaceUtils.PRE_RECEIVE_ATTRIBUTE_NAME);
String postReceiveFlag = element.getAttribute(EsperIntegrationNamespaceUtils.POST_RECEIVE_ATTRIBUTE_NAME);
if (StringUtils.hasText(preSendFlag) || StringUtils.hasText(postSendFlag)
|| StringUtils.hasText(preReceiveFlag) || StringUtils.hasText(postReceiveFlag)) {
if (StringUtils.hasText(preSendFlag)) {
builder.addPropertyValue("preSend", Boolean.parseBoolean(preSendFlag));
} else {
builder.addPropertyValue("preSend", false);
}
if (StringUtils.hasText(postSendFlag)) {
builder.addPropertyValue("postSend", Boolean.parseBoolean(postSendFlag));
} else {
builder.addPropertyValue("postSend", false);
}
if (StringUtils.hasText(preReceiveFlag)) {
builder.addPropertyValue("preReceive", Boolean.parseBoolean(preReceiveFlag));
} else {
builder.addPropertyValue("preReceive", false);
}
if (StringUtils.hasText(postReceiveFlag)) {
builder.addPropertyValue("postReceive", Boolean.parseBoolean(postReceiveFlag));
} else {
builder.addPropertyValue("postReceive", false);
}
}
}
}