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