1414 */
1515package io .fixprotocol .xml ;
1616
17+ import static io .fixprotocol .xml .XmlDiffListener .Event .Pos .append ;
1718import java .io .IOException ;
1819import java .io .OutputStream ;
1920import java .io .OutputStreamWriter ;
2021import java .nio .charset .StandardCharsets ;
2122import java .util .concurrent .atomic .AtomicBoolean ;
22-
2323import javax .xml .parsers .DocumentBuilder ;
2424import javax .xml .parsers .DocumentBuilderFactory ;
2525import javax .xml .parsers .ParserConfigurationException ;
2929import javax .xml .transform .TransformerFactory ;
3030import javax .xml .transform .dom .DOMSource ;
3131import javax .xml .transform .stream .StreamResult ;
32-
3332import org .w3c .dom .Attr ;
3433import org .w3c .dom .Document ;
3534import org .w3c .dom .Element ;
3635import org .w3c .dom .Node ;
3736import org .w3c .dom .Text ;
3837
39- import static io .fixprotocol .xml .XmlDiffListener .Event .Pos .*;
40-
4138/**
4239 * Writes XML diffs as patch operations specified by IETF RFC 5261
43- *
40+ *
4441 * @author Don Mendelson
4542 * @see <a href="https://tools.ietf.org/html/rfc5261">An Extensible Markup Language (XML) Patch
4643 * Operations Framework Utilizing XML Path Language (XPath) Selectors</a>
@@ -54,41 +51,42 @@ public class PatchOpsListener implements XmlDiffListener {
5451
5552 /**
5653 * Constructs a listener with an output stream
54+ *
5755 * @throws IOException if an IO error occurs
5856 * @throws ParserConfigurationException if a configuration error occurs
5957 * @throws TransformerConfigurationException if a configuration error occurs
60- *
58+ *
6159 */
6260 public PatchOpsListener (OutputStream out )
6361 throws IOException , ParserConfigurationException , TransformerConfigurationException {
6462 writer = new OutputStreamWriter (out , StandardCharsets .UTF_8 );
6563
66- DocumentBuilderFactory dbFactory = DocumentBuilderFactory .newInstance ();
64+ final DocumentBuilderFactory dbFactory = DocumentBuilderFactory .newInstance ();
6765 dbFactory .setNamespaceAware (true );
68- DocumentBuilder dBuilder = dbFactory .newDocumentBuilder ();
66+ final DocumentBuilder dBuilder = dbFactory .newDocumentBuilder ();
6967 document = dBuilder .newDocument ();
7068 rootElement = document .createElement ("diff" );
7169 document .appendChild (rootElement );
7270 }
7371
7472 /*
7573 * (non-Javadoc)
76- *
74+ *
7775 * @see java.util.function.Consumer#accept(java.lang.Object)
7876 */
7977 @ Override
8078 public void accept (Event t ) {
8179
8280 switch (t .getDifference ()) {
8381 case ADD :
84- Element addElement = document .createElement ("add" );
82+ final Element addElement = document .createElement ("add" );
8583 rootElement .appendChild (addElement );
8684
8785 if (t .getValue () instanceof Attr ) {
8886 // add attribute
8987 addElement .setAttribute ("sel" , t .getXpath ());
9088 addElement .setAttribute ("type" , "@" + t .getValue ().getNodeName ());
91- Text textNode = document .createTextNode (t .getValue ().getNodeValue ());
89+ final Text textNode = document .createTextNode (t .getValue ().getNodeValue ());
9290 addElement .appendChild (textNode );
9391 } else if (t .getValue () instanceof Element ) {
9492 // add element
@@ -97,30 +95,30 @@ public void accept(Event t) {
9795 addElement .setAttribute ("pos" , t .getPos ().toString ());
9896 }
9997 // will import child text node if it exists (deep copy)
100- Element newValue = (Element ) document .importNode (t .getValue (), true );
98+ final Element newValue = (Element ) document .importNode (t .getValue (), true );
10199 addElement .appendChild (newValue );
102100 }
103101
104102 break ;
105103 case REPLACE :
106- Element replaceElement = document .createElement ("replace" );
104+ final Element replaceElement = document .createElement ("replace" );
107105 rootElement .appendChild (replaceElement );
108106
109107 if (t .getValue () instanceof Attr ) {
110108 // replace attribute
111109 replaceElement .setAttribute ("sel" , t .getXpath ());
112- Text textNode = document .createTextNode (t .getValue ().getNodeValue ());
110+ final Text textNode = document .createTextNode (t .getValue ().getNodeValue ());
113111 replaceElement .appendChild (textNode );
114112 } else {
115113 // replace element
116114 replaceElement .setAttribute ("sel" , t .getXpath ());
117115 // will import child text node if it exists
118- Node newValue = document .importNode (t .getValue (), true );
116+ final Node newValue = document .importNode (t .getValue (), true );
119117 replaceElement .appendChild (newValue );
120118 }
121119 break ;
122120 case REMOVE :
123- Element removeElement = document .createElement ("remove" );
121+ final Element removeElement = document .createElement ("remove" );
124122 rootElement .appendChild (removeElement );
125123 removeElement .setAttribute ("sel" , t .getXpath ());
126124 break ;
@@ -131,18 +129,18 @@ public void accept(Event t) {
131129
132130 /*
133131 * (non-Javadoc)
134- *
132+ *
135133 * @see java.lang.AutoCloseable#close()
136134 */
137135 @ Override
138136 public void close () throws Exception {
139137 // Idempotent - only close once
140138 if (isClosed .compareAndSet (false , true )) {
141- TransformerFactory transformerFactory = TransformerFactory .newInstance ();
142- Transformer transformer = transformerFactory .newTransformer ();
139+ final TransformerFactory transformerFactory = TransformerFactory .newInstance ();
140+ final Transformer transformer = transformerFactory .newTransformer ();
143141 transformer .setOutputProperty (OutputKeys .INDENT , "yes" );
144- DOMSource source = new DOMSource (document );
145- StreamResult result = new StreamResult (writer );
142+ final DOMSource source = new DOMSource (document );
143+ final StreamResult result = new StreamResult (writer );
146144 transformer .transform (source , result );
147145 writer .close ();
148146 }
0 commit comments