--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java Tue Apr 27 08:33:08 2010 +0300
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java Thu Jul 22 17:08:43 2010 +0300
@@ -18,14 +18,14 @@
package com.nokia.helium.diamonds;
import org.apache.tools.ant.BuildEvent;
+
+
import org.apache.tools.ant.Target;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
-
-
-
import java.util.Date;
-
+import java.util.LinkedHashMap;
+import java.util.Set;
import java.util.HashMap;
import java.util.List;
import java.util.Enumeration;
@@ -35,11 +35,8 @@
import java.util.Vector;
import java.util.ArrayList;
import org.apache.log4j.Logger;
-
import com.nokia.helium.core.PropertiesSource;
import com.nokia.helium.core.TemplateInputSource;
-
-
import com.nokia.helium.core.XMLTemplateSource;
/**
@@ -57,15 +54,16 @@
private Map<String, Stage> stageTargetEndMap = new HashMap<String, Stage>();
+ private Map<String, String> stageStartTargetMap = new HashMap<String, String>();
+
+ private Map<String, Date> stageStartTargetTimeMap = new HashMap<String, Date>();
+
private boolean isTargetMapInitialized;
private Project project;
- private String currentStartTargetName;
-
private List<Stage> stages;
- private Date currentStartTargetTime;
public StageDiamondsListener() {
stages = DiamondsConfig.getStages();
@@ -73,6 +71,7 @@
public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
project = buildEvent.getProject();
+ int hashCode = project.hashCode();
String targetName = buildEvent.getTarget().getName();
if (!isTargetMapInitialized && stages != null) {
log
@@ -80,16 +79,49 @@
initStageTargetsMap();
isTargetMapInitialized = true;
}
- log.debug("targetBegin targetName: " + targetName + " - currentStartTargetName:" + currentStartTargetName);
- if (currentStartTargetName == null) {
- findAndSetStartTimeForTargetInStageList(targetName);
+ String targetNameWithHashCode = targetName + "-" + hashCode;
+ log.debug("targetBegin: targetNameWithHashCode: " + targetNameWithHashCode);
+ log.debug("targetBegin targetName: " + targetName +
+ " - currentStartTargetName:" + stageStartTargetMap.get(targetNameWithHashCode));
+ if (stageStartTargetMap.get(targetNameWithHashCode) == null) {
+ log.debug("looking for start target match and associating time to it");
+ findAndSetStartTimeForTargetInStageList(targetName, targetNameWithHashCode);
}
}
+
+ private Date getStartTime(Stage stage, int hasCode) {
+ String startTargetName = stage.getStartTargetName();
+ String endTargetName = stage.getEndTargetName();
+ for (Iterator<Map<String, Date>> listIter = stageTargetBeginList.iterator(); listIter
+ .hasNext();) {
+ Map<String, Date> stageMap = listIter.next();
+ if (stageMap.get(startTargetName) != null &&
+ stageMap.get(endTargetName) != null) {
+ Set<String> targetSet = stageMap.keySet();
+ for (String key : targetSet) {
+ log.debug("key: " + key);
+ Date time = stageMap.get(key);
+ log.debug("time: " + time);
+ if ( time != INVALID_DATE) {
+ return time;
+ }
+ }
+ }
+ }
+ throw new BuildException("No time recorded " +
+ "for stage:" + stage.getStageName());
+ }
@SuppressWarnings("unchecked")
public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
+ String targetName = buildEvent.getTarget().getName();
+ project = buildEvent.getProject();
+ int hashCode = project.hashCode();
+ String targetNameWithHashCode = targetName + "-" + hashCode;
+ log.debug("targetEnd: targetNamewith-hashcode: " + targetNameWithHashCode);
+ String currentStartTargetName =
+ stageStartTargetMap.get(targetNameWithHashCode);
if (currentStartTargetName != null) {
- String targetName = buildEvent.getTarget().getName();
Stage stage = stageTargetEndMap.get(targetName);
if (stage != null && getIsInitialized() ) {
//initDiamondsClient();
@@ -101,12 +133,12 @@
if (sourceFile == null) {
sourceFile = getSourceFile(stageName);
}
+ Date startTime = getStartTime(stage, hashCode);
project.setProperty("logical.stage", stageName);
project.setProperty("stage.start.time", getTimeFormat()
- .format(currentStartTargetTime));
+ .format(startTime));
project.setProperty("stage.end.time", getTimeFormat()
.format(new Date()));
- currentStartTargetName = null;
// Look for template file with stage name
String stageTemplateFileName = stageName + ".xml.ftl";
File stageTemplateFile = new File(stageTemplateFileName);
@@ -123,9 +155,6 @@
.getTemplateDir(), stageTemplateFileName,
output, sourceList);
mergeToFullResults(new File(output));
-
- // String mergedFile = mergeFiles(new File(output));
-
log.info("Sending data to diamonds for stage: "
+ stageName);
getDiamondsClient().sendData(output, DiamondsConfig
@@ -166,18 +195,20 @@
}
}
- private void findAndSetStartTimeForTargetInStageList(String targetName)
- throws DiamondsException {
+ private void findAndSetStartTimeForTargetInStageList(String targetName,
+ String targetNameWithHashCode) throws DiamondsException {
for (Iterator<Map<String, Date>> listIter = stageTargetBeginList.iterator(); listIter
.hasNext();) {
Map<String, Date> stageMap = listIter.next();
Date targetTime = stageMap.get(targetName);
if (targetTime != null && targetTime.equals(INVALID_DATE)) {
- log.debug("diamonds:StageDiamondsListener: started recording for stage-target: "
+ log.debug("diamonds:StageDiamondsListener: started recording for stage-target-----: "
+ targetName);
+ log.debug("findtime: targetNamewith-hashcode: " + targetNameWithHashCode);
+ log.debug("findtime: time: " + new Date());
stageMap.put(targetName, new Date());
- currentStartTargetName = targetName;
- currentStartTargetTime = new Date();
+ stageStartTargetMap.put(targetNameWithHashCode, targetName);
+ stageStartTargetTimeMap.put(targetNameWithHashCode, new Date());
}
}
}
@@ -189,7 +220,7 @@
// stage begin process
Stage stage = iter.next();
String startTargetName = stage.getStartTargetName();
- Map<String, Date> stageMap = new HashMap<String, Date>();
+ Map<String, Date> stageMap = new LinkedHashMap<String, Date>();
Vector<Target> arrayList = null;
try {
arrayList = project.topoSort(startTargetName, project