/*
 *  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
 *
 *    https://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-library'
	id 'org.apache.grails.gradle.grails-plugin'
}

group = 'org.apache.grails'

ext {
	publishArtifactId = 'grails-spring-security-cas'
	pomTitle = 'Grails Spring Security CAS Plugin'
	pomDescription = 'The CAS plugin adds CAS single sign-on support to a Grails application that uses Spring Security.'
	pomDevelopers = ['burtbeckwith': 'Burt Beckwith']
}

dependencies {

	implementation platform("org.apache.grails:grails-bom:$grailsVersion")

	compileOnly 'jakarta.servlet:jakarta.servlet-api'
	compileOnly 'org.springframework.boot:spring-boot-starter-logging'
	compileOnly 'org.apache.grails:grails-web-boot'

	profile 'org.apache.grails.profiles:web-plugin'
	api project(':core-plugin')

	api "org.apereo.cas.client:cas-client-core:$casClientCoreVersion"
	api 'org.springframework.security:spring-security-cas', {
		['spring-beans', 'spring-context', 'spring-core', 'spring-security-core',
		 'spring-security-web', 'spring-web'].each { exclude module: it }
	}
}

apply {
	from rootProject.layout.projectDirectory.file('gradle/plugin-config.gradle')
	from rootProject.layout.projectDirectory.file('gradle/java-config.gradle')
	from rootProject.layout.projectDirectory.file('gradle/groovydoc-config.gradle')
	from rootProject.layout.projectDirectory.file('gradle/test-config.gradle')
	from rootProject.layout.projectDirectory.file('gradle/publish-config.gradle')
	from rootProject.layout.projectDirectory.file('gradle/reproducible-config.gradle')
}
