Skip to content

Commit f6e4117

Browse files
authored
Merge pull request #17 from donmendelson/issue16
Merge fails to remove attribute #16
2 parents c0468fc + 39fe18a commit f6e4117

File tree

5 files changed

+55
-21
lines changed

5 files changed

+55
-21
lines changed

.github/workflows/maven.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- name: Build with Maven
2424
run: mvn -B package --file pom.xml
2525
- name: Upload package
26-
uses: actions/upload-artifact@v2
26+
uses: actions/upload-artifact@v4
2727
with:
2828
name: Package
2929
path: target/*.jar

src/main/java/io/fixprotocol/xml/XmlMerge.java

+20-13
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,14 @@
3535
import javax.xml.xpath.XPathFactory;
3636
import org.apache.logging.log4j.LogManager;
3737
import org.apache.logging.log4j.Logger;
38-
import org.w3c.dom.Document;
39-
import org.w3c.dom.Element;
40-
import org.w3c.dom.Node;
41-
import org.w3c.dom.NodeList;
42-
import org.w3c.dom.Text;
38+
import org.w3c.dom.*;
4339
import org.xml.sax.SAXException;
4440
import io.fixprotocol.orchestra.event.EventListener;
4541
import io.fixprotocol.orchestra.event.EventListenerFactory;
4642
import io.fixprotocol.orchestra.event.TeeEventListener;
4743

44+
import static org.w3c.dom.Node.ATTRIBUTE_NODE;
45+
4846
/**
4947
* Merges a difference file created by {@link XmlDiff} into a baseline XML file to create a new XML
5048
* file
@@ -262,16 +260,25 @@ private void remove(final Document doc, XPath xpathEvaluator, Element patchOpEle
262260
final Node node =
263261
(Node) xpathEvaluator.compile(xpathExpression).evaluate(doc, XPathConstants.NODE);
264262
if (node != null) {
265-
final Node parent = node.getParentNode();
266-
if (parent != null) {
267-
final NodeList children = parent.getChildNodes();
268-
for (int i = 0; i < children.getLength(); i++) {
269-
if (children.item(i) == node) {
270-
parent.removeChild(node);
271-
break;
263+
if (ATTRIBUTE_NODE == node.getNodeType()) {
264+
Attr attr = (Attr) node;
265+
Element parent = attr.getOwnerElement();
266+
parent.removeAttributeNode(attr);
267+
} else {
268+
Node parent = node.getParentNode();
269+
if (parent != null) {
270+
final NodeList children = parent.getChildNodes();
271+
for (int i = 0; i < children.getLength(); i++) {
272+
Node item = children.item(i);
273+
if (item == node) {
274+
parent.removeChild(node);
275+
break;
276+
}
272277
}
273278
}
274279
}
280+
} else {
281+
eventLogger.warn("XPath expression to remove not found; {0}", xpathExpression);
275282
}
276283
} catch (final XPathExpressionException e) {
277284
errors++;
@@ -304,7 +311,7 @@ private void replace(final Document doc, XPath xpathEvaluator, Element patchOpEl
304311
text.setNodeValue(value);
305312
siteNode.appendChild(text);
306313
break;
307-
case Node.ATTRIBUTE_NODE:
314+
case ATTRIBUTE_NODE:
308315
case Node.TEXT_NODE:
309316
siteNode.setNodeValue(value);
310317
break;

src/test/java/io/fixprotocol/xml/XmlDiffTest.java

+24-7
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import org.junit.jupiter.api.BeforeEach;
3535
import org.junit.jupiter.api.Test;
3636
import org.w3c.dom.Document;
37+
import org.w3c.dom.Element;
38+
import org.w3c.dom.NodeList;
3739

3840
class CustomLogFactory implements LoggerContextFactory {
3941
private final org.apache.logging.log4j.spi.LoggerContext ctx;
@@ -72,12 +74,15 @@ public void removeContext(org.apache.logging.log4j.spi.LoggerContext context) {
7274

7375
public class XmlDiffTest {
7476

77+
private static DocumentBuilder docBuilder;
7578
private XmlMerge xmlMerge;
7679

7780
@BeforeAll
7881
public static void setupOnce() throws Exception {
7982
new File("target/test").mkdirs();
8083
LogManager.setFactory(new CustomLogFactory());
84+
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
85+
docBuilder = docFactory.newDocumentBuilder();
8186
}
8287

8388
/**
@@ -95,9 +100,6 @@ public void unordered() throws Exception {
95100
final String diffFilename = "target/test/unordereddiff.xml";
96101
XmlDiff.main(new String[] {"src/test/resources/DiffTest1.xml", "src/test/resources/DiffTest2.xml", diffFilename, "-u"});
97102

98-
99-
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
100-
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
101103
Document doc = docBuilder.parse(diffFilename);
102104

103105
// Expectation:
@@ -127,9 +129,6 @@ public void ordered() throws Exception {
127129
final String diffFilename = "target/test/ordereddiff.xml";
128130
XmlDiff.main(new String[] {"src/test/resources/DiffTest1.xml", "src/test/resources/DiffTest2.xml", diffFilename});
129131

130-
131-
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
132-
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
133132
Document doc = docBuilder.parse(diffFilename);
134133

135134
assertEquals(3, doc.getElementsByTagName("add").getLength());
@@ -160,11 +159,29 @@ public void epDiff() throws Exception {
160159
}
161160
}
162161

163-
164162
@Test
165163
public void xsdDiff() throws Exception {
166164
final String diffFilename = "target/test/xsddiff.xml";
167165
XmlDiff.main(new String[] {"src/test/resources/Enums-new.xsd", "src/test/resources/Enums-old.xsd", diffFilename, "-u"});
168166
}
169167

168+
@Test
169+
public void removeAttribute() throws Exception {
170+
final String mergedFilename = "target/test/Instrument-merged.xml";
171+
final String diffFilename = "src/test/resources/Instrument-diff.xml";
172+
final String baseFilename = "src/test/resources/Instrument-base.xml";
173+
174+
try (
175+
final FileInputStream is1Baseline = new FileInputStream(baseFilename);
176+
final FileInputStream isDiff = new FileInputStream(diffFilename);
177+
final FileOutputStream osMerge = new FileOutputStream(mergedFilename)) {
178+
xmlMerge.merge(is1Baseline, isDiff, osMerge);
179+
180+
Document doc = docBuilder.parse(mergedFilename);
181+
NodeList elements = doc.getElementsByTagName("fixr:component");
182+
Element element = (Element) elements.item(0);
183+
assertEquals(0, element.getAttribute("added").length());
184+
}
185+
}
186+
170187
}
+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<fixr:repository xmlns:dcterms="http://purl.org/dc/terms/" xmlns:fixml="http://fixprotocol.io/2024/orchestra/appinfo/fixml" xmlns:fixr="http://fixprotocol.io/2024/orchestra/repository" version="FIX.Latest_EP292" name="FIX.Latest">
2+
<fixr:components>
3+
<fixr:component id="1003" name="Instrument" scenario="base" added="FIX.Latest">
4+
<fixr:fieldRef id="55" name="Symbol"/>
5+
</fixr:component>
6+
</fixr:components>
7+
</fixr:repository>
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<diff>
2+
<remove sel="/fixr:repository/fixr:components[1]/fixr:component[@id='1003' and @scenario='base']/@added"/>
3+
</diff>

0 commit comments

Comments
 (0)