test, getXPath(testContext), test.getNodeType(), getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.NAMESPACE_URI, control, getXPath(controlContext), control.getNamespaceURI(), getParentXPath(controlContext), test, getXPath(testContext), test.getNamespaceURI(), getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.NAMESPACE_PREFIX, control, getXPath(controlContext), control.getPrefix(), getParentXPath(controlContext), test, getXPath(testContext), test.getPrefix(), getParentXPath(testContext))) .andIfTrueThen(control.getNodeType() != Node.ATTRIBUTE_NODE, new Comparison(ComparisonType.CHILD_NODELIST_LENGTH, control, getXPath(controlContext), test, getXPath(testContext), Linqy.count(testChildren), getParentXPath(testContext))) .andThen(new DeferredComparison() { @Override public ComparisonState apply() { .andIfTrueThen(control.getNodeType() != Node.ATTRIBUTE_NODE, compareChildren(controlContext, controlChildren,
chain = chain.andThen( new Comparison(ComparisonType.ATTR_NAME_LOOKUP, control, getXPath(controlContext), testContext.navigateToAttribute(testAttrName); try { chain = chain.andThen(new DeferredComparison() { @Override public ComparisonState apply() { return chain.andThen(new ControlAttributePresentComparer(control, controlContext, test, testContext,
test, getXPath(testContext), testAttributes.remainingAttributes.size(), getParentXPath(testContext))) .andThen(new DeferredComparison() { @Override public ComparisonState apply() { .andThen(new Comparison(ComparisonType.SCHEMA_LOCATION, control, getXPath(controlContext), controlAttributes.schemaLocation != null testAttributes.schemaLocation != null ? testAttributes.schemaLocation.getValue() : null, getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.NO_NAMESPACE_SCHEMA_LOCATION, control, getXPath(controlContext), controlAttributes.noNamespaceSchemaLocation != null ? ? testAttributes.noNamespaceSchemaLocation.getValue() : null, getParentXPath(testContext))) .andThen(new NormalAttributeComparer(control, controlContext, controlAttributes, test, testContext, testAttributes));
testAttr, getXPath(testContext), testAttrName, getParentXPath(testContext))) .andIfTrueThen(attributePresentOnBothSides, compareAttributeExplicitness(controlAttr, controlContext, testAttr, testContext)) .andIfTrueThen(attributePresentOnBothSides, new Comparison(ComparisonType.ATTR_VALUE, controlAttr, getXPath(controlContext),
try { chain = chain.andThen(new Comparison(ComparisonType.CHILD_NODELIST_SEQUENCE, control, getXPath(controlContext), Integer.valueOf(controlIndex), getParentXPath(controlContext), test, getXPath(testContext), Integer.valueOf(testIndex), getParentXPath(testContext))) .andThen(new DeferredComparison() { @Override public ComparisonState apply() { return chain.andThen(new UnmatchedControlNodes(controlList, controlContext, seen, testContext)) .andThen(new UnmatchedTestNodes(testList, testContext, seen, controlContext));
@Override public ComparisonState apply() { ComparisonState chain = new OngoingComparisonState(); final int testSize = testList.size(); for (int i = 0; i < testSize; i++) { if (!seen.contains(testList.get(i))) { testContext.navigateToChild(i); try { chain = chain.andThen(new Comparison(ComparisonType.CHILD_LOOKUP, null, null, null, getXPath(controlContext), testList.get(i), getXPath(testContext), Nodes.getQName(testList.get(i)), getParentXPath(testContext))); } finally { testContext.navigateToParent(); } } } return chain; } }
/** * Compares document node, doctype and XML declaration properties */ private ComparisonState compareDocuments(final Document control, final XPathContext controlContext, final Document test, final XPathContext testContext) { final DocumentType controlDt = filterNode(control.getDoctype()); final DocumentType testDt = filterNode(test.getDoctype()); return compare(new Comparison(ComparisonType.HAS_DOCTYPE_DECLARATION, control, getXPath(controlContext), Boolean.valueOf(controlDt != null), getParentXPath(controlContext), test, getXPath(testContext), Boolean.valueOf(testDt != null), getParentXPath(testContext))) .andIfTrueThen(controlDt != null && testDt != null, new DeferredComparison() { @Override public ComparisonState apply() { return compareNodes(controlDt, controlContext, testDt, testContext); } }) .andThen(compareDeclarations(control, controlContext, test, testContext)); }
@Override public ComparisonState apply() { ComparisonState chain = new OngoingComparisonState(); final int controlSize = controlList.size(); for (int i = 0; i < controlSize; i++) { if (!seen.contains(controlList.get(i))) { controlContext.navigateToChild(i); try { chain = chain.andThen(new Comparison(ComparisonType.CHILD_LOOKUP, controlList.get(i), getXPath(controlContext), Nodes.getQName(controlList.get(i)), getParentXPath(controlContext), null, null, null, getXPath(testContext))); } finally { controlContext.navigateToParent(); } } } return chain; } }
/** * Compares elements node properties, in particular the element's * name and its attributes. */ private ComparisonState compareElements(final Element control, final XPathContext controlContext, final Element test, final XPathContext testContext) { return compare(new Comparison(ComparisonType.ELEMENT_TAG_NAME, control, getXPath(controlContext), Nodes.getQName(control).getLocalPart(), getParentXPath(controlContext), test, getXPath(testContext), Nodes.getQName(test).getLocalPart(), getParentXPath(testContext))) .andThen(new DeferredComparison() { @Override public ComparisonState apply() { return compareElementAttributes(control, controlContext, test, testContext); } }); }
@Override public ComparisonState apply() { ComparisonState chain = new OngoingComparisonState(); for (Attr testAttr : testAttributes.remainingAttributes) { if (!foundTestAttributes.contains(testAttr)) { QName testAttrName = Nodes.getQName(testAttr); testContext.navigateToAttribute(testAttrName); try { chain = chain.andThen(new Comparison(ComparisonType.ATTR_NAME_LOOKUP, control, getXPath(controlContext), null, getParentXPath(controlContext), test, getXPath(testContext), testAttrName, getParentXPath(testContext))); } finally { testContext.navigateToParent(); } } } return chain; }
@Override public ComparisonState apply() { return compare(new Comparison(ComparisonType.XML_VERSION, control, getXPath(controlContext), control.getXmlVersion(), getParentXPath(controlContext), test, getXPath(testContext), test.getXmlVersion(), getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.XML_STANDALONE, control, getXPath(controlContext), control.getXmlStandalone(), getParentXPath(controlContext), test, getXPath(testContext), test.getXmlStandalone(), getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.XML_ENCODING, control, getXPath(controlContext), control.getXmlEncoding(), getParentXPath(controlContext), test, getXPath(testContext), test.getXmlEncoding(), getParentXPath(testContext))); } };
/** * Compares properties of the doctype declaration. */ private ComparisonState compareDocTypes(DocumentType control, XPathContext controlContext, DocumentType test, XPathContext testContext) { return compare(new Comparison(ComparisonType.DOCTYPE_NAME, control, getXPath(controlContext), control.getName(), getParentXPath(controlContext), test, getXPath(testContext), test.getName(), getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.DOCTYPE_PUBLIC_ID, control, getXPath(controlContext), control.getPublicId(), getParentXPath(controlContext), test, getXPath(testContext), test.getPublicId(), getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.DOCTYPE_SYSTEM_ID, control, null, control.getSystemId(), null, test, null, test.getSystemId(), null)); }
/** * Compares properties of a processing instruction. */ private ComparisonState compareProcessingInstructions(ProcessingInstruction control, XPathContext controlContext, ProcessingInstruction test, XPathContext testContext) { return compare(new Comparison(ComparisonType.PROCESSING_INSTRUCTION_TARGET, control, getXPath(controlContext), control.getTarget(), getParentXPath(controlContext), test, getXPath(testContext), test.getTarget(), getParentXPath(testContext))) .andThen(new Comparison(ComparisonType.PROCESSING_INSTRUCTION_DATA, control, getXPath(controlContext), control.getData(), getParentXPath(controlContext), test, getXPath(testContext), test.getData(), getParentXPath(testContext))); }
/** * Compares properties of an attribute. */ private ComparisonState compareAttributes(Attr control, XPathContext controlContext, Attr test, XPathContext testContext) { return compareAttributeExplicitness(control, controlContext, test, testContext).apply() .andThen(new Comparison(ComparisonType.ATTR_VALUE, control, getXPath(controlContext), control.getValue(), getParentXPath(controlContext), test, getXPath(testContext), test.getValue(), getParentXPath(testContext))); }
protected ComparisonState andThen(final Comparison comp) { return andThen(new DeferredComparison() { @Override public ComparisonState apply() { return compare(comp); } }); } protected ComparisonState andIfTrueThen(boolean predicate,
protected ComparisonState andIfTrueThen(boolean predicate, final Comparison comp) { return andIfTrueThen(predicate, new DeferredComparison() { @Override public ComparisonState apply() { return compare(comp); } }); } @Override
protected ComparisonState andIfTrueThen(boolean predicate, DeferredComparison newStateProducer) { return predicate ? andThen(newStateProducer) : this; } protected ComparisonState andThen(final Comparison comp) {