/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.
 */
import groovy.transform.CompileStatic
import org.gradle.api.execution.TaskExecutionListener

import java.util.concurrent.Semaphore

// This file contains fixes to make sure the build runs properly with --parallel

// Asciidoctor JRuby is not thread-safe, we can only run one at a time
gradle.taskGraph.addTaskExecutionListener(new MaxConcurrentTasksOfKind('org.asciidoctor.gradle.AsciidoctorTask'))

// Limit the number of concurrent test tasks
gradle.taskGraph.addTaskExecutionListener(new MaxConcurrentTasksOfKind('org.gradle.api.tasks.testing.Test', 2))


/**
 * Prevents tasks from a simple type to be executed concurrently
 */
@CompileStatic
class MaxConcurrentTasksOfKind implements TaskExecutionListener {
    private final Semaphore semaphore;
    private final String clazz

    MaxConcurrentTasksOfKind(String clazz, int maxConcurrent = 1) {
        this.clazz = clazz
        this.semaphore = new Semaphore(maxConcurrent)
    }

    void beforeExecute(Task task) {
        if (task.class.name.startsWith(clazz)) {
            semaphore.acquire()
        }
    }

    void afterExecute(Task task, TaskState state) {
        if (task.class.name.startsWith(clazz)) {
            semaphore.release()
        }
    }
}