/*
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.
*/

task aggregateJavadoc(type: Javadoc) {
  description = 'Create all javadoc into target_dir/docs/javadoc'
  destinationDir file(target_javadoc_dir)
  options.addStringOption('Xdoclint:none', '-quiet')
  configure(options) {
    author = true
    version = true
    use = true
    docTitle "Apache Edgent (incubating) v${build_version}"
    footer '<a href="http://edgent.incubator.apache.org">Apache Edgent (incubating)</a>'
    bottom "Copyright &#169; ${COPYRIGHT_YEAR} The Apache Software Foundation. All Rights Reserved - ${commithash}-${DSTAMP}-${TSTAMP}"
    overview "edgent_overview.html"
    windowTitle "Edgent v${build_version}"

    group("Edgent Providers", "org.apache.edgent.providers.*")
    group("Edgent API", "org.apache.edgent.execution", "org.apache.edgent.function", "org.apache.edgent.topology", "org.apache.edgent.topology.json", "org.apache.edgent.topology.mbeans", "org.apache.edgent.topology.plumbing", "org.apache.edgent.topology.services", "org.apache.edgent.execution.*")
    group("Edgent Analytics", "org.apache.edgent.analytics.*")
    group("Edgent Utilities", "org.apache.edgent.metrics", "org.apache.edgent.metrics.*", "org.apache.edgent.streamscope", "org.apache.edgent.streamscope.*")
    group("Edgent Connectors", "org.apache.edgent.connectors.*")
    group("Edgent Samples", "org.apache.edgent.samples.*")
    group("Edgent Low-Level API", "org.apache.edgent.graph", "org.apache.edgent.graph.*", "org.apache.edgent.oplet", "org.apache.edgent.oplet.*", "org.apache.edgent.window")
    group("Edgent SPI", "org.apache.edgent.topology.spi", "org.apache.edgent.topology.spi.*")
  }
  source subprojects.collect { project -> project.sourceSets.main.allJava }
  exclude "**/edgent/connectors/**/runtime"
  exclude "**/edgent/console"
  exclude "**/edgent/samples/scenarios/iotp/range/sensor"
  exclude "**/android/**"
  classpath = files(filteredSubprojects.collect { it.jar.archivePath })
  
  // doc-files aren't picked up automatically so get them now.
  doLast {
    copy {
      from subprojects.collect { project -> project.sourceSets.main.java.srcDirs }
      include '**/doc-files/**'
      includeEmptyDirs = false
      into target_javadoc_dir
    }
  }
}
