Enhancing OnosJar to build OSGi jars and wars if required.

Also, simplifying onos.bucklet by using the rule

Change-Id: If89633db2d83cbfc56a8e70d2bea665ffaf186ff
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarDescription.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarDescription.java
index 7632ade..dff37c0 100644
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarDescription.java
+++ b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarDescription.java
@@ -19,13 +19,21 @@
 import com.facebook.buck.jvm.java.CalculateAbi;
 import com.facebook.buck.jvm.java.DefaultJavaLibrary;
 import com.facebook.buck.jvm.java.JavaBuckConfig;
+import com.facebook.buck.jvm.java.JavaLibrary;
 import com.facebook.buck.jvm.java.JavaLibraryDescription;
 import com.facebook.buck.jvm.java.JavaOptions;
+import com.facebook.buck.jvm.java.JavaSourceJar;
 import com.facebook.buck.jvm.java.JavacOptions;
 import com.facebook.buck.jvm.java.JavacOptionsAmender;
 import com.facebook.buck.jvm.java.JavacOptionsFactory;
+import com.facebook.buck.jvm.java.JavacToJarStepFactory;
+import com.facebook.buck.jvm.java.JavadocJar;
+import com.facebook.buck.jvm.java.MavenUberJar;
+import com.facebook.buck.maven.AetherUtil;
 import com.facebook.buck.model.BuildTarget;
 import com.facebook.buck.model.Flavor;
+import com.facebook.buck.model.Flavored;
+import com.facebook.buck.model.ImmutableFlavor;
 import com.facebook.buck.parser.NoSuchBuildTargetException;
 import com.facebook.buck.rules.BuildRule;
 import com.facebook.buck.rules.BuildRuleParams;
@@ -37,7 +45,9 @@
 import com.facebook.buck.rules.SourcePathResolver;
 import com.facebook.buck.rules.SourcePaths;
 import com.facebook.buck.rules.TargetGraph;
+import com.google.common.base.Function;
 import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Iterables;
@@ -51,8 +61,16 @@
  *
  * Currently, this only does Swagger generation.
  */
-public class OnosJarDescription implements Description<OnosJarDescription.Arg> {
+public class OnosJarDescription implements Description<OnosJarDescription.Arg>, Flavored {
     public static final BuildRuleType TYPE = BuildRuleType.of("onos_jar");
+    public static final Flavor NON_OSGI_JAR = ImmutableFlavor.of("non-osgi");
+
+    public static final ImmutableSet<Flavor> SUPPORTED_FLAVORS = ImmutableSet.of(
+            JavaLibrary.SRC_JAR,
+            JavaLibrary.MAVEN_JAR,
+            JavaLibrary.JAVADOC_JAR,
+            NON_OSGI_JAR);
+
     private final JavacOptions defaultJavacOptions;
     private final JavaOptions defaultJavaOptions;
 
@@ -89,6 +107,63 @@
         ImmutableSortedSet<Flavor> flavors = target.getFlavors();
         BuildRuleParams paramsWithMavenFlavor = null;
 
+        if (flavors.contains(JavaLibrary.MAVEN_JAR)) {
+            paramsWithMavenFlavor = params;
+
+            // Maven rules will depend upon their vanilla versions, so the latter have to be constructed
+            // without the maven flavor to prevent output-path conflict
+            params = params.copyWithBuildTarget(
+                    params.getBuildTarget().withoutFlavors(ImmutableSet.of(JavaLibrary.MAVEN_JAR)));
+        }
+
+        if (flavors.contains(JavaLibrary.SRC_JAR)) {
+            args.mavenCoords = args.mavenCoords.transform(
+                    new Function<String, String>() {
+                        @Override
+                        public String apply(String input) {
+                            return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_SOURCES);
+                        }
+                    });
+
+            if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
+                return new JavaSourceJar(
+                        params,
+                        pathResolver,
+                        args.srcs.get(),
+                        args.mavenCoords);
+            } else {
+                return MavenUberJar.SourceJar.create(
+                        Preconditions.checkNotNull(paramsWithMavenFlavor),
+                        pathResolver,
+                        args.srcs.get(),
+                        args.mavenCoords);
+            }
+        }
+
+        if (flavors.contains(JavaLibrary.JAVADOC_JAR)) {
+            args.mavenCoords = args.mavenCoords.transform(
+                    new Function<String, String>() {
+                        @Override
+                        public String apply(String input) {
+                            return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_JAVADOC);
+                        }
+                    });
+
+            if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
+                return new JavadocJar(
+                        params,
+                        pathResolver,
+                        args.srcs.get(),
+                        args.mavenCoords);
+            } else {
+                return MavenUberJar.MavenJavadocJar.create(
+                        Preconditions.checkNotNull(paramsWithMavenFlavor),
+                        pathResolver,
+                        args.srcs.get(),
+                        args.mavenCoords);
+            }
+        }
+
         JavacOptions javacOptions = JavacOptionsFactory.create(
                 defaultJavacOptions,
                 params,
@@ -101,45 +176,84 @@
 
         ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps.get());
 
