Package com.consol.citrus.validation.matcher.core

Source Code of com.consol.citrus.validation.matcher.core.XmlValidationMatcher

package com.consol.citrus.validation.matcher.core;

import com.consol.citrus.context.TestContext;
import com.consol.citrus.exceptions.ValidationException;
import com.consol.citrus.message.DefaultMessage;
import com.consol.citrus.message.MessageType;
import com.consol.citrus.validation.MessageValidator;
import com.consol.citrus.validation.MessageValidatorRegistry;
import com.consol.citrus.validation.context.ValidationContext;
import com.consol.citrus.validation.matcher.ValidationMatcher;
import com.consol.citrus.validation.xml.DomXmlMessageValidator;
import com.consol.citrus.validation.xml.XmlMessageValidationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
* Validation matcher receives a XML data and validates it against expected XML with full
* XML validation support (e.g. ignoring elements, namespace support, ...).
*
* @author Christoph Deppisch
*/
public class XmlValidationMatcher implements ValidationMatcher, ApplicationContextAware, InitializingBean {

    /** CDATA section starting and ending in XML */
    private static final String CDATA_SECTION_START = "<![CDATA[";
    private static final String CDATA_SECTION_END = "]]>";

    @Autowired(required = false)
    private MessageValidatorRegistry messageValidatorRegistry;

    /** Xml message validator */
    private DomXmlMessageValidator xmlMessageValidator;
   
    /** Spring bean application context */
    private ApplicationContext applicationContext;

    /** Logger */
    private static Logger log = LoggerFactory.getLogger(XmlValidationMatcher.class);
   
    /**
      * {@inheritDoc}
      */
    public void validate(String fieldName, String value, String control, TestContext context) throws ValidationException {
        XmlMessageValidationContext validationContext = new XmlMessageValidationContext();
        validationContext.setControlMessage(new DefaultMessage(control));
       
        xmlMessageValidator.validateMessage(new DefaultMessage(removeCDataElements(value)), context, validationContext);
    }

    /**
     * Cut off CDATA elements.
     * @param value
     * @return
     */
    private String removeCDataElements(String value) {
        String data = value.trim();
       
        if (data.startsWith(CDATA_SECTION_START)) {
            data = value.substring(CDATA_SECTION_START.length());
            data = data.substring(0, data.length() - CDATA_SECTION_END.length());
        }
       
        return data;
    }

    /**
     * Inject Spring bean application context
     * @param applicationContext
     * @throws BeansException
     */
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * Initialize xml message validator if not injected by Spring bean context.
     * @throws Exception
     */
    public void afterPropertiesSet() throws Exception {
        // try to find xml message validator in registry
        for (MessageValidator<? extends ValidationContext> messageValidator : messageValidatorRegistry.getMessageValidators()) {
            if (messageValidator instanceof DomXmlMessageValidator &&
                    messageValidator.supportsMessageType(MessageType.XML.name(), new DefaultMessage(""))) {
                xmlMessageValidator = (DomXmlMessageValidator) messageValidator;
            }
        }

        if (xmlMessageValidator == null) {
            log.warn("No XML message validator found in Spring bean context - setting default validator");
            xmlMessageValidator = new DomXmlMessageValidator();
            xmlMessageValidator.setApplicationContext(applicationContext);
        }
    }
}
TOP

Related Classes of com.consol.citrus.validation.matcher.core.XmlValidationMatcher

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.