1/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2 *
3 * This program and the accompanying materials are made available under
4 * the terms of the Common Public License v1.0 which accompanies this distribution,
5 * and is available at http://www.eclipse.org/legal/cpl-v10.html
6 *
7 * $Id: emmaTask.java,v 1.1.1.1.2.2 2004/07/10 03:34:52 vlad_r Exp $
8 */
9package com.vladium.emma;
10
11import com.vladium.emma.IAppConstants;
12import java.util.ArrayList;
13import java.util.List;
14
15import org.apache.tools.ant.BuildException;
16import org.apache.tools.ant.Project;
17
18import com.vladium.emma.ant.NestedTask;
19import com.vladium.emma.ant.SuppressableTask;
20import com.vladium.emma.data.mergeTask;
21import com.vladium.emma.instr.instrTask;
22import com.vladium.emma.report.reportTask;
23
24// ----------------------------------------------------------------------------
25/**
26 * @author Vlad Roubtsov, (C) 2003
27 */
28public
29final class emmaTask extends SuppressableTask
30{
31    // public: ................................................................
32
33    // TODO: this and related tasks should be designed for external extensibility
34    // [make non final and use virtual prop getters]
35
36    public emmaTask ()
37    {
38        m_tasks = new ArrayList ();
39    }
40
41
42    public synchronized void execute () throws BuildException
43    {
44        log (IAppConstants.APP_VERBOSE_BUILD_ID, Project.MSG_VERBOSE);
45
46        if (isEnabled ())
47        {
48            while (! m_tasks.isEmpty ())
49            {
50                final NestedTask task = (NestedTask) m_tasks.remove (0);
51
52                final String name = getTaskName ();
53                try
54                {
55                    setTaskName (task.getTaskName ());
56
57                    task.execute ();
58                }
59                finally
60                {
61                    setTaskName (name);
62                }
63            }
64        }
65    }
66
67
68    public NestedTask createInstr ()
69    {
70        return addTask (new instrTask (this), getNestedTaskName ("instr"));
71    }
72
73    public NestedTask createMerge ()
74    {
75        return addTask (new mergeTask (this), getNestedTaskName ("merge"));
76    }
77
78    public NestedTask createReport ()
79    {
80        return addTask (new reportTask (this), getNestedTaskName ("report"));
81    }
82
83    // protected: .............................................................
84
85
86    protected NestedTask addTask (final NestedTask task, final String pseudoName)
87    {
88        initTask (task, pseudoName);
89
90        m_tasks.add (task);
91        return task;
92    }
93
94    protected void initTask (final NestedTask task, final String pseudoName)
95    {
96        task.setTaskName (pseudoName);
97        task.setProject (getProject ());
98        task.setLocation (getLocation ());
99        task.setOwningTarget (getOwningTarget ());
100
101        task.init ();
102    }
103
104    protected String getNestedTaskName (final String subname)
105    {
106        return getTaskName ().concat (".").concat (subname);
107    }
108
109    // package: ...............................................................
110
111    // private: ...............................................................
112
113
114    private final List /* NestedTask */ m_tasks;
115
116} // end of class
117// ----------------------------------------------------------------------------