-        DefaultJavaLibrary defaultJavaLibrary =
-                resolver.addToIndex(
-                        new OnosJar(
-                                params.appendExtraDeps(
-                                        Iterables.concat(
-                                                BuildRules.getExportedRules(
-                                                        Iterables.concat(
-                                                                params.getDeclaredDeps().get(),
-                                                                exportedDeps,
-                                                                resolver.getAllRules(args.providedDeps.get()))),
-                                                pathResolver.filterBuildRuleInputs(
-                                                        javacOptions.getInputs(pathResolver)))),
-                                pathResolver,
-                                args.srcs.get(),
-                                validateResources(
-                                        pathResolver,
-                                        params.getProjectFilesystem(),
-                                        args.resources.get()),
-                                javacOptions.getGeneratedSourceFolderName(),
-                                args.proguardConfig.transform(
-                                        SourcePaths.toSourcePath(params.getProjectFilesystem())),
-                                args.postprocessClassesCommands.get(), // FIXME this should be forbidden
-                                exportedDeps,
-                                resolver.getAllRules(args.providedDeps.get()),
-                                new BuildTargetSourcePath(abiJarTarget),
-                                javacOptions.trackClassUsage(),
+        final DefaultJavaLibrary defaultJavaLibrary;
+        if (!flavors.contains(NON_OSGI_JAR)) {
+            defaultJavaLibrary =
+                    resolver.addToIndex(
+                            new OnosJar(
+                                    params.appendExtraDeps(
+                                            Iterables.concat(
+                                                    BuildRules.getExportedRules(
+                                                            Iterables.concat(
+                                                                    params.getDeclaredDeps().get(),
+                                                                    exportedDeps,
+                                                                    resolver.getAllRules(args.providedDeps.get()))),
+                                                    pathResolver.filterBuildRuleInputs(
+                                                            javacOptions.getInputs(pathResolver)))),
+                                    pathResolver,
+                                    args.srcs.get(),
+                                    validateResources(
+                                            pathResolver,
+                                            params.getProjectFilesystem(),
+                                            args.resources.get()),
+                                    javacOptions.getGeneratedSourceFolderName(),
+                                    args.proguardConfig.transform(
+                                            SourcePaths.toSourcePath(params.getProjectFilesystem())),
+                                    args.postprocessClassesCommands.get(), // FIXME this should be forbidden
+                                    exportedDeps,
+                                    resolver.getAllRules(args.providedDeps.get()),
+                                    new BuildTargetSourcePath(abiJarTarget),
+                                    javacOptions.trackClassUsage(),
                                 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
-                                new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
-                                                       args.webContext, args.apiTitle, args.apiVersion,
-                                                       args.apiPackage, args.apiDescription, args.resources),
-                                args.resourcesRoot,
-                                args.mavenCoords,
-                                args.tests.get(),
-                                javacOptions.getClassesToRemoveFromJar(),
-                                args.webContext,
-                                args.apiTitle,
-                                args.apiVersion,
-                                args.apiPackage,
-                                args.apiDescription));
+                                    new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
+                                                           args.webContext, args.apiTitle, args.apiVersion,
+                                                           args.apiPackage, args.apiDescription, args.resources,
+                                                           args.groupId, args.bundleName, args.bundleVersion,
+                                                           args.bundleLicense, args.bundleDescription, args.importPackages,
+                                                           args.exportPackages, args.includeResources, args.dynamicimportPackages),
+                                    args.resourcesRoot,
+                                    args.mavenCoords,
+                                    args.tests.get(),
+                                    javacOptions.getClassesToRemoveFromJar(),
+                                    args.webContext,
+                                    args.apiTitle,
+                                    args.apiVersion,
+                                    args.apiPackage,
+                                    args.apiDescription));
+        } else {
+            defaultJavaLibrary =
+                    resolver.addToIndex(
+                            new DefaultJavaLibrary(
+                                    params.appendExtraDeps(
+                                            Iterables.concat(
+                                                    BuildRules.getExportedRules(
+                                                            Iterables.concat(
+                                                                    params.getDeclaredDeps().get(),
+                                                                    exportedDeps,
+                                                                    resolver.getAllRules(args.providedDeps.get()))),
+                                                    pathResolver.filterBuildRuleInputs(
+                                                            javacOptions.getInputs(pathResolver)))),
+                                    pathResolver,
+                                    args.srcs.get(),
+                                    validateResources(
+                                            pathResolver,
+                                            params.getProjectFilesystem(),
+                                            args.resources.get()),
+                                    javacOptions.getGeneratedSourceFolderName(),
+                                    args.proguardConfig.transform(
+                                            SourcePaths.toSourcePath(params.getProjectFilesystem())),
+                                    args.postprocessClassesCommands.get(),
+                                    exportedDeps,
+                                    resolver.getAllRules(args.providedDeps.get()),
+                                    new BuildTargetSourcePath(abiJarTarget),
+                                    javacOptions.trackClassUsage(),
+                                    /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
+                                    new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
+                                    args.resourcesRoot,
+                                    args.mavenCoords,
+                                    args.tests.get(),
+                                    javacOptions.getClassesToRemoveFromJar()));
+        }
 
         resolver.addToIndex(
                 CalculateAbi.of(
@@ -151,6 +265,10 @@
         return defaultJavaLibrary;
     }
 
+    @Override
+    public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
+        return SUPPORTED_FLAVORS.containsAll(flavors);
+    }
 
     public static class Arg extends JavaLibraryDescription.Arg {
         public Optional<String> webContext;
@@ -158,5 +276,16 @@
         public Optional<String> apiVersion;
         public Optional<String> apiPackage;
         public Optional<String> apiDescription;
+
+        public Optional<String> groupId;
+        public Optional<String> bundleName;
+        public Optional<String> bundleVersion;
+        public Optional<String> bundleLicense;
+        public Optional<String> bundleDescription;
+
+        public Optional<String> importPackages;
+        public Optional<String> exportPackages;
+        public Optional<String> includeResources;
+        public Optional<String> dynamicimportPackages;
     }
 }
\ No newline at end of file