001
014
015 package com.liferay.util.ant;
016
017 import aQute.lib.osgi.Analyzer;
018 import aQute.lib.osgi.Constants;
019
020 import com.liferay.portal.kernel.util.OSDetector;
021 import com.liferay.portal.kernel.util.ReleaseInfo;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.kernel.util.StringUtil;
024
025 import java.io.File;
026
027 import java.text.DateFormat;
028 import java.text.SimpleDateFormat;
029
030 import java.util.Date;
031 import java.util.jar.Attributes;
032 import java.util.jar.Manifest;
033
034 import org.apache.tools.ant.BuildException;
035 import org.apache.tools.ant.Project;
036 import org.apache.tools.ant.Task;
037 import org.apache.tools.ant.types.Path;
038 import org.apache.tools.ant.types.Reference;
039
040
043 public class ManifestHelperTask extends Task {
044
045 @Override
046 public void execute() throws BuildException {
047 try {
048 doExecute();
049 }
050 catch (Exception e) {
051 throw new BuildException(e);
052 }
053 }
054
055 public void setAnalyze(boolean analyze) {
056 _analyze = analyze;
057 }
058
059 public void setClasspathRef(Reference reference) {
060 if (_path == null) {
061 _path = new Path(getProject());
062 }
063
064 Path path = _path.createPath();
065
066 path.setRefid(reference);
067 }
068
069 public void setProjectDirPropertyName(String projectDirPropertyName) {
070 _projectDirPropertyName = projectDirPropertyName;
071 }
072
073 protected void doExecute() throws Exception {
074 if (_projectDirPropertyName == null) {
075 throw new BuildException(
076 "Attribute projectDirPropertyName must be set");
077 }
078
079 Project project = getProject();
080
081 project.setProperty("build.revision", getBuildRevision());
082 project.setProperty("build.time", getDateString(new Date()));
083 project.setProperty(
084 "release.info.build.date",
085 String.valueOf(ReleaseInfo.getBuildDate()));
086 project.setProperty(
087 "release.info.build.number",
088 String.valueOf(ReleaseInfo.getBuildNumber()));
089 project.setProperty(
090 "release.info.code.name", ReleaseInfo.getCodeName());
091 project.setProperty(
092 "release.info.parent.build.number",
093 String.valueOf(ReleaseInfo.getParentBuildNumber()));
094 project.setProperty(
095 "release.info.release.info", ReleaseInfo.getReleaseInfo());
096 project.setProperty(
097 "release.info.server.info", ReleaseInfo.getServerInfo());
098 project.setProperty("release.info.vendor", ReleaseInfo.getVendor());
099 project.setProperty("release.info.version", ReleaseInfo.getVersion());
100
101 if (!_analyze) {
102 return;
103 }
104
105 Analyzer analyzer = new Analyzer();
106
107 analyzer.setBase(project.getBaseDir());
108
109 File classesDir = new File(project.getBaseDir(), "classes");
110
111 analyzer.setJar(classesDir);
112
113 File file = new File(project.getBaseDir(), "bnd.bnd");
114
115 if (file.exists()) {
116 analyzer.setProperties(file);
117 }
118 else {
119 analyzer.setProperty(Constants.EXPORT_PACKAGE, "*");
120 analyzer.setProperty(
121 Constants.IMPORT_PACKAGE, "*;resolution:=optional");
122 }
123
124 Manifest manifest = analyzer.calcManifest();
125
126 Attributes attributes = manifest.getMainAttributes();
127
128 project.setProperty(
129 "export.packages", attributes.getValue(Constants.EXPORT_PACKAGE));
130 project.setProperty(
131 "import.packages", attributes.getValue(Constants.IMPORT_PACKAGE));
132
133 analyzer.close();
134 }
135
136 protected String execute(String command) throws Exception {
137 Runtime runtime = Runtime.getRuntime();
138
139 Process process = runtime.exec(command);
140
141 return StringUtil.read(process.getInputStream());
142 }
143
144 protected String getBuildRevision() throws Exception {
145 Project project = getProject();
146
147 File projectDir = new File(
148 project.getBaseDir(), project.getProperty(_projectDirPropertyName));
149
150 File gitDir = new File(projectDir, ".git");
151
152 if (gitDir.exists()) {
153 if (OSDetector.isWindows()) {
154 return execute("cmd /c git rev-parse HEAD");
155 }
156 else {
157 return execute("git rev-parse HEAD");
158 }
159 }
160
161 File svnDir = new File(projectDir, ".svn");
162
163 if (svnDir.exists()) {
164 if (OSDetector.isWindows()) {
165 return execute("cmd /c svnversion .");
166 }
167 else {
168 return execute("svnversion .");
169 }
170 }
171
172 return StringPool.BLANK;
173 }
174
175 protected String getDateString(Date date) {
176 DateFormat dateFormat = new SimpleDateFormat(_PATTERN);
177
178 return dateFormat.format(date);
179 }
180
181 private static final String _PATTERN = "EEE MMM d HH:mm:ss z yyyy";
182
183 private boolean _analyze;
184 private Path _path;
185 private String _projectDirPropertyName;
186
187 }