001    
002    /*
003     * Copyright (C) 2012 Archie L. Cobbs. All rights reserved.
004     *
005     * $Id: UpdatesXMLEventWriter.java 272 2012-02-02 21:02:52Z archie.cobbs $
006     */
007    
008    package org.dellroad.stuff.pobj;
009    
010    import java.util.List;
011    
012    import javax.xml.stream.XMLEventWriter;
013    import javax.xml.stream.XMLStreamException;
014    
015    import org.dellroad.stuff.xml.AnnotatedXMLEventWriter;
016    
017    /**
018     * {@link AnnotatedXMLEventWriter} that inserts the schema update list into the document
019     * using an {@link PersistentObjectSchemaUpdater#UPDATES_ELEMENT_NAME} annotation element.
020     * Used by {@link PersistentObjectSchemaUpdater}.
021     */
022    public class UpdatesXMLEventWriter extends AnnotatedXMLEventWriter {
023    
024        private final List<String> updates;
025    
026        /**
027         * Constructor.
028         *
029         * @param inner nested output
030         * @param updates list of updates to add
031         * @throws IllegalArgumentException if {@code updates} is null
032         */
033        public UpdatesXMLEventWriter(XMLEventWriter inner, List<String> updates) {
034            super(inner);
035            if (updates == null)
036                throw new IllegalArgumentException("null updates");
037            this.updates = updates;
038        }
039    
040        @Override
041        protected void addAnnotationElement() throws XMLStreamException {
042            this.add(this.xmlEventFactory.createStartElement(PersistentObjectSchemaUpdater.UPDATES_ELEMENT_NAME, null, null));
043            this.add(this.xmlEventFactory.createAttribute(PersistentObjectSchemaUpdater.XMLNS_ATTRIBUTE_NAME,
044              PersistentObjectSchemaUpdater.NAMESPACE_URI));
045            final String space = this.getTrailingSpace();
046            final String space2 = space.length() > 0 ? space + "    " : "";
047            if (!this.updates.isEmpty()) {
048                for (String updateName : this.updates) {
049                    this.add(this.xmlEventFactory.createCharacters(space2));
050                    this.add(this.xmlEventFactory.createStartElement(PersistentObjectSchemaUpdater.UPDATE_ELEMENT_NAME, null, null));
051                    this.add(this.xmlEventFactory.createCharacters(updateName));
052                    this.add(this.xmlEventFactory.createEndElement(PersistentObjectSchemaUpdater.UPDATE_ELEMENT_NAME, null));
053                }
054                this.add(this.xmlEventFactory.createCharacters(space));
055            }
056            this.add(this.xmlEventFactory.createEndElement(PersistentObjectSchemaUpdater.UPDATES_ELEMENT_NAME, null));
057        }
058    }
059