/*
 * 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(type: Jar, 'sourcesJar') {
  description 'Jar the sources.'
  group 'documentation'
  dependsOn jar
  enabled !bnd.project.isNoBundles()
  if (enabled) {
    inputs.file jar.archivePath
    from zipTree(jar.archivePath).matching {
      include 'OSGI-OPT/src/**'
      include '*'
    }
    eachFile { FileCopyDetails fcp ->
      fcp.path = fcp.path - 'OSGI-OPT/src/'
    }
    includeEmptyDirs = false
    classifier = 'sources'
  }
}

task('pom') {
  description 'Generate the pom file.'
  group 'documentation'
  dependsOn jar
  def bundleVersion = bnd('Bundle-Version')
  def groupId = bnd('mavenGroupId')
  def pomname = "${archivesBaseName}.pom"
  ext.pomfile = new File(buildDir, pomname)
  enabled !bnd.project.isNoBundles()
  if (enabled) {
    inputs.file jar.archivePath
    outputs.file pomfile
    doLast {
      copy {
        from zipTree(jar.archivePath).matching {
          include "META-INF/maven/${groupId}/${archivesBaseName}/pom.xml"
        }
        eachFile { FileCopyDetails fcp ->
          fcp.path = pomname
        }
        into buildDir
        includeEmptyDirs = false
      }
    }
  }
}

task(type: Jar, 'javadocJar') {
  description 'Jar the javadoc.'
  group 'documentation'
  dependsOn javadoc
  from javadoc.destinationDir
  classifier 'javadoc'
}

artifacts {
  archives sourcesJar
  archives javadocJar
  archives(pom.pomfile) {
    builtBy pom
  }
}