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

plugins {
  id 'java-platform'
  id 'geode-dependency-constraints'
}

apply from: "${rootDir}/gradle/publish-common.gradle"

publishing {
  publications {
    maven(MavenPublication) {
      from components.javaPlatform

      pom {
        withXml {
          // Published Geode artifacts are constrained to match the version of this BOM.
          // We exclude any child of the :boms subproject
          def thisNode = asNode()
          project.rootProject.subprojects.each { p ->
            if (p.findProperty('constrainVersionInBom')
                && !project(':boms').allprojects.contains(p)) {
              def geodeDependency =
                  thisNode.dependencyManagement.dependencies*.appendNode('dependency')
               geodeDependency*.appendNode('groupId')*.setValue(p.group)
               geodeDependency*.appendNode('artifactId')*.setValue(p.name)
               geodeDependency*.appendNode('version')*.setValue(p.version.toString())
               geodeDependency*.appendNode('scope')*.setValue('compile')
            }
          }
          thisNode
        }
      }
    }
  }
}
