/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.util.ant;
import aQute.bnd.osgi.Analyzer;
import aQute.bnd.osgi.Constants;
import com.liferay.portal.kernel.util.OSDetector;
import com.liferay.portal.kernel.util.ReleaseInfo;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
/**
* @author Raymond Augé
*/
public class ManifestHelperTask extends Task {
@Override
public void execute() throws BuildException {
try {
doExecute();
}
catch (Exception e) {
throw new BuildException(e);
}
}
public void setAnalyze(boolean analyze) {
_analyze = analyze;
}
public void setClasspathRef(Reference reference) {
if (_path == null) {
_path = new Path(getProject());
}
Path path = _path.createPath();
path.setRefid(reference);
}
public void setProjectDirPropertyName(String projectDirPropertyName) {
_projectDirPropertyName = projectDirPropertyName;
}
protected void doExecute() throws Exception {
if (_projectDirPropertyName == null) {
throw new BuildException(
"Attribute projectDirPropertyName must be set");
}
Project project = getProject();
project.setProperty("build.revision", getBuildRevision());
project.setProperty("build.time", getDateString(new Date()));
project.setProperty(
"release.info.build.date",
String.valueOf(ReleaseInfo.getBuildDate()));
project.setProperty(
"release.info.build.number",
String.valueOf(ReleaseInfo.getBuildNumber()));
project.setProperty(
"release.info.code.name", ReleaseInfo.getCodeName());
project.setProperty(
"release.info.parent.build.number",
String.valueOf(ReleaseInfo.getParentBuildNumber()));
project.setProperty(
"release.info.release.info", ReleaseInfo.getReleaseInfo());
project.setProperty(
"release.info.server.info", ReleaseInfo.getServerInfo());
project.setProperty("release.info.vendor", ReleaseInfo.getVendor());
String releaseInfoVersion = project.getProperty("release.info.version");
if (Validator.isNull(releaseInfoVersion)) {
project.setProperty(
"release.info.version", ReleaseInfo.getVersion());
}
if (!_analyze) {
return;
}
try (Analyzer analyzer = new Analyzer()) {
analyzer.setBase(project.getBaseDir());
File classesDir = new File(project.getBaseDir(), "classes");
analyzer.setJar(classesDir);
File file = new File(project.getBaseDir(), "bnd.bnd");
if (file.exists()) {
analyzer.setProperties(file);
}
else {
analyzer.setProperty(Constants.EXPORT_PACKAGE, "*");
analyzer.setProperty(
Constants.IMPORT_PACKAGE, "*;resolution:=optional");
}
Manifest manifest = analyzer.calcManifest();
Attributes attributes = manifest.getMainAttributes();
project.setProperty(
"export.packages",
attributes.getValue(Constants.EXPORT_PACKAGE));
project.setProperty(
"import.packages",
attributes.getValue(Constants.IMPORT_PACKAGE));
}
}
protected String execute(String command) throws Exception {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
return StringUtil.read(process.getInputStream());
}
protected String getBuildRevision() throws Exception {
Project project = getProject();
File projectDir = new File(
project.getBaseDir(), project.getProperty(_projectDirPropertyName));
File gitDir = new File(projectDir, ".git");
if (gitDir.exists()) {
if (OSDetector.isWindows()) {
return execute("cmd /c git rev-parse HEAD");
}
else {
return execute("git rev-parse HEAD");
}
}
File svnDir = new File(projectDir, ".svn");
if (svnDir.exists()) {
if (OSDetector.isWindows()) {
return execute("cmd /c svnversion .");
}
else {
return execute("svnversion .");
}
}
return StringPool.BLANK;
}
protected String getDateString(Date date) {
DateFormat dateFormat = new SimpleDateFormat(_PATTERN);
return dateFormat.format(date);
}
private static final String _PATTERN = "EEE MMM d HH:mm:ss z yyyy";
private boolean _analyze;
private Path _path;
private String _projectDirPropertyName;
}