/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.gradle.util; import groovy.lang.Closure; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import org.gradle.api.Action; import org.gradle.api.GradleException; 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.artifacts.Dependency; import org.gradle.api.artifacts.ResolvableDependencies; import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.file.FileCollection; import org.gradle.api.file.FileTree; import org.gradle.api.plugins.Convention; import org.gradle.api.plugins.ExtensionAware; import org.gradle.api.plugins.ExtensionContainer; import org.gradle.api.plugins.ExtraPropertiesExtension; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskContainer; import org.gradle.api.tasks.util.PatternFilterable; import org.gradle.api.tasks.util.PatternSet; /** * @author Andrea Di Giorgi */ public class GradleUtil { public static Configuration addConfiguration(Project project, String name) { ConfigurationContainer configurationContainer = project.getConfigurations(); return configurationContainer.create(name); } public static Dependency addDependency( Project project, String configurationName, File file) { return _addDependency(project, configurationName, project.files(file)); } public static Dependency addDependency( Project project, String configurationName, FileCollection fileCollection) { return _addDependency(project, configurationName, fileCollection); } public static Dependency addDependency( Project project, String configurationName, String dependencyNotation) { return _addDependency(project, configurationName, dependencyNotation); } public static Dependency addDependency( Project project, String configurationName, String group, String name, String version) { return addDependency( project, configurationName, group, name, version, true); } public static Dependency addDependency( Project project, String configurationName, String group, String name, String version, boolean transitive) { return addDependency( project, configurationName, group, name, version, null, transitive); } public static Dependency addDependency( Project project, String configurationName, String group, String name, String version, String classifier, boolean transitive) { Map<String, Object> dependencyNotation = new HashMap<>(); if (Validator.isNotNull(classifier)) { dependencyNotation.put("classifier", classifier); } dependencyNotation.put("group", group); dependencyNotation.put("name", name); dependencyNotation.put("transitive", transitive); dependencyNotation.put("version", version); return _addDependency(project, configurationName, dependencyNotation); } public static <T> T addExtension( ExtensionAware extensionAware, String name, Class<T> clazz) { ExtensionContainer extensionContainer = extensionAware.getExtensions(); return extensionContainer.create(name, clazz, extensionAware); } public static SourceSet addSourceSet(Project project, String name) { JavaPluginConvention javaPluginConvention = getConvention( project, JavaPluginConvention.class); SourceSetContainer sourceSetContainer = javaPluginConvention.getSourceSets(); return sourceSetContainer.create(name); } public static <T extends Task> T addTask( Project project, String name, Class<T> clazz) { Map<String, Class<T>> args = Collections.singletonMap( Task.TASK_TYPE, clazz); return (T)project.task(args, name); } public static <T extends Plugin<? extends Project>> void applyPlugin( Project project, Class<T> clazz) { Map<String, Class<T>> args = Collections.singletonMap("plugin", clazz); project.apply(args); } public static void applyScript( Project project, String name, Object object) { Map<String, Object> args = new HashMap<>(); ClassLoader classLoader = GradleUtil.class.getClassLoader(); URL url = classLoader.getResource(name); if (url == null) { throw new GradleException("Unable to apply script " + name); } args.put("from", url); if (object != null) { args.put("to", object); } project.apply(args); } public static void executeIfEmpty( final Configuration configuration, final Action<Configuration> action) { ResolvableDependencies resolvableDependencies = configuration.getIncoming(); resolvableDependencies.beforeResolve( new Action<ResolvableDependencies>() { @Override public void execute( ResolvableDependencies resolvableDependencies) { Set<Dependency> dependencies = configuration.getDependencies(); Set<Configuration> parentConfigurations = configuration.getExtendsFrom(); if (dependencies.isEmpty() && parentConfigurations.isEmpty()) { action.execute(configuration); } } }); } public static Configuration getConfiguration(Project project, String name) { ConfigurationContainer configurationContainer = project.getConfigurations(); return configurationContainer.getByName(name); } public static <T> T getConvention(Project project, Class<T> clazz) { Convention convention = project.getConvention(); return convention.getPlugin(clazz); } public static <T> T getExtension( ExtensionAware extensionAware, Class<T> clazz) { ExtensionContainer extensionContainer = extensionAware.getExtensions(); return extensionContainer.getByType(clazz); } public static FileTree getFilteredFileTree( FileTree fileTree, String[] excludes, String[] includes) { PatternFilterable patternFilterable = new PatternSet(); if (ArrayUtil.isNotEmpty(excludes)) { patternFilterable.setExcludes(Arrays.asList(excludes)); } if (ArrayUtil.isNotEmpty(includes)) { patternFilterable.setIncludes(Arrays.asList(includes)); } return fileTree.matching(patternFilterable); } public static Project getProject(Project rootProject, File projectDir) { for (Project project : rootProject.getAllprojects()) { if (projectDir.equals(project.getProjectDir())) { return project; } } return null; } public static Object getProperty( ExtensionAware extensionAware, String name) { ExtensionContainer extensionContainer = extensionAware.getExtensions(); ExtraPropertiesExtension extraPropertiesExtension = extensionContainer.getExtraProperties(); if (!extraPropertiesExtension.has(name)) { return null; } Object value = extraPropertiesExtension.get(name); if ((value instanceof String) && Validator.isNull((String)value)) { value = null; } return value; } public static boolean getProperty( ExtensionAware extensionAware, String name, boolean defaultValue) { Object value = getProperty(extensionAware, name); if (value instanceof Boolean) { return (Boolean)value; } if (value instanceof String) { return Boolean.parseBoolean((String)value); } return defaultValue; } public static String getProperty( ExtensionAware extensionAware, String name, String defaultValue) { Object value = getProperty(extensionAware, name); if (value == null) { return defaultValue; } return toString(value); } public static File getProperty( Project project, String name, File defaultValue) { Object value = getProperty(project, name); if (value == null) { return defaultValue; } return toFile(project, value); } public static SourceSet getSourceSet(Project project, String name) { JavaPluginConvention javaPluginConvention = getConvention( project, JavaPluginConvention.class); SourceSetContainer sourceSetContainer = javaPluginConvention.getSourceSets(); return sourceSetContainer.getByName(name); } public static Task getTask(Project project, String name) { TaskContainer taskContainer = project.getTasks(); return taskContainer.getByName(name); } public static String getTaskName(String prefix, File file) { String fileName = FileUtil.stripExtension(file.getName()); fileName = fileName.replaceAll("\\W", ""); return prefix + StringUtil.capitalize(fileName); } public static String getTaskPrefixedProperty(Task task, String name) { String suffix = "." + name; String value = System.getProperty(task.getPath() + suffix); if (Validator.isNull(value)) { value = System.getProperty(task.getName() + suffix); } return value; } public static void removeDependencies( Project project, String configurationName, String[] dependencyNotations) { Configuration configuration = getConfiguration( project, configurationName); Set<Dependency> dependencies = configuration.getDependencies(); Iterator<Dependency> iterator = dependencies.iterator(); while (iterator.hasNext()) { Dependency dependency = iterator.next(); String dependencyNotation = _getDependencyNotation(dependency); if (ArrayUtil.contains(dependencyNotations, dependencyNotation)) { iterator.remove(); } } } public static void setProperty( ExtensionAware extensionAware, String name, Object value) { ExtensionContainer extensionContainer = extensionAware.getExtensions(); ExtraPropertiesExtension extraPropertiesExtension = extensionContainer.getExtraProperties(); extraPropertiesExtension.set(name, value); } public static File toFile(Project project, Object object) { if (object == null) { return null; } return project.file(object); } public static Integer toInteger(Object object) { object = toObject(object); if (object instanceof Integer) { return (Integer)object; } if (object instanceof Number) { Number number = (Number)object; return number.intValue(); } if (object instanceof String) { return Integer.parseInt((String)object); } return null; } public static Object toObject(Object object) { if (object instanceof Callable<?>) { Callable<?> callable = (Callable<?>)object; try { object = callable.call(); } catch (Exception e) { throw new GradleException(e.getMessage(), e); } } else if (object instanceof Closure<?>) { Closure<?> closure = (Closure<?>)object; object = closure.call(); } return object; } public static String toString(Object object) { object = toObject(object); if (object == null) { return null; } return object.toString(); } public static List<String> toStringList(Iterable<?> iterable) { List<String> list = new ArrayList<>(); for (Object object : iterable) { list.add(toString(object)); } return list; } public static boolean waitFor( Callable<Boolean> callable, long checkInterval, long timeout) throws Exception { long end = System.currentTimeMillis() + timeout; while (System.currentTimeMillis() < end) { if (callable.call()) { return true; } Thread.sleep(checkInterval); } return false; } private static Dependency _addDependency( Project project, String configurationName, Object dependencyNotation) { DependencyHandler dependencyHandler = project.getDependencies(); return dependencyHandler.add(configurationName, dependencyNotation); } private static String _getDependencyNotation(Dependency dependency) { StringBuilder sb = new StringBuilder(); if (Validator.isNotNull(dependency.getGroup())) { sb.append(dependency.getGroup()); sb.append(":"); } sb.append(dependency.getName()); if (Validator.isNotNull(dependency.getVersion())) { sb.append(":"); sb.append(dependency.getVersion()); } return sb.toString(); } }