buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java
changeset 628 7c4a911dc066
parent 588 c7c26511138f
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java	Wed Jun 16 16:51:40 2010 +0300
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java	Fri Aug 13 14:59:05 2010 +0300
@@ -1,58 +1,55 @@
 /*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  
-*
-*/
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  
+ *
+ */
 
 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.ArrayList;
 import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
-import java.util.Set;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Enumeration;
 import java.util.Map;
-import java.io.File;
-import java.util.Iterator;
+import java.util.Set;
 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;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import com.nokia.helium.core.ant.types.Stage;
 
 /**
- * Diamonds client used to connect to get build id and also to send the build
- * results
+ * Diamonds client used to connect to get build id and also to send the build results
  * 
  */
 public class StageDiamondsListener extends DiamondsListenerImpl {
 
     private static final Date INVALID_DATE = new Date(-1);
 
+    private static Object mutexObject = new Object();;
+
     private Logger log = Logger.getLogger(StageDiamondsListener.class);
-    
+
     private List<Map<String, Date>> stageTargetBeginList = new ArrayList<Map<String, Date>>();
 
-    private Map<String, Stage> stageTargetEndMap = new HashMap<String, Stage>();
+    private Map<String, List<Stage>> stageTargetEndMap = new HashMap<String, List<Stage>>();
 
     private Map<String, String> stageStartTargetMap = new HashMap<String, String>();
 
@@ -60,9 +57,7 @@
 
     private boolean isTargetMapInitialized;
 
-    private Project project;
-
-    private List<Stage> stages;
+    private Map<String, Stage> stages;
 
 
     public StageDiamondsListener() {
@@ -70,30 +65,28 @@
     }
 
     public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
-        project = buildEvent.getProject();
-        int hashCode = project.hashCode();
+        initDiamondsClient();
+        Project projectInStage = buildEvent.getProject();
+        int hashCode = projectInStage.hashCode();
         String targetName = buildEvent.getTarget().getName();
         if (!isTargetMapInitialized && stages != null) {
-            log
-                    .debug("diamonds:StageDiamondsListener: initializing for all stages.");
-            initStageTargetsMap();
+            log.debug("diamonds:StageDiamondsListener: initializing for all stages.");
+            initStageTargetsMap(projectInStage);
             isTargetMapInitialized = true;
         }
         String targetNameWithHashCode = targetName + "-" + hashCode;
         log.debug("targetBegin: targetNameWithHashCode: " + targetNameWithHashCode);
-        log.debug("targetBegin targetName: " + targetName +
-               " - currentStartTargetName:" + stageStartTargetMap.get(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();) {
+
+    private Date getStartTime(Stage stage) {
+        String startTargetName = stage.getStartTarget();
+        for (Iterator<Map<String, Date>> listIter = stageTargetBeginList.iterator(); listIter.hasNext();) {
             Map<String, Date> stageMap = listIter.next();
             if (stageMap.get(startTargetName) != null) {
                 Set<String> targetSet = stageMap.keySet();
@@ -101,123 +94,65 @@
                     log.debug("key: " + key);
                     Date time = stageMap.get(key);
                     log.debug("time: " + time);
-                    if ( time != INVALID_DATE) {
+                    if (time != INVALID_DATE) {
                         return time;
                     }
                 }
             }
         }
-        throw new BuildException("No time recorded " +
-                "for stage:" + stage.getStageName());
+        throw new BuildException("No time recorded " + "for stage:" + stage.getStageName());
     }
 
-    private Stage getStageBasedOnEndTarget(String targetName, int hashCode) {
-        Stage stage = stageTargetEndMap.get(targetName);
-        if (stage != null) {
-            String currentStageTargetName = stageStartTargetMap.get(
-                    stage.getStartTargetName() + "-" + hashCode);
-            log.debug("getStageBasedOnEndTarget: currentStargetTargetName" + currentStageTargetName);
-            if (currentStageTargetName != null) {
-                return stage;
-            }
-        }
-        return null;
-    }
-    @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);
-        
-        Stage stage = getStageBasedOnEndTarget(targetName, hashCode);
-        if (stage != null && getIsInitialized() ) {
-            //initDiamondsClient();
-            String stageName = stage.getStageName();
-            String sourceFile = stage.getSourceFile();
-            log.debug("targetEnd: stageName: " + stageName);
-            log
-                    .debug("diamonds:StageDiamondsListener: finished recording for stage: "
-                            + stageName);
-            if (sourceFile == null) {
-                sourceFile = getSourceFile(stageName);
-            }
-            log.debug("targetEnd: logical.stage: " +  stageName);
-            Date startTime = getStartTime(stage, hashCode); 
-            log.debug("targetEnd: starttime: " +  startTime);
-            log.debug("targetEnd: endtime: " +  
-                    getTimeFormat().format(new Date()));
-            project.setProperty("logical.stage", stageName);
-            project.setProperty("stage.start.time", getTimeFormat()
-                    .format(startTime));
-            project.setProperty("stage.end.time", getTimeFormat()
-                    .format(new Date()));
-            // Look for template file with stage name
-            String stageTemplateFileName = stageName + ".xml.ftl";
-            File stageTemplateFile = new File(stageTemplateFileName);
-            if (stageTemplateFile.exists()) {
-                String output = DiamondsConfig.getOutputDir()
-                        + File.separator + stageName + ".xml";
-                try {
-                    List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
-                    sourceList.add(new PropertiesSource("ant", project
-                            .getProperties()));
-                    sourceList
-                            .add(new XMLTemplateSource("doc", new File(sourceFile)));
-                    getTemplateProcessor().convertTemplate(DiamondsConfig
-                            .getTemplateDir(), stageTemplateFileName,
-                            output, sourceList);
-                    mergeToFullResults(new File(output));
-                    log.info("Sending data to diamonds for stage: "
-                            + stageName);
-                    getDiamondsClient().sendData(output, DiamondsConfig
-                            .getDiamondsProperties().getDiamondsBuildID());
-                } catch (com.nokia.helium.core.TemplateProcessorException e1) {
-                    throw new DiamondsException(
-                            "template conversion error for stage: "
-                                    + stageName + " : " + e1.getMessage());
+    private void sendStageInfo(String targetName, int hashCode) throws DiamondsException {
+        List<Stage> stageList = stageTargetEndMap.get(targetName);
+        synchronized (mutexObject) {
+            if (stageList != null) {
+                for (Stage stage : stageList) {
+                    if (stage != null) {
+                        log.debug("stage.name: " + stage.getStageName());
+                        log.debug("stage.start target name: " + stage.getStartTarget());
+                        String currentStageTargetName = stageStartTargetMap.get(stage.getStartTarget()
+                            + "-" + hashCode);
+                        log.debug("getStageBasedOnEndTarget: currentStargetTargetName" + currentStageTargetName);
+                        if (currentStageTargetName != null) {
+                            log.debug("stage in targetend: " + stage);
+                            if (stage != null && getIsInitialized()) {
+                                //initDiamondsClient();
+                                String stageName = stage.getStageName();
+                                log.debug("stageName in targetend: " + stageName);
+                                String stageMessage =  stageName + ".id";
+                                sendMessage(stageMessage);
+                                Date startTime = getStartTime(stage);
+                                getProject().setProperty("logical.stage", stageName);
+                                getProject().setProperty("stage.start.time", getTimeFormat().format(startTime));
+                                getProject().setProperty("stage.end.time", getTimeFormat().format(new Date()));
+                                sendMessage("stage.time.message");
+                            }
+                        }
+                    }
                 }
-            } else {
-                log.debug("diamonds:StageDiamondsListener:tempalte file: "
-                        + stageTemplateFile + " does not exist");
-            }
-
-            String output = DiamondsConfig.getOutputDir() + File.separator
-                    + stageName + "-time.xml";
-            log.debug("targetEnd: output " + output);
-            // Store the time for the current stage and send it
-            stageTemplateFileName = "diamonds_stage.xml.ftl";
-            try {
-                List<TemplateInputSource> sourceList = new ArrayList<TemplateInputSource>();
-                sourceList.add(new PropertiesSource("ant", project
-                        .getProperties()));
-                sourceList.add(new XMLTemplateSource("doc", new File(sourceFile)));
-                getTemplateProcessor().convertTemplate(DiamondsConfig
-                        .getTemplateDir(), stageTemplateFileName, output,
-                        sourceList);
-                mergeToFullResults(new File(output));
-                // List filesToMerge = new ArrayList();
-
-                // mergedFile = mergeFiles(output);
-                getDiamondsClient().sendData(output, DiamondsConfig
-                        .getDiamondsProperties().getDiamondsBuildID());
-            } catch (com.nokia.helium.core.TemplateProcessorException e1) {
-                throw new DiamondsException("template conversion error while sending data for stage: "
-                        + stageName + " : " + e1.getMessage());
             }
         }
     }
 
+    @SuppressWarnings("unchecked")
+    public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
+        String targetName = buildEvent.getTarget().getName();
+        Project prj = buildEvent.getProject();
+        int hashCode = prj.hashCode();
+        String targetNameWithHashCode = targetName + "-" + hashCode;
+        log.debug("targetEnd: targetNamewith-hashcode: " + targetNameWithHashCode);
+        sendStageInfo(targetName, hashCode);
+    }
+
     private void findAndSetStartTimeForTargetInStageList(String targetName,
-            String targetNameWithHashCode) throws DiamondsException {
-        for (Iterator<Map<String, Date>> listIter = stageTargetBeginList.iterator(); listIter
-                .hasNext();) {
+        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-----: "
-                                + targetName);
+                    + targetName);
                 log.debug("findtime: targetNamewith-hashcode: " + targetNameWithHashCode);
                 log.debug("findtime: time: " + new Date());
                 stageMap.put(targetName, new Date());
@@ -228,18 +163,16 @@
     }
 
     @SuppressWarnings("unchecked")
-    private void initStageTargetsMap() {
-        Iterator<Stage> iter = stages.iterator();
-        while (iter.hasNext()) {
-            // stage begin process
-            Stage stage = iter.next();
-            String startTargetName = stage.getStartTargetName();
+    private void initStageTargetsMap(Project projectInStage) {
+        for (String key : stages.keySet()) {
+            Stage stage = stages.get(key);
+            String startTargetName = stage.getStartTarget();
             Map<String, Date> stageMap = new LinkedHashMap<String, Date>();
             Vector<Target> arrayList = null;
             try {
-                arrayList = project.topoSort(startTargetName, project
-                        .getTargets(), false);
-            } catch (BuildException be) {
+                arrayList = projectInStage.topoSort(startTargetName, projectInStage.getTargets(), false);
+            }
+            catch (BuildException be) {
                 log.debug("Diamonds target missing: ", be);
             }
             if (arrayList != null) {
@@ -254,16 +187,14 @@
                 stageTargetBeginList.add(stageMap);
 
                 // stage end process
-                String endTargetName = stage.getEndTargetName();
+                String endTargetName = stage.getEndTarget();
                 // fast lookup
-                Stage existingStage = stageTargetEndMap.get(endTargetName); 
-                if (existingStage != null) {
-                    throw new BuildException("Not supported: two stages with" +
-                            "same ending target defined by:stage1: " + 
-                            existingStage.getStageName() +
-                            "stage2: " + stage.getStageName());
+                List<Stage> existingStageList = stageTargetEndMap.get(endTargetName);
+                if (existingStageList == null) {
+                    existingStageList = new ArrayList<Stage>();
+                    stageTargetEndMap.put(endTargetName, existingStageList);
                 }
-                stageTargetEndMap.put(endTargetName, stage);
+                existingStageList.add(stage);
                 log.debug("   - End target: " + endTargetName);
             }
         }