/*******************************************************************************
* 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);
}
}
}