git-svn-id: https://svn.apache.org/repos/asf/incubator/felix/trunk@239340 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tools/maven2/maven-osgi-plugin/pom.xml b/tools/maven2/maven-osgi-plugin/pom.xml
new file mode 100644
index 0000000..271462c
--- /dev/null
+++ b/tools/maven2/maven-osgi-plugin/pom.xml
@@ -0,0 +1,45 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-osgi-plugin</artifactId>
+ <packaging>maven-plugin</packaging>
+ <name>Maven OSGi Plugin</name>
+ <version>0.1</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <version>2.0-alpha-3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-archiver</artifactId>
+ <version>2.0-alpha-3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-project</artifactId>
+ <version>2.0-alpha-3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-archiver</artifactId>
+ <version>2.0-alpha-3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-project</artifactId>
+ <version>2.0-alpha-3</version>
+ </dependency>
+ <dependency>
+ <groupId>plexus</groupId>
+ <artifactId>plexus-archiver</artifactId>
+ <version>1.0-alpha-1</version>
+ </dependency>
+ <dependency>
+ <groupId>plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <version>1.0-alpha-3</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java
new file mode 100644
index 0000000..63c3486
--- /dev/null
+++ b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiJarMojo.java
@@ -0,0 +1,177 @@
+package org.apache.felix.tools.maven.plugin;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.archiver.MavenArchiver;
+import org.apache.maven.archiver.MavenArchiveConfiguration;
+import org.apache.maven.artifact.Artifact;
+import org.codehaus.plexus.archiver.jar.JarArchiver;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.io.File;
+import java.util.List;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="tbennett@apache.org">Timothy Bennett</a>
+ * @goal felix-jar
+ * @phase package
+ * @requiresDependencyResolution runtime
+ * @description build a OSGi bundle jar
+ */
+public class OsgiJarMojo extends AbstractMojo {
+ private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"};
+ private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"};
+
+ /**
+ * @todo Change type to File
+ *
+ * @parameter expression="${project.build.directory}"
+ * @required
+ * @readonly
+ */
+ private String basedir;
+
+ /**
+ * @parameter alias="jarName" expression="${project.build.finalName}"
+ * @required
+ */
+ private String finalName;
+
+ /**
+ * @parameter expression="${project.build.outputDirectory}"
+ * @required
+ * @readonly
+ */
+ private String outputDirectory;
+
+ /**
+ * @parameter expression="${project}"
+ * @required
+ * @readonly
+ */
+ private MavenProject project;
+
+ /**
+ * @parameter
+ */
+ private String manifestFile;
+
+ /**
+ * @parameter expression="${org.apache.felix.tools.maven.plugin.OsgiManifest}"
+ */
+ private OsgiManifest osgiManifest;
+
+ /**
+ * @parameter
+ */
+ private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+
+ /**
+ * @todo Add license files in META-INF directory.
+ */
+ public void execute() throws MojoExecutionException {
+ File jarFile = new File(basedir, finalName + ".jar");
+
+ MavenArchiver archiver = new MavenArchiver();
+ archiver.setOutputFile(jarFile);
+
+ /*
+ TODO: Decide if we accept merging of entire manifest.mf files
+ Here's a big question to make a final decision at some point: Do accept
+ merging of manifest entries located in some file somewhere in the project
+ directory? If so, do we allow both file and configuration based entries
+ to be specified simultaneously and how do we merge these?
+
+ For now... I'm going to disable support for file-based manifest entries.
+ */
+ //if (manifestFile != null) {
+ // File file = new File(project.getBasedir().getAbsolutePath(), manifestFile);
+ // getLog().info("Manifest file: " + file.getAbsolutePath() + " will be used");
+ // archive.setManifestFile(file);
+ //} else {
+ // getLog().info("No manifest file specified. Default will be used.");
+ //}
+
+ // Look for any OSGi specified manifest entries in the maven-felix-plugin configuration
+ // section of the POM. If we find some, then add them to the target artifact's manifest.
+ if (osgiManifest != null) {
+ Map entries = osgiManifest.getEntries();
+ if (entries.size() != 0) {
+ getLog().info("OSGi bundle manifest entries have been specified." +
+ " Bundle manifest will be modified with the following entries: " + entries.toString());
+ archive.addManifestEntries(entries);
+ } else {
+ getLog().info("No OSGi bundle manifest entries have been specified. Bundle manifest will not be modified");
+ }
+ } else {
+ getLog().info("No OSGi bundle manifest entries have been specified. Bundle manifest will not be modified");
+ }
+
+ /*
+ We are going to iterate thru the POM's specified jar dependencies. If a dependency
+ has a scope of either RUNTIME or COMPILE, then we'll jar them up inside the
+ OSGi bundle artifact.
+
+ We are also going to automatically construct the Bundle-Classpath manifest entry.
+ */
+ StringBuffer bundleClasspath = new StringBuffer();
+ Set artifacts = project.getArtifacts();
+ for (Iterator iter = artifacts.iterator(); iter.hasNext();) {
+ Artifact artifact = (Artifact) iter.next();
+ if (!Artifact.SCOPE_PROVIDED.equals(artifact.getScope()) &&
+ !Artifact.SCOPE_TEST.equals(artifact.getScope())) {
+ String type = artifact.getType();
+ if ("jar".equals(type)) {
+ File depFile = artifact.getFile();
+ File outDir = new File(outputDirectory);
+ try {
+ FileUtils.copyFileToDirectory(depFile, outDir);
+ if (bundleClasspath.length() == 0) bundleClasspath.append(".");
+ bundleClasspath.append("," + artifact.getFile().getName());
+ } catch (Exception e) {
+ String errmsg = "Error copying " + depFile.getAbsolutePath() + " to " + outDir.getAbsolutePath();
+ throw new MojoExecutionException(errmsg, e);
+ }
+ }
+ }
+ }
+ if (bundleClasspath.length() != 0) {
+ archive.addManifestEntry("Bundle-ClassPath", bundleClasspath.toString());
+ }
+ bundleClasspath = null;
+
+ // create the target bundle archive...
+ try {
+ File contentDirectory = new File(outputDirectory);
+ if (!contentDirectory.exists()) {
+ getLog().warn("Bundle archive JAR will be empty -- no content was marked for inclusion!");
+ } else {
+ archiver.getArchiver().addDirectory(contentDirectory, DEFAULT_INCLUDES, DEFAULT_EXCLUDES);
+ }
+ archiver.createArchive(project, archive);
+ } catch (Exception e) {
+ // TODO: improve error handling
+ throw new MojoExecutionException("Error assembling Bundle archive JAR", e);
+ }
+ }
+}
diff --git a/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java
new file mode 100644
index 0000000..cee7477
--- /dev/null
+++ b/tools/maven2/maven-osgi-plugin/src/main/java/org/apache/felix/tools/maven/plugin/OsgiManifest.java
@@ -0,0 +1,141 @@
+package org.apache.felix.tools.maven.plugin;
+
+import java.util.Map;
+import java.util.Hashtable;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: tbennett
+ * Date: Aug 12, 2005
+ * Time: 4:03:29 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class OsgiManifest {
+ private String bundleActivator;
+ private String bundleName;
+ private String bundleDescription;
+ private String bundleVendor;
+ private String bundleVersion;
+ //private String bundleClassPath;
+ private String bundleDate;
+ private String bundleUpdateLocation;
+ private String exportPackage;
+ private String metadataLocation;
+ private Hashtable entries = new Hashtable();
+
+ public Map getEntries() {
+ if (getBundleActivator() != null) {
+ entries.put("Bundle-Activator", getBundleActivator());
+ }
+ if (getBundleName() != null) {
+ entries.put("Bundle-Name", getBundleName());
+ }
+ if (getBundleDescription() != null) {
+ entries.put("Bundle-Description", getBundleDescription());
+ }
+ if (getBundleVendor() != null) {
+ entries.put("Bundle-Vendor", getBundleVendor());
+ }
+ if (getBundleVersion() != null) {
+ entries.put("Bundle-Version", getBundleVersion());
+ }
+ if (getExportPackage() != null) {
+ entries.put("Export-Package", getExportPackage());
+ }
+ /*
+ if (getBundleClassPath() != null) {
+ entries.put("Bundle-ClassPath", getBundleClassPath());
+ }
+ */
+ if (getBundleDate() != null) {
+ entries.put("Bundle-Date", getBundleDate());
+ }
+ if (getBundleUpdateLocation() != null) {
+ entries.put("Bundle-UpdateLocation", getBundleUpdateLocation());
+ }
+ if (getMetadataLocation() != null) {
+ entries.put("Metadata-Location", getMetadataLocation());
+ }
+ return (Map) entries;
+ }
+
+ public String getBundleActivator() {
+ return bundleActivator;
+ }
+
+ public void setBundleActivator(String bundleActivator) {
+ this.bundleActivator = bundleActivator;
+ }
+
+ public String getBundleName() {
+ return bundleName;
+ }
+
+ public void setBundleName(String bundleName) {
+ this.bundleName = bundleName;
+ }
+
+ public String getBundleDescription() {
+ return bundleDescription;
+ }
+
+ public void setBundleDescription(String bundleDescription) {
+ this.bundleDescription = bundleDescription;
+ }
+
+ public String getBundleVendor() {
+ return bundleVendor;
+ }
+
+ public void setBundleVendor(String bundleVendor) {
+ this.bundleVendor = bundleVendor;
+ }
+
+ public String getBundleVersion() {
+ return bundleVersion;
+ }
+
+ public void setBundleVersion(String bundleVersion) {
+ this.bundleVersion = bundleVersion;
+ }
+
+ public String getExportPackage() {
+ return exportPackage;
+ }
+
+ public void setExportPackage(String exportPackage) {
+ this.exportPackage = exportPackage;
+ }
+/*
+ public String getBundleClassPath() {
+ return bundleClassPath;
+ }
+
+ public void setBundleClassPath(String bundleClassPath) {
+ this.bundleClassPath = bundleClassPath;
+ }
+*/
+ public String getBundleDate() {
+ return bundleDate;
+ }
+
+ public void setBundleDate(String bundleDate) {
+ this.bundleDate = bundleDate;
+ }
+
+ public String getBundleUpdateLocation() {
+ return bundleUpdateLocation;
+ }
+
+ public void setBundleUpdateLocation(String bundleUpdateLocation) {
+ this.bundleUpdateLocation = bundleUpdateLocation;
+ }
+
+ public String getMetadataLocation() {
+ return metadataLocation;
+ }
+
+ public void setMetadataLocation(String metadataLocation) {
+ this.metadataLocation = metadataLocation;
+ }
+}