Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1615 mhunt 1
package com.erggroup.mass.ant;
2
 
3
import java.io.File;
4
import java.util.Collection;
5
import java.util.Date;
6
import java.util.Iterator;
7
import org.apache.tools.ant.BuildException;
8
import org.apache.tools.ant.Project;
9
import org.apache.tools.ant.taskdefs.Copy;
10
import org.apache.tools.ant.taskdefs.Echo;
11
import org.apache.tools.ant.taskdefs.Mkdir;
12
import org.apache.tools.ant.types.FileSet;
13
 
14
public class ReleaseElement implements JatsElement
15
{
16
	public static final String TASK_NAME = "release";
17
 
18
	private Project project;
19
 
20
	/**
21
	 * The version, used if type='force'
22
	 */
23
	private String version;
24
 
25
	/**
26
	 * Specifies the type of release (default=force; all other types are deprecated).
27
	 */
28
	private String type = "force";
29
 
30
	/**
31
	 * Specifies the label used when building this release (optional)
32
	 */
33
    private String label;
34
 
35
	/**
36
	 * 
37
	 */
38
	private PackageVersion releaseVersion = null;
39
 
40
 
41
	private Jats parent;
42
 
43
	public ReleaseElement()
44
	{
45
	}
46
 
47
	public String getElementType()
48
	{
49
		return TASK_NAME;
50
	}
51
 
52
	public void setType(String type)
53
	{
54
		this.type = type;
55
	}
56
 
57
	public void setVersion(String value)
58
	{
59
		this.version = value;
60
	}
61
 
62
	public void setLabel( String value )
63
	{
64
		this.label = value;
65
	}
66
 
67
	public void execute(Jats parent)
68
	{
69
		this.parent  = parent;
70
		this.project = parent.getProject();
71
 
72
		if ( "force".equalsIgnoreCase(type) )
73
		{
74
			if ( version == null ) 
75
			{
76
				throw new BuildException("Release 'version' attribute is mandatory."); 
77
			}
78
			releaseVersion = new PackageVersion(version);
79
		}
80
		else
81
		{
82
			throw new BuildException("Release type can only be 'force'; all other types are deprecated.");
83
		}
84
 
85
		updateDescpkgFile();
86
 
87
		releasePackage();
88
	}
89
 
90
	private void updateDescpkgFile()
91
	{
92
		StringBuffer buffer = new StringBuffer();
93
 
94
		buffer.append("Package Name: ")
95
		      .append(parent.getPackage());
96
		buffer.append("\nVersion:      ")
97
			  .append(releaseVersion.toString());
98
		buffer.append("\nReleased By:  ")
99
			  .append(project.replaceProperties("${user.name}"));
100
		buffer.append("\nReleased On:  ")
101
			  .append(new Date());
102
 
103
		// Build label (if specified)			
104
		if ( label != null )
105
		{
106
			buffer.append("\nLabel:        ")
107
				  .append(project.replaceProperties(label));
108
		}
109
 
110
		// Path to source of build (vob-relative)
111
		File baseDirectory = project.getBaseDir();
112
		String buildPath = baseDirectory.getAbsolutePath();
113
		int cpos = buildPath.indexOf(":");
114
		if ( cpos > -1 )
115
		{
116
			buildPath = buildPath.substring(cpos+1);
117
		}
118
		buffer.append("\nPath:         ").append(buildPath);
119
 
120
		buffer.append("\n\nBuild Dependencies:\n");
121
		Collection sandbox = SandboxElement.getSandboxElements();
122
		for (Iterator i = sandbox.iterator() ; i.hasNext() ; )
123
		{
124
			SandboxElement element = (SandboxElement)i.next();
125
			if ( ! element.isRuntime() )
126
			buffer.append("\n<sandbox name=\"")
127
				  .append(element.getName())
128
				  .append("\" version=\"")
129
				  .append(element.getVersion())
130
				  .append("\"/>");
131
		}
132
 
133
		Echo echo = new Echo();
134
		echo.setTaskName(TASK_NAME);
135
		echo.setProject(project);
136
		String descpkgFilename = project.replaceProperties("${basedir}") + "/pkg/descpkg";
137
		echo.setFile(new File(descpkgFilename));
138
 
139
		echo.setMessage(buffer.toString());
140
		echo.execute();
141
	}
142
 
143
	/**
144
	 * Attempts to copy the 'pkg' files into dpkg_archive.
145
	 */
146
	private void releasePackage()
147
	{
148
		String packageName = parent.getPackage();
149
		String version = releaseVersion.toString();
150
 
151
		// Check for the existance of the package directory in dpkg_archive, and if
152
		// it exists, then throw an exception.
153
		File dpkgArchivePackageDir = validatePackageDirectory(packageName);
154
 
155
		File dpkgArchiveVersionDir = validatePackageVersionDirectory(dpkgArchivePackageDir, version);
156
 
157
		// Copy the files from the pkg directory into
158
		// dpkg_archive/${jats.package.name}/${major}.${minor}.${patch}.${project}
159
		Copy copy = new Copy();
160
		copy.setProject(project);
161
		copy.setTaskName(this.getElementType());
162
		copy.setTodir(dpkgArchiveVersionDir);
163
 
164
		File basedir = new File(project.replaceProperties("${basedir}"));
165
		File pkgdir = new File(basedir, "pkg");
166
 
167
		FileSet fileSet = new FileSet();
168
		fileSet.setDir(pkgdir);
169
		fileSet.setIncludes("**/*");
170
		copy.addFileset(fileSet);
171
		copy.perform();
172
	}
173
 
174
	/**
175
	 *
176
	 * @param directoryName
177
	 * @return
178
	 */
179
	private File validatePackageDirectory(String directoryName)
180
	{
181
		File dir = new File(parent.getFromdir(), directoryName);
182
 
183
		if (dir.exists() == false)
184
		{
185
			makeDirectory(dir);
186
		}
187
 
188
		if (dir.isDirectory() == false)
189
		{
190
			throw new BuildException(dir.toString() + " is not a directory.");
191
		}
192
 
193
		return dir;
194
	}
195
 
196
	/**
197
	 *
198
	 * @param fromdir
199
	 * @param directoryName
200
	 * @return
201
	 */
202
	private File validatePackageVersionDirectory(File fromdir, String directoryName)
203
	{
204
		File dir = new File(fromdir, directoryName);
205
 
206
		if (dir.exists() == false)
207
		{
208
			makeDirectory(dir);
209
		}
210
		else
211
		{
212
			String packageName = parent.getPackage();
213
			throw new BuildException("Cannot release package \'"
214
									 + packageName + "\' version \'"
215
									 + releaseVersion + "\' as it has already been released.");
216
		}
217
 
218
		return dir;
219
	}
220
 
221
	/**
222
	 *
223
	 * @param dir
224
	 */
225
	private void makeDirectory(File dir)
226
	{
227
		Mkdir mkdir = new Mkdir();
228
		mkdir.setProject(this.project);
229
		mkdir.setTaskName(this.getElementType());
230
 
231
		mkdir.setDir(dir);
232
 
233
		mkdir.perform();
234
	}
235
}