
com.liferay.gradle.plugins.WatchOSGiPlugin Maven / Gradle / Ivy
/**
* SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/
package com.liferay.gradle.plugins;
import aQute.bnd.osgi.Constants;
import com.liferay.gradle.plugins.extensions.BundleExtension;
import com.liferay.gradle.plugins.internal.util.GradleUtil;
import com.liferay.gradle.plugins.internal.util.IncludeResourceCompileIncludeInstruction;
import com.liferay.gradle.plugins.task.ExecuteBndTask;
import com.liferay.gradle.plugins.task.WatchTask;
import com.liferay.gradle.plugins.util.BndUtil;
import java.io.File;
import java.io.FileInputStream;
import java.util.concurrent.Callable;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.file.FileTree;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.Convention;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.specs.Spec;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;
import org.gradle.api.tasks.Sync;
import org.gradle.api.tasks.TaskOutputs;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.api.tasks.bundling.Jar;
/**
* @author Andrea Di Giorgi
*/
public class WatchOSGiPlugin implements Plugin {
public static final String BUILD_BUNDLE_DIR_TASK_NAME = "buildBundleDir";
public static final Plugin INSTANCE = new WatchOSGiPlugin();
public static final String JAR_COMPILE_INCLUDE_FRAGMENT_TASK_NAME =
"jarCompileIncludeFragment";
public static final String WATCH_TASK_NAME = "watch";
@Override
public void apply(Project project) {
// Extensions
BundleExtension bundleExtension = BndUtil.getBundleExtension(
project.getExtensions());
// Conventions
Convention convention = project.getConvention();
JavaPluginConvention javaPluginConvention = convention.getPlugin(
JavaPluginConvention.class);
SourceSetContainer javaSourceSetContainer =
javaPluginConvention.getSourceSets();
SourceSet javaMainSourceSet = javaSourceSetContainer.getByName(
SourceSet.MAIN_SOURCE_SET_NAME);
// Configurations
ConfigurationContainer configurationContainer =
project.getConfigurations();
Configuration compileIncludeConfiguration =
configurationContainer.maybeCreate(
LiferayOSGiPlugin.COMPILE_INCLUDE_CONFIGURATION_NAME);
// Tasks
TaskProvider buildBundleDirTaskProvider =
GradleUtil.addTaskProvider(
project, BUILD_BUNDLE_DIR_TASK_NAME, Sync.class);
TaskProvider jarCompileIncludeFragmentTaskProvider =
GradleUtil.addTaskProvider(
project, JAR_COMPILE_INCLUDE_FRAGMENT_TASK_NAME,
ExecuteBndTask.class);
TaskProvider watchTaskProvider = GradleUtil.addTaskProvider(
project, WATCH_TASK_NAME, WatchTask.class);
TaskProvider jarTaskProvider = GradleUtil.getTaskProvider(
project, JavaPlugin.JAR_TASK_NAME, Jar.class);
_configureTaskBuildBundleDirProvider(
project, buildBundleDirTaskProvider, jarTaskProvider);
_configureTaskJarCompileIncludeFragmentProvider(
project, javaMainSourceSet, bundleExtension,
compileIncludeConfiguration, jarCompileIncludeFragmentTaskProvider);
_configureTaskWatchProvider(
buildBundleDirTaskProvider, jarCompileIncludeFragmentTaskProvider,
watchTaskProvider);
}
private WatchOSGiPlugin() {
}
private void _configureTaskBuildBundleDirProvider(
final Project project, TaskProvider buildBundleDirTaskProvider,
final TaskProvider jarTaskProvider) {
buildBundleDirTaskProvider.configure(
new Action() {
@Override
public void execute(Sync buildBundleDirSync) {
buildBundleDirSync.dependsOn(jarTaskProvider);
buildBundleDirSync.from(
new Callable() {
@Override
public FileTree call() throws Exception {
Jar jar = jarTaskProvider.get();
return project.zipTree(jar.getArchivePath());
}
});
buildBundleDirSync.into(
new Callable() {
@Override
public File call() throws Exception {
return new File(
project.getBuildDir(),
BUILD_BUNDLE_DIR_TASK_NAME);
}
});
buildBundleDirSync.setDescription(
"Unzips the project's JAR file into a temporary " +
"directory.");
}
});
}
private void _configureTaskJarCompileIncludeFragmentProvider(
final Project project, final SourceSet javaMainSourceSet,
final BundleExtension bundleExtension,
final Configuration compileIncludeConfiguration,
TaskProvider jarCompileIncludeFragmentTaskProvider) {
jarCompileIncludeFragmentTaskProvider.configure(
new Action() {
@Override
public void execute(
ExecuteBndTask jarCompileIncludeFragmentExecuteBndTask) {
jarCompileIncludeFragmentExecuteBndTask.property(
Constants.BUNDLE_NAME,
new Callable() {
@Override
public String call() throws Exception {
String instruction =
bundleExtension.getInstruction(
Constants.BUNDLE_NAME);
return instruction + " Libs";
}
});
jarCompileIncludeFragmentExecuteBndTask.property(
Constants.BUNDLE_SYMBOLICNAME,
new Callable() {
@Override
public String call() throws Exception {
String instruction =
bundleExtension.getInstruction(
Constants.BUNDLE_SYMBOLICNAME);
return instruction + ".libs";
}
});
jarCompileIncludeFragmentExecuteBndTask.property(
Constants.BUNDLE_VERSION, "1.0.0");
jarCompileIncludeFragmentExecuteBndTask.property(
Constants.FRAGMENT_HOST,
new Callable() {
@Override
public String call() throws Exception {
return bundleExtension.getInstruction(
Constants.BUNDLE_SYMBOLICNAME);
}
});
jarCompileIncludeFragmentExecuteBndTask.property(
Constants.INCLUDERESOURCE,
new IncludeResourceCompileIncludeInstruction(
new Callable>() {
@Override
public Iterable call() throws Exception {
return compileIncludeConfiguration;
}
},
new Callable() {
@Override
public Boolean call() throws Exception {
return Boolean.FALSE;
}
}));
jarCompileIncludeFragmentExecuteBndTask.onlyIf(
new Spec() {
@Override
public boolean isSatisfiedBy(Task task) {
return !compileIncludeConfiguration.isEmpty();
}
});
jarCompileIncludeFragmentExecuteBndTask.setClasspath(
javaMainSourceSet.getCompileClasspath());
jarCompileIncludeFragmentExecuteBndTask.setDescription(
"Generates an OSGi fragment containing all " +
"dependencies of " +
LiferayOSGiPlugin.
COMPILE_INCLUDE_CONFIGURATION_NAME + ".");
jarCompileIncludeFragmentExecuteBndTask.setGroup(
BasePlugin.BUILD_GROUP);
jarCompileIncludeFragmentExecuteBndTask.setOutputFile(
new Callable() {
@Override
public File call() throws Exception {
return new File(
project.getBuildDir(),
project.getName() + "-libs." +
Jar.DEFAULT_EXTENSION);
}
});
jarCompileIncludeFragmentExecuteBndTask.setResourceDirs(
project.files());
jarCompileIncludeFragmentExecuteBndTask.setSourceDirs(
project.files());
}
});
}
private void _configureTaskWatchProvider(
final TaskProvider buildBundleDirTaskProvider,
final TaskProvider
jarCompileIncludeFragmentTaskProvider,
TaskProvider watchTaskProvider) {
watchTaskProvider.configure(
new Action() {
@Override
public void execute(WatchTask watchTask) {
Sync buildBundleDirSync = buildBundleDirTaskProvider.get();
watchTask.dependsOn(buildBundleDirSync);
watchTask.setBundleDir(
new Callable() {
@Override
public File call() throws Exception {
return buildBundleDirSync.getDestinationDir();
}
});
watchTask.setBundleSymbolicName(
new Callable() {
@Override
public String call() throws Exception {
File manifestFile = new File(
buildBundleDirSync.getDestinationDir(),
"META-INF/MANIFEST.MF");
if (manifestFile.exists()) {
try (FileInputStream fileInputStream =
new FileInputStream(manifestFile)) {
Manifest manifest = new Manifest(
fileInputStream);
Attributes attributes =
manifest.getMainAttributes();
return attributes.getValue(
"Bundle-SymbolicName");
}
}
return null;
}
});
watchTask.setDescription(
"Continuously redeploys the project's OSGi bundle.");
watchTask.setGroup(BasePlugin.BUILD_GROUP);
ExecuteBndTask jarCompileIncludeFragmentExecuteBndTask =
jarCompileIncludeFragmentTaskProvider.get();
TaskOutputs taskOutputs =
jarCompileIncludeFragmentExecuteBndTask.getOutputs();
watchTask.setFragments(taskOutputs.getFiles());
}
});
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy