void saveChangeSummary()

in impl/src/main/java/org/apache/tuscany/sdo/util/resource/SDOXMLResourceImpl.java [744:863]


        void saveChangeSummary(EObject o, EStructuralFeature f, Object changeSummary) {
            boolean notMixed;
            if (doc instanceof XmlString)
                notMixed = !((XmlString) doc).mixed();
            else if (extendedMetaData == null)
                notMixed = true;
            else
                switch (extendedMetaData.getContentKind(o.eClass())) {
                case ExtendedMetaData.MIXED_CONTENT:
                case ExtendedMetaData.SIMPLE_CONTENT:
                    notMixed = false;
                    break;
                default:
                    notMixed = true;
                }
            if (notMixed) {
                StringBuffer margin = new StringBuffer(this.margin);
                for (EObject container = o.eContainer(), grandContainer; (grandContainer = container.eContainer()) != null; container = grandContainer)
                    margin.append(indent);
                changeSummaryOptions.put(SDOHelper.XMLOptions.XML_SAVE_MARGIN, margin.toString());
            }
            try {
                if (xmlStreamWriter == null) {
                    xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(new Writer() {
                        public void close() {
                        }

                        public void flush() {
                        }

                        protected final void add(char[] cbuf, int index, int off) {
                            doc.addText(new String(cbuf, index, off - index));
                        }

                        public void write(char[] cbuf, int off, int len) {
                            if (len != 0)
                                for (;;) {
                                    while (cbuf[off] == MARK) {
                                        doc.addLine();
                                        if (--len == 0)
                                            return;
                                        ++off;
                                    }
                                    for (int index = off;/* true */;) {
                                        ++off;
                                        if (--len == 0)
                                            add(cbuf, index, off);
                                        else {
                                            if (cbuf[off] != MARK)
                                                continue;
                                            add(cbuf, index, off);
                                            doc.addLine();
                                            if (--len != 0)
                                                break;
                                        }
                                        return;
                                    }
                                    ++off;
                                }
                        }
                    });
                    xmlStreamWriter.setNamespaceContext(((SDOXMLHelperImpl) helper).new NameSpaceContext() {
                        public String getNamespaceURI(String prefix) {
                            return declareXSI && ExtendedMetaData.XSI_PREFIX.equals(prefix) ? ExtendedMetaData.XSI_URI : super
                                    .getNamespaceURI(prefix);
                        }

                        public String getPrefix(String namespaceURI) {
                            return declareXSI && ExtendedMetaData.XSI_URI.equals(namespaceURI) ? ExtendedMetaData.XSI_PREFIX : super
                                    .getPrefix(namespaceURI);
                        }

                        public Iterator getPrefixes(String namespaceURI) {
                            final Iterator iterator = super.getPrefixes(namespaceURI);
                            return ExtendedMetaData.XSI_URI.equals(namespaceURI) ? new Iterator() {
                                boolean first = true;

                                public boolean hasNext() {
                                    if (first)
                                        if (declareXSI) // never from true to false
                                            return true;
                                        else
                                            first = false;
                                    return iterator.hasNext();
                                }

                                public Object next() {
                                    if (first) {
                                        first = false;
                                        if (declareXSI)
                                            return ExtendedMetaData.XSI_PREFIX;
                                    }
                                    return iterator.next();
                                }

                                public void remove() {
                                    if (first)
                                        declareXSI = false;
                                    else
                                        iterator.remove();
                                }
                            } : iterator;
                        }
                    });
                    for (Iterator iterator = helper.getPrefixToNamespaceMap().iterator(); iterator.hasNext();) {
                        Map.Entry entry = (Map.Entry) iterator.next();
                        xmlStreamWriter.setPrefix((String) entry.getKey(), (String) entry.getValue());
                    }
                    if (declareXSI)
                        xmlStreamWriter.setPrefix(ExtendedMetaData.XSI_PREFIX, ExtendedMetaData.XSI_URI);
                    if (changeSummarySerializer == null)
                        changeSummarySerializer = new ChangeSummaryStreamSerializer();
                }
                changeSummarySerializer.saveChangeSummary((ChangeSummary) changeSummary, qName(f), xmlStreamWriter, changeSummaryOptions);
                if (notMixed)
                    doc.addLine();
            } catch (XMLStreamException e) {
                xmlResource.getErrors().add(new XMIException(e));
            }
        }