/*
 * Licensed to the Apache Software Foundation (ASF) under the terms of ASLv2 (http://www.apache.org/licenses/LICENSE-2.0).
 *
 * Master Gradle build script
 *
 * Depends on bndPlugin property set by settings.gradle.
 * and bnd_* values from gradle.properties.
 */

import aQute.bnd.build.Workspace
import aQute.bnd.osgi.Constants

/* Add bnd gradle plugin as a script dependency */
buildscript {
  dependencies {
    classpath bndPlugin
  }
}

/* Initialize the bnd workspace */
Workspace.setDriver(Constants.BNDDRIVER_GRADLE)
Workspace.addGestalt(Constants.GESTALT_BATCH, null)
ext.bndWorkspace = new Workspace(rootDir, bnd_cnf)
if (bndWorkspace == null) {
  throw new GradleException("Unable to load workspace ${rootDir}/${bnd_cnf}")
}

/* Disable JavaDoc linting. */
if (JavaVersion.current().isJava8Compatible()) {
  allprojects {
    tasks.withType(Javadoc) {
      options.addStringOption('Xdoclint:none', '-quiet')
    }
  }
}

ext.cnf = rootProject.project(bnd_cnf)

/* Configure the subprojects */
subprojects {
  def bndProject = bndWorkspace.getProject(name)
  if (bndProject != null) {
    plugins.apply 'biz.aQute.bnd'

    test {
      useTestNG()
    }
  }
}
