Javolution 6.0.0 java
XMLStreamWriterImpl.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.xml.internal.stream;
10 
11 import java.io.IOException;
12 import java.io.OutputStream;
13 import java.io.OutputStreamWriter;
14 import java.io.UnsupportedEncodingException;
15 import java.io.Writer;
16 
18 import javolution.lang.Realtime;
24 
35 @Realtime
36 public final class XMLStreamWriterImpl implements XMLStreamWriter {
37 
41  private static final int BUFFER_LENGTH = 2048;
42 
46  private int _nesting = 0;
47 
51  private TextBuilder[] _qNames = new TextBuilder[16];
52 
56  private boolean _isElementOpen;
57 
61  private boolean _isEmptyElement;
62 
66  private final char[] _buffer = new char[BUFFER_LENGTH];
67 
71  private final NamespacesImpl _namespaces = new NamespacesImpl();
72 
76  private int _index;
77 
81  private boolean _isRepairingNamespaces;
82 
86  private String _repairingPrefix = "ns";
87 
91  private String _indentation;
92 
96  private String _lineSeparator = "\n";
97 
101  private int _indentationLevel;
102 
106  private boolean _automaticEmptyElements;
107 
111  private boolean _noEmptyElementTag;
112 
116  private int _autoNSCount;
117 
121  private boolean _isAttributeValue;
122 
124  // Temporary Settings //
126 
130  private Writer _writer;
131 
135  private String _encoding;
136 
141 
146 
151  this(null);
152  }
153 
158  _factory = factory;
159  for (int i = 0; i < _qNames.length;) {
160  _qNames[i++] = new TextBuilder();
161  }
162  }
163 
170  public void setOutput(OutputStream out) throws XMLStreamException {
172  _encoding = "UTF-8";
174  }
175 
184  public void setOutput(OutputStream out, String encoding)
185  throws XMLStreamException {
186  if (encoding.equals("UTF-8") || encoding.equals("utf-8")
187  || encoding.equals("ASCII")) {
188  setOutput(out); // Default encoding.
189  } else {
190  try {
191  _encoding = encoding;
192  setOutput(new OutputStreamWriter(out, encoding));
193  } catch (UnsupportedEncodingException e) {
194  throw new XMLStreamException(e);
195  }
196  }
197  }
198 
207  public void setOutput(Writer writer) throws XMLStreamException {
208  if (_writer != null)
209  throw new IllegalStateException("Writer not closed or reset");
210  _writer = writer;
211  }
212 
220  public void setRepairingNamespaces(boolean isRepairingNamespaces) {
221  _isRepairingNamespaces = isRepairingNamespaces;
222  }
223 
232  public void setRepairingPrefix(String repairingPrefix) {
233  _repairingPrefix = repairingPrefix;
234  }
235 
243  public void setIndentation(String indentation) {
244  _indentation = indentation;
245  }
246 
252  public void setLineSeparator(String lineSeparator) {
253  _lineSeparator = lineSeparator;
254  }
255 
265  public void setAutomaticEmptyElements(boolean automaticEmptyElements) {
266  _automaticEmptyElements = automaticEmptyElements;
267  }
268 
277  public void setNoEmptyElementTag(boolean noEmptyElementTag) {
278  _noEmptyElementTag = noEmptyElementTag;
279  }
280 
281  // Implements reusable.
282  public void reset() {
283  _automaticEmptyElements = false;
284  _autoNSCount = 0;
285  _encoding = null;
286  _indentation = null;
287  _indentationLevel = 0;
288  _index = 0;
289  _isAttributeValue = false;
290  _isElementOpen = false;
291  _isEmptyElement = false;
292  _isRepairingNamespaces = false;
293  _namespaces.reset();
294  _nesting = 0;
295  _noEmptyElementTag = false;
296  _repairingPrefix = "ns";
298  _writer = null;
299 
300  if (_factory != null)
301  _factory.recycle(this);
302  }
303 
304  // Implements XMLStreamWriter interface.
305  public void writeStartElement(CharSequence localName)
306  throws XMLStreamException {
307  if (localName == null)
308  throw new XMLStreamException("Local name cannot be null");
309  writeNewElement(null, localName, null);
310  }
311 
312  // Implements XMLStreamWriter interface.
313  public void writeStartElement(CharSequence namespaceURI,
314  CharSequence localName) throws XMLStreamException {
315  if (localName == null)
316  throw new XMLStreamException("Local name cannot be null");
317  if (namespaceURI == null)
318  throw new XMLStreamException("Namespace URI cannot be null");
319  writeNewElement(null, localName, namespaceURI);
320  }
321 
322  // Implements XMLStreamWriter interface.
323  public void writeStartElement(CharSequence prefix, CharSequence localName,
324  CharSequence namespaceURI) throws XMLStreamException {
325  if (localName == null)
326  throw new XMLStreamException("Local name cannot be null");
327  if (namespaceURI == null)
328  throw new XMLStreamException("Namespace URI cannot be null");
329  if (prefix == null)
330  throw new XMLStreamException("Prefix cannot be null");
331  writeNewElement(prefix, localName, namespaceURI);
332  }
333 
334  // Implements XMLStreamWriter interface.
335  public void writeEmptyElement(CharSequence localName)
336  throws XMLStreamException {
337  writeStartElement(localName);
338  _isEmptyElement = true;
339  }
340 
341  // Implements XMLStreamWriter interface.
342  public void writeEmptyElement(CharSequence namespaceURI,
343  CharSequence localName) throws XMLStreamException {
344  writeStartElement(namespaceURI, localName);
345  _isEmptyElement = true;
346  }
347 
348  // Implements XMLStreamWriter interface.
349  public void writeEmptyElement(CharSequence prefix, CharSequence localName,
350  CharSequence namespaceURI) throws XMLStreamException {
351  writeStartElement(prefix, localName, namespaceURI);
352  _isEmptyElement = true;
353  }
354 
355  // Implements XMLStreamWriter interface.
356  public void writeEndElement() throws XMLStreamException {
357  if (_isElementOpen) { // Empty element.
358  if (_isEmptyElement) { // Closes the empty element tag.
359  closeOpenTag();
360  } else { // Start element open.
361  if (_automaticEmptyElements) { // Do as if empty element written.
362  _isEmptyElement = true;
363  closeOpenTag();
364  return;
365  } else { // Closes the start element tag.
366  closeOpenTag();
367  }
368  }
369  }
370  if ((_indentation != null) && (_indentationLevel != _nesting - 1)) {
371  // Do not indent if no change in indentation level
372  // to avoid interfering with text only elements.
374  for (int i = 1; i < _nesting; i++) {
376  }
377  }
378 
379  write('<');
380  write('/');
382  write('>');
383  _namespaces.pop();
384  }
385 
386  // Implements XMLStreamWriter interface.
387  public void writeEndDocument() throws XMLStreamException {
388  if (_isElementOpen)
389  closeOpenTag();
390  while (_nesting > 0) { // Implicits closing of all elements.
391  writeEndElement();
392  }
393  flush(); // Not mandatory but safer.
394  }
395 
396  // Implements XMLStreamWriter interface.
397  public void close() throws XMLStreamException {
398  if (_writer != null) {
399  if (_nesting != 0) { // Closes all elements.
401  }
402  flush();
403  }
404  reset(); // Explicit reset.
405  }
406 
407  // Implements XMLStreamWriter interface.
408  public void flush() throws XMLStreamException {
409  flushBuffer();
410  try {
411  _writer.flush();
412  } catch (IOException e) {
413  throw new XMLStreamException(e);
414  }
415  }
416 
417  // Implements XMLStreamWriter interface.
418  public void writeAttribute(CharSequence localName, CharSequence value)
419  throws XMLStreamException {
420  if (localName == null)
421  throw new XMLStreamException("Local name cannot be null");
422  if (value == null)
423  throw new XMLStreamException("Value cannot be null");
424  writeAttributeOrNamespace(null, null, localName, value);
425  }
426 
427  // Implements XMLStreamWriter interface.
428  public void writeAttribute(CharSequence namespaceURI,
429  CharSequence localName, CharSequence value)
430  throws XMLStreamException {
431  if (localName == null)
432  throw new XMLStreamException("Local name cannot be null");
433  if (value == null)
434  throw new XMLStreamException("Value cannot be null");
435  if (namespaceURI == null)
436  throw new XMLStreamException("Namespace URI cannot be null");
437  writeAttributeOrNamespace(null, namespaceURI, localName, value);
438  }
439 
440  // Implements XMLStreamWriter interface.
441  public void writeAttribute(CharSequence prefix, CharSequence namespaceURI,
442  CharSequence localName, CharSequence value)
443  throws XMLStreamException {
444  if (localName == null)
445  throw new XMLStreamException("Local name cannot be null");
446  if (value == null)
447  throw new XMLStreamException("Value cannot be null");
448  if (namespaceURI == null)
449  throw new XMLStreamException("Namespace URI cannot be null");
450  if (prefix == null)
451  throw new XMLStreamException("Prefix cannot be null");
452  writeAttributeOrNamespace(prefix, namespaceURI, localName, value);
453  }
454 
455  // Implements XMLStreamWriter interface.
456  public void writeNamespace(CharSequence prefix, CharSequence namespaceURI)
457  throws XMLStreamException {
458  if ((prefix == null) || (prefix.length() == 0)
459  || _namespaces._xmlns.equals(prefix)) {
460  prefix = _namespaces._defaultNsPrefix;
461  }
462  if (!_isElementOpen) // Check now as the actual writting is queued.
463  throw new IllegalStateException("No open start element");
464  _namespaces.setPrefix(prefix,
465  (namespaceURI == null) ? _namespaces._nullNsURI : namespaceURI,
466  true);
467  }
468 
469  // Implements XMLStreamWriter interface.
470  public void writeDefaultNamespace(CharSequence namespaceURI)
471  throws XMLStreamException {
473  }
474 
475  // Implements XMLStreamWriter interface.
476  public void writeComment(CharSequence data) throws XMLStreamException {
477  if (_isElementOpen)
478  closeOpenTag();
479  writeNoEscape("<!--");
480  if (data != null) { // null values allowed.
481  writeNoEscape(data);
482  }
483  writeNoEscape("-->");
484  }
485 
486  // Implements XMLStreamWriter interface.
487  public void writeProcessingInstruction(CharSequence target)
488  throws XMLStreamException {
490  }
491 
492  private final CharArray _noChar = new CharArray("");
493 
494  // Implements XMLStreamWriter interface.
495  public void writeProcessingInstruction(CharSequence target,
496  CharSequence data) throws XMLStreamException {
497  if (target == null)
498  throw new XMLStreamException("Target cannot be null");
499  if (data == null)
500  throw new XMLStreamException("Data cannot be null");
501  if (_isElementOpen)
502  closeOpenTag();
503  writeNoEscape("<?");
504  writeNoEscape(target);
505  write(' ');
506  writeNoEscape(data);
507  writeNoEscape(" ?>");
508  }
509 
510  // Implements XMLStreamWriter interface.
511  public void writeCData(CharSequence data) throws XMLStreamException {
512  if (data == null)
513  throw new XMLStreamException("Data cannot be null");
514  if (_isElementOpen)
515  closeOpenTag();
516  writeNoEscape("<![CDATA[");
517  writeNoEscape(data);
518  writeNoEscape("]]>");
519  }
520 
521  // Implements XMLStreamWriter interface.
522  public void writeDTD(CharSequence dtd) throws XMLStreamException {
523  if (dtd == null)
524  throw new XMLStreamException("DTD cannot be null");
525  if (_nesting > 0)
526  throw new XMLStreamException(
527  "DOCTYPE declaration (DTD) when not in document root (prolog)");
528  writeNoEscape(dtd);
529  }
530 
531  // Implements XMLStreamWriter interface.
532  public void writeEntityRef(CharSequence name) throws XMLStreamException {
533  write('&');
534  writeNoEscape(name);
535  write(';');
536  }
537 
538  // Implements XMLStreamWriter interface.
539  public void writeStartDocument() throws XMLStreamException {
540  writeStartDocument(null, null);
541  }
542 
543  // Implements XMLStreamWriter interface.
544  public void writeStartDocument(CharSequence version)
545  throws XMLStreamException {
546  writeStartDocument(null, version);
547  }
548 
549  // Implements XMLStreamWriter interface.
550  public void writeStartDocument(CharSequence encoding, CharSequence version)
551  throws XMLStreamException {
552  if (_nesting > 0)
553  throw new XMLStreamException("Not in document root");
554  writeNoEscape("<?xml version=\"");
555  if (version != null) {
556  writeNoEscape(version);
557  write('"');
558  } else { // Default to 1.0
559  writeNoEscape("1.0\"");
560  }
561  if (encoding != null) {
562  writeNoEscape(" encoding=\"");
563  writeNoEscape(encoding);
564  write('"');
565  } else if (_encoding != null) { // Use init encoding (if any).
566  writeNoEscape(" encoding=\"");
568  write('"');
569  }
570  writeNoEscape(" ?>");
571  }
572 
573  // Implements XMLStreamWriter interface.
574  public void writeCharacters(CharSequence text) throws XMLStreamException {
575  if (_isElementOpen)
576  closeOpenTag();
577  if (text == null)
578  return;
579  writeEscape(text);
580  }
581 
582  // Implements XMLStreamWriter interface.
583  public void writeCharacters(char[] text, int start, int length)
584  throws XMLStreamException {
585  _tmpCharArray.setArray(text, start, length);
587  }
588 
589  private final CharArray _tmpCharArray = new CharArray();
590 
591  // Implements XMLStreamWriter interface.
592  public CharSequence getPrefix(CharSequence uri) throws XMLStreamException {
593  return _namespaces.getPrefix(uri);
594  }
595 
596  // Implements XMLStreamWriter interface.
597  public void setPrefix(CharSequence prefix, CharSequence uri)
598  throws XMLStreamException {
599  _namespaces.setPrefix(prefix, (uri == null) ? _namespaces._nullNsURI
600  : uri, false);
601  }
602 
603  // Implements XMLStreamWriter interface.
604  public void setDefaultNamespace(CharSequence uri) throws XMLStreamException {
606  }
607 
608  // Implements XMLStreamWriter interface.
609  public Object getProperty(String name) throws IllegalArgumentException {
610  if (name.equals(XMLOutputFactory.IS_REPAIRING_NAMESPACES)) {
611  return new Boolean(_isRepairingNamespaces);
612  } else if (name.equals(XMLOutputFactory.REPAIRING_PREFIX)) {
613  return _repairingPrefix;
614  } else if (name.equals(XMLOutputFactory.AUTOMATIC_EMPTY_ELEMENTS)) {
615  return new Boolean(_automaticEmptyElements);
616  } else if (name.equals(XMLOutputFactory.NO_EMPTY_ELEMENT_TAG)) {
617  return new Boolean(_noEmptyElementTag);
618  } else if (name.equals(XMLOutputFactory.INDENTATION)) {
619  return _indentation;
620  } else if (name.equals(XMLOutputFactory.LINE_SEPARATOR)) {
621  return _lineSeparator;
622  } else {
623  throw new IllegalArgumentException("Property: " + name
624  + " not supported");
625  }
626  }
627 
628  // Writes a new start or empty element.
629  private void writeNewElement(CharSequence prefix, CharSequence localName,
630  CharSequence namespaceURI) throws XMLStreamException {
631 
632  // Close any open element and gets ready to write a new one.
633  if (_isElementOpen)
634  closeOpenTag();
635  if (_indentation != null) {
638  for (int i = 0; i < _indentationLevel; i++) {
640  }
641  }
642  write('<');
643  _isElementOpen = true;
644 
645  // Enters a new local scope.
646  if (++_nesting >= _qNames.length)
647  resizeElemStack();
648  _namespaces.push();
649 
650  // Constructs qName.
651  TextBuilder qName = _qNames[_nesting].clear();
652 
653  // Writes prefix if any.
654  if ((namespaceURI != null)
655  && (!_namespaces._defaultNamespace.equals(namespaceURI))) {
656  if (_isRepairingNamespaces) { // Repairs prefix.
657  prefix = getRepairedPrefix(prefix, namespaceURI);
658  } else if (prefix == null) { // Retrieves prefix.
659  prefix = getPrefix(namespaceURI);
660  if (prefix == null)
661  throw new XMLStreamException("URI: " + namespaceURI
662  + " not bound and repairing namespaces disabled");
663  }
664  if (prefix.length() > 0) {
665  qName.append(prefix);
666  qName.append(':');
667  }
668  }
669  qName.append(localName);
670  writeNoEscape(qName);
671  }
672 
673  // Writes a new attribute.
674  private void writeAttributeOrNamespace(CharSequence prefix,
675  CharSequence namespaceURI, CharSequence localName,
676  CharSequence value) throws XMLStreamException {
677  if (!_isElementOpen)
678  throw new IllegalStateException("No open start element");
679  write(' ');
680 
681  // Writes prefix if any.
682  if ((namespaceURI != null)
683  && (!_namespaces._defaultNamespace.equals(namespaceURI))) {
684  if (_isRepairingNamespaces) { // Repairs prefix if current prefix is not correct.
685  prefix = getRepairedPrefix(prefix, namespaceURI);
686  } else if (prefix == null) {
687  prefix = getPrefix(namespaceURI);
688  if (prefix == null)
689  throw new XMLStreamException("URI: " + namespaceURI
690  + " not bound and repairing namespaces disabled");
691  }
692  if (prefix.length() > 0) {
693  writeNoEscape(prefix);
694  write(':');
695  }
696  }
697 
698  writeNoEscape(localName);
699  write('=');
700  write('"');
701  _isAttributeValue = true;
702  writeEscape(value);
703  _isAttributeValue = false;
704  write('"');
705  }
706 
707  // Closes the current element (scope if empty element).
708  private void closeOpenTag() throws XMLStreamException {
709 
710  // Writes namespaces now.
711  writeNamespaces();
712 
713  // Closes the tag.
714  _isElementOpen = false;
715  if (_isEmptyElement) {
716  if (_noEmptyElementTag) {
717  write('<');
718  write('/');
720  write('>');
721  } else { // Use empty element tag.
722  write('/');
723  write('>');
724  }
725  _nesting--;
726  _namespaces.pop();
727  _isEmptyElement = false;
728  } else {
729  write('>');
730  }
731  }
732 
733  // Writes all namespaces, these include namespaces set but
734  // not written in outer scope.
735  private void writeNamespaces() throws XMLStreamException {
736  int i0 = (_nesting > 1) ? _namespaces._namespacesCount[_nesting - 2]
738  int i1 = _namespaces._namespacesCount[_nesting - 1];
740  for (int i = i0; i < i2; i++) {
741  if (((_isRepairingNamespaces && (i < i1) && !_namespaces._prefixesWritten[i]))
742  || ((i >= i1) && _namespaces._prefixesWritten[i])) { // Write namespace.
743 
744  // In repairing mode, removes redondancy.
747  _namespaces._namespaces[i], i);
748  if (_namespaces._prefixes[i].equals(prefix))
749  continue; // Not necessary.
750  } // Direct mode, just write them as requested (no check).
751 
752  // Writes namespace.
753  if (_namespaces._prefixes[i].length() == 0) { // Default namespace.
756  } else {
760  }
761  }
762  }
763  }
764 
765  // Returns the prefix for the specified namespace.
766  private CharSequence getRepairedPrefix(CharSequence prefix,
767  CharSequence namespaceURI) throws XMLStreamException {
768  CharArray prefixForURI = _namespaces.getPrefix(namespaceURI);
769  if ((prefixForURI != null)
770  && ((prefix == null) || prefixForURI.equals(prefix)))
771  return prefixForURI; // No repair needed.
772  if ((prefix == null) || (prefix.length() == 0)) { // Creates new prefix.
774  .append(_autoNSCount++);
775  }
776  _namespaces.setPrefix(prefix, namespaceURI, true); // Map to namespace URI.
777  return prefix;
778  }
779 
780  private final TextBuilder _autoPrefix = new TextBuilder();
781 
782  // Resizes element stack (same memory area as the writer).
783  private void resizeElemStack() {
784  final int oldLength = _qNames.length;
785  final int newLength = oldLength * 2;
786 
787  // Resizes elements qNames stack.
788  TextBuilder[] tmp = new TextBuilder[newLength];
789  System.arraycopy(_qNames, 0, tmp, 0, oldLength);
790  _qNames = tmp;
791  for (int i = oldLength; i < newLength; i++) {
792  _qNames[i] = new TextBuilder();
793  }
794  }
795 
796  // Writes methods.
797  //
798 
799  private final void writeNoEscape(String str) throws XMLStreamException {
800  write(str, 0, str.length(), false);
801  }
802 
803  private final void writeNoEscape(TextBuilder tb) throws XMLStreamException {
804  write(tb, 0, tb.length(), false);
805  }
806 
807  private final void writeNoEscape(CharSequence csq)
808  throws XMLStreamException {
809  write(csq, 0, csq.length(), false);
810  }
811 
812  private final void writeEscape(CharSequence csq) throws XMLStreamException {
813  write(csq, 0, csq.length(), true);
814  }
815 
816  private final void write(Object csq, int start, int length,
817  boolean escapeMarkup) throws XMLStreamException {
818  if (_index + length <= BUFFER_LENGTH) { // Enough buffer space.
819  if (csq instanceof String) {
820  ((String) csq).getChars(start, start + length, _buffer, _index);
821  } else if (csq instanceof javolution.text.Text) {
822  ((javolution.text.Text) csq).getChars(start, start + length,
823  _buffer, _index);
824  } else if (csq instanceof javolution.text.TextBuilder) {
825  ((javolution.text.TextBuilder) csq).getChars(start, start
826  + length, _buffer, _index);
827  } else if (csq instanceof javolution.text.CharArray) {
828  ((javolution.text.CharArray) csq).getChars(start, start
829  + length, _buffer, _index);
830  } else {
831  getChars((CharSequence) csq, start, start + length, _buffer,
832  _index);
833  }
834  if (escapeMarkup) {
835  int end = _index + length;
836  for (int i = _index; i < end; i++) {
837  char c = _buffer[i];
838  if ((c >= '?') || !isEscaped(c))
839  continue;
840  // Found character to escape.
841  _index = i;
842  flushBuffer();
844  return; // Done (buffer is empty).
845  }
846  }
847  _index += length;
848 
849  } else { // Not enough remaining space.
850  if (length <= BUFFER_LENGTH) { // Enough space if buffer emptied.
851  flushBuffer();
852  write(csq, start, length, escapeMarkup);
853  } else {
854  int half = length >> 1;
855  write(csq, start, half, escapeMarkup);
856  write(csq, start + half, length - half, escapeMarkup);
857  }
858  }
859  }
860 
861  private static void getChars(CharSequence csq, int start, int end,
862  char dest[], int destPos) {
863  for (int i = start, j = destPos; i < end;) {
864  dest[j++] = csq.charAt(i++);
865  }
866  }
867 
868  // The buffer must have been flushed prior to calling this method.
869  private final void writeDirectEscapedCharacters(char[] chars, int start,
870  int end) throws XMLStreamException {
871  try {
872  int blockStart = start;
873  for (int i = start; i < end;) {
874  char c = chars[i++];
875  if ((c >= '?') || !isEscaped(c))
876  continue;
877  // Flush already read characters (excluding escaped one).
878  int blockLength = i - blockStart - 1;
879  if (blockLength > 0) {
880  _writer.write(_buffer, blockStart, blockLength);
881  }
882  blockStart = i;
883  switch (c) {
884  case '<':
885  _writer.write("&lt;");
886  break;
887  case '>':
888  _writer.write("&gt;");
889  break;
890  case '\'':
891  _writer.write("&apos;");
892  break;
893  case '"':
894  _writer.write("&quot;");
895  break;
896  case '&':
897  _writer.write("&amp;");
898  break;
899  default:
900  _writer.write("&#");
901  _writer.write((char) ('0' + c / 10));
902  _writer.write((char) ('0' + c % 10));
903  _writer.write(';');
904  }
905  }
906  // Flush the current block.
907  int blockLength = end - blockStart;
908  if (blockLength > 0) {
909  _writer.write(_buffer, blockStart, blockLength);
910  }
911  } catch (IOException e) {
912  throw new XMLStreamException(e);
913  }
914  }
915 
916  private boolean isEscaped(char c) {
917  return ((c < ' ') && _isAttributeValue)
918  || (c == '"' && _isAttributeValue) || (c == '<') || (c == '>')
919  || (c == '&');
920  }
921 
922  private final void write(char c) throws XMLStreamException {
923  if (_index == BUFFER_LENGTH) {
924  flushBuffer();
925  }
926  _buffer[_index++] = c;
927  }
928 
929  private void flushBuffer() throws XMLStreamException {
930  try {
931  _writer.write(_buffer, 0, _index);
932  } catch (IOException e) {
933  throw new XMLStreamException(e);
934  } finally {
935  _index = 0;
936  }
937  }
938 
939 }
javolution.xml.internal.stream.XMLStreamWriterImpl.write
final void write(Object csq, int start, int length, boolean escapeMarkup)
Definition: XMLStreamWriterImpl.java:816
javolution.xml.internal.stream.XMLStreamWriterImpl._nesting
int _nesting
Definition: XMLStreamWriterImpl.java:46
javolution.xml.internal.stream.NamespacesImpl.setPrefix
void setPrefix(CharArray prefix, CharArray uri)
Definition: NamespacesImpl.java:152
javolution.text.CharArray
Definition: CharArray.java:36
javolution.xml.stream.XMLOutputFactory.LINE_SEPARATOR
static final String LINE_SEPARATOR
Definition: XMLOutputFactory.java:84
javolution.xml.internal.stream.XMLStreamWriterImpl.setIndentation
void setIndentation(String indentation)
Definition: XMLStreamWriterImpl.java:243
javolution
javolution.xml.internal.stream.NamespacesImpl.getPrefix
CharArray getPrefix(CharSequence uri)
Definition: NamespacesImpl.java:113
javolution.xml.internal.stream.XMLStreamWriterImpl.writeNoEscape
final void writeNoEscape(CharSequence csq)
Definition: XMLStreamWriterImpl.java:807
javolution.xml.internal.stream.NamespacesImpl._defaultNsPrefix
final CharArray _defaultNsPrefix
Definition: NamespacesImpl.java:35
javolution.xml.internal.stream.XMLStreamWriterImpl._autoPrefix
final TextBuilder _autoPrefix
Definition: XMLStreamWriterImpl.java:780
javolution.xml.internal.stream.XMLStreamWriterImpl.setOutput
void setOutput(Writer writer)
Definition: XMLStreamWriterImpl.java:207
javolution.xml.internal.stream.XMLStreamWriterImpl.writeAttribute
void writeAttribute(CharSequence localName, CharSequence value)
Definition: XMLStreamWriterImpl.java:418
javolution.xml.internal.stream.XMLStreamWriterImpl.writeProcessingInstruction
void writeProcessingInstruction(CharSequence target)
Definition: XMLStreamWriterImpl.java:487
javolution.text.TextBuilder.append
final TextBuilder append(char c)
Definition: TextBuilder.java:202
javolution.xml.internal.stream.XMLStreamWriterImpl._qNames
TextBuilder[] _qNames
Definition: XMLStreamWriterImpl.java:51
javolution.text.Text
Definition: Text.java:62
javolution.xml.internal.stream.XMLStreamWriterImpl.writeEndElement
void writeEndElement()
Definition: XMLStreamWriterImpl.java:356
javolution.io
Definition: AppendableWriter.java:9
javolution.xml.internal.stream.XMLStreamWriterImpl.flushBuffer
void flushBuffer()
Definition: XMLStreamWriterImpl.java:929
javolution.text.TextBuilder
Definition: TextBuilder.java:29
javolution.text.TextBuilder.clear
final TextBuilder clear()
Definition: TextBuilder.java:725
javolution.xml.internal.stream.XMLStreamWriterImpl.setOutput
void setOutput(OutputStream out, String encoding)
Definition: XMLStreamWriterImpl.java:184
javolution.xml.internal.stream.XMLStreamWriterImpl.setRepairingNamespaces
void setRepairingNamespaces(boolean isRepairingNamespaces)
Definition: XMLStreamWriterImpl.java:220
javolution.xml.stream.XMLOutputFactory
Definition: XMLOutputFactory.java:57
javolution.xml.internal.stream.NamespacesImpl._xmlnsURI
final CharArray _xmlnsURI
Definition: NamespacesImpl.java:44
javolution.xml.internal.stream.XMLStreamWriterImpl._index
int _index
Definition: XMLStreamWriterImpl.java:76
javolution.xml.internal.stream.NamespacesImpl.push
void push()
Definition: NamespacesImpl.java:219
javolution.io.UTF8StreamWriter.setOutput
UTF8StreamWriter setOutput(OutputStream out)
Definition: UTF8StreamWriter.java:82
javolution.xml.internal.stream.XMLStreamWriterImpl.writeStartElement
void writeStartElement(CharSequence localName)
Definition: XMLStreamWriterImpl.java:305
javolution.xml.internal.stream.XMLStreamWriterImpl.writeStartElement
void writeStartElement(CharSequence namespaceURI, CharSequence localName)
Definition: XMLStreamWriterImpl.java:313
javolution.xml.internal.stream.XMLStreamWriterImpl._repairingPrefix
String _repairingPrefix
Definition: XMLStreamWriterImpl.java:86
javolution.xml.stream.XMLOutputFactory.IS_REPAIRING_NAMESPACES
static final String IS_REPAIRING_NAMESPACES
Definition: XMLOutputFactory.java:63
javolution.xml.internal.stream.XMLStreamWriterImpl.getRepairedPrefix
CharSequence getRepairedPrefix(CharSequence prefix, CharSequence namespaceURI)
Definition: XMLStreamWriterImpl.java:766
javolution.xml.internal.stream.XMLStreamWriterImpl.setOutput
void setOutput(OutputStream out)
Definition: XMLStreamWriterImpl.java:170
javolution.xml.internal.stream.XMLStreamWriterImpl.flush
void flush()
Definition: XMLStreamWriterImpl.java:408
javolution.text.CharArray.equals
boolean equals(Object that)
Definition: CharArray.java:204
javolution.xml.internal.stream.XMLStreamWriterImpl.writeComment
void writeComment(CharSequence data)
Definition: XMLStreamWriterImpl.java:476
javolution.xml.stream.XMLOutputFactory.NO_EMPTY_ELEMENT_TAG
static final String NO_EMPTY_ELEMENT_TAG
Definition: XMLOutputFactory.java:102
javolution.io.UTF8StreamWriter
Definition: UTF8StreamWriter.java:36
javolution.xml.internal.stream.XMLStreamWriterImpl._tmpCharArray
final CharArray _tmpCharArray
Definition: XMLStreamWriterImpl.java:589
javolution.xml.internal.stream.XMLStreamWriterImpl._encoding
String _encoding
Definition: XMLStreamWriterImpl.java:135
javolution.xml.internal.stream.NamespacesImpl._prefixes
CharArray[] _prefixes
Definition: NamespacesImpl.java:54
javolution.xml.internal.stream.XMLStreamWriterImpl._indentationLevel
int _indentationLevel
Definition: XMLStreamWriterImpl.java:101
javolution.xml.internal.stream.XMLStreamWriterImpl.setAutomaticEmptyElements
void setAutomaticEmptyElements(boolean automaticEmptyElements)
Definition: XMLStreamWriterImpl.java:265
javolution.xml.internal.stream.NamespacesImpl.NBR_PREDEFINED_NAMESPACES
static final int NBR_PREDEFINED_NAMESPACES
Definition: NamespacesImpl.java:27
javolution.xml.internal.stream.XMLStreamWriterImpl.BUFFER_LENGTH
static final int BUFFER_LENGTH
Definition: XMLStreamWriterImpl.java:41
javolution.xml.internal.stream.NamespacesImpl._namespacesCount
int[] _namespacesCount
Definition: NamespacesImpl.java:69
javolution.xml.stream.XMLStreamException
Definition: XMLStreamException.java:17
javolution.xml.internal.stream.XMLStreamWriterImpl.writeStartElement
void writeStartElement(CharSequence prefix, CharSequence localName, CharSequence namespaceURI)
Definition: XMLStreamWriterImpl.java:323
javolution.xml.internal.stream.NamespacesImpl
Definition: NamespacesImpl.java:22
javolution.xml.internal.stream.XMLStreamWriterImpl._lineSeparator
String _lineSeparator
Definition: XMLStreamWriterImpl.java:96
javolution.xml.internal.stream.XMLStreamWriterImpl.writeAttribute
void writeAttribute(CharSequence prefix, CharSequence namespaceURI, CharSequence localName, CharSequence value)
Definition: XMLStreamWriterImpl.java:441
javolution.lang
Definition: Configurable.java:9
javolution.xml.internal.stream.XMLStreamWriterImpl.setLineSeparator
void setLineSeparator(String lineSeparator)
Definition: XMLStreamWriterImpl.java:252
javolution.xml.internal.stream.XMLStreamWriterImpl._namespaces
final NamespacesImpl _namespaces
Definition: XMLStreamWriterImpl.java:71
javolution.xml.internal.stream.XMLStreamWriterImpl.writeNamespaces
void writeNamespaces()
Definition: XMLStreamWriterImpl.java:735
javolution.xml.internal.stream.XMLStreamWriterImpl.writeEntityRef
void writeEntityRef(CharSequence name)
Definition: XMLStreamWriterImpl.java:532
javolution.text
Definition: CharArray.java:9
javolution.xml.internal.stream.NamespacesImpl.reset
void reset()
Definition: NamespacesImpl.java:227
javolution.text.TextBuilder.length
final int length()
Definition: TextBuilder.java:91
javolution.xml.internal.stream.XMLStreamWriterImpl.XMLStreamWriterImpl
XMLStreamWriterImpl()
Definition: XMLStreamWriterImpl.java:150
javolution.xml.internal.stream.XMLStreamWriterImpl._automaticEmptyElements
boolean _automaticEmptyElements
Definition: XMLStreamWriterImpl.java:106
javolution.xml.internal.stream.XMLStreamWriterImpl.writeNamespace
void writeNamespace(CharSequence prefix, CharSequence namespaceURI)
Definition: XMLStreamWriterImpl.java:456
javolution.xml.stream.XMLOutputFactory.AUTOMATIC_EMPTY_ELEMENTS
static final String AUTOMATIC_EMPTY_ELEMENTS
Definition: XMLOutputFactory.java:92
javolution.xml.internal.stream.XMLStreamWriterImpl.reset
void reset()
Definition: XMLStreamWriterImpl.java:282
javolution.xml.stream.XMLStreamWriter
Definition: XMLStreamWriter.java:47
javolution.xml.internal.stream.XMLStreamWriterImpl.isEscaped
boolean isEscaped(char c)
Definition: XMLStreamWriterImpl.java:916
javolution.xml.internal.stream.XMLStreamWriterImpl.close
void close()
Definition: XMLStreamWriterImpl.java:397
javolution.text.CharArray.length
int length()
Definition: CharArray.java:95
javolution.xml.internal.stream.XMLStreamWriterImpl.resizeElemStack
void resizeElemStack()
Definition: XMLStreamWriterImpl.java:783
javolution.xml.internal.stream.XMLStreamWriterImpl._factory
final XMLOutputFactoryImpl _factory
Definition: XMLStreamWriterImpl.java:145
javolution.xml.internal.stream.XMLStreamWriterImpl.writeAttributeOrNamespace
void writeAttributeOrNamespace(CharSequence prefix, CharSequence namespaceURI, CharSequence localName, CharSequence value)
Definition: XMLStreamWriterImpl.java:674
javolution.xml.internal.stream.XMLStreamWriterImpl.writeEmptyElement
void writeEmptyElement(CharSequence localName)
Definition: XMLStreamWriterImpl.java:335
javolution.xml.internal.stream.XMLStreamWriterImpl.getPrefix
CharSequence getPrefix(CharSequence uri)
Definition: XMLStreamWriterImpl.java:592
javolution.xml.internal.stream.XMLStreamWriterImpl.writeNewElement
void writeNewElement(CharSequence prefix, CharSequence localName, CharSequence namespaceURI)
Definition: XMLStreamWriterImpl.java:629
javolution.xml.internal.stream.XMLStreamWriterImpl.getChars
static void getChars(CharSequence csq, int start, int end, char dest[], int destPos)
Definition: XMLStreamWriterImpl.java:861
javolution.xml.internal.stream.XMLStreamWriterImpl.setNoEmptyElementTag
void setNoEmptyElementTag(boolean noEmptyElementTag)
Definition: XMLStreamWriterImpl.java:277
javolution.xml.internal.stream.XMLStreamWriterImpl._noChar
final CharArray _noChar
Definition: XMLStreamWriterImpl.java:492
javolution.lang.Realtime
Definition: Realtime.java:59
javolution.xml.internal.stream.XMLStreamWriterImpl.writeAttribute
void writeAttribute(CharSequence namespaceURI, CharSequence localName, CharSequence value)
Definition: XMLStreamWriterImpl.java:428
javolution.xml.internal.stream.XMLStreamWriterImpl._isEmptyElement
boolean _isEmptyElement
Definition: XMLStreamWriterImpl.java:61
javolution.xml.internal.stream.XMLOutputFactoryImpl.recycle
void recycle(XMLStreamWriterImpl xmlWriter)
Definition: XMLOutputFactoryImpl.java:124
javolution.xml.internal.stream.XMLStreamWriterImpl.writeStartDocument
void writeStartDocument(CharSequence version)
Definition: XMLStreamWriterImpl.java:544
javolution.xml.internal.stream.XMLStreamWriterImpl._noEmptyElementTag
boolean _noEmptyElementTag
Definition: XMLStreamWriterImpl.java:111
javolution.xml.internal.stream.XMLStreamWriterImpl._isAttributeValue
boolean _isAttributeValue
Definition: XMLStreamWriterImpl.java:121
javolution.xml.internal.stream.XMLStreamWriterImpl.writeCData
void writeCData(CharSequence data)
Definition: XMLStreamWriterImpl.java:511
javolution.xml.internal.stream.XMLStreamWriterImpl._autoNSCount
int _autoNSCount
Definition: XMLStreamWriterImpl.java:116
javolution.xml.stream.XMLOutputFactory.REPAIRING_PREFIX
static final String REPAIRING_PREFIX
Definition: XMLOutputFactory.java:71
javolution.xml.internal.stream.XMLStreamWriterImpl.closeOpenTag
void closeOpenTag()
Definition: XMLStreamWriterImpl.java:708
javolution.xml.internal.stream.XMLStreamWriterImpl.writeEndDocument
void writeEndDocument()
Definition: XMLStreamWriterImpl.java:387
javolution.xml.internal.stream.XMLStreamWriterImpl._isRepairingNamespaces
boolean _isRepairingNamespaces
Definition: XMLStreamWriterImpl.java:81
javolution.xml.internal.stream.XMLStreamWriterImpl.writeStartDocument
void writeStartDocument()
Definition: XMLStreamWriterImpl.java:539
javolution.xml.internal.stream.XMLStreamWriterImpl.getProperty
Object getProperty(String name)
Definition: XMLStreamWriterImpl.java:609
javolution.xml.internal.stream.XMLStreamWriterImpl.setRepairingPrefix
void setRepairingPrefix(String repairingPrefix)
Definition: XMLStreamWriterImpl.java:232
javolution.xml.internal.stream.NamespacesImpl._namespaces
CharArray[] _namespaces
Definition: NamespacesImpl.java:59
javolution.xml.internal.stream.XMLOutputFactoryImpl
Definition: XMLOutputFactoryImpl.java:21
javolution.xml.internal.stream.XMLStreamWriterImpl.writeDirectEscapedCharacters
final void writeDirectEscapedCharacters(char[] chars, int start, int end)
Definition: XMLStreamWriterImpl.java:869
javolution.xml.internal.stream.XMLStreamWriterImpl.setDefaultNamespace
void setDefaultNamespace(CharSequence uri)
Definition: XMLStreamWriterImpl.java:604
javolution.io.UTF8StreamWriter.reset
void reset()
Definition: UTF8StreamWriter.java:326
javolution.xml.internal.stream.XMLStreamWriterImpl.writeProcessingInstruction
void writeProcessingInstruction(CharSequence target, CharSequence data)
Definition: XMLStreamWriterImpl.java:495
javolution.xml.internal.stream.XMLStreamWriterImpl.writeEscape
final void writeEscape(CharSequence csq)
Definition: XMLStreamWriterImpl.java:812
javolution.xml.internal.stream.XMLStreamWriterImpl.writeDefaultNamespace
void writeDefaultNamespace(CharSequence namespaceURI)
Definition: XMLStreamWriterImpl.java:470
javolution.xml.internal.stream.XMLStreamWriterImpl.writeStartDocument
void writeStartDocument(CharSequence encoding, CharSequence version)
Definition: XMLStreamWriterImpl.java:550
javolution.xml.internal.stream.NamespacesImpl._nullNsURI
final CharArray _nullNsURI
Definition: NamespacesImpl.java:33
javolution.xml.internal.stream.NamespacesImpl._xmlns
final CharArray _xmlns
Definition: NamespacesImpl.java:42
javolution.xml.internal.stream.XMLStreamWriterImpl.writeNoEscape
final void writeNoEscape(TextBuilder tb)
Definition: XMLStreamWriterImpl.java:803
javolution.xml.internal.stream.XMLStreamWriterImpl.write
final void write(char c)
Definition: XMLStreamWriterImpl.java:922
javolution.xml.internal.stream.XMLStreamWriterImpl._buffer
final char[] _buffer
Definition: XMLStreamWriterImpl.java:66
javolution.xml.internal.stream.XMLStreamWriterImpl._indentation
String _indentation
Definition: XMLStreamWriterImpl.java:91
javolution.xml.internal.stream.XMLStreamWriterImpl.writeNoEscape
final void writeNoEscape(String str)
Definition: XMLStreamWriterImpl.java:799
javolution.text.CharArray.setArray
CharArray setArray(char[] array, int offset, int length)
Definition: CharArray.java:116
javolution.xml
Definition: DefaultXMLFormat.java:9
javolution.xml.stream
Definition: Location.java:9
javolution.xml.internal.stream.NamespacesImpl._defaultNamespace
CharArray _defaultNamespace
Definition: NamespacesImpl.java:74
javolution.xml.internal.stream.XMLStreamWriterImpl.writeCharacters
void writeCharacters(CharSequence text)
Definition: XMLStreamWriterImpl.java:574
javolution.xml.stream.XMLOutputFactory.INDENTATION
static final String INDENTATION
Definition: XMLOutputFactory.java:78
javolution.xml.internal.stream.XMLStreamWriterImpl.writeEmptyElement
void writeEmptyElement(CharSequence namespaceURI, CharSequence localName)
Definition: XMLStreamWriterImpl.java:342
javolution.xml.internal.stream.NamespacesImpl._prefixesWritten
boolean[] _prefixesWritten
Definition: NamespacesImpl.java:64
javolution.xml.internal.stream.NamespacesImpl.pop
void pop()
Definition: NamespacesImpl.java:202
javolution.xml.internal.stream.XMLStreamWriterImpl._utf8StreamWriter
final UTF8StreamWriter _utf8StreamWriter
Definition: XMLStreamWriterImpl.java:140
javolution.xml.internal.stream.XMLStreamWriterImpl.writeCharacters
void writeCharacters(char[] text, int start, int length)
Definition: XMLStreamWriterImpl.java:583
javolution.xml.internal.stream.XMLStreamWriterImpl.writeDTD
void writeDTD(CharSequence dtd)
Definition: XMLStreamWriterImpl.java:522
javolution.xml.internal.stream.XMLStreamWriterImpl._isElementOpen
boolean _isElementOpen
Definition: XMLStreamWriterImpl.java:56
javolution.xml.internal.stream.XMLStreamWriterImpl
Definition: XMLStreamWriterImpl.java:36
javolution.xml.internal.stream.XMLStreamWriterImpl.writeEmptyElement
void writeEmptyElement(CharSequence prefix, CharSequence localName, CharSequence namespaceURI)
Definition: XMLStreamWriterImpl.java:349
javolution.xml.internal.stream.XMLStreamWriterImpl._writer
Writer _writer
Definition: XMLStreamWriterImpl.java:130
javolution.xml.internal.stream.XMLStreamWriterImpl.XMLStreamWriterImpl
XMLStreamWriterImpl(XMLOutputFactoryImpl factory)
Definition: XMLStreamWriterImpl.java:157
javolution.xml.internal.stream.XMLStreamWriterImpl.setPrefix
void setPrefix(CharSequence prefix, CharSequence uri)
Definition: XMLStreamWriterImpl.java:597