All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.gradle.plugins.lang.merger.tasks.BaseMergeTask Maven / Gradle / Ivy

There is a newer version: 1.1.0
Show newest version
/**
 * 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.plugins.lang.merger.tasks;

import com.liferay.gradle.util.FileUtil;
import com.liferay.gradle.util.GradleUtil;

import java.io.File;
import java.io.IOException;

import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.gradle.api.DefaultTask;
import org.gradle.api.Project;
import org.gradle.api.file.FileCollection;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.OutputFiles;
import org.gradle.api.tasks.SkipWhenEmpty;
import org.gradle.api.tasks.TaskAction;
import org.gradle.util.CollectionUtils;
import org.gradle.util.GUtil;

/**
 * @author Andrea Di Giorgi
 */
public abstract class BaseMergeTask extends DefaultTask {

	public File getDestinationDir() {
		return GradleUtil.toFile(getProject(), _destinationDir);
	}

	@OutputFiles
	public FileCollection getDestinationFiles() {
		Set destinationFiles = new HashSet<>();

		File destinationDir = getDestinationDir();
		Project project = getProject();

		for (File sourceDir : getSourceDirs()) {
			for (File sourceFile : getSourceFiles(sourceDir)) {
				String fileName = FileUtil.relativize(sourceFile, sourceDir);

				File destinationFile = new File(destinationDir, fileName);

				destinationFiles.add(destinationFile);
			}
		}

		return project.files(destinationFiles);
	}

	public abstract String getPattern();

	public FileCollection getSourceDirs() {
		Project project = getProject();

		return project.files(_sourceDirs);
	}

	@InputFiles
	@SkipWhenEmpty
	public FileCollection getSourceFiles() {
		List fileCollections = new ArrayList<>();

		Project project = getProject();

		for (File sourceDir : getSourceDirs()) {
			FileCollection fileCollection = getSourceFiles(sourceDir);

			fileCollections.add(fileCollection);
		}

		return project.files(fileCollections.toArray());
	}

	@TaskAction
	public void merge() throws IOException {
		File destinationDir = getDestinationDir();
		FileCollection sourceDirs = getSourceDirs();

		for (File destinationFile : getDestinationFiles()) {
			Set sourceFiles = new LinkedHashSet<>();

			String fileName = FileUtil.relativize(
				destinationFile, destinationDir);

			for (File sourceDir : sourceDirs) {
				File sourceFile = new File(sourceDir, fileName);

				if (sourceFile.exists()) {
					sourceFiles.add(sourceFile);
				}
			}

			File destinationFileDir = destinationFile.getParentFile();

			destinationFileDir.mkdirs();

			if (sourceFiles.size() == 1) {
				Iterator iterator = sourceFiles.iterator();

				File sourceFile = iterator.next();

				Files.copy(
					sourceFile.toPath(), destinationFile.toPath(),
					StandardCopyOption.REPLACE_EXISTING);

				if (_logger.isInfoEnabled()) {
					_logger.info(
						"Copied " + sourceFile + " into " + destinationFile);
				}
			}
			else {
				merge(sourceFiles, destinationFile);

				if (_logger.isInfoEnabled()) {
					_logger.info(
						"Merged " + CollectionUtils.join(", ", sourceFiles) +
							" into " + destinationFile);
				}
			}
		}
	}

	public void setDestinationDir(Object destinationDir) {
		_destinationDir = destinationDir;
	}

	public void setSourceDirs(Iterable sourceDirs) {
		_sourceDirs.clear();

		sourceDirs(sourceDirs);
	}

	public void setSourceDirs(Object... sourceDirs) {
		setSourceDirs(Arrays.asList(sourceDirs));
	}

	public BaseMergeTask sourceDirs(Iterable sourceDirs) {
		GUtil.addToCollection(_sourceDirs, sourceDirs);

		return this;
	}

	public BaseMergeTask sourceDirs(Object... sourceDirs) {
		return sourceDirs(Arrays.asList(sourceDirs));
	}

	protected FileCollection getSourceFiles(File sourceDir) {
		Project project = getProject();

		Map args = new HashMap<>();

		args.put("dir", sourceDir);
		args.put("include", getPattern());

		return project.fileTree(args);
	}

	protected abstract void merge(Set sourceFiles, File destinationFile)
		throws IOException;

	private static final Logger _logger = Logging.getLogger(
		BaseMergeTask.class);

	private Object _destinationDir;
	private final Set _sourceDirs = new LinkedHashSet<>();

}