// CAS sample build file

apply plugin: 'war'
apply plugin: 'jetty'
apply plugin: 'groovy'

def excludeModules = ['spring-security-acl', 'jsr250-api', 'spring-jdbc', 'spring-tx']
def jettyVersion = '8.1.9.v20130131'
def keystore = "$rootDir/samples/certificates/server.jks"
def password = 'password'

configurations {
	casServer
	excludeModules.each {name ->
		runtime.exclude module: name
	}

	runtime.exclude group: 'org.aspectj'
}

sourceSets {
	test.resources.exclude 'GebConfig.groovy'
	integrationTest.groovy.srcDir file('src/integration-test/groovy')
}

eclipse.classpath.plusConfigurations += [configurations.integrationTestRuntime]

dependencies {
	providedCompile "javax.servlet:javax.servlet-api:$servletApiVersion"

	compile project(':spring-security-core'),
			project(':spring-security-cas'),
			"org.jasig.cas.client:cas-client-core:$casClientVersion"

	runtime project(':spring-security-web'),
			project(':spring-security-config'),
			"org.springframework:spring-context-support:$springVersion",
			"org.slf4j:jcl-over-slf4j:$slf4jVersion",
			"ch.qos.logback:logback-classic:$logbackVersion",
			"net.sf.ehcache:ehcache:$ehcacheVersion"

	integrationTestCompile project(':spring-security-cas'),
				   "org.seleniumhq.selenium:selenium-htmlunit-driver:$seleniumVersion",
				   "org.gebish:geb-spock:$gebVersion",
				   'commons-httpclient:commons-httpclient:3.1',
				   "org.eclipse.jetty:jetty-server:$jettyVersion",
				   "org.eclipse.jetty:jetty-servlet:$jettyVersion",
				   "org.codehaus.groovy:groovy:$groovyVersion",
				   "org.slf4j:jcl-over-slf4j:$slf4jVersion",
				   spockDependencies
}

[jettyRun, jettyRunWar]*.configure {
	contextPath = "/cas-sample"
	def httpConnector = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.nio.SelectChannelConnector').newInstance()
	httpConnector.port = 8080
	httpConnector.confidentialPort = 8443
	def httpsConnector = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.security.SslSocketConnector').newInstance()
	httpsConnector.port = 8443
	httpsConnector.keystore = httpsConnector.truststore = keystore
	httpsConnector.keyPassword = httpsConnector.trustPassword = password

	connectors = [httpConnector, httpsConnector]
	doFirst() {
		System.setProperty('cas.server.host', casServer().httpsHost)
		System.setProperty('cas.service.host', jettyRunWar.httpsHost)
	}
}

task cas (dependsOn: [jettyRunWar]) {
	jettyRunWar.dependsOn(':spring-security-samples-xml-casserver:casServer')
}

task casServer(dependsOn: ':spring-security-samples-xml-casserver:casServer') {
}

integrationTest.dependsOn cas
integrationTest.doFirst {
	def casServiceHost = jettyRunWar.httpsHost
	systemProperties['cas.server.host'] = casServer().httpsHost
	systemProperties['cas.service.host'] = casServiceHost
	systemProperties['geb.build.baseUrl'] = 'https://'+casServiceHost+'/cas-sample/'
	systemProperties['geb.build.reportsDir'] = 'build/geb-reports'
	systemProperties['jar.path'] = jar.archivePath
	systemProperties['javax.net.ssl.trustStore'] = keystore
	systemProperties['javax.net.ssl.trustStorePassword'] = password
}

gradle.taskGraph.whenReady {graph ->
	def casServer = casServer()
	[casServer,jettyRunWar]*.metaClass*.getHttpsConnector {->
		def sslSocketConnClass = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.security.SslSocketConnector')
		delegate.connectors.find { it in sslSocketConnClass }
	}
	[casServer,jettyRunWar]*.metaClass*.getHttpsHost {->
		"localhost:"+delegate.httpsConnector.port
	}
	jettyRunWar.metaClass.getHttpConnector {->
		def channelConnClass = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.nio.SelectChannelConnector')
		delegate.connectors.find { it in channelConnClass }
	}
	if (graph.hasTask(cas)) {
		casServer.daemon = true
	}
	if(graph.hasTask(integrationTest)) {
		tasks.getByPath(':spring-security-samples-xml-casserver:casServerOverlay').logLevel = 'ERROR'
		jettyRunWar {
			additionalRuntimeJars += file("src/integration-test/resources")
			daemon = true
		}

		[jettyRunWar.httpConnector,jettyRunWar.httpsConnector,casServer.httpsConnector]*.metaClass*.reservePort { taskToCloseSocket ->
			def serverSocket = new ServerSocket(0)
			delegate.metaClass.serverSocket = serverSocket
			delegate.port = serverSocket.localPort
			taskToCloseSocket.doFirst {
				serverSocket.close()
			}
		}

		[jettyRunWar.httpConnector,jettyRunWar.httpsConnector]*.reservePort(jettyRunWar)
		jettyRunWar.httpConnector.confidentialPort = jettyRunWar.httpsConnector.port
		casServer.httpsConnector.reservePort(casServer)
	}
}

def casServer() {
	tasks.getByPath(':spring-security-samples-xml-casserver:casServer')
}
