apply plugin: 'eclipse'
apply plugin: 'idea'
apply from: "./libraries.gradle"


buildscript {
	repositories {
		mavenCentral()
		mavenLocal()
		jcenter()

		maven {
			name 'jboss-nexus'
			url "http://repository.jboss.org/nexus/content/groups/public/"
		}
		maven {
			name "jboss-snapshots"
			url "http://snapshots.jboss.org/maven2/"
		}
	}
	dependencies {
		classpath 'org.hibernate.build.gradle:gradle-maven-publish-auth:2.0.1'
		classpath 'org.hibernate.build.gradle:hibernate-matrix-testing:2.0.0-SNAPSHOT'
		classpath 'org.hibernate.build.gradle:version-injection-plugin:1.0.0'
		classpath 'org.hibernate.build.gradle:gradle-xjc-plugin:1.0.2.Final'
		classpath 'com.github.lburgazzoli:lb-karaf-features-gen:1.0.0-SNAPSHOT'
	}
}

allprojects {
    repositories {
        mavenCentral()
        mavenLocal()

        maven {
            name 'jboss-nexus'
            url "http://repository.jboss.org/nexus/content/groups/public/"
        }
        maven {
            name "jboss-snapshots"
            url "http://snapshots.jboss.org/maven2/"
        }
    }
}

ext {
    expectedGradleVersion = '2.4'
    hibernateTargetVersion = '5.0.1-SNAPSHOT'

    osgiExportVersion = hibernateTargetVersion.replaceAll( '-SNAPSHOT', '.SNAPSHOT' )
}

