/*
 * 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}")
}

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()
    }

    tasks.withType(Javadoc) {
        def runningJVM = JavaVersion.current().toString()
        if (runningJVM.matches("1\\.8.*")) {
            options.addStringOption('Xdoclint:none', '-quiet')
        }
    }
  }


}

