diff options
author | ddunne | 2008-11-03 22:26:01 +0000 |
---|---|---|
committer | ddunne | 2008-11-03 22:26:01 +0000 |
commit | 7c8a244f25e3fb5fee62ba7b41f53e50284619b8 (patch) | |
tree | 10aa2aee3f475ad58f7563fe803a924b70270e65 | |
parent | e99475bc56a13b0bde07c256e8d392bdacb5cf02 (diff) | |
download | org.eclipse.osee-7c8a244f25e3fb5fee62ba7b41f53e50284619b8.tar.gz org.eclipse.osee-7c8a244f25e3fb5fee62ba7b41f53e50284619b8.tar.xz org.eclipse.osee-7c8a244f25e3fb5fee62ba7b41f53e50284619b8.zip |
11 files changed, 538 insertions, 207 deletions
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java index daec07c25e2..ce9f5e37511 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java @@ -163,14 +163,9 @@ public class DecisionReviewArtifact extends ReviewSMArtifact implements IReviewA return null; } - /* - * (non-Javadoc) - * - * @see osee.ats.world.IWorldViewArtifact#getWorldViewImplementer() - */ @Override - public String getWorldViewImplementer() throws OseeCoreException { - return Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees(DecisionReviewState.Decision.name())); + public Collection<User> getImplementers() throws OseeCoreException { + return getImplementersByState(DecisionReviewState.Decision.name()); } /* diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java index 41947a5e84a..89d1e0edf92 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.osee.ats.artifact; +import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -180,14 +181,13 @@ public class PeerToPeerReviewArtifact extends ReviewSMArtifact implements IRevie return null; } - /* - * (non-Javadoc) - * - * @see osee.ats.world.IWorldViewArtifact#getWorldViewImplementer() - */ @Override - public String getWorldViewImplementer() throws OseeCoreException { - return Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees(PeerToPeerReviewState.Review.name())); + public Collection<User> getImplementers() throws OseeCoreException { + Collection<User> users = getImplementersByState(PeerToPeerReviewState.Review.name()); + for (UserRole role : userRoleManager.getUserRoles()) { + users.add(role.getUser()); + } + return users; } /* diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java index 77e97dad3ec..5a081f53729 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java @@ -12,6 +12,7 @@ package org.eclipse.osee.ats.artifact; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -183,7 +184,20 @@ public abstract class StateMachineArtifact extends ATSArtifact implements IWorld */ @Override public String getWorldViewImplementer() throws OseeCoreException { - return null; + return Artifacts.toString("; ", getImplementers()); + } + + public Collection<User> getImplementersByState(String stateName) throws OseeCoreException { + Collection<User> users = smaMgr.getStateMgr().getAssignees(stateName); + LogItem item = smaMgr.getLog().getStateEvent(LogType.StateComplete, stateName); + if (item != null) { + users.add(item.getUser()); + } + return users; + } + + public Collection<User> getImplementers() throws OseeCoreException { + return Collections.emptyList(); } /* (non-Javadoc) diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java index 98ca51287e6..ae19b3ceb82 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java @@ -30,7 +30,6 @@ import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory; import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType; import org.eclipse.osee.framework.skynet.core.artifact.Branch; import org.eclipse.osee.framework.skynet.core.artifact.IATSStateMachineArtifact; -import org.eclipse.osee.framework.skynet.core.utility.Artifacts; import org.eclipse.osee.framework.ui.plugin.util.Result; import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition; @@ -281,18 +280,9 @@ public class TaskArtifact extends StateMachineArtifact implements IWorldViewArti return null; } - /* - * (non-Javadoc) - * - * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewImplementer() - */ @Override - public String getWorldViewImplementer() throws OseeCoreException { - return Artifacts.toString("; ", getImplementers()); - } - - public Collection<User> getImplementers() { - return smaMgr.getStateMgr().getAssignees(TaskStates.InWork.name()); + public Collection<User> getImplementers() throws OseeCoreException { + return getImplementersByState(TaskStates.InWork.name()); } /* diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java index 4d5720eef4c..68f816e94f4 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java @@ -291,7 +291,7 @@ public class TeamWorkFlowArtifact extends TaskableStateMachineArtifact implement if (verArts.size() > 1) { String errStr = "Workflow " + smaMgr.getSma().getHumanReadableId() + " targeted for multiple versions: " + Artifacts.commaArts(verArts); - OseeLog.log(AtsPlugin.class, Level.SEVERE, errStr, null); + OseeLog.log(AtsPlugin.class, Level.SEVERE, errStr, null); return XViewerCells.getCellExceptionString(errStr); } VersionArtifact verArt = verArts.iterator().next(); @@ -299,7 +299,7 @@ public class TeamWorkFlowArtifact extends TaskableStateMachineArtifact implement ATSAttributes.RELEASED_ATTRIBUTE.getStoreName(), false)) { String errStr = "Workflow " + smaMgr.getSma().getHumanReadableId() + " targeted for released version, but not completed: " + verArt; - OseeLog.log(AtsPlugin.class, Level.SEVERE, errStr, null); + OseeLog.log(AtsPlugin.class, Level.SEVERE, errStr, null); return XViewerCells.getCellExceptionString(errStr); } return verArt.getDescriptiveName(); @@ -351,8 +351,7 @@ public class TeamWorkFlowArtifact extends TaskableStateMachineArtifact implement selectedAlias.add((ActionableItemArtifact) obj); } - ActionableItemsTx txWrapper = - new ActionableItemsTx(BranchManager.getAtsBranch(), selectedAlias, null); + ActionableItemsTx txWrapper = new ActionableItemsTx(BranchManager.getAtsBranch(), selectedAlias, null); txWrapper.execute(); toReturn = txWrapper.getResult(); } @@ -416,8 +415,7 @@ public class TeamWorkFlowArtifact extends TaskableStateMachineArtifact implement if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Confirm Convert", sb.toString())) { Set<ActionableItemArtifact> toProcess = new HashSet<ActionableItemArtifact>(); toProcess.add(selectedAia); - ActionableItemsTx txWrapper = - new ActionableItemsTx(BranchManager.getAtsBranch(), toProcess, newTeamDef); + ActionableItemsTx txWrapper = new ActionableItemsTx(BranchManager.getAtsBranch(), toProcess, newTeamDef); txWrapper.execute(); toReturn = txWrapper.getResult(); } @@ -492,14 +490,9 @@ public class TeamWorkFlowArtifact extends TaskableStateMachineArtifact implement return date; } - /* - * (non-Javadoc) - * - * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewImplementer() - */ @Override - public String getWorldViewImplementer() throws OseeCoreException { - return Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees(DefaultTeamState.Implement.name())); + public Collection<User> getImplementers() throws OseeCoreException { + return getImplementersByState(DefaultTeamState.Implement.name()); } /* diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java index ff16586501a..267844a8356 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java @@ -12,14 +12,17 @@ package org.eclipse.osee.ats.util; import java.util.Collection; import java.util.Date; -import java.util.logging.Level; -import org.eclipse.osee.ats.AtsPlugin; +import java.util.HashSet; +import java.util.Set; import org.eclipse.osee.ats.artifact.ActionArtifact; +import org.eclipse.osee.ats.artifact.ReviewSMArtifact; import org.eclipse.osee.ats.artifact.StateMachineArtifact; import org.eclipse.osee.ats.artifact.TaskArtifact; import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact; import org.eclipse.osee.ats.artifact.VersionArtifact; -import org.eclipse.osee.framework.logging.OseeLog; +import org.eclipse.osee.framework.db.connection.exception.OseeCoreException; +import org.eclipse.osee.framework.jdk.core.type.HashCollection; +import org.eclipse.osee.framework.skynet.core.User; import org.eclipse.osee.framework.skynet.core.artifact.Artifact; import org.eclipse.osee.framework.ui.skynet.widgets.XDate; @@ -28,94 +31,373 @@ import org.eclipse.osee.framework.ui.skynet.widgets.XDate; */ public class SMAMetrics { + private static double manDayHrs = 7.2; private static int MILLISECS_PER_DAY = (1000 * 60 * 60 * 24); - public static String getEstRemainMetrics(Collection<StateMachineArtifact> smas) { - if (smas.size() == 0) return ""; - try { - int numTeamWfs = 0; - int numTasks = 0; - for (Artifact art : smas) { - if (art instanceof TeamWorkFlowArtifact) { - smas.add((TeamWorkFlowArtifact) art); - numTeamWfs++; - } else if ((art instanceof ActionArtifact) && ((ActionArtifact) art).getTeamWorkFlowArtifacts().size() > 0) { - smas.addAll(((ActionArtifact) art).getTeamWorkFlowArtifacts()); - numTeamWfs += ((ActionArtifact) art).getTeamWorkFlowArtifacts().size(); - } else if (art instanceof TaskArtifact) { - smas.add((TaskArtifact) art); - numTasks++; - } - } - int numObjects = numTasks + numTeamWfs; - double estHours = 0; - double hrsRemain = 0; - double hrsSpent = 0; - double manDaysNeeded = 0; - double totalPercentComplete = 0; - for (StateMachineArtifact team : smas) { - hrsRemain += team.getWorldViewRemainHours(); - estHours += team.getWorldViewEstimatedHours(); - hrsSpent += team.getWorldViewHoursSpentTotal(); - manDaysNeeded += team.getWorldViewManDaysNeeded(); - totalPercentComplete += team.getWorldViewPercentCompleteTotal(); + double estHours = 0; + double hrsRemain = 0; + double hrsSpent = 0; + double manDaysNeeded = 0; + double cummulativePercentComplete = 0; + double percentCompleteByTeamPercents = 0; + double percentCompleteByWorkflow = 0; + int numObjects = 0; + + /** + * @return the numObjects + */ + public int getNumObjects() { + return numObjects; + } + + Date estRelDate; + long daysTillRel = 0; + VersionArtifact versionArtifact = null; + String str = ""; + Set<TeamWorkFlowArtifact> teamArts = new HashSet<TeamWorkFlowArtifact>(); + Set<ActionArtifact> actionArts = new HashSet<ActionArtifact>(); + Set<TaskArtifact> taskArts = new HashSet<TaskArtifact>(); + Set<ReviewSMArtifact> reviewArts = new HashSet<ReviewSMArtifact>(); + Set<StateMachineArtifact> smas = new HashSet<StateMachineArtifact>(); + Set<User> assignees = new HashSet<User>(); + Set<User> assigneesAssignedOrCompleted = new HashSet<User>(); + Set<StateMachineArtifact> smasInherited = new HashSet<StateMachineArtifact>(); + + private final HashCollection<User, Artifact> userToAssignedSmas = + new HashCollection<User, Artifact>(true, HashSet.class, 100); + private final HashCollection<User, Artifact> userToCompletedSmas = + new HashCollection<User, Artifact>(true, HashSet.class, 100); + + /** + * @return the userToCompletedSmas + */ + public HashCollection<User, Artifact> getUserToCompletedSmas() { + return userToCompletedSmas; + } + + /** + * @return the manDayHrs + */ + public static double getManDayHrs() { + return manDayHrs; + } + + /** + * @return the teamArts + */ + public Set<TeamWorkFlowArtifact> getTeamArts() { + return teamArts; + } + + /** + * @return the actionArts + */ + public Set<ActionArtifact> getActionArts() { + return actionArts; + } + + /** + * @return the taskArts + */ + public Set<TaskArtifact> getTaskArts() { + return taskArts; + } + + /** + * @return the reviewArts + */ + public Set<ReviewSMArtifact> getReviewArts() { + return reviewArts; + } + + /** + * @return the userToSmas + */ + public HashCollection<User, Artifact> getUserToAssignedSmas() { + return userToAssignedSmas; + } + + /** + * @return the estRelDate + */ + public Date getEstRelDate() { + return estRelDate; + } + + /** + * @param estRelDate the estRelDate to set + */ + public void setEstRelDate(Date estRelDate) { + this.estRelDate = estRelDate; + } + + /** + * @return the daysTillRel + */ + public long getDaysTillRel() { + return daysTillRel; + } + + /** + * @param daysTillRel the daysTillRel to set + */ + public void setDaysTillRel(int daysTillRel) { + this.daysTillRel = daysTillRel; + } + + /** + * @return the versionArtifact + */ + public VersionArtifact getVersionArtifact() { + return versionArtifact; + } + + /** + * @param versionArtifact the versionArtifact to set + */ + public void setVersionArtifact(VersionArtifact versionArtifact) { + this.versionArtifact = versionArtifact; + } + + /** + * @return the numTeamWfs + */ + public int getNumTeamWfs() { + return teamArts.size(); + } + + /** + * @return the numTasks + */ + public int getNumTasks() { + return taskArts.size(); + } + + /** + * @return the numTasks + */ + public int getNumActions() { + return actionArts.size(); + } + + /** + * @return the numTasks + */ + public int getNumReviews() { + return reviewArts.size(); + } + + /** + * @return the estHours + */ + public double getEstHours() { + return estHours; + } + + /** + * @param estHours the estHours to set + */ + public void setEstHours(double estHours) { + this.estHours = estHours; + } + + /** + * @return the hrsRemain + */ + public double getHrsRemain() { + return hrsRemain; + } + + /** + * @param hrsRemain the hrsRemain to set + */ + public void setHrsRemain(double hrsRemain) { + this.hrsRemain = hrsRemain; + } + + /** + * @return the hrsSpent + */ + public double getHrsSpent() { + return hrsSpent; + } + + /** + * @param hrsSpent the hrsSpent to set + */ + public void setHrsSpent(double hrsSpent) { + this.hrsSpent = hrsSpent; + } + + /** + * @return the manDaysNeeded + */ + public double getManDaysNeeded() { + return manDaysNeeded; + } + + /** + * @param manDaysNeeded the manDaysNeeded to set + */ + public void setManDaysNeeded(double manDaysNeeded) { + this.manDaysNeeded = manDaysNeeded; + } + + /** + * @return the cummulativePercentComplete + */ + public double getCummulativePercentComplete() { + return cummulativePercentComplete; + } + + /** + * @param cummulativePercentComplete the cummulativePercentComplete to set + */ + public void setCummulativePercentComplete(double cummulativePercentComplete) { + this.cummulativePercentComplete = cummulativePercentComplete; + } + + /** + * @return the percentComplete + */ + public double getPercentCompleteByTeamPercents() { + return percentCompleteByTeamPercents; + } + + public Collection<TeamWorkFlowArtifact> getCompletedTeamWorkflows() { + Set<TeamWorkFlowArtifact> teams = new HashSet<TeamWorkFlowArtifact>(); + for (TeamWorkFlowArtifact team : getTeamArts()) { + if (team.getSmaMgr().isCancelledOrCompleted()) { + teams.add(team); } - double percentComplete = 0; - if (numObjects > 0 && totalPercentComplete > 0) percentComplete = totalPercentComplete / numObjects; - return String.format(" Selected %s %s EstHrs: %5.2f %sCmp: %5.2f RmnHrs: %5.2f HrsSpnt: %5.2f %s", - (numTeamWfs > 0 ? "TeamWFs: " + numTeamWfs : ""), (numTasks > 0 ? "Tasks: " + numTasks : ""), estHours, - "%", percentComplete, hrsRemain, hrsSpent, (manDaysNeeded > 0 ? String.format("ManDaysNeeded: %5.2f ", - manDaysNeeded) : "")); - } catch (Exception ex) { - OseeLog.log(AtsPlugin.class, Level.SEVERE, ex); - return "Exception occurred - see log"; } + return teams; } - private static double manDayHrs = 7.2; + public double getPercentCompleteByWorkflow() { + if (getTeamArts().size() == 0) return 100; + double completed = getCompletedTeamWorkflows().size(); + if (completed == 0) return 0; + return completed / getTeamArts().size() * 100; + } - public static String getReleaseEstRemainMetrics(Collection<StateMachineArtifact> smas) { - if (smas.size() == 0) return ""; - try { - Artifact art = smas.iterator().next(); - TeamWorkFlowArtifact selTeam = null; - if (art instanceof TeamWorkFlowArtifact) - selTeam = (TeamWorkFlowArtifact) art; - else if ((art instanceof ActionArtifact) && ((ActionArtifact) art).getTeamWorkFlowArtifacts().size() == 1) selTeam = - ((ActionArtifact) art).getTeamWorkFlowArtifacts().iterator().next(); - if (selTeam != null) { - if (selTeam.getTargetedForVersion() != null) { - VersionArtifact verArt = selTeam.getTargetedForVersion(); - Collection<TeamWorkFlowArtifact> teams = verArt.getTargetedForTeamArtifacts(); - double estHours = 0; - double hrsRemain = 0; - double hrsSpent = 0; - for (TeamWorkFlowArtifact team : teams) { - hrsRemain += team.getWorldViewRemainHours(); - estHours += team.getWorldViewEstimatedHours(); - hrsSpent += team.getHoursSpentSMATotal(); - } - Date estRelDate = verArt.getEstimatedReleaseDate(); - double manDaysNeeded = 0; - if (hrsRemain != 0) manDaysNeeded = hrsRemain / manDayHrs; - String daysLeft = ""; - Date today = new Date(); - long daysTillRel = 0; - if (estRelDate != null && estRelDate.after(today)) { - daysTillRel = (estRelDate.getTime() - today.getTime()) / MILLISECS_PER_DAY; - daysLeft = String.format(" DaysLft: %d", daysTillRel); - } - return String.format( - " Target Version: %s EstRelDate: %s %s TeamWFs: %s EstHrs: %5.2f RmnHrs: %5.2f HrsSpnt: %5.2f ManDaysNeeded: %5.2f ", - verArt.getDescriptiveName(), XDate.getDateStr(estRelDate, XDate.MMDDYY), daysLeft, teams.size(), - estHours, hrsRemain, hrsSpent, manDaysNeeded); + /** + * @return the str + */ + @Override + public String toString() { + return str; + } + public static String getEstRemainMetrics(Collection<? extends Artifact> smas) throws OseeCoreException { + return new SMAMetrics(smas).str; + } + + public SMAMetrics(Collection<? extends Artifact> smas) throws OseeCoreException { + this(smas, null); + } + + public SMAMetrics(Collection<? extends Artifact> artifacts, VersionArtifact versionArtifact) throws OseeCoreException { + this.versionArtifact = versionArtifact; + if (artifacts.size() == 0) return; + getInheritedSmasRecursive(artifacts, smasInherited); + for (Artifact art : artifacts) { + if (art instanceof ActionArtifact) { + actionArts.add((ActionArtifact) art); + } + } + for (Artifact art : smasInherited) { + if (art instanceof TeamWorkFlowArtifact) { + teamArts.add((TeamWorkFlowArtifact) art); + } else if (art instanceof TaskArtifact) { + taskArts.add((TaskArtifact) art); + } else if (art instanceof ReviewSMArtifact) { + reviewArts.add((ReviewSMArtifact) art); + } + if (art instanceof StateMachineArtifact) { + smas.add((StateMachineArtifact) art); + Collection<User> users = ((StateMachineArtifact) art).getSmaMgr().getStateMgr().getAssignees(); + assignees.addAll(users); + assigneesAssignedOrCompleted.addAll(users); + for (User user : users) { + userToAssignedSmas.put(user, art); + } + if (((StateMachineArtifact) art).getSmaMgr().isCompleted()) { + Collection<User> implementers = ((StateMachineArtifact) art).getImplementers(); + assigneesAssignedOrCompleted.addAll(implementers); + for (User user : implementers) { + userToCompletedSmas.put(user, art); + } } } - } catch (Exception ex) { - OseeLog.log(AtsPlugin.class, Level.SEVERE, ex); - return "Exception occurred - see log"; } - return ""; + numObjects = getNumTasks() + getNumTeamWfs() + getNumReviews(); + estHours = 0; + hrsRemain = 0; + hrsSpent = 0; + manDaysNeeded = 0; + cummulativePercentComplete = 0; + manDaysNeeded = 0; + for (TeamWorkFlowArtifact team : teamArts) { + hrsRemain += team.getWorldViewRemainHours(); + estHours += team.getWorldViewEstimatedHours(); + hrsSpent += team.getWorldViewHoursSpentTotal(); + manDaysNeeded += team.getWorldViewManDaysNeeded(); + cummulativePercentComplete += team.getWorldViewPercentCompleteTotal(); + } + if (hrsRemain != 0) manDaysNeeded = hrsRemain / manDayHrs; + percentCompleteByTeamPercents = 0; + if (numObjects > 0 && cummulativePercentComplete > 0) { + percentCompleteByTeamPercents = cummulativePercentComplete / numObjects; + } + + estRelDate = null; + Date today = new Date(); + daysTillRel = 0; + if (versionArtifact != null) { + estRelDate = versionArtifact.getEstimatedReleaseDate(); + if (estRelDate != null && estRelDate.after(today)) { + daysTillRel = (estRelDate.getTime() - today.getTime()) / MILLISECS_PER_DAY; + } + } + str = + String.format("TeamWFs: %s Tasks: %s EstHrs: %5.2f %sCmp: %5.2f RmnHrs: %5.2f HrsSpnt: %5.2f %s %s", + getNumTeamWfs(), getNumTasks(), estHours, "%", percentCompleteByTeamPercents, hrsRemain, hrsSpent, + (manDaysNeeded > 0 ? String.format("ManDaysNeeded: %5.2f ", manDaysNeeded) : ""), + (versionArtifact != null ? String.format("Version: %s EstRelDate: %s DaysLeft: %d ", + versionArtifact.getDescriptiveName(), (estRelDate == null ? "Not Set" : XDate.getDateStr( + estRelDate, XDate.MMDDYY)), daysTillRel) : "")); + } + + /** + * @return the assigneesAssignedOrCompleted + */ + public Set<User> getAssigneesAssignedOrCompleted() { + return assigneesAssignedOrCompleted; } + + public void getInheritedSmasRecursive(Collection<? extends Artifact> artifacts, Set<StateMachineArtifact> smas) throws OseeCoreException { + for (Artifact art : artifacts) { + if (art instanceof StateMachineArtifact) { + StateMachineArtifact sma = (StateMachineArtifact) art; + smas.add(sma); + smas.addAll(sma.getSmaMgr().getReviewManager().getReviews()); + getInheritedSmasRecursive(sma.getSmaMgr().getReviewManager().getReviews(), smas); + smas.addAll(sma.getSmaMgr().getTaskMgr().getTaskArtifacts()); + } else if (art instanceof ActionArtifact) { + smas.addAll(((ActionArtifact) art).getTeamWorkFlowArtifacts()); + getInheritedSmasRecursive(((ActionArtifact) art).getTeamWorkFlowArtifacts(), smas); + } + } + } + + public String toStringLong() { + return String.format( + "Actions: %s Team Workflows: %s Reviews: %s Tasks: %s \nEstimated Hours: %5.2f Percent Complete: %5.2f Remaining Hours: %5.2f ManDaysNeeded: %5.2f \nHours Spent: %5.2f %s", + getNumActions(), getNumTeamWfs(), getNumReviews(), getNumTasks(), estHours, percentCompleteByTeamPercents, + hrsRemain, manDaysNeeded, hrsSpent, (versionArtifact != null ? String.format( + "\nVersion: %s Estimated Release Date: %s Days Left: %d ", versionArtifact.getDescriptiveName(), + (estRelDate == null ? "Not Set" : XDate.getDateStr(estRelDate, XDate.MMDDYY)), daysTillRel) : "")); + } + } diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/task/XTaskViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/task/XTaskViewer.java index bb1084416c9..e4132575e9d 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/task/XTaskViewer.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/task/XTaskViewer.java @@ -140,7 +140,11 @@ public class XTaskViewer extends XWidget implements IActionable { xViewer.setLabelProvider(new TaskLabelProvider(xViewer)); xViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { - updateExtraInfoLine(); + try { + updateExtraInfoLine(); + } catch (OseeCoreException ex) { + OseeLog.log(AtsPlugin.class, Level.SEVERE, ex); + } } }); xViewer.getTree().addKeyListener(new KeyListener() { @@ -148,21 +152,25 @@ public class XTaskViewer extends XWidget implements IActionable { } public void keyReleased(KeyEvent event) { - if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL) { - if (event.keyCode == 'a') { - xViewer.getTree().setSelection(xViewer.getTree().getItems()); - updateExtraInfoLine(); - } else if (event.keyCode == 'x') { - if (selectionMetricsMenuItem != null) { - selectionMetricsMenuItem.setSelection(!selectionMetricsMenuItem.getSelection()); + try { + if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL) { + if (event.keyCode == 'a') { + xViewer.getTree().setSelection(xViewer.getTree().getItems()); updateExtraInfoLine(); - } - } else if (event.keyCode == 'f') { - if (filterCompletedMenuItem != null) { - filterCompletedMenuItem.setSelection(!filterCompletedMenuItem.getSelection()); - handleFilterAction(); + } else if (event.keyCode == 'x') { + if (selectionMetricsMenuItem != null) { + selectionMetricsMenuItem.setSelection(!selectionMetricsMenuItem.getSelection()); + updateExtraInfoLine(); + } + } else if (event.keyCode == 'f') { + if (filterCompletedMenuItem != null) { + filterCompletedMenuItem.setSelection(!filterCompletedMenuItem.getSelection()); + handleFilterAction(); + } } } + } catch (OseeCoreException ex) { + OseeLog.log(AtsPlugin.class, Level.SEVERE, ex); } } }); @@ -297,7 +305,7 @@ public class XTaskViewer extends XWidget implements IActionable { } - public void updateExtraInfoLine() { + public void updateExtraInfoLine() throws OseeCoreException { if (selectionMetricsMenuItem != null && selectionMetricsMenuItem.getSelection()) extraInfoLabel.setText(SMAMetrics.getEstRemainMetrics(getXViewer().getSelectedSMAArtifacts())); else @@ -337,7 +345,11 @@ public class XTaskViewer extends XWidget implements IActionable { selectionMetricsMenuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - updateExtraInfoLine(); + try { + updateExtraInfoLine(); + } catch (Exception ex) { + OSEELog.logException(AtsPlugin.class, ex, true); + } } }); diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java index ca41a5fc509..2ce358ab780 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java @@ -30,7 +30,9 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.osee.ats.AtsPlugin;
import org.eclipse.osee.ats.actions.NewAction;
import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
import org.eclipse.osee.ats.navigate.AtsNavigateViewItems;
import org.eclipse.osee.ats.util.SMAMetrics;
import org.eclipse.osee.ats.world.search.WorldSearchItem;
@@ -163,7 +165,11 @@ public class WorldComposite extends Composite implements IFrameworkTransactionEv xViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
- updateExtraInfoLine();
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
}
});
xViewer.getTree().addKeyListener(new KeyListener() {
@@ -175,7 +181,11 @@ public class WorldComposite extends Composite implements IFrameworkTransactionEv if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL) {
if (event.keyCode == 'a') {
xViewer.getTree().setSelection(xViewer.getTree().getItems());
- updateExtraInfoLine();
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
} else if (event.keyCode == 'z') {
releaseMetricsAction.setChecked(!releaseMetricsAction.isChecked());
releaseMetricsAction.run();
@@ -390,26 +400,38 @@ public class WorldComposite extends Composite implements IFrameworkTransactionEv public void setTableTitle(final String title, final boolean warning) {
Displays.ensureInDisplayThread(new Runnable() {
public void run() {
- if (warning)
- warningLabel.setImage(AtsPlugin.getInstance().getImage("warn.gif"));
- else
- warningLabel.setImage(null);
- searchNameLabel.setText(title);
- searchNameLabel.getParent().layout();
- xViewer.setReportingTitle(title + " - " + XDate.getDateNow());
- updateExtraInfoLine();
+ try {
+ if (warning)
+ warningLabel.setImage(AtsPlugin.getInstance().getImage("warn.gif"));
+ else
+ warningLabel.setImage(null);
+ searchNameLabel.setText(title);
+ searchNameLabel.getParent().layout();
+ xViewer.setReportingTitle(title + " - " + XDate.getDateNow());
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
};
});
}
- public void updateExtraInfoLine() {
+ public void updateExtraInfoLine() throws OseeCoreException {
if (extraInfoLabel == null || extraInfoLabel.isDisposed()) return;
+ String str = "";
if (releaseMetricsAction.isChecked()) {
- extraInfoLabel.setText(SMAMetrics.getReleaseEstRemainMetrics(getXViewer().getSelectedSMAArtifacts()));
+ VersionArtifact verArt = null;
+ Set<StateMachineArtifact> smaArts = getXViewer().getSelectedSMAArtifacts();
+ if (smaArts.size() != 0) {
+ verArt = smaArts.iterator().next().getTargetedForVersion();
+ SMAMetrics sMet = new SMAMetrics(smaArts, verArt);
+ str = sMet.toString();
+ }
} else if (selectionMetricsAction.isChecked()) {
- extraInfoLabel.setText(SMAMetrics.getEstRemainMetrics(getXViewer().getSelectedSMAArtifacts()));
+ SMAMetrics sMet = new SMAMetrics(getXViewer().getSelectedSMAArtifacts(), null);
+ str = sMet.toString();
} else
- extraInfoLabel.setText("");
+ extraInfoLabel.setText(str);
extraInfoLabel.getParent().layout();
}
@@ -516,7 +538,11 @@ public class WorldComposite extends Composite implements IFrameworkTransactionEv @Override
public void run() {
if (releaseMetricsAction.isChecked()) selectionMetricsAction.setChecked(false);
- updateExtraInfoLine();
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
}
};
releaseMetricsAction.setToolTipText("Show Release Metrics by Release Version - Ctrl-Z");
@@ -526,7 +552,11 @@ public class WorldComposite extends Composite implements IFrameworkTransactionEv @Override
public void run() {
if (selectionMetricsAction.isChecked()) releaseMetricsAction.setChecked(false);
- updateExtraInfoLine();
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
}
};
selectionMetricsAction.setToolTipText("Show Release Metrics by Selection - Ctrl-X");
@@ -715,7 +745,11 @@ public class WorldComposite extends Composite implements IFrameworkTransactionEv Displays.ensureInDisplayThread(new Runnable() {
@Override
public void run() {
- updateExtraInfoLine();
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
}
});
}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldMetricsComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldMetricsComposite.java index cd87227adbc..b065e489d82 100644 --- a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldMetricsComposite.java +++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldMetricsComposite.java @@ -5,20 +5,14 @@ */
package org.eclipse.osee.ats.world;
-import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
-import java.util.Set;
import java.util.logging.Level;
import org.eclipse.osee.ats.AtsPlugin;
-import org.eclipse.osee.ats.artifact.ActionArtifact;
-import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
-import org.eclipse.osee.ats.artifact.TaskArtifact;
-import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.util.SMAMetrics;
import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
import org.eclipse.osee.framework.logging.OseeLog;
-import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.User;
import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
import org.eclipse.osee.framework.ui.skynet.widgets.xbargraph.XBarGraphTable;
import org.eclipse.osee.framework.ui.swt.ALayout;
@@ -59,17 +53,12 @@ public class WorldMetricsComposite extends Composite { adapt(this);
creatToolBar(this);
- // try {
- // handleUpdateMetrics();
- // } catch (OseeCoreException ex) {
- // OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
- // }
}
private void creatToolBar(Composite composite) {
toolBarComposite = new Composite(composite, SWT.NONE);
toolBarComposite.setLayoutData(new GridData(SWT.LEFT, SWT.NONE, false, false, 1, 1));
- toolBarComposite.setLayout(ALayout.getZeroMarginLayout(1, false));
+ toolBarComposite.setLayout(new GridLayout(1, false));
adapt(toolBarComposite);
ToolBar toolBar = new ToolBar(toolBarComposite, SWT.FLAT | SWT.RIGHT);
@@ -106,56 +95,58 @@ public class WorldMetricsComposite extends Composite { adapt(metricsComposite);
addSpace();
+ SMAMetrics sMet = new SMAMetrics(worldComposite.getLoadedArtifacts(), null);
Label label = new Label(metricsComposite, SWT.NONE);
- label.setText("Number of Workflows: " + getLoadedWorkflowArtifacts().size());
+ label.setText(sMet.toStringLong());
adapt(label);
addSpace();
- createFullPercentChart(metricsComposite);
+ createFullPercentChart(sMet, metricsComposite);
addSpace();
- createAssigneesChart(metricsComposite);
+ createCompletedByAssigneesChart(sMet, metricsComposite);
layout();
}
- private Collection<TeamWorkFlowArtifact> getLoadedWorkflowArtifacts() throws OseeCoreException {
- Set<TeamWorkFlowArtifact> teams = new HashSet<TeamWorkFlowArtifact>();
- for (Artifact art : worldComposite.getLoadedArtifacts()) {
- if (art instanceof ActionArtifact) {
- teams.addAll(((ActionArtifact) art).getTeamWorkFlowArtifacts());
- }
- if (art instanceof TeamWorkFlowArtifact) {
- teams.add((TeamWorkFlowArtifact) art);
- }
- if (art instanceof TaskArtifact) {
- teams.add(((TaskArtifact) art).getParentTeamWorkflow());
- }
- if (art instanceof ReviewSMArtifact) {
- teams.add(((ReviewSMArtifact) art).getParentTeamWorkflow());
- }
- }
- return teams;
- }
-
private void addSpace() {
Label label = new Label(metricsComposite, SWT.NONE);
label.setText(" ");
adapt(label);
}
- public void createFullPercentChart(Composite parent) {
+ public void createFullPercentChart(SMAMetrics sMet, Composite parent) {
Map<String, Integer> itemToValueMap = new HashMap<String, Integer>();
- itemToValueMap.put("All", 85);
- XBarGraphTable table = new XBarGraphTable("Complete", "Loaded", "Complete", itemToValueMap);
+ itemToValueMap.put(
+ "By Team Percents (" + sMet.getCummulativePercentComplete() + "/" + sMet.getNumObjects() + ")",
+ (int) sMet.getPercentCompleteByTeamPercents());
+ itemToValueMap.put(
+ "By Team Workflow (" + sMet.getCompletedTeamWorkflows().size() + "/" + sMet.getNumTeamWfs() + ")",
+ (int) sMet.getPercentCompleteByWorkflow());
+ XBarGraphTable table = new XBarGraphTable("Total Percent Complete", "", "Percent Complete", itemToValueMap);
+ table.setFillHorizontally(true);
table.createWidgets(parent, 1);
adapt(table);
}
- public void createAssigneesChart(Composite parent) {
+ public void createCompletedByAssigneesChart(SMAMetrics sMet, Composite parent) {
Map<String, Integer> itemToValueMap = new HashMap<String, Integer>();
- itemToValueMap.put("Don", 85);
- itemToValueMap.put("Ryan", 35);
- itemToValueMap.put("Andy", 4);
- XBarGraphTable table = new XBarGraphTable("Complete by Assignee", "User", "Complete", itemToValueMap);
+ for (User user : sMet.getAssigneesAssignedOrCompleted()) {
+ int completed =
+ sMet.getUserToCompletedSmas().containsKey(user) ? sMet.getUserToCompletedSmas().getValues(user).size() : 0;
+ int inWork =
+ sMet.getUserToAssignedSmas().containsKey(user) ? sMet.getUserToAssignedSmas().getValues(user).size() : 0;
+ int total = completed + inWork;
+ int percentComplete = 0;
+ if (completed == total) {
+ percentComplete = 100;
+ } else if (completed != 0 && total != 0) {
+ double percent = new Double(completed) / total * 100.0;
+ percentComplete = (int) percent;
+ }
+ itemToValueMap.put(user.getName() + "(" + completed + "/" + total + ")", percentComplete);
+ }
+ XBarGraphTable table =
+ new XBarGraphTable("Completed by Assignee", "User", "Percent Complete", itemToValueMap, "%");
+ table.setFillHorizontally(true);
table.createWidgets(parent, 1);
adapt(table);
}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java index 915b0fc73e5..0dbe978c54d 100644 --- a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java +++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java @@ -47,8 +47,16 @@ public abstract class XWidget { protected boolean verticalLabel = false; protected boolean fillVertically = false; protected boolean fillHorizontally = false; + + /** + * @return the fillHorizontally + */ + public boolean isFillHorizontally() { + return fillHorizontally; + } + protected boolean displayLabel = true; - private Set<XModifiedListener> modifiedListeners = new LinkedHashSet<XModifiedListener>(); + private final Set<XModifiedListener> modifiedListeners = new LinkedHashSet<XModifiedListener>(); private MouseListener mouseLabelListener; /** @@ -367,6 +375,7 @@ public abstract class XWidget { */ public abstract String getReportData(); + @Override public String toString() { return toReport(); } diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java index 24e2bcb16b0..1aff3d18844 100644 --- a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java +++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java @@ -13,6 +13,7 @@ import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
@@ -32,15 +33,18 @@ public class XBarGraphTable extends XWidget { private final String percentHeader;
private final Map<String, Integer> itemToValueMap;
private Table table;
+ private final String valuePostFix;
- /**
- * @param label
- */
public XBarGraphTable(String label, String itemHeader, String percentHeader, Map<String, Integer> itemToValueMap) {
+ this(label, itemHeader, percentHeader, itemToValueMap, "%");
+ }
+
+ public XBarGraphTable(String label, String itemHeader, String percentHeader, Map<String, Integer> itemToValueMap, String valuePostFix) {
super(label);
this.itemHeader = itemHeader;
this.percentHeader = percentHeader;
this.itemToValueMap = itemToValueMap;
+ this.valuePostFix = valuePostFix;
}
/* (non-Javadoc)
@@ -54,12 +58,15 @@ public class XBarGraphTable extends XWidget { table = new Table(parent, SWT.BORDER);
table.setHeaderVisible(true);
table.setLinesVisible(true);
+ if (isFillHorizontally()) {
+ table.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
TableColumn column1 = new TableColumn(table, SWT.NONE);
column1.setText(itemHeader);
- column1.setWidth(100);
+ column1.setWidth(300);
final TableColumn column2 = new TableColumn(table, SWT.NONE);
column2.setText(percentHeader);
- column2.setWidth(200);
+ column2.setWidth(500);
for (String itemName : itemToValueMap.keySet()) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(itemName);
@@ -81,14 +88,19 @@ public class XBarGraphTable extends XWidget { int percent = percents[index];
Color foreground = gc.getForeground();
Color background = gc.getBackground();
- gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
- gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
+ if (valuePostFix.equals("%") && percent == 100) {
+ gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN));
+ gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN));
+ } else {
+ gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
+ }
int width = (column2.getWidth() - 1) * percent / 100;
gc.fillGradientRectangle(event.x, event.y, width, event.height, true);
Rectangle rect2 = new Rectangle(event.x, event.y, width - 1, event.height - 1);
gc.drawRectangle(rect2);
gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
- String text = percent + "%";
+ String text = percent + valuePostFix;
Point size = event.gc.textExtent(text);
int offset = Math.max(0, (event.height - size.y) / 2);
gc.drawText(text, event.x + 2, event.y + offset, true);
@@ -97,7 +109,6 @@ public class XBarGraphTable extends XWidget { }
}
});
-
}
/* (non-Javadoc)
|