Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1974 jgill 1
/**
2
 * AntShield - A project release tool for ant.
3
 */
4
package com.erggroup.mass.ant;
5
 
6
import java.io.File;
7
import java.util.ArrayList;
8
import java.util.Iterator;
9
import org.apache.tools.ant.BuildException;
10
import org.apache.tools.ant.taskdefs.Property;
11
 
12
/**
13
 * AntShield
14
 * Implementation of an ant Task which displays an
15
 * AntShieldReleaseFrame, then an AntShieldFieldFrame.
16
 */
17
public class AntShield extends org.apache.tools.ant.Task
18
{
19
    static final String JatsHomeProperty = "${env.JATS_HOME}";
20
 
21
    private ArrayList fields = new ArrayList();
22
    private String dpkgDir = null;
23
    private String packageName = null;
24
    private String type = null;
25
    private String releaseProperty = null;
26
    private boolean doRelease = true;
27
    private boolean undo = false;
28
 
29
    public AntShield()
30
    {
31
    } // Antshield
32
 
33
    /**
34
     * Creates, stores and returns an object that handles
35
     * the "field" nested tag.
36
     * @return
37
     */
38
    public FieldElement createField()
39
    {
40
        FieldElement element = new FieldElement(this, project);
41
        fields.add(element);
42
        return element;
43
    } // createField
44
 
45
    /**
46
     * Set the optional property "dpkgDir".
47
     * Default value "${JATS_HOME}".
48
     * @param s
49
     */
50
    public void setDpkgDir(String s)
51
    {
52
        dpkgDir = s;
53
    } // setDpkgDir
54
 
55
    /**
56
     * Set the mandatory property "packageName".
57
     * @param s
58
     */
59
    public void setPackageName(String s)
60
    {
61
        packageName = s;
62
    } // setPackageName
63
 
64
    /**
65
     * Set the mandatory property "type".
66
     * Valid strings are "major", "minor" and "patch".
67
     * @param s
68
     */
69
    public void setType(String s)
70
    {
71
        type = s;
72
    } // setType
73
 
74
    /**
75
     * Set the optional property "releaseProperty".
76
     * Default value "antshield.property".
77
     * @param s
78
     */
79
    public void setReleaseProperty(String s)
80
    {
81
        releaseProperty = s;
82
    } // setType
83
 
84
    /**
85
     * Set the optional property "release".
86
     * Default value "true".
87
     * @param b
88
     */
89
    public void setRelease(boolean b)
90
    {
91
        doRelease = b;
92
    } // setRelease
93
 
94
    /**
95
     * Set the optional property "undo".
96
     * Default value "false".
97
     * @param b
98
     */
99
    public void setUndo(boolean b)
100
    {
101
        undo = b;
102
    } // setRelease
103
 
104
    /**
105
     * Execute this task.
106
     * Check all supplied parameters.
107
     * If "release" is true (default), display an AntShieldReleaseDialog.
108
     * If fields are specified, display an AntShieldFieldDialog.
109
     * Throw a BuildException if any dialogs are cancelled.
110
     * Create properties for release (antshield.release) and all fields
111
     * which are passed back to ant.
112
     * @throws BuildException
113
     */
114
	public void execute() throws BuildException
115
	{
116
        Property p = new Property();
117
        p.setProject(project);
118
        p.setTaskName(this.getTaskName());
119
        p.setName("env");
120
        p.setEnvironment("env");
121
        p.setValue("");
122
        p.execute();
123
 
124
        if (doRelease)
125
        {
126
            if (dpkgDir == null)
127
            {
128
                // Check JATS_HOME
129
                dpkgDir = project.replaceProperties(JatsHomeProperty);
130
                if (JatsHomeProperty.equals(dpkgDir))
131
                {
132
                    throw new BuildException("<" + this.getTaskName() + "> JATS_HOME environment variable not set");
133
                }
134
            }
135
            File dpkgdir = new File(dpkgDir);
136
            if (!dpkgdir.exists() || !dpkgdir.isDirectory())
137
            {
138
                throw new BuildException("<" + this.getTaskName() + "> " + dpkgDir + " is not a directory");
139
            }
140
            // Check for valid input
141
            if ((packageName == null) || (packageName.length() == 0))
142
            {
143
                throw new BuildException("<" + this.getTaskName() + "> Parameter 'packageName' cannot be empty");
144
            }
145
        }
146
        if ((type == null) || (type.length() == 0))
147
        {
148
            type = "patch";
149
        }
150
        if (!type.equals("major") && !type.equals("minor") && !type.equals("patch"))
151
        {
152
            throw new BuildException("<" + this.getTaskName() + "> Parameter 'type' must be either 'major', 'minor' or 'patch'");
153
        }
154
 
155
        // Check field values
156
        Iterator i = fields.iterator();
157
        while (i.hasNext())
158
        {
159
            ((FieldElement)i.next()).check();
160
        }
161
 
162
        ArrayList dirlist = new ArrayList();
163
        if (doRelease)
164
        {
165
            // Retrieve list of release directories for package
166
            File pkgdir = new File(dpkgDir + "/" + packageName);
167
            if (pkgdir.exists() && !pkgdir.isDirectory())
168
            {
169
                throw new BuildException("<" + this.getTaskName() + "> " + dpkgDir + "/" + packageName + " is not a directory");
170
            }
171
            if (pkgdir.exists())
172
            {
173
                for (int n = 0; n < pkgdir.list().length; n++)
174
                {
175
                    String dir = pkgdir.list()[n];
176
                    File d = new File(dpkgDir + "/" + packageName + "/" + dir);
177
                    if (d.isDirectory())
178
                    {
179
                        dirlist.add(dir);
180
                    }
181
                }
182
            }
183
        }
184
 
185
        // Release dialog
186
        boolean guiOk = true;
187
        if (doRelease)
188
        {
189
            AntShieldReleaseFrame releaseGui = new AntShieldReleaseFrame(packageName, type, dirlist, undo);
190
            guiOk = releaseGui.isOk();
191
            if (guiOk)
192
            {
193
                // Create property to pass back to ANT
194
                if ((releaseProperty == null) || (releaseProperty.length() == 0))
195
                {
196
                    releaseProperty = new String("antshield.release");
197
                }
198
                p.setName(releaseProperty);
199
                p.setValue(releaseGui.getRelease());
200
                p.execute();
201
            }
202
        }
203
        if (guiOk && !fields.isEmpty())
204
        {
205
            // Fields dialog
206
            AntShieldFieldFrame fieldGui = new AntShieldFieldFrame(fields);
207
            guiOk = fieldGui.isOk();
208
        }
209
        if (!guiOk)
210
        {
211
            throw new BuildException("<" + this.getTaskName() + "> Action cancelled");
212
        }
213
 
214
        // Create properties to pass back to ANT
215
        i = fields.iterator();
216
        while (i.hasNext())
217
        {
218
            FieldElement e = (FieldElement)i.next();
219
            p.setName(e.getName());
220
            p.setValue(e.getValue());
221
            p.execute();
222
        }
223
	} // execute
224
}