001package ca.uhn.fhir.util;
002
003/*
004 * #%L
005 * HAPI FHIR - Core Library
006 * %%
007 * Copyright (C) 2014 - 2023 Smile CDR, Inc.
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import javax.xml.namespace.NamespaceContext;
024import javax.xml.stream.XMLStreamException;
025import javax.xml.stream.XMLStreamWriter;
026
027public class NonPrettyPrintWriterWrapper implements XMLStreamWriter {
028
029        private static final String PRE = "pre";
030        private XMLStreamWriter myTarget;
031        private int myInsidePre = 0;
032
033        public NonPrettyPrintWriterWrapper(XMLStreamWriter target) {
034                myTarget = target;
035        }
036
037        @Override
038        public void flush() throws XMLStreamException {
039                myTarget.flush();
040        }
041
042        @Override
043        public void close() throws XMLStreamException {
044                myTarget.close();
045        }
046
047        @Override
048        @CoverageIgnore
049        public String getPrefix(String theUri) throws XMLStreamException {
050                return myTarget.getPrefix(theUri);
051        }
052
053        @Override
054        @CoverageIgnore
055        public void setPrefix(String thePrefix, String theUri) throws XMLStreamException {
056                myTarget.setPrefix(thePrefix, theUri);
057        }
058
059        @Override
060        @CoverageIgnore
061        public void setDefaultNamespace(String theUri) throws XMLStreamException {
062                myTarget.setDefaultNamespace(theUri);
063        }
064
065        @Override
066        @CoverageIgnore
067        public void setNamespaceContext(NamespaceContext theContext) throws XMLStreamException {
068                myTarget.setNamespaceContext(theContext);
069        }
070
071        @Override
072        @CoverageIgnore
073        public NamespaceContext getNamespaceContext() {
074                return myTarget.getNamespaceContext();
075        }
076
077        @Override
078        public void writeStartElement(String theLocalName) throws XMLStreamException {
079                if (PRE.equals(theLocalName) || myInsidePre > 0) {
080                        myInsidePre++;
081                }
082                myTarget.writeStartElement(theLocalName);
083        }
084
085        @Override
086        public void writeStartElement(String theNamespaceURI, String theLocalName) throws XMLStreamException {
087                if (PRE.equals(theLocalName) || myInsidePre > 0) {
088                        myInsidePre++;
089                }
090                myTarget.writeStartElement(theNamespaceURI, theLocalName);
091        }
092
093        @Override
094        public void writeStartElement(String thePrefix, String theLocalName, String theNamespaceURI) throws XMLStreamException {
095                if (PRE.equals(theLocalName) || myInsidePre > 0) {
096                        myInsidePre++;
097                }
098                myTarget.writeStartElement(thePrefix, theLocalName, theNamespaceURI);
099        }
100
101        @Override
102        @CoverageIgnore
103        public void writeEmptyElement(String theNamespaceURI, String theLocalName) throws XMLStreamException {
104                myTarget.writeEmptyElement(theNamespaceURI, theLocalName);
105        }
106
107        @Override
108        @CoverageIgnore
109        public void writeEmptyElement(String thePrefix, String theLocalName, String theNamespaceURI) throws XMLStreamException {
110                myTarget.writeEmptyElement(thePrefix, theLocalName, theNamespaceURI);
111        }
112
113        @Override
114        @CoverageIgnore
115        public void writeEmptyElement(String theLocalName) throws XMLStreamException {
116                myTarget.writeEmptyElement(theLocalName);
117        }
118
119        @Override
120        public void writeEndElement() throws XMLStreamException {
121                if (myInsidePre > 0) {
122                        myInsidePre--;
123                }
124                myTarget.writeEndElement();
125        }
126
127        @Override
128        public void writeEndDocument() throws XMLStreamException {
129                myTarget.writeEndDocument();
130        }
131
132        @Override
133        public void writeAttribute(String theLocalName, String theValue) throws XMLStreamException {
134                myTarget.writeAttribute(theLocalName, theValue);
135        }
136
137        @Override
138        @CoverageIgnore
139        public void writeAttribute(String thePrefix, String theNamespaceURI, String theLocalName, String theValue) throws XMLStreamException {
140                myTarget.writeAttribute(thePrefix, theNamespaceURI, theLocalName, theValue);
141        }
142
143        @Override
144        @CoverageIgnore
145        public void writeAttribute(String theNamespaceURI, String theLocalName, String theValue) throws XMLStreamException {
146                myTarget.writeAttribute(theNamespaceURI, theLocalName, theValue);
147        }
148
149        @Override
150        public void writeNamespace(String thePrefix, String theNamespaceURI) throws XMLStreamException {
151                myTarget.writeNamespace(thePrefix, theNamespaceURI);
152        }
153
154        @Override
155        public void writeDefaultNamespace(String theNamespaceURI) throws XMLStreamException {
156                myTarget.writeDefaultNamespace(theNamespaceURI);
157        }
158
159        @Override
160        public void writeComment(String theData) throws XMLStreamException {
161                myTarget.writeComment(theData);
162        }
163
164        @Override
165        @CoverageIgnore
166        public void writeProcessingInstruction(String theTarget) throws XMLStreamException {
167                myTarget.writeProcessingInstruction(theTarget);
168        }
169
170        @Override
171        @CoverageIgnore
172        public void writeProcessingInstruction(String theTarget, String theData) throws XMLStreamException {
173                myTarget.writeProcessingInstruction(theTarget, theData);
174        }
175
176        @Override
177        @CoverageIgnore
178        public void writeCData(String theData) throws XMLStreamException {
179                myTarget.writeCData(theData);
180        }
181
182        @Override
183        @CoverageIgnore
184        public void writeDTD(String theDtd) throws XMLStreamException {
185                myTarget.writeDTD(theDtd);
186        }
187
188        @Override
189        @CoverageIgnore
190        public void writeEntityRef(String theName) throws XMLStreamException {
191                myTarget.writeEntityRef(theName);
192        }
193
194        @Override
195        @CoverageIgnore
196        public void writeStartDocument() throws XMLStreamException {
197                myTarget.writeStartDocument();
198        }
199
200        @Override
201        @CoverageIgnore
202        public void writeStartDocument(String theVersion) throws XMLStreamException {
203                myTarget.writeStartDocument(theVersion);
204        }
205
206        @Override
207        public void writeStartDocument(String theEncoding, String theVersion) throws XMLStreamException {
208                myTarget.writeStartDocument(theEncoding, theVersion);
209        }
210
211        @Override
212        public void writeCharacters(String theText) throws XMLStreamException {
213                if (myInsidePre > 0) {
214                        myTarget.writeCharacters(theText);
215                } else {
216                        writeCharacters(theText.toCharArray(), 0, theText.length());
217                }
218        }
219
220        @Override
221        public void writeCharacters(char[] theText, int theStart, int theLen) throws XMLStreamException {
222                writeCharacters(theText, theStart, theLen, myTarget, myInsidePre);
223        }
224
225        static void writeCharacters(char[] theText, int theStart, int theLen, XMLStreamWriter target, int insidePre) throws XMLStreamException {
226                if (theLen > 0) {
227                        if (insidePre > 0) {
228                                target.writeCharacters(theText, theStart, theLen);
229                        } else {
230                                int initialEnd = theStart + (theLen - 1);
231                                int start = theStart;
232                                int end = initialEnd;
233                                while (Character.isWhitespace(theText[start]) && start < end) {
234                                        start++;
235                                }
236                                while (Character.isWhitespace(theText[end]) && end > start) {
237                                        end--;
238                                }
239                                if (start == end) {
240                                        if (Character.isWhitespace(theText[start])) {
241                                                target.writeCharacters(" ");
242                                                return;
243                                        }
244                                }
245                                if (start > theStart) {
246                                        target.writeCharacters(" ");
247                                }
248                                target.writeCharacters(theText, start, (end - start) + 1);
249                                if (end < initialEnd) {
250                                        target.writeCharacters(" ");
251                                }
252
253                        }
254                }
255        }
256
257        @Override
258        @CoverageIgnore
259        public Object getProperty(String theName) throws IllegalArgumentException {
260                return myTarget.getProperty(theName);
261        }
262
263}