/* * Copyright (c) 2015 BISON Schweiz AG, All Rights Reserved. */ package to.rtc.rtc2jira.importer.mapping; import java.io.IOException; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.map.ObjectMapper; import to.rtc.rtc2jira.importer.RTCImporter; import to.rtc.rtc2jira.importer.mapping.spi.MappingAdapter; import to.rtc.rtc2jira.storage.FieldNames; import com.ibm.team.process.internal.common.Iteration; import com.ibm.team.process.internal.common.IterationHandle; import com.ibm.team.workitem.common.model.IAttribute; import com.orientechnologies.orient.core.record.impl.ODocument; /** * @author roman.schaller * */ public class TargetMapping extends MappingAdapter { static final Logger LOGGER = Logger.getLogger(TargetMapping.class.getName()); static { LOGGER.addHandler(RTCImporter.DEFAULT_LOG_HANDLER); } public static final String NO_ITERATION = "NO_ITERATION"; private IterationInfo iterationInfo; @Override protected void beforeWorkItem() { iterationInfo = null; } @Override public void acceptAttribute(IAttribute attribute) { IterationHandle handle = getValue(attribute); if (handle != null) { Iteration iteration = fetchCompleteItem(handle); iterationInfo = fromRtcIteration(iteration); } } IterationInfo fromRtcIteration(Iteration iteration) { IterationInfo iterationInfo = new IterationInfo(); iterationInfo.rtcId = iteration.getId(); iterationInfo.name = iteration.getName(); iterationInfo.label = iteration.getLabel(); iterationInfo.startDate = iteration.getStartDate(); iterationInfo.endDate = iteration.getEndDate(); iterationInfo.hasDeliverable = iteration.hasDeliverable(); iterationInfo.archived = iteration.isArchived(); if (iteration.getParent() != null) { iterationInfo.parent = fromRtcIteration(fetchCompleteItem(iteration.getParent())); } String name = iterationInfo.name.toLowerCase(); if (name.contains("backlog")) { iterationInfo.iterationType = RtcIterationType.backlog; } else if (name.contains("timeslot")) { iterationInfo.iterationType = RtcIterationType.timeslot; } else if (name.contains("release")) { iterationInfo.iterationType = RtcIterationType.release; iterationInfo.hasDeliverable = true; } else if (name.contains("parking")) { iterationInfo.iterationType = RtcIterationType.sprint; } else if (name.contains("sprint")) { iterationInfo.iterationType = RtcIterationType.sprint; } else { LOGGER.warning("No unequivocal iteration type could be assigned to the iteration '" + name + "'"); if (name != null && name.contains(".")) { iterationInfo.iterationType = RtcIterationType.release; } else if (name != null && name.contains("/")) { iterationInfo.iterationType = RtcIterationType.timeslot; } else if (name != null && name.contains("201")) { iterationInfo.iterationType = RtcIterationType.timeslot; } else { iterationInfo.iterationType = RtcIterationType.unknown; } } return iterationInfo; } @Override public void afterWorkItem(ODocument doc) { if (iterationInfo != null) { String iterationJson = iterationInfo.marshall(); doc.field(FieldNames.ITERATION_INFO, iterationJson); } else { doc.field(FieldNames.ITERATION_INFO, NO_ITERATION); } } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) static public class IterationInfo { public String rtcId; public String name; public String label; public Date startDate; public Date endDate; public IterationInfo parent; public boolean hasDeliverable; public boolean archived; public RtcIterationType iterationType; @JsonIgnore private ObjectMapper objectMapper; public IterationInfo() { objectMapper = new ObjectMapper(); } String marshall() { String result = ""; try { result = objectMapper.writeValueAsString(this); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Could not marshall IterationInfo: " + e.getMessage()); } return result; } public void unmarshall(String json) throws IOException { try { IterationInfo readValue = objectMapper.readValue(json, IterationInfo.class); this.rtcId = readValue.rtcId; this.name = readValue.name; this.label = readValue.label; this.startDate = readValue.startDate; this.endDate = readValue.endDate; this.hasDeliverable = readValue.hasDeliverable; this.archived = readValue.archived; this.parent = readValue.parent; this.iterationType = readValue.iterationType; } catch (IOException e) { throw e; } } } public enum RtcIterationType { backlog, timeslot, release, sprint, parking, unknown } }