package com.github.moonkev.spring.integration.zmq.schema;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.xml.AbstractConsumerEndpointParser;
import org.springframework.integration.config.xml.IntegrationNamespaceUtils;
import org.w3c.dom.Element;

import com.github.moonkev.spring.integration.zmq.convert.JsonByteArrayToMapConverter;
import com.github.moonkev.spring.integration.zmq.convert.MapToJsonByteArrayConverter;

public class ZmqOutboundGatewayParser extends AbstractConsumerEndpointParser {

	protected String getInputChannelAttributeName() {
		return "request-channel";
	}
	
	protected BeanDefinitionBuilder parseHandler(Element element,
			ParserContext parserContext) {
		BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
				"com.github.moonkev.spring.integration.zmq.ZmqOutboundGateway");
		
		builder.addPropertyValue("address", element.getAttribute("address"));
		builder.addPropertyValue("socketType", element.getAttribute("socket-type"));
		IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "bind");
		IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "send-timeout", "socketSendTimeout");
		IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "receive-timeout", "socketReceiveTimeout");
		IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "linger");
		IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "reply-channel");
		IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "context-manager");
		
		if ("".equals(element.getAttribute("request-converter"))) {
			builder.addPropertyValue("requestConverter", new MapToJsonByteArrayConverter());
		} else {
			builder.addPropertyReference("request-converter", element.getAttribute("requestConverter"));
		}
		
		if ("".equals(element.getAttribute("reply-converter"))) {
			builder.addPropertyValue("replyConverter", new JsonByteArrayToMapConverter());
		} else {
			builder.addPropertyReference("reply-converter", element.getAttribute("replyConverter"));
		}

		return builder;		
	}
}