org.eclipse.skalli.core.extension.DataMigration11.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.skalli.core.extension.DataMigration11.java

Source

/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.core.extension;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.eclipse.skalli.model.Project;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

@SuppressWarnings("nls")
public class DataMigration11 extends ProjectDataMigration {
    private static final Logger LOG = LoggerFactory.getLogger(DataMigration11.class);

    public DataMigration11() {
        super(Project.class, 11);
    }

    /**
     * Changes from model version 11 -> 12:
     * <ol>
     *   <li>Project members now in separate collections</li>
     * </ol>
     */
    @Override
    public void migrate(Document doc) {
        Map<String, String> roleCache = new HashMap<String, String>();

        List<String> members = new LinkedList<String>();
        List<String> leads = new LinkedList<String>();
        List<String> productOwners = new LinkedList<String>();
        List<String> scrumMasters = new LinkedList<String>();

        // reading old project members and their roles
        NodeList nodes = doc.getElementsByTagName("org.eclipse.skalli.model.core.ProjectMember");
        for (int i = 0; i < nodes.getLength(); i++) {
            Element member = (Element) nodes.item(i);
            String userId = member.getElementsByTagName("userID").item(0).getTextContent();
            LOG.debug("Reading User '" + userId + "' for Migration.");

            NodeList roles = member.getElementsByTagName("roles").item(0).getChildNodes();
            for (int j = 0; j < roles.getLength(); j++) {
                Node roleNode = (Node) roles.item(j);
                if (roleNode instanceof Element && !roleNode.getNodeName().equals("no-comparator")) {
                    Element roleElement = (Element) roleNode;
                    String role = null;
                    if (StringUtils.isBlank(roleElement.getAttribute("reference"))) {
                        role = roleElement.getElementsByTagName("technicalName").item(0).getTextContent();
                        roleCache.put(roleElement.getNodeName(), role);
                    } else {
                        role = roleCache.get(roleElement.getNodeName());
                    }
                    LOG.debug("User '" + userId + "' has role '" + role + "'.");
                    if (role.equals("projectmember")) {
                        members.add(userId);
                    } else if (role.equals("projectlead")) {
                        leads.add(userId);
                    } else if (role.equals("scrummaster")) {
                        scrumMasters.add(userId);
                    } else if (role.equals("productowner")) {
                        productOwners.add(userId);
                    } else {
                        throw new RuntimeException("unknown role: " + role);
                    }
                }
            }
        }

        // remove current "members" section
        Node membersNode = doc.getElementsByTagName("members").item(0);
        if (membersNode == null) {
            throw new RuntimeException(doc.toString());
        }
        Node projectNode = membersNode.getParentNode();
        projectNode.removeChild(membersNode);

        // add (new) members
        addPeopleSection(doc, projectNode, "members", members);

        // add leads
        addPeopleSection(doc, projectNode, "leads", leads);

        // add scrum people
        if (scrumMasters.size() > 0 || productOwners.size() > 0) {
            Node scrumExt = doc.getElementsByTagName("org.eclipse.skalli.model.ext.scrum.ScrumProjectExt").item(0);

            if (scrumExt == null) {
                LOG.warn("there were scrum people, but no scrum extension.");
            } else {
                // add scrum masters
                addPeopleSection(doc, scrumExt, "scrumMasters", scrumMasters);

                // add product owners
                addPeopleSection(doc, scrumExt, "productOwners", productOwners);
            }
        }
    }

    private void addPeopleSection(Document doc, Node parentNode, String name, List<String> people) {
        Element peopleElement = doc.createElement(name);
        addPeople(doc, peopleElement, people);
        parentNode.appendChild(peopleElement);
    }

    private void addPeople(Document doc, Element element, List<String> people) {
        Element setEntry = doc.createElement("no-comparator");
        element.appendChild(setEntry);
        for (String userId : people) {
            Element memberElement = doc.createElement("org.eclipse.skalli.model.core.ProjectMember");
            element.appendChild(memberElement);

            Element userIdElement = doc.createElement("userID");
            memberElement.appendChild(userIdElement);
            userIdElement.setTextContent(userId);
        }
    }

}