How to use NamespaceContextBuilder method of com.consol.citrus.validation.xml.DomXmlMessageValidator class

Best Citrus code snippet using com.consol.citrus.validation.xml.DomXmlMessageValidator.NamespaceContextBuilder

Source:DomXmlMessageValidator.java Github

copy

Full Screen

...40import com.consol.citrus.validation.ValidationUtils;41import com.consol.citrus.validation.matcher.ValidationMatcherUtils;42import com.consol.citrus.validation.xml.schema.XmlSchemaValidation;43import com.consol.citrus.xml.XsdSchemaRepository;44import com.consol.citrus.xml.namespace.NamespaceContextBuilder;45import com.consol.citrus.xml.schema.WsdlXsdSchema;46import com.consol.citrus.xml.schema.XsdSchemaCollection;47import org.slf4j.Logger;48import org.slf4j.LoggerFactory;49import org.springframework.core.io.ByteArrayResource;50import org.springframework.core.io.Resource;51import org.springframework.util.Assert;52import org.springframework.util.CollectionUtils;53import org.springframework.util.StringUtils;54import org.springframework.util.xml.DomUtils;55import org.springframework.xml.validation.XmlValidator;56import org.springframework.xml.validation.XmlValidatorFactory;57import org.springframework.xml.xsd.XsdSchema;58import org.w3c.dom.DOMException;59import org.w3c.dom.Document;60import org.w3c.dom.DocumentType;61import org.w3c.dom.Element;62import org.w3c.dom.NamedNodeMap;63import org.w3c.dom.Node;64import org.w3c.dom.ls.LSException;65import org.xml.sax.SAXParseException;66/**67 * Default message validator implementation. Working on XML messages68 * providing message payload, header and namespace validation.69 *70 * @author Christoph Deppisch71 * @since 200772 */73public class DomXmlMessageValidator extends AbstractMessageValidator<XmlMessageValidationContext> {74 /** Logger */75 private static final Logger LOG = LoggerFactory.getLogger(DomXmlMessageValidator.class);76 private NamespaceContextBuilder namespaceContextBuilder;77 /** Default schema validator */78 private XmlSchemaValidation schemaValidator = new XmlSchemaValidation();79 @Override80 public void validateMessage(Message receivedMessage, Message controlMessage,81 TestContext context, XmlMessageValidationContext validationContext) throws ValidationException {82 LOG.debug("Start XML message validation ...");83 try {84 if (validationContext.isSchemaValidationEnabled()) {85 schemaValidator.validate(receivedMessage, context, validationContext);86 }87 validateNamespaces(validationContext.getControlNamespaces(), receivedMessage);88 validateMessageContent(receivedMessage, controlMessage, validationContext, context);89 if (controlMessage != null) {90 Assert.isTrue(controlMessage.getHeaderData().size() <= receivedMessage.getHeaderData().size(),91 "Failed to validate header data XML fragments - found " +92 receivedMessage.getHeaderData().size() + " header fragments, expected " + controlMessage.getHeaderData().size());93 for (int i = 0; i < controlMessage.getHeaderData().size(); i++) {94 validateXmlHeaderFragment(receivedMessage.getHeaderData().get(i),95 controlMessage.getHeaderData().get(i), validationContext, context);96 }97 }98 LOG.info("XML message validation successful: All values OK");99 } catch (ClassCastException | DOMException | LSException e) {100 throw new CitrusRuntimeException(e);101 } catch (IllegalArgumentException e) {102 LOG.error("Failed to validate:\n" + XMLUtils.prettyPrint(receivedMessage.getPayload(String.class)));103 throw new ValidationException("Validation failed:", e);104 } catch (ValidationException ex) {105 LOG.error("Failed to validate:\n" + XMLUtils.prettyPrint(receivedMessage.getPayload(String.class)));106 throw ex;107 }108 }109 /**110 * Validate namespaces in message. The method compares namespace declarations in the root111 * element of the received message to expected namespaces. Prefixes are important too, so112 * differing namespace prefixes will fail the validation.113 *114 * @param expectedNamespaces115 * @param receivedMessage116 */117 protected void validateNamespaces(Map<String, String> expectedNamespaces, Message receivedMessage) {118 if (CollectionUtils.isEmpty(expectedNamespaces)) { return; }119 if (receivedMessage.getPayload() == null || !StringUtils.hasText(receivedMessage.getPayload(String.class))) {120 throw new ValidationException("Unable to validate message namespaces - receive message payload was empty");121 }122 LOG.debug("Start XML namespace validation");123 Document received = XMLUtils.parseMessagePayload(receivedMessage.getPayload(String.class));124 Map<String, String> foundNamespaces = NamespaceContextBuilder.lookupNamespaces(receivedMessage.getPayload(String.class));125 if (foundNamespaces.size() != expectedNamespaces.size()) {126 throw new ValidationException("Number of namespace declarations not equal for node " +127 XMLUtils.getNodesPathName(received.getFirstChild()) + " found " +128 foundNamespaces.size() + " expected " + expectedNamespaces.size());129 }130 for (Entry<String, String> entry : expectedNamespaces.entrySet()) {131 String namespace = entry.getKey();132 String url = entry.getValue();133 if (foundNamespaces.containsKey(namespace)) {134 if (!foundNamespaces.get(namespace).equals(url)) {135 throw new ValidationException("Namespace '" + namespace +136 "' values not equal: found '" + foundNamespaces.get(namespace) +137 "' expected '" + url + "' in reference node " +138 XMLUtils.getNodesPathName(received.getFirstChild()));139 } else {140 if (LOG.isDebugEnabled()) {141 LOG.debug("Validating namespace " + namespace + " value as expected " + url + " - value OK");142 }143 }144 } else {145 throw new ValidationException("Missing namespace " + namespace + "(" + url + ") in node " +146 XMLUtils.getNodesPathName(received.getFirstChild()));147 }148 }149 LOG.info("XML namespace validation successful: All values OK");150 }151 private void doElementNameValidation(Node received, Node source) {152 //validate element name153 if (LOG.isDebugEnabled()) {154 LOG.debug("Validating element: " + received.getLocalName() + " (" + received.getNamespaceURI() + ")");155 }156 Assert.isTrue(received.getLocalName().equals(source.getLocalName()),157 ValidationUtils.buildValueMismatchErrorMessage("Element names not equal", source.getLocalName(), received.getLocalName()));158 }159 private void doElementNamespaceValidation(Node received, Node source) {160 //validate element namespace161 if (LOG.isDebugEnabled()) {162 LOG.debug("Validating namespace for element: " + received.getLocalName());163 }164 if (received.getNamespaceURI() != null) {165 Assert.isTrue(source.getNamespaceURI() != null,166 ValidationUtils.buildValueMismatchErrorMessage("Element namespace not equal for element '" +167 received.getLocalName() + "'", null, received.getNamespaceURI()));168 Assert.isTrue(received.getNamespaceURI().equals(source.getNamespaceURI()),169 ValidationUtils.buildValueMismatchErrorMessage("Element namespace not equal for element '" +170 received.getLocalName() + "'", source.getNamespaceURI(), received.getNamespaceURI()));171 } else {172 Assert.isTrue(source.getNamespaceURI() == null,173 ValidationUtils.buildValueMismatchErrorMessage("Element namespace not equal for element '" +174 received.getLocalName() + "'", source.getNamespaceURI(), null));175 }176 }177 /**178 * Validate message payloads by comparing to a control message.179 *180 * @param receivedMessage181 * @param validationContext182 * @param context183 */184 protected void validateMessageContent(Message receivedMessage, Message controlMessage,185 XmlMessageValidationContext validationContext, TestContext context) {186 if (controlMessage == null || controlMessage.getPayload() == null) {187 LOG.debug("Skip message payload validation as no control message was defined");188 return;189 }190 if (!(controlMessage.getPayload() instanceof String)) {191 throw new IllegalArgumentException(192 "DomXmlMessageValidator does only support message payload of type String, " +193 "but was " + controlMessage.getPayload().getClass());194 }195 String controlMessagePayload = controlMessage.getPayload(String.class);196 if (receivedMessage.getPayload() == null || !StringUtils.hasText(receivedMessage.getPayload(String.class))) {197 Assert.isTrue(!StringUtils.hasText(controlMessagePayload),198 "Unable to validate message payload - received message payload was empty, control message payload is not");199 return;200 } else if (!StringUtils.hasText(controlMessagePayload)) {201 return;202 }203 LOG.debug("Start XML tree validation ...");204 Document received = XMLUtils.parseMessagePayload(receivedMessage.getPayload(String.class));205 Document source = XMLUtils.parseMessagePayload(controlMessagePayload);206 XMLUtils.stripWhitespaceNodes(received);207 XMLUtils.stripWhitespaceNodes(source);208 if (LOG.isDebugEnabled()) {209 log.debug("Received message:\n" + context.getLogModifier().mask(XMLUtils.serialize(received)));210 log.debug("Control message:\n" + context.getLogModifier().mask(XMLUtils.serialize(source)));211 }212 validateXmlTree(received, source, validationContext, getNamespaceContextBuilder(context)213 .buildContext(receivedMessage, validationContext.getNamespaces()), context);214 }215 /**216 * Validates XML header fragment data.217 * @param receivedHeaderData218 * @param controlHeaderData219 * @param validationContext220 * @param context221 */222 private void validateXmlHeaderFragment(String receivedHeaderData, String controlHeaderData,223 XmlMessageValidationContext validationContext, TestContext context) {224 LOG.debug("Start XML header data validation ...");225 Document received = XMLUtils.parseMessagePayload(receivedHeaderData);226 Document source = XMLUtils.parseMessagePayload(controlHeaderData);227 XMLUtils.stripWhitespaceNodes(received);228 XMLUtils.stripWhitespaceNodes(source);229 if (LOG.isDebugEnabled()) {230 LOG.debug("Received header data:\n" + XMLUtils.serialize(received));231 LOG.debug("Control header data:\n" + XMLUtils.serialize(source));232 }233 validateXmlTree(received, source, validationContext,234 getNamespaceContextBuilder(context)235 .buildContext(new DefaultMessage(receivedHeaderData), validationContext.getNamespaces()), context);236 }237 /**238 * Walk the XML tree and validate all nodes.239 *240 * @param received241 * @param source242 * @param validationContext243 */244 private void validateXmlTree(Node received, Node source,245 XmlMessageValidationContext validationContext, NamespaceContext namespaceContext, TestContext context) {246 switch(received.getNodeType()) {247 case Node.DOCUMENT_TYPE_NODE:248 doDocumentTypeDefinition(received, source, validationContext, namespaceContext, context);249 break;250 case Node.DOCUMENT_NODE:251 validateXmlTree(received.getFirstChild(), source.getFirstChild(),252 validationContext, namespaceContext, context);253 break;254 case Node.ELEMENT_NODE:255 doElement(received, source, validationContext, namespaceContext, context);256 break;257 case Node.ATTRIBUTE_NODE:258 throw new IllegalStateException();259 case Node.COMMENT_NODE:260 validateXmlTree(received.getNextSibling(), source,261 validationContext, namespaceContext, context);262 break;263 case Node.PROCESSING_INSTRUCTION_NODE:264 doPI(received);265 break;266 }267 }268 /**269 * Handle document type definition with validation of publicId and systemId.270 * @param received271 * @param source272 * @param validationContext273 * @param namespaceContext274 */275 private void doDocumentTypeDefinition(Node received, Node source,276 XmlMessageValidationContext validationContext,277 NamespaceContext namespaceContext, TestContext context) {278 Assert.isTrue(source instanceof DocumentType, "Missing document type definition in expected xml fragment");279 DocumentType receivedDTD = (DocumentType) received;280 DocumentType sourceDTD = (DocumentType) source;281 if (LOG.isDebugEnabled()) {282 LOG.debug("Validating document type definition: " +283 receivedDTD.getPublicId() + " (" + receivedDTD.getSystemId() + ")");284 }285 if (!StringUtils.hasText(sourceDTD.getPublicId())) {286 Assert.isNull(receivedDTD.getPublicId(),287 ValidationUtils.buildValueMismatchErrorMessage("Document type public id not equal",288 sourceDTD.getPublicId(), receivedDTD.getPublicId()));289 } else if (sourceDTD.getPublicId().trim().equals(CitrusSettings.IGNORE_PLACEHOLDER)) {290 if (LOG.isDebugEnabled()) {291 LOG.debug("Document type public id: '" + receivedDTD.getPublicId() +292 "' is ignored by placeholder '" + CitrusSettings.IGNORE_PLACEHOLDER + "'");293 }294 } else {295 Assert.isTrue(StringUtils.hasText(receivedDTD.getPublicId()) &&296 receivedDTD.getPublicId().equals(sourceDTD.getPublicId()),297 ValidationUtils.buildValueMismatchErrorMessage("Document type public id not equal",298 sourceDTD.getPublicId(), receivedDTD.getPublicId()));299 }300 if (!StringUtils.hasText(sourceDTD.getSystemId())) {301 Assert.isNull(receivedDTD.getSystemId(),302 ValidationUtils.buildValueMismatchErrorMessage("Document type system id not equal",303 sourceDTD.getSystemId(), receivedDTD.getSystemId()));304 } else if (sourceDTD.getSystemId().trim().equals(CitrusSettings.IGNORE_PLACEHOLDER)) {305 if (LOG.isDebugEnabled()) {306 LOG.debug("Document type system id: '" + receivedDTD.getSystemId() +307 "' is ignored by placeholder '" + CitrusSettings.IGNORE_PLACEHOLDER + "'");308 }309 } else {310 Assert.isTrue(StringUtils.hasText(receivedDTD.getSystemId()) &&311 receivedDTD.getSystemId().equals(sourceDTD.getSystemId()),312 ValidationUtils.buildValueMismatchErrorMessage("Document type system id not equal",313 sourceDTD.getSystemId(), receivedDTD.getSystemId()));314 }315 validateXmlTree(received.getNextSibling(),316 source.getNextSibling(), validationContext, namespaceContext, context);317 }318 /**319 * Handle element node.320 *321 * @param received322 * @param source323 * @param validationContext324 */325 private void doElement(Node received, Node source,326 XmlMessageValidationContext validationContext, NamespaceContext namespaceContext, TestContext context) {327 doElementNameValidation(received, source);328 doElementNamespaceValidation(received, source);329 //check if element is ignored either by xpath or by ignore placeholder in source message330 if (XmlValidationUtils.isElementIgnored(source, received, validationContext.getIgnoreExpressions(), namespaceContext)) {331 return;332 }333 //work on attributes334 if (LOG.isDebugEnabled()) {335 LOG.debug("Validating attributes for element: " + received.getLocalName());336 }337 NamedNodeMap receivedAttr = received.getAttributes();338 NamedNodeMap sourceAttr = source.getAttributes();339 Assert.isTrue(countAttributes(receivedAttr) == countAttributes(sourceAttr),340 ValidationUtils.buildValueMismatchErrorMessage("Number of attributes not equal for element '"341 + received.getLocalName() + "'", countAttributes(sourceAttr), countAttributes(receivedAttr)));342 for (int i = 0; i < receivedAttr.getLength(); i++) {343 doAttribute(received, receivedAttr.item(i), source, validationContext, namespaceContext, context);344 }345 //check if validation matcher on element is specified346 if (isValidationMatcherExpression(source)) {347 ValidationMatcherUtils.resolveValidationMatcher(source.getNodeName(),348 received.getFirstChild().getNodeValue().trim(),349 source.getFirstChild().getNodeValue().trim(),350 context);351 return;352 }353 doText((Element) received, (Element) source);354 //work on child nodes355 List<Element> receivedChildElements = DomUtils.getChildElements((Element) received);356 List<Element> sourceChildElements = DomUtils.getChildElements((Element) source);357 Assert.isTrue(receivedChildElements.size() == sourceChildElements.size(),358 ValidationUtils.buildValueMismatchErrorMessage("Number of child elements not equal for element '"359 + received.getLocalName() + "'", sourceChildElements.size(), receivedChildElements.size()));360 for (int i = 0; i < receivedChildElements.size(); i++) {361 this.validateXmlTree(receivedChildElements.get(i), sourceChildElements.get(i),362 validationContext, namespaceContext, context);363 }364 if (LOG.isDebugEnabled()) {365 LOG.debug("Validation successful for element: " + received.getLocalName() +366 " (" + received.getNamespaceURI() + ")");367 }368 }369 /**370 * Handle text node during validation.371 *372 * @param received373 * @param source374 */375 private void doText(Element received, Element source) {376 if (LOG.isDebugEnabled()) {377 LOG.debug("Validating node value for element: " + received.getLocalName());378 }379 String receivedText = DomUtils.getTextValue(received);380 String sourceText = DomUtils.getTextValue(source);381 if (receivedText != null) {382 Assert.isTrue(sourceText != null,383 ValidationUtils.buildValueMismatchErrorMessage("Node value not equal for element '"384 + received.getLocalName() + "'", null, receivedText.trim()));385 Assert.isTrue(receivedText.trim().equals(sourceText.trim()),386 ValidationUtils.buildValueMismatchErrorMessage("Node value not equal for element '"387 + received.getLocalName() + "'", sourceText.trim(),388 receivedText.trim()));389 } else {390 Assert.isTrue(sourceText == null,391 ValidationUtils.buildValueMismatchErrorMessage("Node value not equal for element '"392 + received.getLocalName() + "'", sourceText.trim(), null));393 }394 if (LOG.isDebugEnabled()) {395 LOG.debug("Node value '" + receivedText.trim() + "': OK");396 }397 }398 /**399 * Handle attribute node during validation.400 *401 * @param receivedElement402 * @param receivedAttribute403 * @param sourceElement404 * @param validationContext405 */406 private void doAttribute(Node receivedElement, Node receivedAttribute, Node sourceElement,407 XmlMessageValidationContext validationContext, NamespaceContext namespaceContext, TestContext context) {408 if (receivedAttribute.getNodeName().startsWith(XMLConstants.XMLNS_ATTRIBUTE)) { return; }409 String receivedAttributeName = receivedAttribute.getLocalName();410 if (LOG.isDebugEnabled()) {411 LOG.debug("Validating attribute: " + receivedAttributeName + " (" + receivedAttribute.getNamespaceURI() + ")");412 }413 NamedNodeMap sourceAttributes = sourceElement.getAttributes();414 Node sourceAttribute = sourceAttributes.getNamedItemNS(receivedAttribute.getNamespaceURI(), receivedAttributeName);415 Assert.isTrue(sourceAttribute != null,416 "Attribute validation failed for element '"417 + receivedElement.getLocalName() + "', unknown attribute "418 + receivedAttributeName + " (" + receivedAttribute.getNamespaceURI() + ")");419 if (XmlValidationUtils.isAttributeIgnored(receivedElement, receivedAttribute, sourceAttribute, validationContext.getIgnoreExpressions(), namespaceContext)) {420 return;421 }422 String receivedValue = receivedAttribute.getNodeValue();423 String sourceValue = sourceAttribute.getNodeValue();424 if (isValidationMatcherExpression(sourceAttribute)) {425 ValidationMatcherUtils.resolveValidationMatcher(sourceAttribute.getNodeName(),426 receivedAttribute.getNodeValue().trim(),427 sourceAttribute.getNodeValue().trim(),428 context);429 } else if (receivedValue.contains(":") && sourceValue.contains(":")) {430 doNamespaceQualifiedAttributeValidation(receivedElement, receivedAttribute, sourceElement, sourceAttribute);431 } else {432 Assert.isTrue(receivedValue.equals(sourceValue),433 ValidationUtils.buildValueMismatchErrorMessage("Values not equal for attribute '"434 + receivedAttributeName + "'", sourceValue, receivedValue));435 }436 if (LOG.isDebugEnabled()) {437 LOG.debug("Attribute '" + receivedAttributeName + "'='" + receivedValue + "': OK");438 }439 }440 /**441 * Perform validation on namespace qualified attribute values if present. This includes the validation of namespace presence442 * and equality.443 * @param receivedElement444 * @param receivedAttribute445 * @param sourceElement446 * @param sourceAttribute447 */448 private void doNamespaceQualifiedAttributeValidation(Node receivedElement, Node receivedAttribute, Node sourceElement, Node sourceAttribute) {449 String receivedValue = receivedAttribute.getNodeValue();450 String sourceValue = sourceAttribute.getNodeValue();451 if (receivedValue.contains(":") && sourceValue.contains(":")) {452 // value has namespace prefix set, do special QName validation453 String receivedPrefix = receivedValue.substring(0, receivedValue.indexOf(':'));454 String sourcePrefix = sourceValue.substring(0, sourceValue.indexOf(':'));455 Map<String, String> receivedNamespaces = XMLUtils.lookupNamespaces(receivedAttribute.getOwnerDocument());456 receivedNamespaces.putAll(XMLUtils.lookupNamespaces(receivedElement));457 if (receivedNamespaces.containsKey(receivedPrefix)) {458 Map<String, String> sourceNamespaces = XMLUtils.lookupNamespaces(sourceAttribute.getOwnerDocument());459 sourceNamespaces.putAll(XMLUtils.lookupNamespaces(sourceElement));460 if (sourceNamespaces.containsKey(sourcePrefix)) {461 Assert.isTrue(sourceNamespaces.get(sourcePrefix).equals(receivedNamespaces.get(receivedPrefix)),462 ValidationUtils.buildValueMismatchErrorMessage("Values not equal for attribute value namespace '"463 + receivedValue + "'", sourceNamespaces.get(sourcePrefix), receivedNamespaces.get(receivedPrefix)));464 // remove namespace prefixes as they must not form equality465 receivedValue = receivedValue.substring((receivedPrefix + ":").length());466 sourceValue = sourceValue.substring((sourcePrefix + ":").length());467 } else {468 throw new ValidationException("Received attribute value '" + receivedAttribute.getLocalName() + "' describes namespace qualified attribute value," +469 " control value '" + sourceValue + "' does not");470 }471 }472 }473 Assert.isTrue(receivedValue.equals(sourceValue),474 ValidationUtils.buildValueMismatchErrorMessage("Values not equal for attribute '"475 + receivedAttribute.getLocalName() + "'", sourceValue, receivedValue));476 }477 /**478 * Handle processing instruction during validation.479 *480 * @param received481 */482 private void doPI(Node received) {483 if (LOG.isDebugEnabled()) {484 LOG.debug("Ignored processing instruction (" + received.getLocalName() + "=" + received.getNodeValue() + ")");485 }486 }487 /**488 * Counts the attributenode for an element (xmlns attributes ignored)489 * @param attributesR attributesMap490 * @return number of attributes491 */492 private int countAttributes(NamedNodeMap attributesR) {493 int cntAttributes = 0;494 for (int i = 0; i < attributesR.getLength(); i++) {495 if (!attributesR.item(i).getNodeName().startsWith(XMLConstants.XMLNS_ATTRIBUTE)) {496 cntAttributes++;497 }498 }499 return cntAttributes;500 }501 /**502 * Checks whether the given node contains a validation matcher503 * @param node504 * @return true if node value contains validation matcher, false if not505 */506 private boolean isValidationMatcherExpression(Node node) {507 switch (node.getNodeType()) {508 case Node.ELEMENT_NODE:509 return node.getFirstChild() != null &&510 StringUtils.hasText(node.getFirstChild().getNodeValue()) &&511 ValidationMatcherUtils.isValidationMatcherExpression(node.getFirstChild().getNodeValue().trim());512 case Node.ATTRIBUTE_NODE:513 return StringUtils.hasText(node.getNodeValue()) &&514 ValidationMatcherUtils.isValidationMatcherExpression(node.getNodeValue().trim());515 default: return false; //validation matchers makes no sense516 }517 }518 @Override519 protected Class<XmlMessageValidationContext> getRequiredValidationContextType() {520 return XmlMessageValidationContext.class;521 }522 @Override523 public boolean supportsMessageType(String messageType, Message message) {524 return messageType.equalsIgnoreCase(MessageType.XML.name()) && MessageUtils.hasXmlPayload(message);525 }526 /**527 * Get explicit namespace context builder set on this class or obtain instance from reference resolver.528 * @param context529 * @return530 */531 private NamespaceContextBuilder getNamespaceContextBuilder(TestContext context) {532 if (namespaceContextBuilder != null) {533 return namespaceContextBuilder;534 }535 return XmlValidationHelper.getNamespaceContextBuilder(context);536 }537 /**538 * Sets the namespace context builder.539 * @param namespaceContextBuilder540 */541 public void setNamespaceContextBuilder(NamespaceContextBuilder namespaceContextBuilder) {542 this.namespaceContextBuilder = namespaceContextBuilder;543 }544 public void validateXMLSchema(Message message, TestContext context, XmlMessageValidationContext xmlMessageValidationContext) {545 schemaValidator.validate(message, context, xmlMessageValidationContext);546 }547}...

Full Screen

Full Screen

Source:XpathMessageValidator.java Github

copy

Full Screen

...20import com.consol.citrus.message.Message;21import com.consol.citrus.util.XMLUtils;22import com.consol.citrus.validation.AbstractMessageValidator;23import com.consol.citrus.validation.ValidationUtils;24import com.consol.citrus.xml.namespace.NamespaceContextBuilder;25import com.consol.citrus.xml.xpath.XPathExpressionResult;26import com.consol.citrus.xml.xpath.XPathUtils;27import org.slf4j.Logger;28import org.slf4j.LoggerFactory;29import org.springframework.beans.factory.annotation.Autowired;30import org.springframework.util.CollectionUtils;31import org.springframework.util.StringUtils;32import org.w3c.dom.Document;33import org.w3c.dom.Node;34import javax.xml.namespace.NamespaceContext;35import java.util.Map;36/**37 * Message validator evaluates set of XPath expressions on message payload and checks that values are as expected.38 * @author Christoph Deppisch39 * @since 2.340 */41public class XpathMessageValidator extends AbstractMessageValidator<XpathMessageValidationContext> {42 /** Logger */43 private static Logger log = LoggerFactory.getLogger(XpathMessageValidator.class);44 @Autowired(required = false)45 private NamespaceContextBuilder namespaceContextBuilder = new NamespaceContextBuilder();46 @Override47 public void validateMessage(Message receivedMessage, Message controlMessage, TestContext context, XpathMessageValidationContext validationContext) throws ValidationException {48 if (CollectionUtils.isEmpty(validationContext.getXpathExpressions())) { return; }49 if (receivedMessage.getPayload() == null || !StringUtils.hasText(receivedMessage.getPayload(String.class))) {50 throw new ValidationException("Unable to validate message elements - receive message payload was empty");51 }52 log.debug("Start XPath element validation ...");53 Document received = XMLUtils.parseMessagePayload(receivedMessage.getPayload(String.class));54 NamespaceContext namespaceContext = namespaceContextBuilder.buildContext(55 receivedMessage, validationContext.getNamespaces());56 for (Map.Entry<String, Object> entry : validationContext.getXpathExpressions().entrySet()) {57 String xPathExpression = entry.getKey();58 Object expectedValue = entry.getValue();59 xPathExpression = context.replaceDynamicContentInString(xPathExpression);...

Full Screen

Full Screen

NamespaceContextBuilder

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.validation.xml;2import com.consol.citrus.context.TestContext;3import com.consol.citrus.testng.AbstractTestNGUnitTest;4import com.consol.citrus.validation.xml.DomXmlMessageValidator;5import com.consol.citrus.validation.xml.XmlMessageValidationContext;6import com.consol.citrus.validation.xml.XmlMessageValidationContextBuilder;7import org.springframework.core.io.ClassPathResource;8import org.testng.Assert;9import org.testng.annotations.Test;10import org.w3c.dom.Document;11import org.w3c.dom.Node;12import org.xml.sax.SAXException;13import javax.xml.parsers.ParserConfigurationException;14import javax.xml.transform.TransformerException;15import javax.xml.xpath.XPathConstants;16import javax.xml.xpath.XPathExpressionException;17import java.io.IOException;18public class DomXmlMessageValidatorTest extends AbstractTestNGUnitTest {19 public void testNamespaceContextBuilder() throws ParserConfigurationException, IOException, SAXException, TransformerException, XPathExpressionException {20 DomXmlMessageValidator validator = new DomXmlMessageValidator();21 Document document = validator.getDocumentBuilder().parse(new ClassPathResource("namespaced.xml", DomXmlMessageValidatorTest.class).getInputStream());22 Node node = (Node) validator.getXPath().evaluate("/ns0:root/ns0:foo", document, XPathConstants.NODE);23 XmlMessageValidationContext validationContext = new XmlMessageValidationContextBuilder().build();24 String namespace = validator.getNamespaceContextBuilder().buildNamespaceContext(validationContext.getNamespaceContext()).getNamespaceURI("ns0");25 }26}27package com.consol.citrus.validation.xml;28import com.consol.citrus.context.TestContext;29import com.consol.citrus.exceptions.ValidationException;30import com.consol.citrus.testng.AbstractTestNGUnitTest;31import com.consol.citrus.validation.MessageValidator;32import com.consol.citrus.validation.MessageValidatorRegistry;33import com.consol.citrus.validation.xml.DomXmlMessageValidator;34import com.consol.citrus.validation.xml.XmlMessageValidationContext;35import com.consol.citrus.validation.xml.XmlMessageValidationContextBuilder;36import org.springframework.core.io.ClassPathResource;37import org.testng.Assert;38import org.testng.annotations.Test;39import org.w3c.dom.Document;40import org.w3c.dom.Node;41import org.xml.sax.SAXException;42import javax.xml.parsers.Parser

Full Screen

Full Screen

NamespaceContextBuilder

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.validation.xml;2import com.consol.citrus.message.Message;3import com.consol.citrus.testng.AbstractTestNGUnitTest;4import com.consol.citrus.validation.xml.DomXmlMessageValidator;5import com.consol.citrus.validation.xml.XmlMessageValidationContext;6import org.testng.Assert;7import org.testng.annotations.Test;8import org.w3c.dom.Document;9import javax.xml.namespace.QName;10import javax.xml.parsers.DocumentBuilderFactory;11import javax.xml.parsers.ParserConfigurationException;12import java.io.IOException;13import java.util.Collections;14import java.util.HashMap;15import java.util.Map;16public class DomXmlMessageValidatorTest extends AbstractTestNGUnitTest {17 private final DomXmlMessageValidator validator = new DomXmlMessageValidator();18 public void testValidateMessage() throws ParserConfigurationException, IOException {19 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();20 factory.setNamespaceAware(true);21 Document document = factory.newDocumentBuilder().parse(getClass().getResourceAsStream("test.xml"));22 Message message = new Message(document);23 XmlMessageValidationContext validationContext = new XmlMessageValidationContext();24 validator.validateMessage(message, context, validationContext);25 }26 public void testValidateMessageWithNamespaceContextBuilder() throws ParserConfigurationException, IOException {27 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();28 factory.setNamespaceAware(true);29 Document document = factory.newDocumentBuilder().parse(getClass().getResourceAsStream("test.xml"));30 Message message = new Message(document);31 XmlMessageValidationContext validationContext = new XmlMessageValidationContext();32 Map<String, String> namespaceMap = new HashMap<>();33 validationContext.setNamespaceContextBuilder(new NamespaceContextBuilder(namespaceMap));34 validator.validateMessage(message, context, validationContext);35 }36 public void testValidateMessageWithNamespaceContextBuilderAndQName() throws ParserConfigurationException, IOException {37 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();38 factory.setNamespaceAware(true);39 Document document = factory.newDocumentBuilder().parse(getClass().getResourceAsStream("test.xml"));40 Message message = new Message(document);41 XmlMessageValidationContext validationContext = new XmlMessageValidationContext();42 Map<String, String> namespaceMap = new HashMap<>();

Full Screen

Full Screen

NamespaceContextBuilder

Using AI Code Generation

copy

Full Screen

1import com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner;2import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;3import com.consol.citrus.message.MessageType;4import org.testng.annotations.Test;5import java.util.HashMap;6import java.util.Map;7public class 4 extends TestNGCitrusTestRunner {8 public void 4() {9 variable("name", "John Doe");10 variable("id", "12345");11 variable("amount", "100.00");12 variable("date", "2018-01-01");13 variable("time", "2018-01-01T12:00:00");14 variable("dateTime", "2018-01-01T12:00:00+02:00");15 echo("4");16 send("4")17 .header("operation", "sayHello")18 .header("citrus_jms_messageId", "ID:localhost-5672-1515638258837-1:1:1:1:1");19 receive("4")

Full Screen

Full Screen

NamespaceContextBuilder

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus;2import com.consol.citrus.dsl.runner.TestRunner;3import com.consol.citrus.dsl.testng.TestNGCitrusTest;4import com.consol.citrus.validation.xml.DomXmlMessageValidator;5import com.consol.citrus.validation.xml.XmlMessageValidationContext;6import org.springframework.beans.factory.annotation.Autowired;7import org.springframework.core.io.ClassPathResource;8import org.testng.annotations.Test;9import javax.xml.namespace.NamespaceContext;10import java.util.HashMap;11import java.util.Map;12public class 4 extends TestNGCitrusTest {13 private TestRunner runner;14 public void test() {15 runner.http(builder -> builder.client("httpClient")16 .send()17 .post()18 .payload(new ClassPathResource("input.xml")));19 runner.http(builder -> builder.client("httpClient")20 .receive()21 .response(HttpStatus.OK)22 .payload(new ClassPathResource("output.xml")));23 Map<String, String> nsMap = new HashMap<>();24 NamespaceContext nsContext = new NamespaceContextBuilder(nsMap).build();25 XmlMessageValidationContext validationContext = new XmlMessageValidationContext();26 validationContext.setNamespaceContext(nsContext);27 DomXmlMessageValidator messageValidator = new DomXmlMessageValidator();28 messageValidator.setValidationContext(validationContext);29 runner.receive(builder -> builder.endpoint("myEndpoint")30 .messageType(MessageType.XML)31 .validator(messageValidator)32 .payload(new ClassPathResource("input.xml")));33 }34}35package com.consol.citrus;36import com.consol.citrus.dsl.runner.TestRunner;37import com.consol.citrus.dsl.testng.TestNGCitrusTest;38import com.consol.citrus.validation.xml.DomXmlMessageValidator;39import com.consol.citrus.validation.xml.XmlMessageValidationContext;40import org.springframework.beans.factory.annotation.Autowired;41import org.springframework.core.io.ClassPathResource;42import org.testng.annotations.Test;43import javax.xml.namespace.NamespaceContext;44import java.util.HashMap;45import java.util.Map;

Full Screen

Full Screen

NamespaceContextBuilder

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.dsl.testng;2import com.consol.citrus.annotations.CitrusTest;3import com.consol.citrus.dsl.runner.TestNGCitrusTestRunner;4import com.consol.citrus.testng.CitrusParameters;5import org.testng.annotations.DataProvider;6import org.testng.annotations.Test;7public class XmlMessageValidatorNamespaceContextBuilderTest extends TestNGCitrusTestRunner {8 @DataProvider(name = "testData")9 public Object[][] testData() {10 return new Object[][] {11 };12 }13 @Test(dataProvider = "testData")14 @CitrusParameters({"prefix", "namespaceUri"})15 public void xmlMessageValidatorNamespaceContextBuilder(String prefix, String namespaceUri) {16 variable("prefix", prefix);17 variable("namespaceUri", namespaceUri);18 send("fooRequestMessageSender")19 .payload("<foo:TestRequest xmlns:foo=\"${namespaceUri}\">" +20 "</foo:TestRequest>");21 receive("fooResponseMessageReceiver")22 .payload("<foo:TestResponse xmlns:foo=\"${namespaceUri}\">" +23 .validate(xml()24 .namespaceContextBuilder()25 .namespace("foo", "${namespaceUri}")26 .build());27 }28}

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful