/* * Copyright 2016-present Open Networking Laboratory * * 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. */ package org.onosproject.onosjar; import com.facebook.buck.io.ProjectFilesystem; import com.facebook.buck.jvm.core.SuggestBuildRules; import com.facebook.buck.jvm.java.ClassUsageFileWriter; import com.facebook.buck.jvm.java.JarDirectoryStep; import com.facebook.buck.jvm.java.JavacOptions; import com.facebook.buck.jvm.java.JavacOptionsAmender; import com.facebook.buck.jvm.java.JavacToJarStepFactory; import com.facebook.buck.model.BuildTarget; import com.facebook.buck.rules.BuildContext; import com.facebook.buck.rules.BuildableContext; import com.facebook.buck.rules.SourcePath; import com.facebook.buck.rules.SourcePathResolver; import com.facebook.buck.step.Step; import com.facebook.buck.step.fs.CopyStep; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; import java.nio.file.Path; import java.nio.file.Paths; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * Creates the list of build steps for the onos_jar rules. */ public class OnosJarStepFactory extends JavacToJarStepFactory { private static final String DEFINITIONS = "/definitions/"; private final String webContext; private final String apiTitle; private final String apiVersion; private final String apiPackage; private final String apiDescription; private final Optional<ImmutableSortedSet<SourcePath>> resources; private final String groupId; private final String bundleName; private final String bundleVersion; private final String bundleLicense; private final String bundleDescription; private final String importPackages; private final String privatePackages; private final String exportPackages; private final String includeResources; private final String dynamicimportPackages; public OnosJarStepFactory(JavacOptions javacOptions, JavacOptionsAmender amender, Optional<String> webContext, Optional<String> apiTitle, Optional<String> apiVersion, Optional<String> apiPackage, Optional<String> apiDescription, Optional<ImmutableSortedSet<SourcePath>> resources, Optional<String> groupId, Optional<String> bundleName, Optional<String> bundleVersion, Optional<String> bundleLicense, Optional<String> bundleDescription, Optional<String> importPackages, Optional<String> exportPackages, Optional<String> includeResources, Optional<String> dynamicimportPackages, Optional<String> privatePackages) { super(javacOptions, amender); this.bundleDescription = processParameter(bundleDescription); this.importPackages = processParameter(importPackages); this.privatePackages = processParameter(privatePackages); this.exportPackages = processParameter(exportPackages); this.includeResources = processParameter(includeResources); this.dynamicimportPackages = processParameter(dynamicimportPackages); this.groupId = processParameter(groupId); this.bundleName = processParameter(bundleName); this.bundleVersion = processParameter(bundleVersion); this.bundleLicense = processParameter(bundleLicense); this.webContext = processParameter(webContext); this.apiTitle = processParameter(apiTitle); this.apiVersion = processParameter(apiVersion); this.apiPackage = processParameter(apiPackage); this.apiDescription = processParameter(apiDescription); this.resources = resources; } private String processParameter(Optional<String> p) { return !p.isPresent() || p.get().equals("NONE") ? null : p.get(); } @Override public void createCompileToJarStep(BuildContext context, ImmutableSortedSet<Path> sourceFilePaths, BuildTarget invokingRule, SourcePathResolver resolver, ProjectFilesystem filesystem, ImmutableSortedSet<Path> declaredClasspathEntries, Path outputDirectory, Optional<Path> workingDirectory, Path pathToSrcsList, Optional<SuggestBuildRules> suggestBuildRules, ImmutableList<String> postprocessClassesCommands, ImmutableSortedSet<Path> entriesToJar, Optional<String> mainClass, Optional<Path> manifestFile, Path outputJar, ClassUsageFileWriter usedClassesFileWriter, ImmutableList.Builder<Step> steps, BuildableContext buildableContext, ImmutableSet<Pattern> classesToRemoveFromJar) { ImmutableSet.Builder<Path> sourceFilePathBuilder = ImmutableSet.builder(); sourceFilePathBuilder.addAll(sourceFilePaths); ImmutableSet.Builder<Pattern> blacklistBuilder = ImmutableSet.builder(); blacklistBuilder.addAll(classesToRemoveFromJar); // precompilation steps // - generate sources // add all generated sources ot pathToSrcsList if (webContext != null && apiTitle != null && resources.isPresent()) { ImmutableSortedSet<Path> resourceFilePaths = findSwaggerModelDefs(resolver, resources.get()); blacklistBuilder.addAll(resourceFilePaths.stream() .map(rp -> Pattern.compile(rp.getFileName().toString(), Pattern.LITERAL)) .collect(Collectors.toSet())); Path genSourcesOutput = workingDirectory.get(); SwaggerStep swaggerStep = new SwaggerStep(filesystem, sourceFilePaths, resourceFilePaths, genSourcesOutput, outputDirectory, webContext, apiTitle, apiVersion, apiPackage, apiDescription); sourceFilePathBuilder.add(swaggerStep.apiRegistratorPath()); steps.add(swaggerStep); // steps.addAll(sourceFilePaths.stream() // .filter(sp -> sp.startsWith("src/main/webapp/")) // .map(sp -> CopyStep.forFile(filesystem, sp, outputDirectory)) // .iterator()); } createCompileStep(context, ImmutableSortedSet.copyOf(sourceFilePathBuilder.build()), invokingRule, resolver, filesystem, declaredClasspathEntries, outputDirectory, workingDirectory, pathToSrcsList, suggestBuildRules, usedClassesFileWriter, steps, buildableContext); // post compilation steps // FIXME BOC: add mechanism to inject new Steps //context.additionalStepFactory(JavaStep.class); // build the jar steps.add(new JarDirectoryStep(filesystem, outputJar, ImmutableSortedSet.of(outputDirectory), mainClass.orNull(), manifestFile.orNull(), true, blacklistBuilder.build())); OSGiWrapper osgiStep = new OSGiWrapper( outputJar, //input jar outputJar, //Paths.get(outputJar.toString() + ".jar"), //output jar invokingRule.getBasePath(), // sources dir outputDirectory, // classes dir declaredClasspathEntries, // classpath bundleName, // bundle name groupId, // groupId bundleVersion, // bundle version bundleLicense, // bundle license importPackages, // import packages exportPackages, // export packages includeResources, // include resources webContext, // web context dynamicimportPackages, // dynamic import packages bundleDescription, // bundle description privatePackages // private packages ); steps.add(osgiStep); //steps.add(CopyStep.forFile(filesystem, Paths.get(outputJar.toString() + ".jar"), outputJar)); } private ImmutableSortedSet<Path> findSwaggerModelDefs(SourcePathResolver resolver, ImmutableSortedSet<SourcePath> resourcePaths) { if (resourcePaths == null) { return ImmutableSortedSet.of(); } return ImmutableSortedSet.copyOf(resourcePaths.stream() .filter(sp -> sp.toString().contains(DEFINITIONS)) .map(resolver::getRelativePath) .collect(Collectors.toList())); } }