/**
* This file is part of Archiv-Editor.
*
* The software Archiv-Editor serves as a client user interface for working with
* the Person Data Repository. See: pdr.bbaw.de
*
* The software Archiv-Editor was developed at the Berlin-Brandenburg Academy
* of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin.
* www.bbaw.de
*
* Copyright (C) 2010-2013 Berlin-Brandenburg Academy
* of Sciences and Humanities
*
* The software Archiv-Editor was developed by @author: Christoph Plutte.
*
* Archiv-Editor is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Archiv-Editor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Archiv-Editor.
* If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
*/
package org.bbaw.pdr.ae.collections.control;
import java.io.ByteArrayOutputStream;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import org.bbaw.pdr.ae.collections.model.PDRCollection;
import org.bbaw.pdr.ae.common.AEConstants;
import org.bbaw.pdr.ae.metamodel.Revision;
import org.bbaw.pdr.ae.model.view.TreeNode;
/** collection xml processor to write a given collection to xml using
* collection namespace cudl.
* @author Christoph Plutte
*
*/
public class CollectionXMLProcessor
{
/** collections namespace prefix.*/
private static final String PREFIX = "codl";
/** collections namespace uri.*/
private static final String URI = "http://pdr.bbaw.de/namespaces/codl/";
/** write collection to xml.
* @param coll collection to write to xml
* @return xml string of collection
* @throws XMLStreamException xml exception.
*/
public final String writeToXML(final PDRCollection coll) throws XMLStreamException
{
// Create a XMLOutputFactory
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
// Create XMLEventWriter
ByteArrayOutputStream bout = new ByteArrayOutputStream();
XMLEventWriter eventWriter = outputFactory
.createXMLEventWriter(bout);
// Create a EventFactory
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
// end = eventFactory.createDTD("\n");
XMLEvent end = eventFactory.createCharacters("\n");
// XMLEvent tab = eventFactory.createCharacters("\t");
// Create and write Start Tag
StartDocument startDocument = eventFactory.createStartDocument();
eventWriter.add(startDocument);
// Create config open tag
StartElement startElement = eventFactory.createStartElement(PREFIX, URI, "pdrCollection");
eventWriter.add(startElement);
eventWriter.add(eventFactory.createNamespace(PREFIX, URI));
// eventWriter.add(eventFactory.createAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"));
// eventWriter.add(eventFactory.createAttribute("xsi:schemaLocation",
// "http://pdr.bbaw.de/namespaces/dtdl/ http://telotadev.bbaw.de/telotasvn/pdr/Programme/schema/dtdl.xsd"));
eventWriter.add(eventFactory.createAttribute("name", coll.getName()));
eventWriter.add(end);
// Write the different nodes
if (coll.getRecord() != null && coll.getRecord().getRevisions() != null)
{
startElement = eventFactory.createStartElement(PREFIX, URI, "record");
eventWriter.add(startElement);
eventWriter.add(end);
for (int i = 0; i < coll.getRecord().getRevisions().size(); i++)
{
createNode(eventWriter, "revision", coll.getRecord().getRevisions().get(i));
}
eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "record"));
eventWriter.add(end);
}
if (coll.getObjects() != null && !coll.getObjects().isEmpty())
{
startElement = eventFactory.createStartElement(PREFIX, URI, "collection");
eventWriter.add(startElement);
eventWriter.add(end);
for (TreeNode tn : coll.getObjects())
{
createNode(eventWriter, "item", tn);
}
eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "collection"));
eventWriter.add(end);
}
eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "pdrCollection"));
eventWriter.add(end);
eventWriter.add(eventFactory.createEndDocument());
eventWriter.close();
// System.out.println(bout.toString());
return bout.toString();
}
/** create node of given treenode.
* @param eventWriter writer.
* @param name node name.
* @param tn treenode.
* @throws XMLStreamException exc.
*/
private void createNode(final XMLEventWriter eventWriter, final String name,
final TreeNode tn) throws XMLStreamException
{
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent end = eventFactory.createCharacters("\n");
XMLEvent tab = eventFactory.createCharacters("\t");
// Create Start node
StartElement sElement = eventFactory.createStartElement(PREFIX, URI, name);
eventWriter.add(tab);
eventWriter.add(sElement);
if (tn.getPdrObject() != null)
{
eventWriter.add(eventFactory.createAttribute("id", tn.getPdrObject().getPdrId().toString()));
}
else
{
eventWriter.add(eventFactory.createAttribute("id", tn.getId()));
}
if (tn.hasChildren() && tn.getChildren() != null)
{
for (TreeNode t : tn.getChildren())
{
createNode(eventWriter, "item", t);
}
}
// Create End node
EndElement eElement = eventFactory.createEndElement(PREFIX,
URI, name);
eventWriter.add(eElement);
eventWriter.add(end);
}
/** create node of given revision.
* @param eventWriter writer.
* @param name node name
* @param r revision.
* @throws XMLStreamException exc.
*/
private void createNode(final XMLEventWriter eventWriter, final String name,
final Revision r) throws XMLStreamException
{
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent end = eventFactory.createCharacters("\n");
XMLEvent tab = eventFactory.createCharacters("\t");
// Create Start node
StartElement sElement = eventFactory.createStartElement(PREFIX,
URI, name);
eventWriter.add(tab);
eventWriter.add(sElement);
eventWriter.add(eventFactory.createAttribute("ref", new Integer(r.getRef()).toString()));
eventWriter.add(eventFactory.createAttribute("timestamp", AEConstants.ADMINDATE_FORMAT.format(r.getTimeStamp()).toString()));
eventWriter.add(eventFactory.createAttribute("authority", r.getAuthority().toString()));
// TODO das Schema sieht keinen authority namen mehr vor, �nderung im model umsetzen.
// // Create Content
// Characters characters = eventFactory.createCharacters(r.getRevisor());
// eventWriter.add(characters);
// Create End node
EndElement eElement = eventFactory.createEndElement(PREFIX,
URI, name);
eventWriter.add(eElement);
eventWriter.add(end);
}
}