idea {
    project {
		jdkName = '1.6'
		languageLevel = '1.6'

		vcs = 'Git'
    }
    module {
        name = "hibernate-orm"
    }
}

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
// Used in MANIFEST.MF for OSGi Bundles
def osgiDescription() {
	return "A module of the Hibernate O/RM project"
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

subprojects { subProject ->
    apply plugin: 'idea'
    apply plugin: 'eclipse'

    defaultTasks 'build'

    group = 'org.hibernate'
    version = rootProject.hibernateTargetVersion

    ext.exportPackageVersion = rootProject.osgiExportVersion

    // minimize changes, at least for now (gradle uses 'build' by default)..
    buildDir = "target"

	if ( subProject.name.startsWith( 'release' ) || subProject.name.startsWith( 'documentation' ) ) {
		return;
	}

	// everything below here in the closure applies to java projects
	apply plugin: 'java'
	apply plugin: 'maven-publish'
	apply plugin: 'maven-publish-auth'
	apply plugin: 'osgi'

	apply plugin: 'findbugs'
	apply plugin: 'checkstyle'
	apply plugin: 'build-dashboard'
	apply plugin: 'project-report'

	apply plugin: org.hibernate.build.HibernateBuildPlugin

	configurations {
		provided {
			// todo : need to make sure these are non-exported
			description = 'Non-exported compile-time dependencies.'
		}
		jbossLoggingTool {
			description = 'Dependencies for running the jboss-logging tooling.'
		}
		configurations {
			all*.exclude group: 'xml-apis', module: 'xml-apis'
		}
	}

	// appropriately inject the common dependencies into each sub-project
	dependencies {
		compile libraries.logging

		provided libraries.logging_annotations

		jbossLoggingTool( libraries.logging_processor )

		testCompile( libraries.junit )
		testCompile( libraries.byteman )
		testCompile( libraries.byteman_install )
		testCompile( libraries.byteman_bmunit )

		testRuntime( libraries.log4j )
		testRuntime( libraries.javassist )
		testRuntime( libraries.h2 )
		testRuntime( libraries.woodstox )

		// 6.6 gave me some NPE problems from within checkstyle...
		checkstyle 'com.puppycrawl.tools:checkstyle:6.5'
	}

	// mac-specific stuff ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// should really use Jvm.current().toolsJar
	ext.toolsJar = file("${System.getProperty('java.home')}/../lib/tools.jar")
	if ( ext.toolsJar.exists() ) {
		dependencies{
			testCompile files( toolsJar )
		}
	}
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	task compile
	compile.dependsOn compileJava, processResources, compileTestJava, processTestResources

	sourceSets.main {
		compileClasspath += configurations.provided
		compileClasspath += configurations.jbossLoggingTool
	}

	jar {
		manifest = osgiManifest {
			// GRADLE-1411: Even if we override Imports and Exports
			// auto-generation with instructions, classesDir and classpath
			// need to be here (temporarily).
			classesDir = sourceSets.main.output.classesDir
			classpath = configurations.runtime

			instruction 'Import-Package',
				// Temporarily support JTA 1.1 -- Karaf and other frameworks still
				// use it.  Without this, the plugin generates [1.2,2).
				'javax.transaction;version="[1.1,2)"',
				// Tell Gradle OSGi to still dynamically import the other packages.
				// IMPORTANT: Do not include the * in the modules' .gradle files.
				// If it exists more than once, the manifest will physically contain a *.
				'*'

			instruction 'Bundle-Vendor', 'Hibernate.org'
			instruction 'Bundle-Description', subProject.osgiDescription()
			instruction 'Implementation-Url', 'http://hibernate.org'
			instruction 'Implementation-Version', version
			instruction 'Implementation-Vendor', 'Hibernate.org'
			instruction 'Implementation-Vendor-Id', 'org.hibernate'
		}
	}

	test {
		systemProperties['hibernate.test.validatefailureexpected'] = true
		systemProperties += System.properties.findAll { it.key.startsWith( "hibernate.") }

//		beforeTest { descriptor ->
//			println "Starting test: " + descriptor
//		}

//		afterTest { descriptor ->
//			println "Completed test: " + descriptor
//		}
	}

	processTestResources.doLast( {
		copy {
			from( sourceSets.test.java.srcDirs ) {
				include '**/*.properties'
				include '**/*.xml'
			}
			into sourceSets.test.output.classesDir
		}
	} )

	idea {
		module {
			jdkName = javaTarget.version

			excludeDirs = [file( ".gradle" )]
			excludeDirs += file( "$buildDir/classes" )
			excludeDirs += file( "$buildDir/bundles" )
			excludeDirs += file( "$buildDir/packages" )
			excludeDirs += file( "$buildDir/dependency-cache" )
			excludeDirs += file( "$buildDir/libs" )
			excludeDirs += file( "$buildDir/reports" )
			excludeDirs += file( "$buildDir/test-results" )
			excludeDirs += file( "$buildDir/tmp" )
			excludeDirs += file( "$buildDir/matrix" )
			excludeDirs += file( "$buildDir/resources" )

			downloadSources = true
			scopes.PROVIDED.plus += [configurations.provided]
		}
	}

	eclipse {
		jdt {
			sourceCompatibility = javaTarget.version
			targetCompatibility = javaTarget.version
		}
		classpath {
			plusConfigurations.add( configurations.provided )
		}
	}

	// eclipseClasspath will not add sources to classpath unless the dirs actually exist.
	// TODO: Eclipse's annotation processor handling is also fairly stupid (and completely lacks in the
	// Gradle plugin).  For now, just compile first in order to get the logging classes.
	eclipseClasspath.dependsOn compile


	// Report configs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	checkstyle {
		sourceSets = [ subProject.sourceSets.main ]
		configFile = rootProject.file( 'shared/config/checkstyle/checkstyle.xml' )
		showViolations = false
	}
	// exclude generated java sources - by explicitly setting the base source dir
	checkstyleMain.source = 'src/main/java'

	findbugs {
		sourceSets = [ subProject.sourceSets.main, subProject.sourceSets.test ]
		ignoreFailures = true
		toolVersion = '3.0.1'
		// for now we need to set this to low so that FindBugs will actually report the DM_CONVERT_CASE warning we care about
		reportLevel = 'low'
		// remove all low level bug warnings except DM_CONVERT_CASE
		excludeFilterConfig=resources.text.fromString(excludeAllLowLevelBugsExcept('DM_CONVERT_CASE'))
	}

	// exclude generated java sources and cfg package is a mess mainly from annotation stuff
	findbugsMain.doFirst {
		classes = classes.filter {
			!it.path.contains( 'org/hibernate/hql/internal/antlr' ) &&
					!it.path.contains( 'org/hibernate/boot/jaxb/cfg/spi' ) &&
					!it.path.contains( 'org/hibernate/sql/ordering/antlr/Generated' ) &&
					!it.path.contains( 'org/hibernate/sql/ordering/antlr/OrderByTemplateTokenTypes' ) &&
					!it.path.contains( 'org/hibernate/boot/jaxb/hbm/spi/Jaxb' ) &&
					!it.path.contains( 'org/hibernate/boot/jaxb/hbm/spi/Adapter' ) &&
					!it.path.contains( 'org/hibernate/boot/jaxb/hbm/spi/ObjectFactory' ) &&
					!it.path.contains( 'org/hibernate/cfg' ) &&
					!it.path.contains( '_\$logger' )
		}
	}

		// because cfg package is a mess mainly from annotation stuff
	checkstyleMain.exclude '**/org/hibernate/cfg/**'
	checkstyleMain.exclude '**/org/hibernate/cfg/*'
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


	publishing {
		publications {
			mavenJava(MavenPublication) {
				from components.java

				artifact( sourcesJar ) {
					classifier 'sources'
				}
			}
			// http://issues.gradle.org/browse/GRADLE-2966
			// Once ^^ is resolved:
			//		1) Move hibernate-testing module into hibernate-core tests
			//		2) Define a second publication on hibernate-core for publishing the testing jar
			// We could kind of do this now, but it would just be the jar.  Every module would still need
			// to duplicate the testing dependencies.  Well, on second thought, we could centralize the
			// testing dependencies here within the subprojects block
		}
	}

	model {
		tasks.generatePomFileForMavenJavaPublication {
			destination = file( "$subProject.buildDir/generated-pom.xml" )
		}
	}

	task sourcesJar(type: Jar, dependsOn: compileJava) {
		from sourceSets.main.allSource
		classifier = 'sources'
	}
}

task release(type: Task, dependsOn: 'release:release')

task wrapper(type: Wrapper) {
    gradleVersion = expectedGradleVersion
}

def excludeAllLowLevelBugsExcept(String[] bugTypes){
	def writer = new StringWriter()
	def xml = new groovy.xml.MarkupBuilder(writer);
	xml.FindBugsFilter {
		Match {
			Confidence( value: '3' )
			bugTypes.each { bug ->
				Not {
					Bug( pattern: "${bug}" )
				}
			}
		}
	}
	return writer.toString(  )
}