/**
* 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.control.core;
import java.io.ByteArrayOutputStream;
import java.text.SimpleDateFormat;
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.Characters;
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.common.AEConstants;
import org.bbaw.pdr.ae.control.internal.Activator;
import org.bbaw.pdr.ae.metamodel.Revision;
import org.bbaw.pdr.ae.model.User;
import org.bbaw.pdr.ae.model.UserContact;
import org.bbaw.pdr.ae.model.UserInformation;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* The Class UserXMLProcessor.
* @author Christoph Plutte
*/
public class UserXMLProcessor
{
/** The _admin date format. */
private SimpleDateFormat _adminDateFormat = AEConstants.ADMINDATE_FORMAT;
// private final String _encoding = "iso-8601";
/** The _end. */
private XMLEvent _end;
/** The _tab. */
private XMLEvent _tab;
/** Logger. */
private static ILog iLogger = AEConstants.ILOGGER;
/** status. */
private IStatus _log;
/**
* Creates the node.
* @param eventWriter the event writer
* @param name the name of node
* @param r the revision
* @param prefix the prefix
* @param uri the uri
* @throws XMLStreamException the xML stream exception
*/
private void createNode(final XMLEventWriter eventWriter, final String name, final Revision r, final String prefix,
final String uri) 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", _adminDateFormat.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("aodl", "http://pdr.bbaw.de/namespaces/aodl/", name);
eventWriter.add(eElement);
eventWriter.add(end);
}
/**
* Write to xml.
* @param user the user
* @return the string
* @throws XMLStreamException the xML stream exception
*/
public final String writeToXML(final User user) 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");
_tab = eventFactory.createDTD("\t");
// Create and write Start Tag
StartDocument startDocument = eventFactory.createStartDocument();
eventWriter.add(startDocument);
// Create config open tag
StartElement startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/",
"user");
eventWriter.add(startElement);
eventWriter.add(eventFactory.createNamespace("uodl", "http://pdr.bbaw.de/namespaces/uodl/"));
eventWriter.add(eventFactory.createAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"));
eventWriter.add(eventFactory.createAttribute("xsi:schemaLocation",
"http://pdr.bbaw.de/namespaces/uodl/ http://pdr.bbaw.de/schema/uodl.xsd"));
eventWriter.add(eventFactory.createAttribute("id", user.getPdrId().toString()));
eventWriter.add(_end);
// Write the different nodes
if (user.getRecord() != null && user.getRecord().getRevisions() != null)
{
startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "record");
eventWriter.add(startElement);
eventWriter.add(_end);
for (int i = 0; i < user.getRecord().getRevisions().size(); i++)
{
createNode(eventWriter, "revision", user.getRecord().getRevisions().get(i), "uodl",
"http://pdr.bbaw.de/namespaces/uodl/");
}
eventWriter.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "record"));
eventWriter.add(_end);
}
if (user.getAuthentication() != null)
{
startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/",
"authentication");
eventWriter.add(startElement);
if (user.getAuthentication().getUserName() != null)
{
eventWriter.add(eventFactory.createAttribute("username", user.getAuthentication().getUserName()));
}
if (user.getAuthentication().getPassword() != null)
{
eventWriter.add(eventFactory.createAttribute("password", user.getAuthentication().getPassword()));
}
eventWriter.add(_end);
if (user.getAuthentication().getRoles() != null)
{
eventWriter.add(_tab);
startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "roles");
eventWriter.add(startElement);
eventWriter.add(_end);
for (String role : user.getAuthentication().getRoles())
{
eventWriter.add(_tab);
eventWriter.add(_tab);
startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/",
"role");
eventWriter.add(startElement);
if (role != null)
{
Characters characters = eventFactory.createCharacters(role);
eventWriter.add(characters);
}
eventWriter.add(eventFactory
.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "role"));
eventWriter.add(_end);
}
eventWriter.add(_tab);
eventWriter.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "roles"));
eventWriter.add(_end);
}
eventWriter.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/",
"authentication"));
eventWriter.add(_end);
}
if (user.getUserInformation() != null)
{
UserInformation ui = user.getUserInformation();
startElement = eventFactory
.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "information");
eventWriter.add(startElement);
eventWriter.add(_end);
eventWriter.add(_tab);
startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "fullname");
eventWriter.add(startElement);
if (ui.getForename() != null)
{
eventWriter.add(eventFactory.createAttribute("forename", ui.getForename()));
}
if (ui.getSurname() != null)
{
eventWriter.add(eventFactory.createAttribute("surname", ui.getSurname()));
}
eventWriter.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "fullname"));
eventWriter.add(_end);
eventWriter.add(_tab);
startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "project");
eventWriter.add(startElement);
if (ui.getUserProjectPosition() != null)
{
eventWriter.add(eventFactory.createAttribute("position", ui.getUserProjectPosition()));
}
if (ui.getProjectName() != null)
{
Characters characters = eventFactory.createCharacters(ui.getProjectName());
eventWriter.add(characters);
}
eventWriter.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "project"));
eventWriter.add(_end);
if (ui.getUserContacts() != null)
{
for (UserContact uc : ui.getUserContacts())
{
eventWriter.add(_tab);
startElement = eventFactory.createStartElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/",
"contact");
eventWriter.add(startElement);
if (uc.getType() != null)
{
eventWriter.add(eventFactory.createAttribute("type", uc.getType()));
}
if (uc.getContact() != null)
{
Characters characters = eventFactory.createCharacters(uc.getContact());
eventWriter.add(characters);
}
eventWriter.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/",
"contact"));
eventWriter.add(_end);
}
}
eventWriter
.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "information"));
eventWriter.add(_end);
}
eventWriter.add(eventFactory.createEndElement("uodl", "http://pdr.bbaw.de/namespaces/uodl/", "user"));
eventWriter.add(_end);
eventWriter.add(eventFactory.createEndDocument());
eventWriter.close();
_log = new Status(IStatus.WARNING, Activator.PLUGIN_ID, "XMLProcessor output: " + bout.toString());
iLogger.log(_log);
return bout.toString();
}
}