buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java
branchhelium-9.0
changeset 618 df88fead2976
parent 587 85df38eb4012
--- 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