From a2452ab5145b6f7ce23843cdb78a9aed70d1c384 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Fri, 29 Jun 2012 12:59:22 -0500 Subject: [PATCH] SEC-1906: Update to Gradle 1.0 --- build.gradle | 18 +-- buildSrc/build.gradle | 16 +-- .../main/groovy/aspectj/AspectJPlugin.groovy | 18 +-- .../main/groovy/bundlor/BundlorPlugin.groovy | 2 +- config/config.gradle | 2 +- core/core.gradle | 15 +-- docs/docs.gradle | 7 +- gradle/ide-integration.gradle | 96 +++++---------- gradle/javaprojects.gradle | 32 ++--- gradle/maven-deployment.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 12597 -> 39860 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 110 +++++++++--------- gradlew.bat | 54 +++++---- ldap/ldap.gradle | 2 +- remoting/remoting.gradle | 2 +- samples/aspectj/aspectj.gradle | 2 +- samples/cas/sample/cassample.gradle | 16 +-- samples/cas/server/casserver.gradle | 16 +-- samples/gae/gae.gradle | 16 ++- samples/preauth/preauth.gradle | 2 +- samples/tutorial/tutorial.gradle | 4 +- settings.gradle | 8 +- web/web.gradle | 2 +- 24 files changed, 202 insertions(+), 244 deletions(-) diff --git a/build.gradle b/build.gradle index 893abb7fee..0f23c501d9 100644 --- a/build.gradle +++ b/build.gradle @@ -4,8 +4,8 @@ description = 'Spring Security' allprojects { version = '3.1.1.CI-SNAPSHOT' - releaseBuild = version.endsWith('RELEASE') - snapshotBuild = version.endsWith('SNAPSHOT') + ext.releaseBuild = version.endsWith('RELEASE') + ext.snapshotBuild = version.endsWith('SNAPSHOT') group = 'org.springframework.security' @@ -16,11 +16,11 @@ allprojects { } // Set up different subproject lists for individual configuration -javaProjects = subprojects.findAll { project -> project.name != 'docs' && project.name != 'faq' && project.name != 'manual' } -sampleProjects = subprojects.findAll { project -> project.name.startsWith('spring-security-samples') } -itestProjects = subprojects.findAll { project -> project.name.startsWith('itest') } -coreModuleProjects = javaProjects - sampleProjects - itestProjects -aspectjProjects = [project(':spring-security-aspects'), project(':spring-security-samples-aspectj')] +ext.javaProjects = subprojects.findAll { project -> project.name != 'docs' && project.name != 'faq' && project.name != 'manual' } +ext.sampleProjects = subprojects.findAll { project -> project.name.startsWith('spring-security-samples') } +ext.itestProjects = subprojects.findAll { project -> project.name.startsWith('itest') } +ext.coreModuleProjects = javaProjects - sampleProjects - itestProjects +ext.aspectjProjects = [project(':spring-security-aspects'), project(':spring-security-samples-aspectj')] configure(javaProjects) { apply from: "$rootDir/gradle/javaprojects.gradle" @@ -28,7 +28,7 @@ configure(javaProjects) { configure(coreModuleProjects) { // Gives better names in structure101 jar diagram - sourceSets.main.classesDir = new File(buildDir, "classes/" + project.name.substring("spring-security".length() + 1)) + sourceSets.main.output.classesDir = new File(buildDir, "classes/" + project.name.substring("spring-security".length() + 1)) apply plugin: 'bundlor' bundlor.expansions = bundlorProperties apply from: "$rootDir/gradle/maven-deployment.gradle" @@ -75,5 +75,5 @@ task uploadDist(type: S3DistroUpload) { apply from: "$rootDir/gradle/ide-integration.gradle" task wrapper(type: Wrapper) { - gradleVersion = '1.0-milestone-3' + gradleVersion = '1.0' } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 8cf7636879..d5e7d9fd08 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -3,8 +3,14 @@ apply plugin: 'groovy' repositories { mavenLocal() mavenCentral() - mavenRepo name: 'SpringSource Enterprise Release', urls: 'http://repository.springsource.com/maven/bundles/release' - mavenRepo name: 'SpringSource Enterprise External', urls: 'http://repository.springsource.com/maven/bundles/external' + maven { + name = 'SpringSource Enterprise Release' + url = 'http://repository.springsource.com/maven/bundles/release' + } + maven { + name = 'SpringSource Enterprise External' + url = 'http://repository.springsource.com/maven/bundles/external' + } } // Docbook Plugin @@ -48,9 +54,3 @@ task ide(type: Copy) { from configurations.runtime into 'ide' } - -apply plugin: 'idea' - -ideaModule { - excludeDirs += file('.gradle') -} diff --git a/buildSrc/src/main/groovy/aspectj/AspectJPlugin.groovy b/buildSrc/src/main/groovy/aspectj/AspectJPlugin.groovy index 77165f2496..81fc7c2518 100644 --- a/buildSrc/src/main/groovy/aspectj/AspectJPlugin.groovy +++ b/buildSrc/src/main/groovy/aspectj/AspectJPlugin.groovy @@ -12,7 +12,7 @@ import org.gradle.api.GradleException import org.gradle.plugins.ide.eclipse.GenerateEclipseProject import org.gradle.plugins.ide.eclipse.GenerateEclipseClasspath import org.gradle.plugins.ide.eclipse.model.BuildCommand -import org.gradle.tooling.model.ProjectDependency +import org.gradle.plugins.ide.eclipse.model.ProjectDependency /** * @@ -41,7 +41,7 @@ class AspectJPlugin implements Plugin { dependsOn project.processResources sourceSet = project.sourceSets.main inputs.files(sourceSet.java.srcDirs) - outputs.dir(sourceSet.classesDir) + outputs.dir(sourceSet.output.classesDir) aspectPath = project.configurations.aspectpath } @@ -49,19 +49,19 @@ class AspectJPlugin implements Plugin { dependsOn project.processTestResources, project.compileJava, project.jar sourceSet = project.sourceSets.test inputs.files(sourceSet.java.srcDirs) - outputs.dir(sourceSet.classesDir) + outputs.dir(sourceSet.output.classesDir) aspectPath = project.files(project.configurations.aspectpath, project.jar.archivePath) } - project.tasks.withType(GenerateEclipseProject).all { - whenConfigured { p -> + project.tasks.withType(GenerateEclipseProject) { + project.eclipse.project.file.whenMerged { p -> p.natures.add(0, 'org.eclipse.ajdt.ui.ajnature') - p.buildCommands = [new BuildCommand('org.eclipse.ajdt.core.ajbuilder',[:])] + p.buildCommands = [new BuildCommand('org.eclipse.ajdt.core.ajbuilder')] } } - project.tasks.withType(GenerateEclipseClasspath).all { - whenConfigured { classpath -> + project.tasks.withType(GenerateEclipseClasspath) { + project.eclipse.classpath.file.whenMerged { classpath -> def entries = classpath.entries.findAll { it instanceof ProjectDependency}.findAll { entry -> def projectPath = entry.path.replaceAll('/',':') project.rootProject.findProject(projectPath).plugins.findPlugin(AspectJPlugin) @@ -86,7 +86,7 @@ class Ajc extends DefaultTask { def compile() { logger.info("Running ajc ...") ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties", classpath: project.configurations.ajtools.asPath) - ant.iajc(classpath: sourceSet.compileClasspath.asPath, fork: 'true', destDir: sourceSet.classesDir.absolutePath, + ant.iajc(classpath: sourceSet.compileClasspath.asPath, fork: 'true', destDir: sourceSet.output.classesDir.absolutePath, source: project.convention.plugins.java.sourceCompatibility, target: project.convention.plugins.java.targetCompatibility, aspectPath: aspectPath.asPath, sourceRootCopyFilter: '**/*.java', showWeaveInfo: 'true') { diff --git a/buildSrc/src/main/groovy/bundlor/BundlorPlugin.groovy b/buildSrc/src/main/groovy/bundlor/BundlorPlugin.groovy index b3b389163c..a48e1248e9 100644 --- a/buildSrc/src/main/groovy/bundlor/BundlorPlugin.groovy +++ b/buildSrc/src/main/groovy/bundlor/BundlorPlugin.groovy @@ -76,7 +76,7 @@ public class Bundlor extends DefaultTask { manifestTemplate = null } - inputPaths = project.files(project.sourceSets.main.classesDir) + inputPaths = project.files(project.sourceSets.main.output.classesDir) if (manifestTemplate != null) { project.jar.manifest.from manifest diff --git a/config/config.gradle b/config/config.gradle index 48f7698fd9..8943ebed88 100644 --- a/config/config.gradle +++ b/config/config.gradle @@ -27,7 +27,7 @@ dependencies { testCompile project(':spring-security-ldap'), project(':spring-security-openid'), - project(':spring-security-core').sourceSets.test.classes, + project(':spring-security-core').sourceSets.test.output, 'javax.annotation:jsr250-api:1.0', "org.springframework.ldap:spring-ldap-core:$springLdapVersion", "org.springframework:spring-expression:$springVersion", diff --git a/core/core.gradle b/core/core.gradle index a02f1e1ccc..7b986e138d 100644 --- a/core/core.gradle +++ b/core/core.gradle @@ -2,7 +2,7 @@ // We don't define a module dependency on crypto to avoid creating a transitive dependency def cryptoProject = project(':spring-security-crypto') -def cryptoClasses = cryptoProject.sourceSets.main.classes +def cryptoClasses = cryptoProject.sourceSets.main.output dependencies { compile cryptoProject, @@ -31,7 +31,7 @@ classes.dependsOn cryptoProject.classes classes.doLast { copy { from cryptoClasses - into sourceSets.main.classesDir + into sourceSets.main.output.classesDir } } @@ -43,15 +43,4 @@ sourceJar.from cryptoProject.sourceSets.main.java test { systemProperties['springSecurityVersion'] = version systemProperties['springVersion'] = springVersion -} - -// Add the crypto module in the IDE -ideaModule { - def cryptoDep = new org.gradle.plugins.ide.idea.model.ModuleDependency('spring-security-crypto', 'COMPILE') - cryptoDep.exported = true - module.dependencies.add(cryptoDep) -} - -eclipseProject { - referencedProjects.add('spring-security-crypto') } \ No newline at end of file diff --git a/docs/docs.gradle b/docs/docs.gradle index 73d5a5c5a5..d43118aa6c 100644 --- a/docs/docs.gradle +++ b/docs/docs.gradle @@ -17,7 +17,7 @@ project('faq') { [docbookHtml, docbookFoPdf, docbookHtmlSingle]*.sourceFileName = 'faq.xml' docbookHtmlSingle.suffix = '' - spec = copySpec { + ext.spec = copySpec { into ('faq') { from("$buildDir/docs") from("$projectDir/src/resources") @@ -36,7 +36,7 @@ project('manual') { // docbookFoPdf.admonGraphicsPath = "${imagesDir}/" docbookFoPdf.imgSrcPath = "${projectDir}/src/docbook/" - spec = copySpec { + ext.spec = copySpec { into ('reference') { from("$buildDir/docs") from("$projectDir/src/resources") @@ -56,7 +56,6 @@ task reference (type: Copy) { task apidocs(type: Javadoc) { destinationDir = new File(buildDir, 'apidocs') title = "Spring Security $version API" - optionsFile = file("$buildDir/tmp/javadoc.options") source coreModuleProjects.collect { project -> project.sourceSets.main.allJava @@ -94,7 +93,7 @@ apidocs.options.groups = [ ] -apiSpec = copySpec { +ext.apiSpec = copySpec { into('apidocs') { from(apidocs.destinationDir) } diff --git a/gradle/ide-integration.gradle b/gradle/ide-integration.gradle index ffb8109810..a22b9aac77 100644 --- a/gradle/ide-integration.gradle +++ b/gradle/ide-integration.gradle @@ -2,80 +2,40 @@ apply plugin: 'idea' configure(javaProjects) { apply plugin: 'idea' - apply plugin: 'eclipse' + apply plugin: 'eclipse-wtp' + + eclipse.classpath.downloadSources = true - ideaModule { - downloadJavadoc=false - excludeDirs.add(buildDir) - gradleCacheVariable = 'GRADLE_CACHE' - outputDir = "$rootProject.projectDir/intellij/out" as File - testOutputDir = "$rootProject.projectDir/intellij/testOut" as File - whenConfigured { module -> - def allClasses = module.dependencies.findAll() { dep -> - if (dep instanceof org.gradle.plugins.ide.idea.model.ModuleLibrary - && dep.classes.find { path -> - path.url.matches('.*jcl-over-slf4j.*') || - path.url.matches('.*servlet-api.*') || - path.url.matches('.*jsp-api.*') - }) { - dep.scope = 'COMPILE' - dep.exported = false - } - } - } - } - // GRADLE-1116 - eclipseClasspath.whenConfigured { classpath -> - classpath.entries.removeAll { entry -> entry.path.endsWith('/build/classes/test') } - } - eclipseClasspath.doFirst { - eclipseClasspath.whenConfigured { classpath -> - def includeDeps = project.configurations.getByName('runtime')?.collect { f-> f.absolutePath } as Set - classpath.entries.each { cp -> - if(cp instanceof org.gradle.plugins.ide.eclipse.model.Library) { - def include = includeDeps.contains(cp.path) - def attr = 'org.eclipse.jst.component.dependency' - if(include && project.hasProperty('war')) { - // GRADLE-1426 (part a) - cp.entryAttributes.put(attr,'/WEB-INF/lib') - } else if(!include) { - // GRADLE-1422 - cp.entryAttributes.remove(attr) - } - } - } - } - } - // GRADLE-1426 (part b) - project.plugins.withType(org.gradle.api.plugins.WarPlugin.class).all { - eclipseWtpComponent.whenConfigured { wtpComp -> - wtpComp.wbModuleEntries.findAll { it instanceof org.gradle.plugins.ide.eclipse.model.WbDependentModule }.each { e -> - if(!e.handle.startsWith('module:/resource/')) { - wtpComp.wbModuleEntries.remove(e) - } - } - } - } tasks.withType(org.gradle.plugins.ide.eclipse.GenerateEclipseWtpComponent) { - whenConfigured { wtpComponent -> - wtpComponent.contextPath = project.tasks.findByName('jettyRun')?.contextPath?.replaceFirst('/','') + project.eclipse.classpath.file.whenMerged { classpath-> + project.eclipse.wtp.component.file.whenMerged { wtpComponent -> + wtpComponent.contextPath = project.tasks.findByName('jettyRun')?.contextPath?.replaceFirst('/','') + } } } } -ideaModule { - excludeDirs += file('.gradle') - excludeDirs += file('buildSrc/build') - excludeDirs += file('buildSrc/.gradle') -} +project(':spring-security-samples-aspectj') { + task afterEclipseImport { + ext.srcFile = file('.classpath') + inputs.file srcFile + outputs.dir srcFile -ideaProject { - javaVersion = '1.6' - subprojects = [rootProject] + javaProjects - withXml { provider -> - // Use git - def node = provider.asNode() - def vcsConfig = node.component.find { it.'@name' == 'VcsDirectoryMappings' } - vcsConfig.mapping[0].'@vcs' = 'Git' + onlyIf { srcFile.exists() } + + doLast { + def classpath = new XmlParser().parse(srcFile) + + classpath.classpathentry.findAll{ it.@path == '/spring-security-aspects' }.each { node -> + if(node.children().size() == 0) { + def attrs = new Node(node,'attributes') + def adjtAttr = new Node(attrs,'attributes',[name: 'org.eclipse.ajdt.aspectpath', value: 'org.eclipse.ajdt.aspectpath']) + node.appendNode(adjtAttr) + } + } + + def writer = new FileWriter(srcFile) + new XmlNodePrinter(new PrintWriter(writer)).print(classpath) + } } } diff --git a/gradle/javaprojects.gradle b/gradle/javaprojects.gradle index 6462f4bdf9..530b847510 100644 --- a/gradle/javaprojects.gradle +++ b/gradle/javaprojects.gradle @@ -1,20 +1,20 @@ apply plugin: 'java' apply plugin: 'eclipse' -springVersion = '3.0.6.RELEASE' -springLdapVersion = '1.3.1.RELEASE' -ehcacheVersion = '1.6.2' -aspectjVersion = '1.6.10' -apacheDsVersion = '1.5.5' -jstlVersion = '1.2' -jettyVersion = '6.1.26' -hsqlVersion = '1.8.0.10' -slf4jVersion = '1.6.1' -logbackVersion = '0.9.29' -cglibVersion = '2.2' -powerMockVersion = '1.4.12' +ext.springVersion = '3.0.6.RELEASE' +ext.springLdapVersion = '1.3.1.RELEASE' +ext.ehcacheVersion = '1.6.2' +ext.aspectjVersion = '1.6.10' +ext.apacheDsVersion = '1.5.5' +ext.jstlVersion = '1.2' +ext.jettyVersion = '6.1.26' +ext.hsqlVersion = '1.8.0.10' +ext.slf4jVersion = '1.6.1' +ext.logbackVersion = '0.9.29' +ext.cglibVersion = '2.2' +ext.powerMockVersion = '1.4.12' -bundlorProperties = [ +ext.bundlorProperties = [ version: version, secRange: "[$version, 3.2.0)", springRange: "[$springVersion, 3.2.0)", @@ -55,13 +55,13 @@ sourceSets { integrationTest { java.srcDir file('src/integration-test/java') resources.srcDir file('src/integration-test/resources') - compileClasspath = sourceSets.main.classes + sourceSets.test.classes + configurations.integrationTestCompile - runtimeClasspath = classes + compileClasspath + configurations.integrationTestRuntime + compileClasspath = sourceSets.main.output + sourceSets.test.output + configurations.integrationTestCompile + runtimeClasspath = output + compileClasspath + configurations.integrationTestRuntime } } task integrationTest(type: Test, dependsOn: jar) { - testClassesDir = sourceSets.integrationTest.classesDir + testClassesDir = sourceSets.integrationTest.output.classesDir logging.captureStandardOutput(LogLevel.INFO) classpath = sourceSets.integrationTest.runtimeClasspath maxParallelForks = 1 diff --git a/gradle/maven-deployment.gradle b/gradle/maven-deployment.gradle index 6e2e764e07..dafaec648e 100644 --- a/gradle/maven-deployment.gradle +++ b/gradle/maven-deployment.gradle @@ -43,7 +43,7 @@ uploadArchives { if (releaseBuild) { repository(url: releaseRepositoryUrl) } else { - s3credentials = [userName: project.properties.s3AccessKey, passphrase: project.properties.s3SecretAccessKey] + def s3credentials = [userName: project.properties.s3AccessKey, passphrase: project.properties.s3SecretAccessKey] repository(url: milestoneRepositoryUrl) { authentication(s3credentials) } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 73dbae74c3898153ccac972f3157c500a59d934e..e3b3376e6002f9d44543761c8d3dcd199eff1d82 100644 GIT binary patch literal 39860 zcma&Ob980fwl1EEZQHh;if!A@ij9hG+o{-g#kOr56;$}L-?`_#yZ1dm%+|(g^N&8~ zY-6mi_tEtY1!)jaXdoa+NFWr9iSIyP7w}&{Ul-KZkQG%Cq?42rV*mkC_?uw8FYp!4 zmjKq+K>hE6vVwAwVxr0_^s-|2vJ>Mn(scB*aMEHn)J%HKuZ91ZR5O&$NoBNhQBW`$p(i(iA}KR+U3 z=VohTXJ|soL~m?k=;Y)RB@5lhh#0(W!KOvy$`Amv9Fo&ZU{6HPD`+EZ10^Y0-jxZ1 zu#-Q4>Tu3`#D_oOUGuaLMJU|YgJ~q>-OQ0X?o&o)*xpn%tA=_mwE%+l7}&3ZwEib`?z1&Cnqg{pB4)R_g&KV1l z&%1;mXoeV8NDLF4AT+uk&V>%o=O3$lra~~e{tXDI90UkR%FKHvmNRaXj=O(z1N{^CgxTvz zA-9^jJBow?@taang3hR3y1`~Z)Xt9bl{Wd7DVa$g3Oi@}kA%Q1p(%5kyj7;V2oUhG zO9nF%dBh-d09;MKD5^-nBQkmvC?0GYq~4ukhW*;QO;ZzF$(vNSiP zak#;|z#XWx4;93u|4#0(9SgaPJG}P=V(TYzY7_VU$^Z(4{Okg>f4DhlM`YGjEX$}| zdjO5f5bgOHOo@zrenuC(<%1m!OZZD4fv7?{DmiO(fD>Lo0{&XtTAIQ7xr|~_*nH`w zelTRtG?89IBXcAbN(kx4ib{ncYLAYRQ?5;^{+wvpTQ&f zZw>huG(@9&zw`q(f4`t?@aZ<>?m!hIT)ACn?mNuxdrkCa2d z+bck{1)=MV1EgIpSAN@E_xOVReWs7NKlwPnRKyno2#D@K&s6p3hF}|1Rgzqn zyQ&von2(7nnNnBl9DKV|D0^$5`G(!Ba+dR_Ry1t=Gk>r+7Vl6Z zY|fr0cA|#tF2td)Os~ohx?q>X@iCR8RfQuDWQK$l)RFW>-TTy|9~DcC%lcR9Ry@Fe z&T#(7rEt$#re^q?^ITE@@1IxiL(Dw|qT)(HxCx`xm z3ghz+m!R$#mK#nMpWv$ZQ9|(azvPY*U&N)MY-;Avr1IkLCijs}#Abe0CH&KSB__xg z(KuVuYz$EWoC*_ZV`j3+XXIUP#iLgB^w@LvBLxC4xWPx+I)Y}!da4DOk6CF&xi-8v zqj!s3-bp^W87(RFF@=uytV4M`B+)T=7grS^B`nI5jlUC8V>T8m-L2G`h7%eSBWEsR z71HJv=rr|wOrcnmdz72Yx|!o<0a!UJGI!-$z0|@dn6~cNye~3hDC>sZ=s5;h93rw}x$ru}ZY|xS|?ku%ah4l{M zCAf1~P?GGT+U}vf13yYiS3lx51HEe3>sWX^P#mU)o7;Eoqc%6!5pXxg0~c1h?;_B! z`@`s=m2xjlwuz(~uL+m5W6zy5SkDt#NB22!gDD=L4BT&eL zZzl#>v`5Mm5*YXCC{e-2B)GAkqrm}mfjy*`tYRx7DS(N(XSy}uNO~q}&ewW<#~i(6 z8B_t{Kd)3qtf+Q#TSM7D&Z_K>qtMJ(hcw${O1A`oVN}qKW})!9B)mBAvu9@YQMyEa zB394MqWD^zn643D>3-kl=?#j}BYOFkT%&P7%w1JTFiW408Y*{wVlGmn^oJasueeZl z?a=*qT1+)!m*C;LMq_>B0Nf_FGxdQ**l~lLYQN&R{z!PjVQtqS&G<-!W*?tug zTcH$Hg^|%gEhtc`t<#UzYHnN%O^WUO?uzxf;Ck7isrmhzHH=Gq`&GQDE0GXNQYw?L zjm7D>!>#*ua`I^U*H$N(JsuA;Ibt$m;%s1P6lb+$D}6s*7Ke#M8fs*w5j)v#O3*s; z)d=SIg-H2W$iAGp3x30AKTPl7O!`!ERe6v>v0;fJ+#8BDDO$L(*60(U@=I*`# zppw`4-hv=9D18?9Vi#pMGfYpAUNrFK%H(6%K$!MXmgGI|mefU;K;A-Zw|XAaP>fWY ziUEN5v1v%8f3WOB8}@S5Gsx!7sDZJjgEL8vnzUp{cV%^YxpE!V@W$xL>Cl{lEM1O^ z&E`Tvb`I7Um3dV}_C7I0f19h?eR(=ZD;`QdH2pqF$nFu>y;a+Hb4mA7!bsB)<;kw4 zu_5jB;t8ceB48c5h^TE!jo$JAJJGAzr=Eqq4cC}d+)ZYzDfV!I%Cs201G>!pOV!Pa z6S16i*wka2_4;>hFxwY6>B;$=U(N$#zXWxzs5SaY47-(YFy%q>udzbL#F=?xz>MQ~5~z65C6djdZIaM9OC{W^4Pe$`iN=@q zGO7|PZ|St@kg}hDmCA`^4ANEG-DUOXHCjp1m89aJSha~eb6x5Zttp^R+ZVSjI)b?b z@tA9v#>>nwLE*qTvrE_ZyOcWD!)+UQ5^tSrz+p7W5c8ZTs&#F?1E1<~uKVs!L%S%OtJcAWDn@Ib! z>32VAi0EfozTKXFL$RZ-SGRD<5fdxqX+(I$kqsl!l;8CD=F=Jh6pWZ8+Y83v@mZR0 z4j|})$*0y~*oD7d+#wI8&<$)9^XN>MXpG>08S79$rf0fs+q&$_EfdtNF!Y-th=NsP z5}^vIzzn}K{=GR;wv0J0QqJk)=MWM!e$3s26@t;qV8-v*R><#$W?u2kxO?kS&iMqa z?v1aGc8roBU%uBz6BX>EB$7vud;|2MS9$gE&fOWRSN=(Dr1Bkh`K%D3CI0)T;V2Cz ziC4H(Ru3T+tBmL?r4g`Ty`d*DDq3+Gr>JOr(IWNxCVwy7Tae^iROU07@-te?O@xA1 z&`Y*LZ~GAuHEVks_@W%tLR z6oLrP-b@T=xI3G1BEd{YMaPQmQE;{v9uGtsF_KW9?qGhSJmrVa1XmU15E)EEWhoxW zH#A{&VCLog;iW39g`$jQDU{l1$TrR!!B~&YOK(mZV9!fUQ|}NZT-D-~5C~9^jn_6- zQ7dXq&rWW1a9|fsncTWdo@isD!#Z3~zZFxZ!=n|0qqp4KD<}e!$M7QNVJMN6HR<-r zUgQ-QF*fuo8c~t~Y~y(%ZF|b9Qk9}(thyp^@tC$DfUA-oTFTd{OxKn&*sth=b)S`s z$&Qs{{Jg0rqVg0B_ms{gp6)`ABgX0tpB>p04i(WY*i2Safzp-27bwnH%Nj6KAu`=_ zVNw6~&Pkq!5X#SoN>~EsLm8<#(9T}( ztpRP^);zzK)k=bENcYs}t$sB4&})Gv*nJ-genfj*mDWdiz7;`;g0cZ(CNH@RmaJ!m z9`WZiXm<96{Q(MK{y}qK{$bT``a9C_+Az}fsPvc#^GJhnb5Rd$M>DZCnEN$cHdNn2 zQ;&-VjozD+DhrE^Ml>z^hnEBwCyIC@tlZH{d3o#WEwJ&s2<15XKSEIRdt096dR)92 zb|8vJT+pk_?hIg_kpvvA@8BZ<*WJ6OEK{5+J2Yd#%q?j*InrcfAsI~xQBlF`J~>BKz7TV!=A+Bv zuF+IyQ-4n!Ok^QrK>dy-lIrhskIkz>f*=d-&an^e3q?E6qGk zwKcKYrJbunJHYlytbEvIj=b_Lfj-ShtfogB!@ZnWo~E71G?F;Rf;!o+&Jlw+(V}o0 ziszI=k}l(xF(#m1ssa1ia;w8|OZ3yZVQxi~z1^bBC&~=4;Iy#r<6+NX(X;Dd<>3gy zTZ@MK!er3)Ix^LLGqHL63BvZ14Ne63_iJy6PpL43rZ8sX(xzYb4-=qNpATHC``STo zf8GlR{Zs)2@frZ!6zS{1SfMSPH*>6K1{9Z#BZtDgO(A*c5O0R(<#~7Jxc8=Mcd%k! z<49cyouqz4*J}Lm(&BoO_D*VW42R^Xd4OgBp;~@34Mw-pE1kUZCv&u0_k$eJ&z`I(|RSb z5$O@c!##tStFdZmX(q?{nk1Rq7L9o!r0aJ}ycT0Li}1DO4Dk6mz63vW*amDPYIM4H=xBXMIyscp)dJYOTKlSWk3K0O zU}7_D;5n_ExpZ`Ul8MwPwG*Bg0cFIDp8*-<`l?xjFh`)ND*n^0hsq z!jHD5rXtWhv+^f~8hWQZT^Ywb(U4yI^Wyd%w|X!lAnY32#*A?espOgmh@0?IlMMAE zLB)=8((gKeSu>RzVCC#2%HJJ9;q#I0TSDn8D8wsVMsD!-^XMC8FpP6j?b0B3Q}0_d z=NxX<(3B2vw0g+(a@^8kZKvGeL2Vzd-b1tRdO@@Ay(0g}%ky8g9Y8RB3!@M?I--YS zpj?TLkwkC}nJer12a&{;EgKO#PAj}T7K0uAX<=lapMLJs%|5GK2WvNIFA+C(* ziMrhw!D$mKT8C7EwA@zHa7L$l*_{%i&)`ZOpQteGl3ubyS)_Y=G;*A07?~2c|e7^gSRM{ zPF1E5O~a_2+N>5fmHKW_#wb&WDEsjy9$4}#46$JnN48Z`o=_dsY}G=$mq5|+f08ol zrbe%=HiwBNMK3o(l1Gmu1O5Yt3w(6I(bqoB+%G)fL?zt~t)8gf&Iw9HPRQ#;J72hm ztwY1e0T@}bm|+J0%|r>U74wR$Ow}@^F=Js!EG8zN+t}qDUE`;tfQg zB3eg@)cQ=fC~1X6WLRvz^SMYSkWJmRTgyK1ryxQ}u{gr<(K%Qne@_?|>gO^fIZO5( z1whDa<@ag41Tw7V5}AQe>CGiRW7*y6QnhAbL^703rP834Lky|K&jh*$=M!|Q^f5_! z%Iu^Zeij{3!K`E;nxOiFl^rW+wa6JsooGIQAKwqWN8mu(zyl`Fox$*f+!Z$Xtc8=j$Nt==ngI z_|`2*yAonlUZK2Vx#lBLp5Uk0yO?6(Lu*xD3GOF%N;jk|O85)ll!Dd+Vv;sWqE)5J zqFokwUA-c`N}`1pN`oE&^c4Y(mq}P?7+Cr4p32dLtsaABk~(=2X7FAx6f2cb2hoBw zyhRaeZ8$7TF$H=VJu<<~@{_f*pOMDxNM&%a zR>JWib+6u5R%JApbKYK1qvq{~r(+iEK3as@*l1UTRA@6{QBi9TwpU9mk~++S_^b72 zo4Ezd-}R(`Df$IZtvAcAr9n-hk(#Xy`7FpR$TC`xHNeb@)liQN9sUc93) z6t0H6rTxA|n>L{`XTP=1w>wu8fl5!&O>N@H%hfSoL~+KcGrUc!+>k3#l!#=B3#lpW zypUH=Jp29~Esyb@?ohTmQMWq0V!)^c-E#2>iN%X?%M^n9v|6NK@lkBz`@$TS9co;+ zJ5`JTCB?JxD~|(LT@#Y_W2u``{$rR!Iz9umo@dvscA^iO?=>2L0AY`pWG=3q^fc<| zDHcXm3c>SKmZI)KYX%lOi3ZBa49zx|w-TP(V7E0PotxZFA%VxZj~K&ovNmJom$IbN zlCXoT*o$d5YT1q4N015L-Mn@<4RbKYpsf2q;^NUQ6P04k=z4a4jPH|Smx`mcl>8y!kaVI|(o|+!IM3IrD zF8tliP@}$?;DS&C-j)iE#nm!c!3#k=>zU0r+putwK$B?c%rxv^Pe2C3S`QrNNK2BC zLA>5?WAh_q0-3LO&sw0ndGL0ja-re%drUYEEC)#t2gzcI zOIm*`uEfkG^ccLQWv>M<&{9U|VG+KkkVe z6vnF@+VdF2Rb(|wS$=#wXv=0g!0(w-q~znB!U4=R?v5>`suv=HAnANOSj(7?F70w0ZJ_vcbDD@{ z5}7`cPUu9p8=mDeGzufF%pGmXY>qnasWW~lUr;-&wswmdA*S%AQpdCGic7{-ISDD1 z-X2x!;Fi$ojq3sa&~F^yfqGx23lH&4SP-eW5Y$Ogtd6z>Q_TSE-Nlfs*%U^yV^__?wM5^Joe&HZ#cr&TOJzd6Fl7r@R#+lr`DFBX0@{%l)VaiGze8YGkTzGB zl}Pc2uiB2f=n?1GwvmL~Luu5s|HSO9>Q76K^ZW*PkKCWKRG+AkL)78YX|v|kr0AOj z%g|#8YwXl15OP$s?`p)}v_9&?GvdJ$AFC^pj|A?i2u5(WQ=&=0RhheCzC*GS*il-E zTa3&s6MV=|O@lD|jG3GwPFWwTY{(^u>FGZ` zbA+sJ4y(%*x?4+7hlizZO<(Bg$YqA)dZYm9^qd+*TGNHf3-Mqry*EQyVyhilW%lDV zTv$T`H`e6zO%+v2YFdiNytCi+fEuSiMB;uv06l({kc>eJ5(d#=0EuHc2%=(}fE>bqB}P=thf zHwD+NaM{+-J(n;e7ly&(8x45dV&9iO>5RJIr4?Uk^Of764J{>fVPE;5?}WuEDXY*D zdsn;jHHjs#ee*euH*F5Z87^}sp(B}3CWajksZ=zIffx}VD#;!IN>Hhp&q z6raA4>(C&)W;IN2ZGSwP!u!78zgh!b_o^cG6+~D|P)blsl%@62CEMCoxD&VqJ%0~I zkf!Dz5Et5jGt#tB3urCbF$SxkCcg;}c%{bQ$q#Tw%!N*4Bf^KO!yhoGX0I*VaX`eX z+f;G@TZhh(fZSjKB-TjXh#Gq#A2cc(A(Jx~Pd1+~0z0`y1&Ct%M&r<@+LL(3aWU&* zQ;pY-m*Kj}c681yrOBPeTh^iZ7gl#s*Bje%yUO+|1M{+8Dh-vc4?;U}z^V7yIQLY1 zN+5ETT%o6PN`~<|#%x*1VXF-Aba+PLl*pd51V0Vaa z&8-+f&&>-EhH_O}H|pF&OnoKsh7a-fRMc^`m~Aayg9LT^BkT6NC+$)C7;N%pbBpoP z;~HjOaWF&`c?-{-R*ZC&8Z^43wM0lKYzQ7)A2m2(i@n^Y_6;wrd#K6fK$(rx2Qml~ zUvVfF%FlOq1abG>A|M~&z-=g$aG;r(`YG~xVh7+`5hFxZ z{!Zf`VFJI|HRTU{5;=3NclsO&k>ey##$M4+c-yw&_}8JGlKUoSJkVhV-r*heD3-iL z4#_viOnBr6PMWSvlt^lTs$%7tlJy~jGh0`BepU@GS9Ftc(N4cbSw|ZFY0jJLIaDa} zKg~r9d-i=7O!@KW=~`K5G_=|?NRDxS;3C&NiM~(XF-BrTBmj83;2n9-8HeH>6aAl= ziVpN;ybaBIooX}Jzv@cF(EoA71(bOsz+tw*x!0@6Ky6=wV|QDCJlv^Z zuS03)vQLk&bu_f8*NOM!t{CmrRoctMadmHm6r-AWALQo-*{a{eBl=S02N85Ah_FR= z-VuBk=iN0N7;5TME;^(KjnESDDT;jF}}Bk%?}Y1fiqD^0+bqldi~tE znqfY7A>JQz(elvKiSe;pA9Uip?p;P*aB~d}1@Bl7 z4Q+pYg@;3U#Kp$EAUMIs#a7)p=c<&o&TmaggAAr)Nl9BNHZTm0m(bMeTdNtIZx09| z2D=38Rs+M)z&j)0LL)pNxF%nrM#441UD7eA)$hw@h$(SYrR6BqZrm~e2KVy)akKfC zj@n#@_nhmOcB8O}ddVWNCS@4&J{pr{w7FDWO97)rIbl}D?8d4C5>dnCs5Tc&6X7#K zWup6@7DEdoCLv;3P5nobnHgv-$f)Hw95UR_8nGJLOo=m$vD7QeDi@+2i8UrA=VADg z%2=|k+)2KiSf7t9+LFrh zR>fOb(sgu0bI6aiSjx4nmW3qAGgUJ;1{`<~u6W@mlDiUZw=QN|3r(eT7O_SLe zWy&rh4ZlyqhLRSC;OMv&6z+y-?!5PZaO9Xfk~>$-h`xwRDb}H~a&)DPwYzkH${h6; z2d2h|bIEQp)8D$UcDeS~p5&%nEE=c?c zr7bhm>Z((T2}dZJy@+B#U05jzF#Sc}P*sLr0erREGK$2;N{}{Ubot;u%~v zwW9IDN4Y00!fqG1gNk6)fZK4e__xk0mBr}G!8FZN>^zq5{)?m!=Z9s(GK9A9j=;Iz*b94jfnKlP)r$ly6sIdMooHE~$^Gkv$X@oaz? zU|Fd>;(DJ9&CO5naIA@P7fT8(%Vayri}C8SYte&Vg>#0(a4w{2Ro@Q*Ml-fF+e`6E-0isZ5n+A0M^mBw}Ib11utjKh@S zIYeLb;iC*zs}+k4Uf<3QnygGVtuvOejw8n$>(}YKGihY4B?)BkG`x8R6pt*XxwO{} zZfl&`P|=-R7V1ljM7rH=u{Xbjl0PI}<%SRLe=u#@ohc8o!WF}k%$^a1ozr#*WRJCr z)zIdYSDmBG)%e=)$0l?Ml+}`c(m+Gh@$|mNQY|-8Q61;1zJd9=?AuX)&?lmaFGTy6 zK2v-g4*gPngZNaPSu%evIeaYPSt|N;eJ?d;PhKF|vrU3ey3C4f+qc(MT>;%KlsSwK zV6W^rF>>?$_OLdtpNApOj-L&a0jjpDoK-&yBHD0Kn_#?A-58)fhMN&=-of&g%EdOG zJ;C~mQq}W;){?p#E4ZTiARuA)P;yyiNkz9D*QpE|>t5OeuROIA!bnnlCX-quE1Ook z90;oOE}EIu5}T#XO^|Idh$OLH=0K>e_gPFrW6C4f3;Te;aNP02u*8WN)j*J%E)dHo znDuovpU_?ON&j&q&nVVZr}FM`S!H7n#bA9JCl#wwhlJ5x<6C4KY4_&vG9{ zD%~$1$L%$m8Xd1g*$EdSK=(JhqJhjX-B@a=ued`&>{yWr`-Uzp&>BCv(5ciaC(tXU z0~#Jl%>fKJ$=6A)8^czcA9JMV9#d_q&~xF~g)cH=7R>*KtJF!uUC$X}th{m%xKE85 ziYZCA>nri~vdO_**FL(%(IlNPEmE0|%%8{Nf!N0Sy%yesaY?ljIt3zN0` zh?`x-mJM^fFUAk)yaiiWKjaQ8HI4j_|RG!9OW#Z55F7LE(Duu)!wuxcL)+)u`8#;1RR}-^-=L5h~lz=< zYg@P`$XdG%y(o9Ipl2`*xefKx9G|21MaTp-i)P3brWtoaPPkd37@_@#VdAuvga!n`%lHW#r2t2E^A8esCd zHfDeUL*Tq(@8}8f&(v%@Q<#h>ib=67a@Q=T!@~QqbvB$$O5;S(njGN_g53RdJbxfBJ}Z*R@m{&MW(Hu1HZBIKQpDG0gKG7nLD_oPT+RO1i3`3;Wtjn z)E-$=7xZ|OmVH!K_O0sXZ8X6hNe`U)g2HI4$_D;?R^900_uW<122OnIr!FPZ)IT^5 z1f-uToJ+!*^E2@Ks7Ks5777nI0Jv8nYW5|Cfy?gTJ`|Y zTQP2w?i5>O`85<{T_kNtahh7Ny_dQWzN_^D~%HGl{( zw&fRQlH|vplLF>vfS((me~|l$4?Hy>V|x~wcThl36i-LHJi&{VPz)Cu&mW726d(r# zrZ&-Nk^aPTig#F-!geYlWli3bjg5(p5*sErng^Lp3yS6|j&EY?&zV!=%6=QaDePCK zw{kI`lUUP5rtYg!MyB?f0EJ>lAcyneOwF0Cf&!3>N|8_jsR%q?7} z3ZUOxzRzjKD8io-?{m||Q!dK&T^eHWSc*-NE4Le`+oTt7W;T+trfyXWBzX7EF`KAO zDBT*oV{K8rvEm6d(#b?G{g#{H~Ci6toPN-Xxl1JT#jfN$81?H_gxUZph z3&)$kC%IuTSUFA%W#y2BsgY_dZl>B^drF11t#V7}tv%=#RJJ`Ri?-b_tG2iq72TxX z7eb7TwXJ>&!b>ONI|6;F|oD803GSoxXX=j_b4Uh&D)ooIxr&H`T3_>=5`Us}F*5N5o2d6kxNltq zFM@eV~yaM$H_bGNu8xUjr{Kom#@HPFpf`|-#j@#&9mTSOj6a;pf&zt8DEEZn9X9|v$T2BYIx*Ya z8d|C*b;qk9daT*&-ng1;^3%$4QVU9WGt!1a3|;B)+Yxu7FndpHqM^n z;=`FM!^_mQJ;(8FPScafhjNq2BKLQ-(=WS?v}~i3V%9prFOle`AHd%Y<~Ju|^yYma zF7@gt#y6T19*v4nLya;&1wzi5Zg(7qJA<-Kb(U>MYj#(!IL${aXQHh2w6%BlV}g5? zX+S1yZLy zs%aVH%0GkdCm=-Y6Q286WaIA_W$;~d_ermdLcPA?eJ6_A?3he@Ty{w!?{UwoGm`2X8Ja3Rv4&cTR%@ty;H$h_ z{MstWMzc+F@ecZWfoR4nQf>YmzGkmZN}IeN9h<+b$?8ssdIwbl!XP$}M#ha1KA*s! zz@Cn0>x1m6Zn==}XRnY1fYL+0y}MXU1}0s4%m_e0;P;Ao(ji;x_ubnf{-At*3KInuGK^G=KtzlWoQorMzF85#AO3rf=mtlY~um;W$!<(UB_!%k>_%)0>L8 zQzoT>z?G@awXW<_f6Q)AjA@pc;|A76@c{1>s8{R3>?>xwR3zbm%bH{`#^*m$vDR4F z{(fJ4nYJ%N6z6|-1pd}GNGfAzY-l55`IVcsG;;aBoPc1(b*cXEh zsmQjJx%XpS1@2|XC|rTXY9~`7yX7#T-bM*yjXa0tD`9VJ{c0pguEAnntR=!6vSvm! z-{g@mrI8Z>@1T;g}r! zHiXq=WHK=dHnf`|I&Z3-dfyJfB>x!IEDRK`(7{iGwkFw?YnhK6hWX%rk(BN1!_ z^7F96(zplIB41S}L0SXbb^of^PfI|28&f~aA~}uU{06yK&7Uyv_7cad@Gz~5{iSLIe8wUp>j#OycS%ium z`rilRime}O{q7Xp_592yMi{?g>}5t}OAj$^niW?cSxApj zrdbZjQl{Jr`yhlW&4kl~Avr6aR5WK_k2=L3(V9iLtM?*rp)lH{tx7DZuyCQTGA{DY zVo>Gly!tBr!72|k1+z2}VFaTYq1Fg4Hi({nnW5PW55Qdt&r}L33{FNftDkW0ox-?C z0x%~pU~Gc6s=lFSBZP!?20RIV(}1=?72#E_^_KG4b?>{t38yf(=}$8$7&kJx5b;i*ipIK{>{~kv>c@eIy#! z23~_d-!q5=Sb4fKzSW0C@S_SWgOr2-i?g|&v5%lP46jCLjVKmPR%`LrP4_Bngy&cE zu(ORfXI0cns1A3j%QAB*ybA9o{**yKmuJqfOpb%6(eqnoKT2>&9rY)dBWKG`y%xUF zIHE^LjSYQNxfv*yQ`asL;cn!}=HAobI3Yg`3NfH;PP;0f6;rpTA2gs^rx;wII1&E2 z2gipEr`&TW=D%Xg8IYE*lJjjBIT4UkGjdkho;Pwny%#jWE;Cu|9OmpyJH!zIuMpFB zSL_rrcmw@#hHh1?t{6hz8N!~?qAX7@9JXY*+zx`Dp)8PJmq}{)qC^l1KE*6k?e1&8tzVAMq%l_AD>14Zg_dFc&5gaf{y>4ko8 z)Fzs&5fTdXIN?l$u+}rsYwrb#P{IsLylIiQ!?BxWE3q_6HyIR{&x3dl5k%9*3f& zybVhTB}q%zwBg=8JQAbOFU0}I5Y4E4rmj^i8Kf;fn>pooSO=?2C~wi&8}`v|vehTj z*KiYo#0v~k`MA|<)G@d*P6cTeJ)IkA=MOZUz&C=wo4YMY1q{V6GbjHw{vx*ii!w{+ z_Adq--T!8?+J7~_)7$?auBY+gSdMnfsUcQ_8~|=hqG_^VPu5^gqP~js7Zy8aoTy0RUeVAQ?+r(=S?{>lbVF z-$l`A6-7H_LBtRA7(K5Xw5Fd;S};{j!{54I3S@~$;bvEY)JO&fhW9lXmV0Jt#UIQU zF)}Rn5N^b=%&#Q^H&i`Z(^uQl?aW+%ZR-E}^$B_d41vvhpo+>`6t`R(1hBl6I8R6I zP~uguE9p~EG|?#a=*C#UniIPv37o@p=IZY%KE7{I{M9eIe)W5#kQ?MPA=0mxG2{60 zC*Z+myGah1-sF1|=b`s9*Rh;}>5QJQ%d_YX+*>|$qG8!#TQ^=5=r^?l11sfjHA3F) zs-=oS*UVZy>`8xnI`x%J{Fba7^RAY`I5(WYAKQ-|^}7e;k4KWQ(zs-D=)*F!PK-~y zDm3M8!^iq^Z-xf1@PLts_^?c-f*pjWN5wZ^zN?IESF0&8=MbF*$a;E&QZ`Je&|kL) zNEk6Z{ohyQ;*#nZ&QE3>Qi*)Mg6*w?W01$VzsdyhqH@FF_|oG>l#>S^739LMuG}Hn zTtktm=@H!MSEbYMJ0Y0^(!@{Z({LVbIEB(So#mZW=`fZoxLb~RALCphEl!M1^p8|v z?Tgr9ioc;vB<7job&40sEy=r%*j6~0PaG344L&!V~fAwck(s2g({j~VPo$FzHn6>b< z0xGCzFUo*xDV-&-4; z;Q0YI0wz?*K0Rp`h2fHdiP#c5meRwMXRghwn;E6PqY#pfr2NkyZ;C@an_!k@WtZa< z**wP^JWm^$e;!_k<$+XfDkKa=MX`ffHQf#!R7Jt9=iKDA&Y>fq$6zH}P*$oH6b#e6 z7F+Z)bEdn*48XGly{JH+tYS`IH_TV6J911la#kH%9WGYHCIKz7v*qgnp`DA;g07U~ z#@Z{rC?Vo6tluJDVZ$@l3!WyVcJx{{54La`PU9$+*#+3SzI73rFdsa;@Z1Mlau(M{ ziS4ZRtx@4Ko9Ht6@!MiNzHJfUrv z1NG0UD8(MDyk08c*e>%NG1#mI1WT8~Y377z9vsx?3l5^efgiEi6qFOig28EPsNDGN z?yh8YG+!r*?KXiCWwFBsZLk=BGXy>ovLbB2->ZMJ{kP@>=rg5{!oFis)sOpplqz0C;;ufMD7W@Z#{ut*4iqeG>yvm=sVBkH&ZzTp4!n>Ky zUZHYKN{rH8-=JPJTr8mejGwg%z5>?brQ`d!r4&B@fk+q|)-?DpL}Gq9?tK4$5cw}C zDt|>{w&q`WwKx1CY5)7of?#FYzs@Z1vF33wo?G%}{Z0s=qMH;K4U5}}qb!IBLM7#*`Ytc<+;{i~6}R>yI7PKuCd>WvgMcok6)P5IAGcJ?aPFOCMgU)jDdzqxtD{vR(3c(@r-wrL$-TCRQlcSXS5s7&ZCTO|$E?9CP+-CO?{ZZ32Hh7h zc4@YrsEiN-W{D6iTXeU0cEmfcoDLVg94M2QWyGjA+a}&W{4ob6O^W84>L!6gyw$0Y zT)pu{i8E3l^3|V&_!vl1e9gq;l*m=63MZi6FcaTMT9VAuD9rQ9U7SwEQdi$r?iC7jyvGpj{h_Y;R0_**++=Et zMAi?j7M@0tiWnNjch1BLVeKN?b%5R?u=KIOgyOw2_sSm6CM-jp z1o64%_i?4(0K6TsP`dDvkd*$8CsL-nxaOy1H6XGT=~)rJ9#8*BP!Pbgw3bdblQoX? zPS7e(*7o(%O>46SH(zpKWfYeQoW{5FXlFYUtv|CB= zWApO}#3qv1-)5%hzTG=TwT-N| zXGlcOCuh6D`UW5dg7dhOh>Psw$@8R4H0?5D2IW^iKc6Uyg;+*!^GWiy0XR@w zB&0TIm49^``Qu6US_4(pe*G+%pKFx==#`bS{WMtl^S%AEg#M+9Y^rOxBYz6p>>xAg zacV%JQJN8_Wh~z6nk(6!B7{962@+Q zeDUDB-phv>m>8#V|Bf%jT8leOg(G-=gPclq8 zIE&#gSgy{>FDwx<@SsFtM}BVL_Lr)AUSt;Y=wCJhELtLg)ykpjr7ZzXN9Y6+knr?9B0e3EDua?R9V(-mY-S* zH1#bO7hHs0o^&TMZmcy`9v&0wi7}#2y@$5G`Ssxa4u(KI(oG7>+pr)xuj!iI8JV2i zEj!+!SPAh$sraO#IH)O1jsj`cTI=J@fyrA6_H1b=)Weiu%|?y>Ts5M-nj3{VI5@y8 z$XyPiPrHrHbX27`X0gciC0n9Av4vr3Em%4IHr+l*FtVF2|4H-s z>mUB`v$;D&&f?GN`X&M!>oCK)OtDd17i&^xCLX8fk7Nano3C_Tl+P%|#NI_aP8q7# zU{O-fioI&jn!OlNVn$koN0`p9^=mkda?KACXTQI0OFql?Y7FgQcj1A2f4!!9{t^2d z5dA4SW^ z7+vk{_zH1N8UC+y>GEmm{7-M9RIXXUe&VZF^xRbsa~CB^OyEYP)|-1c)UI3L#Gv@} zWDIgXMJ;LY9JPGsR!%v>?OD!WRSLG#yLt7QSBUzD44V;cJQP|q33 zObKm^f)XnD{1V+1-|AoMJhHRCkJ__dUvw7%m{EYaNPnowmXKxoNHy52yJdu#P$el6 z%yL_3tp+p0uk5oW-o?o`3bmNxdlJi8L-DC`Oxr~zT2CH3MfeyyjUIrGaD=U@Rx3g) zs~j&`Le~jQ8dodyK44YZT2+bUrgMq54CcrC^V25EibNmT`v}0LmtMY>{oHUGCI}Z6 z4GUqsHR()F8F{lwvni^&RNu9>uDj`q-0$>63IY@l)d;3b1h-EfeK_!x4(_)}H0RUW z{a_IY(_xDG-Y3P?cjZ18Wj4sN8_mKNOeg@HARL4oIk<)&dx&Na z;#+vL0#Ovwvd_wa#+q1%$U-xCJUK@c79iId%=DGkP<6RsCpw06dcRE|LAOf6(AAV9 zrd@h}FO6V=qK{S4`D3+$4%!`W51n{cjyIzR$pI;H52PUkJ~SWICJPViWIh2(nVMAQ z7xCDu!W3sPy_&oZlN0(~8#>^{Y`832gkKlDp#P^sx=1eHz@7iyvMXQVoKTHcV3#4d*$Xi3bP*67@{ONVP*U-NCHbq z!ZJCmJf@s!=PLV2 zUo}1(Dz^WezW$xKMk=q%u755P(xI`Wkpx?nXP{#QjmUn)=;l-+TB3$hDuN~|5m@$dreN2yCWqOT&L zO3S3aKSCw0FVstl>x9Ct3`S8}EPp^Q@x(a%O)SVL*uZkzv0}%Mpvsc$kIo1YrXF@2 zQLNKe%Ka)bN#@&@Yr7dhti9Q?|6wBR6az;~d96vMv~{y;*ZClGzrM#2hi6TwoC#%N zsMNt$*}9*BYPeEq7Vf@Aq})jvqbH_{E9%;^Y4@$~x6{WX{T0kK+LowFaz#;k(kZ%t zT+wz5jVWD?btpe|WY5E6{^ubvjO6@NbHh)@BV@lbdduU3tSdrrLv8qipx z7VjGlv-sOPa2CZ8S$coaSUp8q2H@>nEzcr@2;(pReX?{-+>BWy=Xd-TP>_KGbC->h zEJ%y{vSSI7rP18W0q#PheSK8qWDbnyO5S3vP<>WmYic2%2r$EHP{Ag_#TN-o3gYnO z5T8KoDi6)#f>@vYL`!C8p4@VYxb{NcJvDJ}{bX_9z6F+N1rB4+#1=uxpYvMdp}Yy< z-76Xc7H>Fr=ipH1W|y#o>X<_-1x%bGMe1!s(y3j%b7=b(hxl*afdbYeenA)m4$%$h zm+|=t@U_y6a@v=Mnf8heTEj&CQn3r-rsB3nhiw0zq9VV(t5|%dDAFfo1c^}V_WR4483VKS{(Ab``v8`{Nx#zg3_IivhFgkw(c^yo<6GC?7mFwl>MO1V48^x zwSDERo&Yl;Rmn5XfsqnZ5sM^19_0SUS%l#T|3@pN0ERyCrWj_wb*w;42+-t#&{>CV z-G}xXd^&&0ncbNy^-?@vkijPJo{Blj9hWcRJDhI4a5`NJcQ}zqR%}iD&;;D{Ptf2V z1Mwvq+qut$+cAX9DGV9=Pr>Qw8qOSn1j8k(#RQoeX#_?;*U81|str83Go!Ul0%90g zG%5LV?eR<5BhUskxr;foX%o2;Cm;@ZFD_Uke?b!osQToJa`yuPl79>I7~e}v85=Q} z1E}_@iUVnI1r`?sWMK5=Q#Fu1?o&_1dINvxBIl#eI?N7`XfHVg?P~5dMISO@bi}}` z8qvjk*M8dFSE>(funBuzA1KQV5$6-F3xkO->_+vXwitoo*>Je57$nf!^Nn8;y13NG zDkIV|jKEE^^^BM!FVUD)6OgGswD3Eq7cU*1i^R@bl+m;}2&Qg|Oi)=BUMsT|tS@4X z)d+5D5vda~KDh&7JST#Ag!FjC2sno}k<)iiwhZLnbS`L6^K#KZHP9Q)vOYw$bw*3B zZHn>nfq0EPr^w(1lEDH0kacyAZj|I7Tr;zoIc1C4@|UHp*E1ofd<5ZmjK4?6FLk9H z760owQBu|YV?BP~T-)hM2-?JE; z;75+u=ZwJQQw{$&rHcgq{-xVe(Ng=|@csHKNJWj8xQ2td4AxBeb51W-)(8PAlfF(sYQ3k9>G5!|J9JA9YX$tb? zngT<6z7gypcI9%W;=oLmZbsFDLNA0uQ@qpxHjh=9@DMXn{UM=v*P&nCtqT6o6@IF+ zN~>p-;c^ml#xnFEZ2Q`+Xv6IFcZL(=k=CE2u5pTygo5D~^9|jVrfZluM(I;HdX)*% z%j79}W5n(YRsz0eo%E5N@I~iw@rclXb8S12UdYr00E2h$QHHaD0^MaDGUn924yqh8 z_h1Y_0H!qO0gjQf4ihvEvkNpo@XRXTP%YpGPm$N2%PRTYA-O2K>w{lvoPlXjz5zNB zW|x2IZeGG|&B1I@{zbeu_%Jxfa5Rgypz@Y7JbNRUwi^Aj-ehTRXHz{HW0l&|B+=Z~ zV3AEtM^|KJ@SU~F{tgucx}vj9Fj!UUVPP1r2WZ9YZR{>_MVMK{&-#u^SM2cwh|7`} zubBL-M4V{WwXxKjvmpN%BCaiGV>t@${%0A3!wsG4uToG`VrIW5Id|4fPyx?=aMz8G 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ee037f8e66..d6d7f61d4f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 27 16:17:28 BST 2011 +#Sun Jul 01 12:51:55 CDT 2012 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://repo.gradle.org/gradle/distributions/gradle-1.0-milestone-3-bin.zip +distributionUrl=http\://services.gradle.org/distributions/gradle-1.0-bin.zip diff --git a/gradlew b/gradlew index d8809f151d..662dce77c3 100755 --- a/gradlew +++ b/gradlew @@ -1,16 +1,16 @@ #!/bin/bash ############################################################################## -## ## -## Gradle wrapper script for UN*X ## -## ## +## +## Gradle start up script for UN*X +## ############################################################################## -# Uncomment those lines to set JVM options. GRADLE_OPTS and JAVA_OPTS can be used together. -# GRADLE_OPTS="$GRADLE_OPTS -Xmx512m" -# JAVA_OPTS="$JAVA_OPTS -Xmx512m" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="-XX:MaxPermSize=256M" -GRADLE_APP_NAME=Gradle +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -42,54 +42,51 @@ case "`uname`" in ;; esac -# Attempt to set JAVA_HOME if it's not already set. -if [ -z "$JAVA_HOME" ] ; then - if $darwin ; then - [ -z "$JAVA_HOME" -a -d "/Library/Java/Home" ] && export JAVA_HOME="/Library/Java/Home" - [ -z "$JAVA_HOME" -a -d "/System/Library/Frameworks/JavaVM.framework/Home" ] && export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Home" - else - javaExecutable="`which javac`" - [ -z "$javaExecutable" -o "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ] && die "JAVA_HOME not set and cannot find javac to deduce location, please set JAVA_HOME." - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - [ `expr "$readLink" : '\([^ ]*\)'` = "no" ] && die "JAVA_HOME not set and readlink not available, please set JAVA_HOME." - javaExecutable="`readlink -f \"$javaExecutable\"`" - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - export JAVA_HOME="$javaHome" - fi -fi - # For Cygwin, ensure paths are in UNIX format before anything is touched. if $cygwin ; then - [ -n "$JAVACMD" ] && JAVACMD=`cygpath --unix "$JAVACMD"` [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` fi -STARTER_MAIN_CLASS=org.gradle.wrapper.GradleWrapperMain -CLASSPATH=`dirname "$0"`/gradle/wrapper/gradle-wrapper.jar -WRAPPER_PROPERTIES=`dirname "$0"`/gradle/wrapper/gradle-wrapper.properties -# Determine the Java command to use to start the JVM. -if [ -z "$JAVACMD" ] ; then - 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 +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" else - JAVACMD="java" + PRG=`dirname "$PRG"`"/$link" fi -fi -if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +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 -if [ -z "$JAVA_HOME" ] ; then - warn "JAVA_HOME environment variable is not set" fi # Increase the maximum file descriptors if we can. @@ -108,15 +105,14 @@ if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then fi fi -# For Darwin, add GRADLE_APP_NAME to the JAVA_OPTS as -Xdock:name +# For Darwin, add options to specify how the application appears in the dock if $darwin; then - JAVA_OPTS="$JAVA_OPTS -Xdock:name=$GRADLE_APP_NAME" -# we may also want to set -Xdock:image + 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 - JAVA_HOME=`cygpath --path --mixed "$JAVA_HOME"` + APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` # We build the pattern for arguments to be converted via cygpath @@ -143,7 +139,7 @@ if $cygwin ; then eval `echo args$i`="\"$arg\"" fi i=$((i+1)) - done + done case $i in (0) set -- ;; (1) set -- "$args0" ;; @@ -158,11 +154,11 @@ if $cygwin ; then esac fi -GRADLE_APP_BASE_NAME=`basename "$0"` +# 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" $JAVA_OPTS $GRADLE_OPTS \ - -classpath "$CLASSPATH" \ - -Dorg.gradle.appname="$GRADLE_APP_BASE_NAME" \ - -Dorg.gradle.wrapper.properties="$WRAPPER_PROPERTIES" \ - $STARTER_MAIN_CLASS \ - "$@" +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat index 4855abb883..89759b8224 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,24 +1,37 @@ @if "%DEBUG%" == "" @echo off @rem ########################################################################## -@rem ## -@rem Gradle startup script for Windows ## -@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 Uncomment those lines to set JVM options. GRADLE_OPTS and JAVA_OPTS can be used together. -@rem set GRADLE_OPTS=%GRADLE_OPTS% -Xmx512m -@rem set JAVA_OPTS=%JAVA_OPTS% -Xmx512m +@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=-XX:MaxPermSize=256M set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=.\ +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% @rem Find java.exe -set JAVA_EXE=java.exe -if not defined JAVA_HOME goto init +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 @@ -29,14 +42,14 @@ 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. -echo. -goto end + +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 +if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -56,27 +69,22 @@ set CMD_LINE_ARGS=%$ :execute @rem Setup the command line -set STARTER_MAIN_CLASS=org.gradle.wrapper.GradleWrapperMain -set CLASSPATH=%DIRNAME%\gradle\wrapper\gradle-wrapper.jar -set WRAPPER_PROPERTIES=%DIRNAME%\gradle\wrapper\gradle-wrapper.properties - -set GRADLE_OPTS=%JAVA_OPTS% %GRADLE_OPTS% -Dorg.gradle.wrapper.properties="%WRAPPER_PROPERTIES%" +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %GRADLE_OPTS% -classpath "%CLASSPATH%" %STARTER_MAIN_CLASS% %CMD_LINE_ARGS% +"%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 -if not "%OS%"=="Windows_NT" echo 1 > nul | choice /n /c:1 - +: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 "%ERRORLEVEL%" -exit /b "%ERRORLEVEL%" +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal -:omega \ No newline at end of file +:omega diff --git a/ldap/ldap.gradle b/ldap/ldap.gradle index 781c56b5e0..8594baa37b 100644 --- a/ldap/ldap.gradle +++ b/ldap/ldap.gradle @@ -1,6 +1,6 @@ // Ldap build file -apacheds_libs = [ +def apacheds_libs = [ "org.apache.directory.server:apacheds-core:$apacheDsVersion", "org.apache.directory.server:apacheds-core-entry:$apacheDsVersion", "org.apache.directory.server:apacheds-protocol-shared:$apacheDsVersion", diff --git a/remoting/remoting.gradle b/remoting/remoting.gradle index 1cbf7c730e..2530862965 100644 --- a/remoting/remoting.gradle +++ b/remoting/remoting.gradle @@ -7,5 +7,5 @@ dependencies { "org.springframework:spring-context:$springVersion", "org.springframework:spring-web:$springVersion" - testCompile project(':spring-security-core').sourceSets.test.classes + testCompile project(':spring-security-core').sourceSets.test.output } diff --git a/samples/aspectj/aspectj.gradle b/samples/aspectj/aspectj.gradle index 2f098dd31c..b3c512ce37 100644 --- a/samples/aspectj/aspectj.gradle +++ b/samples/aspectj/aspectj.gradle @@ -6,4 +6,4 @@ dependencies { runtime project(':spring-security-config'), project(':spring-security-aspects') -} \ No newline at end of file +} diff --git a/samples/cas/sample/cassample.gradle b/samples/cas/sample/cassample.gradle index 8f98e507a9..c55767f6bf 100644 --- a/samples/cas/sample/cassample.gradle +++ b/samples/cas/sample/cassample.gradle @@ -24,9 +24,7 @@ sourceSets.integrationTest { groovy.srcDir file('src/integration-test/groovy') } -eclipseClasspath { - plusConfigurations += configurations.integrationTestRuntime -} +eclipse.classpath.plusConfigurations += configurations.integrationTestRuntime dependencies { groovy 'org.codehaus.groovy:groovy:1.7.10' @@ -53,10 +51,10 @@ dependencies { [jettyRun, jettyRunWar]*.configure { contextPath = "/cas-sample" - def httpConnector = new org.mortbay.jetty.nio.SelectChannelConnector(); + def httpConnector = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.nio.SelectChannelConnector').newInstance() httpConnector.port = 8080 httpConnector.confidentialPort = 8443 - def httpsConnector = new org.mortbay.jetty.security.SslSocketConnector(); + 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 @@ -87,13 +85,15 @@ integrationTest.doFirst { gradle.taskGraph.whenReady {graph -> def casServer = casServer() [casServer,jettyRunWar]*.metaClass*.getHttpsConnector {-> - delegate.connectors.find { it instanceof org.mortbay.jetty.security.SslSocketConnector } + 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 {-> - delegate.connectors.find { it instanceof org.mortbay.jetty.nio.SelectChannelConnector } + def channelConnClass = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.nio.SelectChannelConnector') + delegate.connectors.find { it in channelConnClass } } if (graph.hasTask(cas)) { casServer.daemon = true @@ -118,4 +118,4 @@ def availablePort() { int port = server.localPort server.close() port -} \ No newline at end of file +} diff --git a/samples/cas/server/casserver.gradle b/samples/cas/server/casserver.gradle index d08e870492..d3d98dc825 100644 --- a/samples/cas/server/casserver.gradle +++ b/samples/cas/server/casserver.gradle @@ -13,12 +13,12 @@ dependencies { } task casServerOverlay(type: Sync) { - war = configurations.casServer.resolve().toArray()[0] - warName = war.name.replace('.war','-custom') - overlayDir = file('src/main/webapp') - explodedWar = file("$buildDir/tmp/${warName}") - customWar = file("$buildDir/tmp/${warName}.war") - tokens = [logLevel: 'INFO'] + def war = configurations.casServer.resolve().toArray()[0] + def warName = war.name.replace('.war','-custom') + def overlayDir = file('src/main/webapp') + def explodedWar = file("$buildDir/tmp/${warName}") + ext.customWar = file("$buildDir/tmp/${warName}.war") + ext.tokens = [logLevel: 'INFO'] inputs.files(war, overlayDir) inputs.property('tokens',{tokens}) @@ -44,7 +44,7 @@ casServerOverlay.metaClass.setLogLevel { level -> task casServer (type: org.gradle.api.plugins.jetty.JettyRunWar, dependsOn: 'casServerOverlay') { contextPath = "/cas" - connectors = [new org.mortbay.jetty.security.SslSocketConnector()] + connectors = [casServer.class.classLoader.loadClass('org.mortbay.jetty.security.SslSocketConnector').newInstance()] connectors[0].port = 9443 connectors[0].keystore = connectors[0].truststore = keystore connectors[0].keyPassword = connectors[0].trustPassword = password @@ -58,4 +58,4 @@ task casServer (type: org.gradle.api.plugins.jetty.JettyRunWar, dependsOn: 'casS System.setProperty('javax.net.ssl.trustStore', keystore) System.setProperty('javax.net.ssl.trustStorePassword', password) } -} \ No newline at end of file +} diff --git a/samples/gae/gae.gradle b/samples/gae/gae.gradle index 5a3564888d..bb6710c7a0 100644 --- a/samples/gae/gae.gradle +++ b/samples/gae/gae.gradle @@ -2,13 +2,19 @@ apply plugin: 'war' apply plugin: 'jetty' apply plugin: 'gae' -gaeVersion="1.4.2" +def gaeVersion="1.4.2" repositories { - // Hibernate Validator - mavenRepo name: 'JBoss', urls: 'https://repository.jboss.org/nexus/content/repositories/releases' - // GAE Jars - mavenRepo name: 'GAE', urls:'http://maven-gae-plugin.googlecode.com/svn/repository' + maven { + // Hibernate Validator + name = 'JBoss' + url = 'https://repository.jboss.org/nexus/content/repositories/releases' + } + maven { + // GAE Jars + name = 'GAE' + url = 'http://maven-gae-plugin.googlecode.com/svn/repository' + } } // Remove logback as it causes security issues with GAE. diff --git a/samples/preauth/preauth.gradle b/samples/preauth/preauth.gradle index 69d0821ce3..e7218d8ef9 100644 --- a/samples/preauth/preauth.gradle +++ b/samples/preauth/preauth.gradle @@ -23,5 +23,5 @@ dependencies { jettyRun { contextPath = "/preauth" - userRealms = [new org.mortbay.jetty.security.HashUserRealm('Preauth Realm', "$projectDir/realm.properties")] + userRealms = [jettyRun.class.classLoader.loadClass('org.mortbay.jetty.security.HashUserRealm').newInstance('Preauth Realm', "$projectDir/realm.properties")] } diff --git a/samples/tutorial/tutorial.gradle b/samples/tutorial/tutorial.gradle index 31c0ddea89..60397a41b3 100644 --- a/samples/tutorial/tutorial.gradle +++ b/samples/tutorial/tutorial.gradle @@ -34,10 +34,10 @@ dependencies { jettyRun { contextPath = "/tutorial" - def httpConnector = new org.mortbay.jetty.nio.SelectChannelConnector(); + def httpConnector = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.nio.SelectChannelConnector').newInstance() httpConnector.port = 8080 httpConnector.confidentialPort = 8443 - def httpsConnector = new org.mortbay.jetty.security.SslSocketConnector(); + def httpsConnector = jettyRunWar.class.classLoader.loadClass('org.mortbay.jetty.security.SslSocketConnector').newInstance() httpsConnector.port = 8443 httpsConnector.keystore = "$rootDir/samples/certificates/server.jks" httpsConnector.keyPassword = 'password' diff --git a/settings.gradle b/settings.gradle index 41e71cbfca..31db6dae91 100644 --- a/settings.gradle +++ b/settings.gradle @@ -34,7 +34,7 @@ def String[] itest = [ include modules modules.each {name -> - p = findProject(":${name}") + def p = findProject(":${name}") p.name = "spring-security-${name}" p.buildFileName = "${name}.gradle" } @@ -42,7 +42,7 @@ modules.each {name -> include samples samples.each {name -> - p = findProject(":${name}") + def p = findProject(":${name}") def fullName = name.replaceAll('/','') p.name = "spring-security-samples-${fullName}" p.buildFileName = "${fullName}.gradle" @@ -52,7 +52,7 @@ samples.each {name -> include itest itest.each { name -> - p = findProject(":${name}") + def p = findProject(":${name}") p.name = "itest-${name}" p.buildFileName = "itest-${name}.gradle" p.projectDir = new File(settingsDir, "itest/${name}"); @@ -60,7 +60,7 @@ itest.each { name -> include 'docs', 'docs:faq', 'docs:manual' -docs = findProject(':docs') +def docs = findProject(':docs') docs.buildFileName = 'docs.gradle' rootProject.children.each {project -> diff --git a/web/web.gradle b/web/web.gradle index 5a990c0ee4..9afb8a42e0 100644 --- a/web/web.gradle +++ b/web/web.gradle @@ -11,7 +11,7 @@ dependencies { provided 'javax.servlet:servlet-api:2.5' - testCompile project(':spring-security-core').sourceSets.test.classes, + testCompile project(':spring-security-core').sourceSets.test.output, 'commons-codec:commons-codec:1.3', "org.springframework:spring-test:$springVersion", "org.powermock:powermock-core:$powerMockVersion",