import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
-import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.jar.Manifest;
import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.metadata.ArtifactMetadata;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.artifact.ProjectArtifactMetadata;
/**
+ * Base class for MoJo analyzing a set of bundles directories.
+ *
* @author mbaudier
*
*/
protected List analyze(boolean willGenerate) throws MojoExecutionException {
List list = new ArrayList();
- File[] bundleDirs = bundlesDirectory.listFiles(new FileFilter() {
- public boolean accept(File file) {
- if (!file.isDirectory())
- return false;
-
- return manifestFileFromDir(file).exists();
- }
- });
+ File[] bundleDirs = bundlesDirectory.listFiles(bundleFileFilter());
for (int i = 0; i < bundleDirs.length; i++) {
File dir = bundleDirs[i];
else
versionMfMain = versionMf;
- int sIndex = project.getModel().getVersion().lastIndexOf("-SNAPSHOT");
+ int sIndex = snapshotIndex();
String versionMain;
String buildId;
boolean isSnapshot = false;
if (sIndex >= 0) {// SNAPSHOT
- versionMain = project.getVersion().substring(0, sIndex);
+ versionMain = versionMain(sIndex);
// buildId = "D_" + sdf.format(new Date());// D for dev
buildId = "SNAPSHOT";
isSnapshot = true;
if (debug && willGenerate) {
getLog().info("\n## " + artifactId);
getLog().info("project.getVersion()=" + project.getVersion());
- // getLog().info(
- // "project.getModel().getVersion()="
- // + project.getModel().getVersion());
- // getLog().info("versionMf=" + versionMf);
- // getLog().info("buildId=" + buildId);
getLog().info("newVersionMf=" + newVersionMf);
}
return pom.toString();
}
+ protected Manifest readManifest(File file) throws IOException {
+ Manifest manifest = new Manifest();
+ FileInputStream in = new FileInputStream(file);
+ manifest.read(in);
+ in.close();
+ return manifest;
+ }
+
+ protected int snapshotIndex() {
+ return project.getModel().getVersion().lastIndexOf("-SNAPSHOT");
+ }
+
+ protected String versionMain(int sIndex) {
+ return project.getVersion().substring(0, sIndex);
+ }
+
+ protected File getBundleDirectory() {
+ return bundlesDirectory;
+ }
+
+ protected FileFilter bundleFileFilter() {
+ return new FileFilter() {
+ public boolean accept(File file) {
+ if (!file.isDirectory())
+ return false;
+
+ return manifestFileFromDir(file).exists();
+ }
+ };
+ }
+
protected static class BundlePackage {
private final Artifact artifact;
private final File bundleDir;
public File getPomFile() {
return new File(getPackageFile().getPath() + ".pom.xml");
}
- }
- protected Manifest readManifest(File file) throws IOException {
- Manifest manifest = new Manifest();
- FileInputStream in = new FileInputStream(file);
- manifest.read(in);
- in.close();
- return manifest;
+ public String toString() {
+ return "Bundle: " + bundleDir;
+ }
+
}
+
}
--- /dev/null
+package org.argeo.slc.maven.plugins.osgi;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+
+/**
+ * Update the manifests based on the POM
+ *
+ * @goal update-manifests
+ * @phase package
+ * @author mbaudier
+ *
+ */
+public class UpdateManifestsMojo extends AbstractBundlesPackagerMojo {
+
+ public void execute() throws MojoExecutionException, MojoFailureException {
+ if (!PACKAGING_BUNDLE.equals(project.getPackaging())) {
+ getLog().info(
+ "Project is not of packaging type " + PACKAGING_BUNDLE
+ + ", skipping...");
+ }
+
+ int sIndex = snapshotIndex();
+ String versionMf = null;
+ if (sIndex >= 0) {// SNAPSHOT
+ versionMf = versionMain(sIndex) + ".SNAPSHOT";
+ } else {
+ throw new MojoExecutionException("Can only modify on SNAPSHOT");
+ }
+
+ File[] bundleDirs = getBundleDirectory().listFiles(bundleFileFilter());
+ for (int i = 0; i < bundleDirs.length; i++) {
+ OutputStream out = null;
+ try {
+ File dir = bundleDirs[i];
+ File originalMf = manifestFileFromDir(dir);
+ Manifest manifest = readManifest(originalMf);
+ manifest.getMainAttributes().putValue("Bundle-Version",
+ versionMf);
+ manifest.getMainAttributes().put(
+ Attributes.Name.MANIFEST_VERSION, "1.0");
+
+ out = new FileOutputStream(originalMf);
+ manifest.write(out);
+ getLog().info(
+ "Update MANIFEST of bundle " + dir + " with version "
+ + versionMf);
+ } catch (IOException e) {
+ throw new MojoExecutionException(
+ "Could not modify manifets. WARNING: some manifests may already have been modified! Check your sources.",
+ e);
+ } finally {
+ IOUtils.closeQuietly(out);
+ }
+ }
+
+ }
+}