From 8b350a874d8e1fa88b3785b8504a0e16f107a450 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Wed, 10 Jul 2013 11:33:07 -0500 Subject: [PATCH] Convert to Gradle This commit converts the build to a Gradle based build. It also setup sonar integration at https://sonar.springsource.org/dashboard/index/11620 Currently tests in the samples fail on the CI server and are disabled. The tests were not enabled for the maven based build either. Issue: LDAP-251 --- build.gradle | 151 +++++++++ core-tiger/build.gradle | 8 + core/.gitignore | 3 + core/build.gradle | 20 ++ core/javacc.gradle | 59 ++++ gradle.properties | 1 + gradle/java-module.gradle | 64 ++++ gradle/java.gradle | 19 ++ gradle/maven-deployment.gradle | 87 +++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 50527 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 ++++++++++ gradlew.bat | 90 ++++++ ldif/ldif-batch/build.gradle | 10 + ldif/ldif-core/build.gradle | 10 + odm/build.gradle | 22 ++ .../ldap/odm/test/TestsWithJdepend.java | 2 +- samples/article-spring20/build.gradle | 25 ++ samples/article-spring30/build.gradle | 23 ++ samples/article/build.gradle | 17 + samples/demos/demo-tiger/build.gradle | 12 + samples/demos/demo/build.gradle | 12 + samples/samples-utils/build.gradle | 11 + samples/simple-odm/build.gradle | 14 + sandbox/build.gradle | 11 + settings.gradle | 31 ++ .../images/NamingException.png | Bin src/docbkx/{resources => }/images/banner4.jpg | Bin src/docbkx/{resources => }/images/bannerR.gif | Bin src/docbkx/{resources => }/images/logo.png | Bin .../images/package-dependencies.png | Bin .../{resources => }/images/s2_box_logo.png | Bin .../images/xdev-spring_logo.jpg | Bin src/docbkx/resources/css/html.css | 303 ------------------ test-support/build.gradle | 22 ++ test/integration-tests-openldap/build.gradle | 19 ++ test/integration-tests-sunone/build.gradle | 19 ++ test/integration-tests/build.gradle | 21 ++ 38 files changed, 952 insertions(+), 304 deletions(-) create mode 100644 build.gradle create mode 100644 core-tiger/build.gradle create mode 100644 core/build.gradle create mode 100644 core/javacc.gradle create mode 100644 gradle.properties create mode 100644 gradle/java-module.gradle create mode 100644 gradle/java.gradle create mode 100644 gradle/maven-deployment.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 ldif/ldif-batch/build.gradle create mode 100644 ldif/ldif-core/build.gradle create mode 100644 odm/build.gradle create mode 100644 samples/article-spring20/build.gradle create mode 100644 samples/article-spring30/build.gradle create mode 100644 samples/article/build.gradle create mode 100644 samples/demos/demo-tiger/build.gradle create mode 100644 samples/demos/demo/build.gradle create mode 100644 samples/samples-utils/build.gradle create mode 100644 samples/simple-odm/build.gradle create mode 100644 sandbox/build.gradle create mode 100644 settings.gradle rename src/docbkx/{resources => }/images/NamingException.png (100%) rename src/docbkx/{resources => }/images/banner4.jpg (100%) rename src/docbkx/{resources => }/images/bannerR.gif (100%) rename src/docbkx/{resources => }/images/logo.png (100%) rename src/docbkx/{resources => }/images/package-dependencies.png (100%) rename src/docbkx/{resources => }/images/s2_box_logo.png (100%) rename src/docbkx/{resources => }/images/xdev-spring_logo.jpg (100%) delete mode 100644 src/docbkx/resources/css/html.css create mode 100644 test-support/build.gradle create mode 100644 test/integration-tests-openldap/build.gradle create mode 100644 test/integration-tests-sunone/build.gradle create mode 100644 test/integration-tests/build.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..136f2b7f --- /dev/null +++ b/build.gradle @@ -0,0 +1,151 @@ +buildscript { + repositories { + maven { url "http://repo.springsource.org/plugins-release" } + } + dependencies { + classpath("org.springframework.build.gradle:propdeps-plugin:0.0.3") + classpath("org.springframework.build.gradle:docbook-reference-plugin:0.2.6") + } +} + +apply plugin: "docbook-reference" +apply plugin: "sonar-runner" + +ext.GRADLE_SCRIPT_DIR = "${rootProject.projectDir}/gradle" +ext.JAVA_MODULE_SCRIPT = "${GRADLE_SCRIPT_DIR}/java-module.gradle" +ext.MAVEN_DEPLOYMENT_SCRIPT = "${GRADLE_SCRIPT_DIR}/maven-deployment.gradle" +ext.JAVA_SCRIPT = "${GRADLE_SCRIPT_DIR}/java.gradle" + +ext.coreModules = subprojects.findAll { p-> (!p.name.contains("test") && !p.name.contains("sample")) || p.name == "spring-ldap-test" } + +configure(allprojects) { + apply plugin: 'eclipse' + apply plugin: 'idea' + apply plugin: 'java' + + group = "org.springframework.ldap" + + ext.javadocLinks = [ + "http://download.oracle.com/javase/1.5.0/docs/api", + "http://static.springframework.org/spring/docs/3.0.x/api/", + "http://logging.apache.org/log4j/1.2/apidocs/", + "http://commons.apache.org/logging/apidocs/", + "http://commons.apache.org/dbcp/apidocs/", + "http://commons.apache.org/pool/apidocs/", + "http://junit.sourceforge.net/javadoc/", + ] as String[] +} + +configure(coreModules) { + apply from: JAVA_MODULE_SCRIPT +} + +configure(subprojects - coreModules) { + sonarRunner { + skipProject = true + } + test.enabled = false +} + +description = "Spring LDAP" + +configurations.archives.artifacts.clear() + +sonarRunner { + sonarProperties { + property "sonar.java.coveragePlugin", "jacoco" + property "sonar.jacoco.reportPath", "${buildDir.name}/jacoco.exec" + property "sonar.links.homepage", 'https://github.com/SpringSource/spring-ldap' + property "sonar.links.ci", 'https://build.springsource.org/browse/LDAP-1.3.x' + property "sonar.links.issue", 'https://jira.springsource.org/browse/LDAP' + property "sonar.links.scm", 'https://github.com/SpringSource/spring-ldap' + property "sonar.links.scm_dev", 'https://github.com/SpringSource/spring-ldap.git' + property "sonar.java.coveragePlugin", "jacoco" + } +} + +reference { + sourceDir = file("src/docbkx") + pdfFilename = "spring-ldap-reference.pdf" +} + +task api(type: Javadoc) { + group = "Documentation" + description = "Generates aggregated Javadoc API documentation." + title = "${rootProject.description} ${version} API" + + options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED + options.author = true + options.header = rootProject.description + options.splitIndex = true + options.links(project.ext.javadocLinks) + + maxMemory = "1024m" + destinationDir = new File(buildDir, "api") + + source coreModules*.javadoc*.source + classpath = files(coreModules*.javadoc*.classpath) +} + +task docsZip(type: Zip) { + group = "Distribution" + baseName = "spring-ldap" + classifier = "docs" + description = "Builds -${classifier} archive containing api and reference " + + "for deployment at http://static.springframework.org/spring-ldap/docs." + + from("src/dist") { + include "changelog.txt" + } + + from (api) { + into "javadoc-api" + } + + from (reference) { + into "spring-ldap-reference" + } +} + + +task distZip(type: Zip, dependsOn: [docsZip]) { + dependsOn subprojects*.tasks*.matching { task -> task.name == 'assemble' } + + group = "Distribution" + baseName = "spring-ldap" + classifier = "dist" + description = "Builds -${classifier} archive, containing all jars and docs, " + + "suitable for community download page." + + ext.baseDir = "${baseName}-${project.version}" + + + from("src/dist") { + include "readme.txt" + include "license.txt" + include "notice.txt" + into "${baseDir}" + expand(copyright: new Date().format("yyyy"), version: project.version) + } + + from(zipTree(docsZip.archivePath)) { + into "${baseDir}/docs" + } + + coreModules.each { subproject -> + into ("${baseDir}/libs") { + from subproject.jar + if (subproject.tasks.findByPath("sourcesJar")) { + from subproject.sourcesJar + } + if (subproject.tasks.findByPath("javadocJar")) { + from subproject.javadocJar + } + } + } +} + +artifacts { + archives docsZip + archives distZip +} \ No newline at end of file diff --git a/core-tiger/build.gradle b/core-tiger/build.gradle new file mode 100644 index 00000000..ee4c24d0 --- /dev/null +++ b/core-tiger/build.gradle @@ -0,0 +1,8 @@ + +dependencies { + compile project(":spring-ldap-core"), + "org.springframework:spring-tx:$springVersion" + + testCompile "junit:junit:$junitVersion", + "org.easymock:easymock:2.5.1" +} \ No newline at end of file diff --git a/core/.gitignore b/core/.gitignore index 73df60d8..5a415516 100644 --- a/core/.gitignore +++ b/core/.gitignore @@ -2,3 +2,6 @@ target .classpath .project .settings +.gradle +bin +build \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 00000000..89049871 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,20 @@ +apply from: 'javacc.gradle' + +dependencies { + compile "commons-logging:commons-logging:$commonsLoggingVersion", + "commons-lang:commons-lang:$commonsLangVersion", + "org.springframework:spring-core:$springVersion", + "org.springframework:spring-beans:$springVersion", + "org.springframework:spring-tx:$springVersion" + + provided "commons-pool:commons-pool:$commonsPoolVersion", + "com.sun:ldapbp:1.0", + "org.springframework:spring-context:$springVersion", + "org.springframework:spring-jdbc:$springVersion", + "org.springframework:spring-orm:$springVersion" + + testCompile "junit:junit:$junitVersion", + "easymock:easymock:$easyMockVersion", + "gsbase:gsbase:$gsbaseVersion" +} + diff --git a/core/javacc.gradle b/core/javacc.gradle new file mode 100644 index 00000000..8b27b5fc --- /dev/null +++ b/core/javacc.gradle @@ -0,0 +1,59 @@ + +task downloadJavacc { + ext.file = "javacc-5.0.tar.gz" + ext.dest = file("$buildDir/javacc/$file") + ext.url = "https://java.net/downloads/javacc/$file" + + outputs.file dest + + doLast { + dest.parentFile.mkdirs() + new URL(url).withInputStream{ i -> dest.withOutputStream{ it << i }} + } +} + +task installJavacc(type:Copy,dependsOn:downloadJavacc) { + ext.archive = downloadJavacc.dest + ext.javaccHome = file("$buildDir/javacc/") + + inputs.file archive + outputs.dir javaccHome + + if(archive.name.endsWith('.zip')) { + from zipTree(archive) + } else { + from tarTree(archive) + } + into javaccHome +} + +task javacc(dependsOn:installJavacc) { + ext.srcFile = file("src/main/javacc/DnParserImpl.jj") + ext.srcDestDir = file("$buildDir/generated-src/javacc") + ext.destDir = file("$srcDestDir/org/springframework/ldap/core") + ext.homeDir = file("${installJavacc.javaccHome.path}/javacc-5.0") + + inputs.file srcFile + outputs.dir destDir + + doLast { + destDir.mkdirs() + ant.javacc (target:"src/main/javacc/DnParserImpl.jj", outputdirectory : destDir, javacchome: homeDir) + } +} + +sourceSets { + main { + java { + srcDir project.javacc.srcDestDir + } + } +} + +sourcesJar { + from javacc.srcDestDir + include "**/*.java" +} + +sourcesJar.dependsOn javacc +compileJava.dependsOn javacc \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..f00d4a2c --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +version=1.3.2.CI-SNAPSHOT \ No newline at end of file diff --git a/gradle/java-module.gradle b/gradle/java-module.gradle new file mode 100644 index 00000000..625b2d77 --- /dev/null +++ b/gradle/java-module.gradle @@ -0,0 +1,64 @@ +apply from: JAVA_SCRIPT +apply from: MAVEN_DEPLOYMENT_SCRIPT + +configurations { + jacoco //Configuration Group used by Sonar to provide Code Coverage using JaCoCo +} + +dependencies { + jacoco group: "org.jacoco", name: "org.jacoco.agent", version: "0.6.2.201302030002", classifier: "runtime" +} + +test { + jvmArgs "-javaagent:${configurations.jacoco.asPath}=destfile=${buildDir}/jacoco.exec,includes=${project.group}.*" +} + +jar { + manifest.attributes["Created-By"] = + "${System.getProperty("java.version")} (${System.getProperty("java.specification.vendor")})" + manifest.attributes["Implementation-Title"] = project.name + manifest.attributes["Implementation-Version"] = project.version + + from("${rootProject.projectDir}/src/dist") { + include "license.txt" + include "notice.txt" + into "META-INF" + expand(copyright: new Date().format("yyyy"), version: project.version) + } +} + +javadoc { + description = "Generates project-level javadoc for use in -javadoc jar" + + options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED + options.author = true + options.header = project.name + options.links(project.ext.javadocLinks) + + // suppress warnings due to cross-module @see and @link references; + // note that global 'api' task does display all warnings. + logging.captureStandardError LogLevel.INFO + logging.captureStandardOutput LogLevel.INFO // suppress "## warnings" message +} + +task sourcesJar(type: Jar, dependsOn:classes) { + description = "Generates the -sources.jar" + + classifier = "sources" + from sourceSets.main.allJava.srcDirs + include "**/*.java", "**/*.aj" +} +assemble.dependsOn sourcesJar + +task javadocJar(type: Jar) { + description = "Generates the -javadoc.jar" + + classifier = "javadoc" + from javadoc +} +assemble.dependsOn javadocJar + +artifacts { + archives sourcesJar + archives javadocJar +} \ No newline at end of file diff --git a/gradle/java.gradle b/gradle/java.gradle new file mode 100644 index 00000000..ad1fbbee --- /dev/null +++ b/gradle/java.gradle @@ -0,0 +1,19 @@ +apply plugin: 'java' +apply plugin: 'propdeps' + +sourceCompatibility = '1.5' +targetCompatibility = '1.5' + +ext.springVersion = '3.0.5.RELEASE' +ext.springBatchVersion = '2.0.3.RELEASE' +ext.junitVersion = '4.8.2' +ext.commonsPoolVersion = '1.5.4' +ext.commonsLangVersion = '2.4' +ext.commonsLoggingVersion = '1.0.4' +ext.easyMockVersion = '1.2_Java1.3' +ext.gsbaseVersion = '2.0.1' +ext.log4jVersion = '1.2.9' + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/gradle/maven-deployment.gradle b/gradle/maven-deployment.gradle new file mode 100644 index 00000000..d9319d62 --- /dev/null +++ b/gradle/maven-deployment.gradle @@ -0,0 +1,87 @@ +apply plugin: 'maven' + +install { + customizePom(repositories.mavenInstaller.pom, project) +} + +def customizePom(pom, gradleProject) { + pom.project { + name = gradleProject.name + description = gradleProject.name + url = 'http://www.springframework.org/ldap' + organization { + name = 'SpringSource' + url = 'http://springsource.org/' + } + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + distribution 'repo' + } + } + scm { + url = 'https://github.com/SpringSource/spring-ldap' + connection = 'scm:git:git://github.com/SpringSource/spring-ldap' + developerConnection = 'scm:git:git://github.com/SpringSource/spring-ldap' + } + developers { + developer { + id = 'rwinch' + name = 'Rob Winch' + email = 'rwinch@gopivotal.com' + } + developer { + id = "marthursson" + name = "Mattias Hellborg Arthursson" + email = "mattias.arthursson@jayway.com" + organization = "Jayway" + organizationUrl = "http://www.jayway.co" + } + developer { + id = "ulsa" + name = "Ulrik Sandberg" + email = "ulrik.sandberg@jayway.com" + organization = "Jayway" + organizationUrl = "http://www.jayway.co" + } + } + contributors { + contributor { + name = "Eric Dalquist" + } + contributor { + name = "Marius Scurtescu" + } + contributor { + name = "Tim Terry" + } + contributor { + name = "Keith Barlow" + } + contributor { + name = "Paul Harvey" + } + contributor { + name = "Marvin S. Addison" + } + } + } +} + +task generatePom { + group = 'Build' + description = 'Generates the Maven pom.xml' + + ext.generatedPomFileName = 'pom.xml' + + inputs.files('**/*.gradle') + outputs.files(generatedPomFileName) + + doLast() { + def p = pom {} + customizePom(p, project) + p.writeTo(generatedPomFileName) + } + +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..903401eae8e56edb0474688817d28d4418f3b7cd GIT binary patch literal 50527 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 rZrKB^FHi%;4g( \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..bbc4099e --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS=-Xmx1024M -XX:MaxPermSize=256M + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/ldif/ldif-batch/build.gradle b/ldif/ldif-batch/build.gradle new file mode 100644 index 00000000..0f7e8cb3 --- /dev/null +++ b/ldif/ldif-batch/build.gradle @@ -0,0 +1,10 @@ + +dependencies { + compile project(':spring-ldap-ldif-core'), + "org.springframework.batch:spring-batch-core:$springBatchVersion", + "org.springframework.batch:spring-batch-infrastructure:$springBatchVersion" + + + testCompile "junit:junit:$junitVersion", + "org.springframework.batch:spring-batch-test:$springBatchVersion" +} \ No newline at end of file diff --git a/ldif/ldif-core/build.gradle b/ldif/ldif-core/build.gradle new file mode 100644 index 00000000..f7954759 --- /dev/null +++ b/ldif/ldif-core/build.gradle @@ -0,0 +1,10 @@ + +dependencies { + compile project(":spring-ldap-core"), + "commons-lang:commons-lang:$commonsLangVersion", + "org.springframework.batch:spring-batch-core:$springBatchVersion", + "org.springframework.batch:spring-batch-infrastructure:$springBatchVersion" + + testCompile "junit:junit:$junitVersion", + "log4j:log4j:$log4jVersion" +} \ No newline at end of file diff --git a/odm/build.gradle b/odm/build.gradle new file mode 100644 index 00000000..8de817f8 --- /dev/null +++ b/odm/build.gradle @@ -0,0 +1,22 @@ + +dependencies { + compile project(":spring-ldap-core"), + project(":spring-ldap-core-tiger"), + "org.springframework:spring-core:$springVersion", + "org.freemarker:freemarker:2.3.9", + "commons-logging:commons-logging:$commonsLoggingVersion", + "commons-lang:commons-lang:$commonsLangVersion", + "commons-cli:commons-cli:1.2" + + runtime "org.springframework:spring-context:$springVersion" + + provided "commons-pool:commons-pool:$commonsPoolVersion", + "com.sun:ldapbp:1.0", + "org.springframework:spring-context:$springVersion", + "org.springframework:spring-jdbc:$springVersion", + "org.springframework:spring-orm:$springVersion" + + testCompile project(":spring-ldap-test"), + "junit:junit:$junitVersion", + "jdepend:jdepend:2.9.1" +} \ No newline at end of file diff --git a/odm/src/test/java/org/springframework/ldap/odm/test/TestsWithJdepend.java b/odm/src/test/java/org/springframework/ldap/odm/test/TestsWithJdepend.java index 82920860..a2a9f9e6 100755 --- a/odm/src/test/java/org/springframework/ldap/odm/test/TestsWithJdepend.java +++ b/odm/src/test/java/org/springframework/ldap/odm/test/TestsWithJdepend.java @@ -15,7 +15,7 @@ public class TestsWithJdepend { @Before public void setUp() throws IOException { jdepend = new JDepend(); - jdepend.addDirectory("target/classes"); + jdepend.addDirectory("build/classes/main"); } @Test diff --git a/samples/article-spring20/build.gradle b/samples/article-spring20/build.gradle new file mode 100644 index 00000000..ec0b0f80 --- /dev/null +++ b/samples/article-spring20/build.gradle @@ -0,0 +1,25 @@ +apply from: JAVA_SCRIPT +apply plugin: 'war' +apply plugin: 'jetty' + +ext.springVersion = "2.0.8" + +dependencies { + compile project(':spring-ldap-test'), + project(':spring-ldap-samples-utils'), + 'log4j:log4j:1.2.9', + 'javax.servlet:jstl:1.2', + "org.springframework:spring-beans:$springVersion", + "org.springframework:spring-core:$springVersion", + "org.springframework:spring-dao:$springVersion", + "org.springframework:spring-jdbc:$springVersion", + "org.springframework:spring-context:$springVersion", + "org.springframework:spring-web:$springVersion", + "org.springframework:spring-webmvc:$springVersion", + "org.springframework:spring-support:$springVersion" + + provided "javax.servlet:servlet-api:2.5" + + testCompile "org.springframework:spring-mock:$springVersion", + "junit:junit:$junitVersion" +} \ No newline at end of file diff --git a/samples/article-spring30/build.gradle b/samples/article-spring30/build.gradle new file mode 100644 index 00000000..c8f8cc73 --- /dev/null +++ b/samples/article-spring30/build.gradle @@ -0,0 +1,23 @@ +apply from: JAVA_SCRIPT +apply plugin: 'war' +apply plugin: 'jetty' + +dependencies { + compile project(':spring-ldap-test'), + project(':spring-ldap-samples-utils'), + 'log4j:log4j:1.2.9', + 'javax.servlet:jstl:1.2', + "org.springframework:spring-beans:$springVersion", + "org.springframework:spring-core:$springVersion", + "org.springframework:spring-tx:$springVersion", + "org.springframework:spring-jdbc:$springVersion", + "org.springframework:spring-context:$springVersion", + "org.springframework:spring-web:$springVersion", + "org.springframework:spring-webmvc:$springVersion", + "org.springframework:spring-aop:$springVersion" + + provided "javax.servlet:servlet-api:2.5" + + testCompile "org.springframework:spring-test:$springVersion", + "junit:junit:$junitVersion" +} \ No newline at end of file diff --git a/samples/article/build.gradle b/samples/article/build.gradle new file mode 100644 index 00000000..7dc020bc --- /dev/null +++ b/samples/article/build.gradle @@ -0,0 +1,17 @@ +apply from: JAVA_SCRIPT +apply plugin: 'war' +apply plugin: 'jetty' + +dependencies { + compile project(':spring-ldap-test'), + project(':spring-ldap-samples-utils'), + 'log4j:log4j:1.2.9', + 'javax.servlet:jstl:1.2', + "org.springframework:spring-context:$springVersion", + "org.springframework:spring-webmvc:$springVersion" + + provided "javax.servlet:servlet-api:2.5" + + testCompile "org.springframework:spring-test:$springVersion", + "junit:junit:$junitVersion" +} \ No newline at end of file diff --git a/samples/demos/demo-tiger/build.gradle b/samples/demos/demo-tiger/build.gradle new file mode 100644 index 00000000..9c304490 --- /dev/null +++ b/samples/demos/demo-tiger/build.gradle @@ -0,0 +1,12 @@ +apply from: JAVA_SCRIPT + +description = "Example code for demonstrating the process of refactoring from plain JNDI to Spring LDAP (Java 5)." + +dependencies { + compile project(':spring-ldap-test'), + project(':spring-ldap-core-tiger'), + "org.springframework:spring-context:$springVersion" + + testCompile "org.springframework:spring-test:$springVersion", + "junit:junit:$junitVersion" +} \ No newline at end of file diff --git a/samples/demos/demo/build.gradle b/samples/demos/demo/build.gradle new file mode 100644 index 00000000..3019d9e9 --- /dev/null +++ b/samples/demos/demo/build.gradle @@ -0,0 +1,12 @@ +apply from: JAVA_SCRIPT + +description = "Example code for demonstrating the process of refactoring from plain JNDI to Spring LDAP (Java 1.4)." + +dependencies { + compile project(':spring-ldap-test'), + project(':spring-ldap-core'), + "org.springframework:spring-context:$springVersion" + + testCompile "org.springframework:spring-test:$springVersion", + "junit:junit:$junitVersion" +} \ No newline at end of file diff --git a/samples/samples-utils/build.gradle b/samples/samples-utils/build.gradle new file mode 100644 index 00000000..5ee07cf9 --- /dev/null +++ b/samples/samples-utils/build.gradle @@ -0,0 +1,11 @@ +apply from: JAVA_SCRIPT + +dependencies { + compile project(':spring-ldap-core-tiger'), + project(':spring-ldap-test') + + testCompile "org.springframework:spring-test:$springVersion", + "junit:junit:$junitVersion" +} + +test.enabled = false // FIXME this needs to be enabled, but fails since no LDAP server is started \ No newline at end of file diff --git a/samples/simple-odm/build.gradle b/samples/simple-odm/build.gradle new file mode 100644 index 00000000..b7a6d26f --- /dev/null +++ b/samples/simple-odm/build.gradle @@ -0,0 +1,14 @@ +apply from: JAVA_SCRIPT + +dependencies { + compile project(":spring-ldap-core"), + project(":spring-ldap-odm"), + "org.springframework:spring-core:$springVersion", + "org.springframework:spring-context:$springVersion", + "commons-pool:commons-pool:$commonsPoolVersion" + + runtime "log4j:log4j:$log4jVersion" + + testCompile project(":spring-ldap-test"), + "junit:junit:$junitVersion" +} \ No newline at end of file diff --git a/sandbox/build.gradle b/sandbox/build.gradle new file mode 100644 index 00000000..9edde414 --- /dev/null +++ b/sandbox/build.gradle @@ -0,0 +1,11 @@ +apply from: JAVA_SCRIPT + +dependencies { + compile project(":spring-ldap-core") + + provided "com.sun:ldapbp:1.0" + + testCompile "junit:junit:$junitVersion", + "easymock:easymock:$easyMockVersion", + "gsbase:gsbase:$gsbaseVersion" +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..f60e1219 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,31 @@ +rootProject.name = 'spring-ldap' + +include 'core' +include 'core-tiger' +include 'ldif/ldif-batch' +include 'ldif/ldif-core' +include 'odm' +include 'sandbox' +include 'samples/article' +include 'samples/article-spring20' +include 'samples/article-spring30' +include 'samples/demos/demo' +include 'samples/demos/demo-tiger' +include 'samples/samples-utils' +include 'samples/simple-odm' +include 'test/integration-tests' +include 'test/integration-tests-openldap' +include 'test/integration-tests-sunone' +include 'test-support' + +rootProject.children.each { p-> + def name = p.name + def isSample = name.contains("sample") + name = name.replaceFirst(".*?/","") + if(isSample && !name.contains("sample")) { + name += "-sample" + } + p.name = "spring-ldap-" + name +} + +findProject(":spring-ldap-test-support").name = "spring-ldap-test" \ No newline at end of file diff --git a/src/docbkx/resources/images/NamingException.png b/src/docbkx/images/NamingException.png similarity index 100% rename from src/docbkx/resources/images/NamingException.png rename to src/docbkx/images/NamingException.png diff --git a/src/docbkx/resources/images/banner4.jpg b/src/docbkx/images/banner4.jpg similarity index 100% rename from src/docbkx/resources/images/banner4.jpg rename to src/docbkx/images/banner4.jpg diff --git a/src/docbkx/resources/images/bannerR.gif b/src/docbkx/images/bannerR.gif similarity index 100% rename from src/docbkx/resources/images/bannerR.gif rename to src/docbkx/images/bannerR.gif diff --git a/src/docbkx/resources/images/logo.png b/src/docbkx/images/logo.png similarity index 100% rename from src/docbkx/resources/images/logo.png rename to src/docbkx/images/logo.png diff --git a/src/docbkx/resources/images/package-dependencies.png b/src/docbkx/images/package-dependencies.png similarity index 100% rename from src/docbkx/resources/images/package-dependencies.png rename to src/docbkx/images/package-dependencies.png diff --git a/src/docbkx/resources/images/s2_box_logo.png b/src/docbkx/images/s2_box_logo.png similarity index 100% rename from src/docbkx/resources/images/s2_box_logo.png rename to src/docbkx/images/s2_box_logo.png diff --git a/src/docbkx/resources/images/xdev-spring_logo.jpg b/src/docbkx/images/xdev-spring_logo.jpg similarity index 100% rename from src/docbkx/resources/images/xdev-spring_logo.jpg rename to src/docbkx/images/xdev-spring_logo.jpg diff --git a/src/docbkx/resources/css/html.css b/src/docbkx/resources/css/html.css deleted file mode 100644 index 4669bbd3..00000000 --- a/src/docbkx/resources/css/html.css +++ /dev/null @@ -1,303 +0,0 @@ -body { - text-align: justify; - margin-right: 2em; - margin-left: 2em; -} - -a, -a[accesskey^="h"], -a[accesskey^="n"], -a[accesskey^="u"], -a[accesskey^="p"] { - font-family: Verdana, Arial, helvetica, sans-serif; - font-size: 12px; - color: #003399; -} - -a:active { - color: #003399; -} - -a:visited { - color: #888888; -} - -p { - font-family: Verdana, Arial, sans-serif; -} - -dt { - font-family: Verdana, Arial, sans-serif; - font-size: 12px; -} - -p, dl, dt, dd, blockquote { - color: #000000; - margin-bottom: 3px; - margin-top: 3px; - padding-top: 0; -} - -ol, ul, p { - margin-top: 6px; - margin-bottom: 6px; -} - -p, blockquote { - font-size: 90%; -} - -p.releaseinfo { - font-size: 100%; - font-weight: bold; - font-family: Verdana, Arial, helvetica, sans-serif; - padding-top: 10px; -} - -p.pubdate { - font-size: 120%; - font-weight: bold; - font-family: Verdana, Arial, helvetica, sans-serif; -} - -td { - font-size: 80%; -} - -td, th, span { - color: #000000; -} - -td[width^="40%"] { - font-family: Verdana, Arial, helvetica, sans-serif; - font-size: 12px; - color: #003399; -} - -table[summary^="Navigation header"] tbody tr th[colspan^="3"] { - font-family: Verdana, Arial, helvetica, sans-serif; -} - -blockquote { - margin-right: 0; -} - -h1, h2, h3, h4, h6 { - color: #000000; - font-weight: 500; - margin-top: 0; - padding-top: 14px; - font-family: Verdana, Arial, helvetica, sans-serif; - margin-bottom: 0; -} - -h2.title { - font-weight: 800; - margin-bottom: 8px; -} - -h2.subtitle { - font-weight: 800; - margin-bottom: 20px; -} - -.firstname, .surname { - font-size: 12px; - font-family: Verdana, Arial, helvetica, sans-serif; -} - -table { - border-collapse: collapse; - border-spacing: 0; - border: 1px black; - empty-cells: hide; - margin: 10px 0 30px 50px; - width: 90%; -} - -div.table { - margin: 30px 0 10px 0; - border: 1px dashed gray; - padding: 10px; -} - -div .table-contents table { - border: 1px solid black; -} - -div.table > p.title { - padding-left: 10px; -} - -table[summary^="Navigation footer"] { - border-collapse: collapse; - border-spacing: 0; - border: 1px black; - empty-cells: hide; - margin: 0px; - width: 100%; -} - -table[summary^="Note"], -table[summary^="Warning"], -table[summary^="Tip"] { - border-collapse: collapse; - border-spacing: 0; - border: 1px black; - empty-cells: hide; - margin: 10px 0px 10px -20px; - width: 100%; -} - -td { - padding: 4pt; - font-family: Verdana, Arial, helvetica, sans-serif; -} - -div.warning TD { - text-align: justify; -} - -h1 { - font-size: 150%; -} - -h2 { - font-size: 110%; -} - -h3 { - font-size: 100%; font-weight: bold; -} - -h4 { - font-size: 90%; font-weight: bold; -} - -h5 { - font-size: 90%; font-style: italic; -} - -h6 { - font-size: 100%; font-style: italic; -} - -tt { - font-size: 110%; - font-family: "Courier New", Courier, monospace; - color: #000000; -} - -.navheader, .navfooter { - border: none; -} - -div.navfooter table { - border-style: dashed; - border-color: gray; - border-width: 1px 1px 1px 1px; - background-color: #cde48d; -} - -pre { - font-size: 110%; - padding: 5px; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC; - background-color: #f3f5e9; -} - -ul, ol, li { - list-style: disc; -} - -hr { - width: 100%; - height: 1px; - background-color: #CCCCCC; - border-width: 0; - padding: 0; -} - -.variablelist { - padding-top: 10px; - padding-bottom: 10px; - margin: 0; -} - -.term { - font-weight:bold; -} - -.mediaobject { - padding-top: 30px; - padding-bottom: 30px; -} - -.legalnotice { - font-family: Verdana, Arial, helvetica, sans-serif; - font-size: 12px; - font-style: italic; -} - -.sidebar { - float: right; - margin: 10px 0 10px 30px; - padding: 10px 20px 20px 20px; - width: 33%; - border: 1px solid black; - background-color: #F4F4F4; - font-size: 14px; -} - -.property { - font-family: "Courier New", Courier, monospace; -} - -a code { - font-family: Verdana, Arial, monospace; - font-size: 12px; -} - -td code { - font-size: 110%; -} - -div.note * td, -div.tip * td, -div.warning * td, -div.calloutlist * td { - text-align: justify; - font-size: 100%; -} - -.programlisting { - clear: both; -} - -.programlisting .interfacename, -.programlisting .literal, -.programlisting .classname { - font-size: 95%; -} - -.title .interfacename, -.title .literal, -.title .classname { - font-size: 130%; -} - -/* everything in a is displayed in a coloured, comment-like font */ -.programlisting * .lineannotation, -.programlisting * .lineannotation * { - color: green; -} - -.question * p { - font-size: 100%; -} - -.answer * p { - font-size: 100%; -} diff --git a/test-support/build.gradle b/test-support/build.gradle new file mode 100644 index 00000000..146fee55 --- /dev/null +++ b/test-support/build.gradle @@ -0,0 +1,22 @@ + +dependencies { + compile project(":spring-ldap-core"), + "com.google.code.typica:typica:1.3", + "commons-io:commons-io:1.4", + "javax.xml:jsr173:1.0", + "javax.activation:activation:1.1", + "javax.xml.bind:jaxb-api:2.1", + "javax.xml:jaxb-impl:2.1", + "org.springframework:spring-core:$springVersion", + "org.springframework:spring-beans:$springVersion", + "org.springframework:spring-context:$springVersion", + "org.springframework:spring-test:$springVersion", + "log4j:log4j:$log4jVersion", + "org.slf4j:slf4j-log4j12:1.0.1" + + compile("org.apache.directory.server:apacheds-server-main:1.0.2") { + exclude group: "org.slf4j", module: "nlog4j" + } + + provided "junit:junit:$junitVersion" +} \ No newline at end of file diff --git a/test/integration-tests-openldap/build.gradle b/test/integration-tests-openldap/build.gradle new file mode 100644 index 00000000..127431c8 --- /dev/null +++ b/test/integration-tests-openldap/build.gradle @@ -0,0 +1,19 @@ +apply from: JAVA_SCRIPT + +dependencies { + compile project(":spring-ldap-core-tiger"), + project(":spring-ldap-test"), + "commons-logging:commons-logging:$commonsLoggingVersion", + "commons-httpclient:commons-httpclient:3.1", + "commons-codec:commons-codec:1.3" + + provided "org.springframework:spring-jdbc:$springVersion" + + testCompile "org.springframework:spring-aop:$springVersion", + "org.springframework:spring-test:$springVersion", + "gsbase:gsbase:$gsbaseVersion", + "junit:junit:$junitVersion", + "com.sun:ldapbp:1.0" +} + +test.enabled = false // FIXME this needs to be enabled (error due to missing host) \ No newline at end of file diff --git a/test/integration-tests-sunone/build.gradle b/test/integration-tests-sunone/build.gradle new file mode 100644 index 00000000..ec892041 --- /dev/null +++ b/test/integration-tests-sunone/build.gradle @@ -0,0 +1,19 @@ +apply from: JAVA_SCRIPT + +dependencies { + compile project(":spring-ldap-test"), + project(":spring-ldap-integration-tests"), + project(":spring-ldap-sandbox"), + project(":spring-ldap-core-tiger"), + "commons-pool:commons-pool:1.4" + + provided "org.springframework:spring-jdbc:$springVersion", + "com.sun:ldapbp:1.0" + + testCompile "junit:junit:$junitVersion", + "org.springframework:spring-aop:$springVersion", + "org.springframework:spring-aop:$springVersion", + "gsbase:gsbase:$gsbaseVersion" +} + +test.enabled = false // FIXME this needs to be enabled (error due to missing host) \ No newline at end of file diff --git a/test/integration-tests/build.gradle b/test/integration-tests/build.gradle new file mode 100644 index 00000000..794e7262 --- /dev/null +++ b/test/integration-tests/build.gradle @@ -0,0 +1,21 @@ +repositories { + maven { url "http://download.java.net/maven/2/" } +} +apply from: JAVA_SCRIPT + +dependencies { + compile project(":spring-ldap-test"), + project(":spring-ldap-core-tiger") + + provided "commons-pool:commons-pool:$commonsPoolVersion", + "org.springframework:spring-jdbc:$springVersion", + "org.springframework:spring-orm:$springVersion" + + testCompile "org.springframework:spring-test:$springVersion", + "org.springframework:spring-aop:$springVersion", + "org.hibernate:hibernate:3.2.6.ga", + "aspectj:aspectjrt:1.5.3", + "aspectj:aspectjweaver:1.5.3", + "hsqldb:hsqldb:1.8.0.7", + "junit:junit:$junitVersion" +} \ No newline at end of file