buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/StageSummaryHandler.java
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 587 85df38eb4012
child 645 b8d81fa19e7d
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
/*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
 * All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
 * under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
 * Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
 * Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
 * Description:  
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
package com.nokia.helium.logger.ant.listener;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
import java.io.File;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
import java.io.StringWriter;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
import java.text.DateFormat;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
import java.util.ArrayList;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
import java.util.Date;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    24
import java.util.Enumeration;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import java.util.HashMap;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
import java.util.Hashtable;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
import java.util.LinkedHashMap;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
import java.util.List;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
import java.util.Map;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
import java.util.Vector;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
import org.apache.log4j.Logger;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
import org.apache.tools.ant.BuildEvent;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
import org.apache.tools.ant.BuildException;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
import org.apache.tools.ant.Project;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
import org.apache.tools.ant.Target;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
import org.apache.tools.ant.util.DateUtils;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    39
import com.nokia.helium.core.ant.types.Stage;
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
import com.nokia.helium.logger.ant.types.StageSummary;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    41
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
import freemarker.cache.FileTemplateLoader;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
import freemarker.template.Configuration;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
import freemarker.template.Template;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    45
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
/**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
 * <code>StageStatusHandler</code> is the handler class responsible for
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
 * displaying the summary of the various configured build stages at the end of
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
 * build process.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
 * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
public class StageSummaryHandler implements Handler {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
    public static final String PASSED = "PASSED";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
    public static final String FAILED = "FAILED";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
    private Logger log = Logger.getLogger(getClass());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
    private boolean lookup4Stages;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
    private boolean summarize;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
    private Map<String, StageWrapper> completedStages;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
    private StageWrapper currentStage;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
    private Hashtable<String, Stage> stages;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
    private File template;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
     * Create an instance of {@link StageSummaryHandler}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
    public StageSummaryHandler() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
        completedStages = new LinkedHashMap<String, StageWrapper>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
        log.debug("StageStatusHandler instantiated");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
     * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
    public void handleBuildStarted(BuildEvent event) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
     * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
    public void handleBuildFinished(BuildEvent event) {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    86
        if (summarize && currentStage != null) {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
            endCurrentStage();
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    88
        }
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
        if (summarize && !completedStages.isEmpty()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
            generateSummary(event.getProject());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
            log.debug("Stage Summary generation completed");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
     * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
    public void handleTargetStarted(BuildEvent event) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
        Project project = event.getProject();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
        if (!summarize) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
            StageSummary stageSummary = getStageSummary(project);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   102
            summarize = stageSummary != null
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
                    && stageSummary.getTemplate() != null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
            lookup4Stages = summarize;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
            template = stageSummary.getTemplate();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
            log.debug("Is Project configured to display Stage Summary ? "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
                    + summarize);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
        if (lookup4Stages) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
            log.debug("Loading stages....");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
            parseStages(event.getProject());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
            log.debug("Total no of stages loaded = " + stages.size());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
            lookup4Stages = false;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
        log.debug("Handling target - " + event.getTarget().getName());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
        if (summarize && doRunTarget(event)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
            StageWrapper stage = searchNewStage(event);
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   120
            if (stage != null) {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
                startNewStage(stage);
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   122
            }
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
     * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
    public void handleTargetFinished(BuildEvent event) {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   130
        if (summarize && isCurrentStageToEnd(event)) {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
            endCurrentStage();
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   132
        }
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   134
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   135
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   136
     * Indicates whether the current stage is ending or not.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   137
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   138
     * @param event
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   139
     *            is the build event.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   140
     * @return true, if the build failed or the end target of the stage is
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   141
     *         reached; otherwise false.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   142
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   143
    private boolean isCurrentStageToEnd(BuildEvent event) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   144
        boolean end = false;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   145
        if (currentStage != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   146
            if (event.getException() != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   147
                currentStage.setError(getReason(event.getException()));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   148
                end = true;
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   149
            } else {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   150
                end = currentStage.stage.isEndTarget(event.getTarget()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   151
                        .getName());
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   152
            }
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   153
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   154
        return end;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   155
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   156
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   157
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   158
     * Method returns the configured {@link StageSummary}.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   159
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   160
     * @param project
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   161
     *            is the project to lookup for stageSummary.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   162
     * @return the {@link StageSummary}.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   163
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   164
    @SuppressWarnings("unchecked")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   165
    private StageSummary getStageSummary(Project project) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   166
        StageSummary stageSummary = null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   167
        int count = 0;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   168
        Hashtable<String, Object> references = project.getReferences();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   169
        for (Enumeration<String> en = references.keys(); en.hasMoreElements();) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   170
            Object object = references.get(en.nextElement());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   171
            if (object instanceof StageSummary) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   172
                count++;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   173
                if (count > 1) {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   174
                    throw new BuildException("Multiple entries of 'hlm:stagesummary' found in "
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   175
                            + "stages_config.ant.xml.");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   176
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   177
                stageSummary = (StageSummary) object;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   178
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   179
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   180
        return stageSummary;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   181
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   182
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   183
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   184
     * Start the given stage as a new build stage.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   185
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   186
     * @param newStage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   187
     *            is the new build stage to start.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   188
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   189
    private void startNewStage(StageWrapper newStage) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   190
        endCurrentStage();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   191
        Long currTime = getCurrentTime();
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   192
        if (!completedStages.containsKey(newStage.stageName)) {
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   193
            newStage.setStageStartTime(getTimestamp(currTime));
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   194
        }
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   195
        newStage.setStartTime(currTime);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   196
        this.currentStage = newStage;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   197
        log.debug("New stage [" + newStage.stageName + "] started at "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   198
                + getTimestamp(currTime));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   199
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   200
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   201
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   202
     * End the current stage.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   203
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   204
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   205
    private void endCurrentStage() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   206
        if (currentStage != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   207
            Long currTime = getCurrentTime();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   208
            if (completedStages.containsKey(currentStage.stageName)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   209
                StageWrapper stg = completedStages.get(currentStage.stageName);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   210
                stg.setDuration(stg.duration
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   211
                        + getTimeElapsed(currentStage.startTime, currTime));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   212
            } else {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   213
                currentStage.setDuration(getTimeElapsed(currentStage.startTime,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   214
                        currTime));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   215
                completedStages.put(currentStage.stageName, currentStage);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   216
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   217
            log.debug("Stage [" + currentStage.stageName + "] finished at "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   218
                    + getTimestamp(currTime));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   219
            currentStage = null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   220
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   221
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   222
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   223
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   224
     * Search for the new Stage based on the given build event.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   225
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   226
     * @param event
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   227
     *            is the build event fired.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   228
     * @return an instance of StageWrapper, if the build event marks the start
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   229
     *         of a configured Stage.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   230
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   231
    private StageWrapper searchNewStage(BuildEvent event) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   232
        StageWrapper stageWrapper = null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   233
        String target = event.getTarget().getName();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   234
        for (String stageName : stages.keySet()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   235
            Stage stage = stages.get(stageName);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   236
            if (isStartingTarget(target, event.getProject(), stage)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   237
                stageWrapper = new StageWrapper(stageName, stage);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   238
                break;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   239
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   240
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   241
        return stageWrapper;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   242
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   243
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   244
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   245
     * Return whether the given target is a starting target of the given stage.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   246
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   247
     * @param targetName
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   248
     *            is the target to check.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   249
     * @param project
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   250
     *            is the project to lookup for target
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   251
     * @param stage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   252
     *            is the stage to check.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   253
     * @return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   254
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   255
    @SuppressWarnings("unchecked")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   256
    private boolean isStartingTarget(String targetName, Project project,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   257
            Stage stage) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   258
        boolean bool = false;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   259
        if (project.getTargets().containsKey(stage.getStartTarget())) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   260
            Vector<Target> dependencies = project.topoSort(stage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   261
                    .getStartTarget(), project.getTargets(), false);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   262
            if (!dependencies.isEmpty()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   263
                Target target = dependencies.firstElement();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   264
                bool = target.getName().equals(targetName);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   265
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   266
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   267
        return bool;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   268
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   269
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   270
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   271
     * Parse and cache the stages configured.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   272
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   273
     * @param project
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   274
     *            is the project to lookup for stages.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   275
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   276
    @SuppressWarnings("unchecked")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   277
    private void parseStages(Project project) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   278
        stages = new Hashtable<String, Stage>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   279
        Hashtable<String, Object> references = project.getReferences();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   280
        for (Enumeration<String> en = references.keys(); en.hasMoreElements();) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   281
            String key = en.nextElement();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   282
            Object value = references.get(key);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   283
            if (value instanceof Stage) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   284
                validateStageInformation(key, (Stage) value);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   285
                stages.put(key, (Stage) value);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   286
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   287
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   288
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   289
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   290
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   291
     * Return the reason for build failure in String format.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   292
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   293
     * @param th
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   294
     *            is the cause of build failure if any.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   295
     * @return String representing the build failure.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   296
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   297
    private String getReason(Throwable th) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   298
        return (th != null) ? th.getMessage() : "";
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   299
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   300
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   301
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   302
     * Return the current time in milliseconds.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   303
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   304
     * @return the current time in milliseconds.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   305
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   306
    private Long getCurrentTime() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   307
        return System.currentTimeMillis();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   308
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   309
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   310
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   311
     * Method is used to construct build reports for the completed stages.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   312
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   313
     * @return a list of build status reports.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   314
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   315
    private List<BuildStatusReport> constructBuildStatusReports() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   316
        List<BuildStatusReport> reports = new ArrayList<BuildStatusReport>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   317
        BuildStatusReport report = null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   318
        StageWrapper stage = null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   319
        for (String stageName : completedStages.keySet()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   320
            stage = completedStages.get(stageName);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   321
            report = new BuildStatusReport(stageName, stage.stageStartTime,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   322
                    format2String(stage.duration), stage.error);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   323
            reports.add(report);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   324
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   325
        return reports;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   326
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   327
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   328
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   329
     * Generate build summary.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   330
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   331
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   332
    private void generateSummary(Project project) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   333
        if (template != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   334
            try {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   335
                Configuration cfg = new Configuration();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   336
                log.debug("Basedir: " + template.getParentFile());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   337
                cfg.setTemplateLoader(new FileTemplateLoader(template
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   338
                        .getParentFile()));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   339
                Template templ = cfg.getTemplate(template.getName());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   340
                StringWriter writer = new StringWriter();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   341
                templ.process(getTemplateData(), writer);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   342
                project.log(writer.toString());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   343
            } catch (freemarker.core.InvalidReferenceException ivx) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   344
                project.log("Invalid reference in config: ", ivx,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   345
                        Project.MSG_WARN);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   346
            } catch (freemarker.template.TemplateException e2) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   347
                project.log("TemplateException: ", e2, Project.MSG_WARN);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   348
            } catch (java.io.IOException e) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   349
                project.log("I/O Error during template conversion: "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   350
                        + e.toString(), Project.MSG_WARN);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   351
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   352
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   353
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   354
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   355
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   356
     * Return the data-model to be merged with the template.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   357
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   358
     * @return a Map representing template data-model.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   359
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   360
    private Map<String, Object> getTemplateData() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   361
        Map<String, Object> templateMap = new HashMap<String, Object>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   362
        List<BuildStatusReport> statusReports = constructBuildStatusReports();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   363
        templateMap.put("statusReports", statusReports);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   364
        return templateMap;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   365
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   366
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   367
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   368
     * Get the given date as String format.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   369
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   370
     * @param date
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   371
     *            is the date to be formatted as String.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   372
     * @return given date formated as String
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   373
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   374
    private String getTimestamp(long date) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   375
        Date dt = new Date(date);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   376
        DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   377
                DateFormat.SHORT);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   378
        String finishTime = formatter.format(dt);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   379
        return finishTime;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   380
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   381
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   382
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   383
     * Get the time duration for the given start and end times.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   384
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   385
     * @param startTime
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   386
     *            is the start time.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   387
     * @param endTime
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   388
     *            is the end time.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   389
     * @return total time elapsed.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   390
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   391
    private Long getTimeElapsed(Long startTime, Long endTime) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   392
        return endTime - startTime;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   393
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   394
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   395
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   396
     * Return the given elapsed time in String format.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   397
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   398
     * @param time
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   399
     *            is the time to be formatted as String.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   400
     * @return time elapsed in String format.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   401
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   402
    private String format2String(Long time) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   403
        return DateUtils.formatElapsedTime(time);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   404
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   405
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   406
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   407
     * To validate stage information.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   408
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   409
     * @param stageKey
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   410
     * @param stage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   411
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   412
    private void validateStageInformation(String stageKey, Stage stage) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   413
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   414
        if (stage.getStartTarget() == null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   415
            throw new BuildException("'starttarget' for stage '" + stageKey
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   416
                    + "' should not be null.");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   417
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   418
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   419
        if (stage.getEndTarget() == null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   420
            throw new BuildException("'endtarget' for stage '" + stageKey
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   421
                    + "' should not be null.");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   422
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   423
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   424
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   425
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   426
     * Method indicates whether the target is to be considered for build stage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   427
     * summary or not.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   428
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   429
     * @param event
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   430
     *            is the build event.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   431
     * @return true, if the target is enabled;otherwise false
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   432
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   433
    private boolean doRunTarget(BuildEvent event) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   434
        boolean doRun = true;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   435
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   436
        String ifCondition = event.getTarget().getIf();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   437
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   438
        if (ifCondition != null && !ifCondition.isEmpty()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   439
            String prop = event.getProject().replaceProperties(ifCondition);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   440
            doRun = event.getProject().getProperty(prop) != null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   441
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   442
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   443
        String unlessCondition = event.getTarget().getUnless();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   444
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   445
        if (unlessCondition != null && !unlessCondition.isEmpty()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   446
            String prop = event.getProject().replaceProperties(unlessCondition);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   447
            doRun = event.getProject().getProperty(prop) == null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   448
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   449
        return doRun;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   450
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   451
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   452
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   453
     * A wrapper class for Stage.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   454
     * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   455
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   456
    private class StageWrapper {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   457
        private Stage stage;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   458
        private String stageName;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   459
        private String error;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   460
        private String stageStartTime;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   461
        private Long startTime;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   462
        private Long duration;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   463
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   464
        public StageWrapper(String stageName, Stage stage) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   465
            this.stageName = stageName;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   466
            this.stage = stage;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   467
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   468
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   469
        public void setStartTime(Long startTime) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   470
            this.startTime = startTime;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   471
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   472
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   473
        public void setError(String error) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   474
            this.error = error;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   475
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   476
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   477
        public void setDuration(Long duration) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   478
            this.duration = duration;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   479
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   480
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   481
        public void setStageStartTime(String stageStartTime) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   482
            this.stageStartTime = stageStartTime;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   483
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   484
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   485
}