From 098ff6f0f8ef8e9e6288279f0cf96f43e076d425 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 26 Jun 2017 18:58:59 +0200 Subject: [PATCH] Compatibility with JDK 9 release candidate build (175) Includes upgrade to Objenesis 2.6, Gradle 3.5.1, RxJava 2.1.1, JSON Binding API 1.0 final. Issue: SPR-15686 Issue: SPR-15600 --- build.gradle | 134 +++++++++--------- gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 54711 bytes gradle/wrapper/gradle-wrapper.properties | 6 +- .../springframework/util/ReflectionUtils.java | 3 + .../support/ReflectivePropertyAccessor.java | 12 +- .../http/codec/xml/XmlEventDecoder.java | 23 +-- .../script/KotlinScriptTemplateTests.java | 9 +- .../script/KotlinScriptTemplateTests.java | 13 +- 8 files changed, 104 insertions(+), 96 deletions(-) diff --git a/build.gradle b/build.gradle index 392123ca3ae..1851be43f7e 100644 --- a/build.gradle +++ b/build.gradle @@ -68,7 +68,7 @@ configure(allprojects) { project -> ext.jodaVersion = "2.9.9" ext.jpaVersion = "2.1.1" ext.jsfVersion = "2.2" - ext.jsonBindingVersion = "1.0.0-RC2" + ext.jsonBindingVersion = "1.0" ext.jspVersion = "2.3.2-b02" ext.jtaVersion = "1.2" ext.junitVersion = "4.12" @@ -86,7 +86,7 @@ configure(allprojects) { project -> ext.romeVersion = "1.7.3" ext.rxjavaVersion = '1.3.0' ext.rxjavaAdapterVersion = '1.2.1' - ext.rxjava2Version = '2.1.0' + ext.rxjava2Version = '2.1.1' ext.rxnettyVersion = '0.5.2' ext.servletVersion = "3.1.0" ext.slf4jVersion = "1.7.25" @@ -322,7 +322,7 @@ project("spring-core") { // further transformed by the JarJar task to depend on org.springframework.asm; this // avoids including two different copies of asm unnecessarily. def cglibVersion = "3.2.5" - def objenesisVersion = "2.5.1" + def objenesisVersion = "2.6" configurations { jarjar @@ -597,6 +597,7 @@ project("spring-messaging") { testCompile("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}") testRuntime("com.sun.xml.bind:jaxb-core:${jaxbVersion}") testRuntime("com.sun.xml.bind:jaxb-impl:${jaxbVersion}") + testRuntime("javax.activation:activation:${activationApiVersion}") } } @@ -779,67 +780,6 @@ project("spring-web") { } } -project("spring-webflux") { - description = "Spring WebFlux" - - dependencies { - compile(project(":spring-core")) - compile(project(":spring-web")) - compile("org.reactivestreams:reactive-streams") - compile("io.projectreactor:reactor-core") - optional(project(":spring-context-support")) // for FreeMarker support - provided "javax.servlet:javax.servlet-api:${servletVersion}" - optional("javax.xml.bind:jaxb-api:${jaxbVersion}") - optional("com.fasterxml.jackson.core:jackson-databind:${jackson2Version}") - optional("org.freemarker:freemarker:${freemarkerVersion}") - optional("org.apache.httpcomponents:httpclient:${httpclientVersion}") { - exclude group: "commons-logging", module: "commons-logging" - } - optional('org.webjars:webjars-locator:0.32-1') - optional("io.projectreactor.ipc:reactor-netty") - optional("io.reactivex:rxjava:${rxjavaVersion}") - optional("io.reactivex:rxjava-reactive-streams:${rxjavaAdapterVersion}") - optional("javax.websocket:javax.websocket-api:${websocketVersion}") - optional("org.apache.tomcat:tomcat-websocket:${tomcatVersion}") { - exclude group: "org.apache.tomcat", module: "tomcat-websocket-api" - exclude group: "org.apache.tomcat", module: "tomcat-servlet-api" - } - optional("org.eclipse.jetty.websocket:websocket-server:${jettyVersion}") { - exclude group: "javax.servlet", module: "javax.servlet" - } - optional("io.undertow:undertow-websockets-jsr:${undertowVersion}") { - exclude group: "org.jboss.spec.javax.websocket", module: "jboss-websocket-api_1.1_spec" - } - optional("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") - optional("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}") - testCompile("io.projectreactor:reactor-test") - testCompile("javax.validation:validation-api:${beanvalVersion}") - testCompile("org.hibernate:hibernate-validator:${hibvalVersion}") - testCompile("org.apache.tomcat:tomcat-util:${tomcatVersion}") - testCompile("org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}") - testCompile("org.eclipse.jetty:jetty-server:${jettyVersion}") - testCompile("org.eclipse.jetty:jetty-servlet:${jettyVersion}") - testCompile "io.reactivex.rxjava2:rxjava:${rxjava2Version}" - testCompile("io.undertow:undertow-core:${undertowVersion}") - testCompile("io.reactivex:rxnetty-http:${rxnettyVersion}") { - exclude group: 'io.reactivex', module: 'rxjava' - } - testCompile("com.fasterxml:aalto-xml:1.0.0") - testCompile("org.xmlunit:xmlunit-matchers:${xmlunitVersion}") - testCompile("com.squareup.okhttp3:mockwebserver:${okhttp3Version}") - testCompile("org.jetbrains.kotlin:kotlin-script-runtime:${kotlinVersion}") - testRuntime("org.jetbrains.kotlin:kotlin-script-util:${kotlinVersion}") - testRuntime("org.jetbrains.kotlin:kotlin-compiler:${kotlinVersion}") - testRuntime("org.jruby:jruby:9.1.9.0") - testRuntime("org.python:jython-standalone:2.5.3") - testRuntime("org.webjars:underscorejs:1.8.3") - testRuntime("org.glassfish:javax.el:3.0.1-b08") - testRuntime("com.sun.xml.bind:jaxb-core:${jaxbVersion}") - testRuntime("com.sun.xml.bind:jaxb-impl:${jaxbVersion}") - testRuntime("org.synchronoss.cloud:nio-multipart-parser:${niomultipartVersion}") - } -} - project("spring-orm") { description = "Spring Object/Relational Mapping" @@ -948,6 +888,7 @@ project("spring-webmvc") { testRuntime("org.glassfish:javax.el:3.0.1-b08") testRuntime("com.sun.xml.bind:jaxb-core:${jaxbVersion}") testRuntime("com.sun.xml.bind:jaxb-impl:${jaxbVersion}") + testRuntime("javax.activation:activation:${activationApiVersion}") } } @@ -995,6 +936,68 @@ project("spring-websocket") { } } +project("spring-webflux") { + description = "Spring WebFlux" + + dependencies { + compile(project(":spring-core")) + compile(project(":spring-web")) + compile("org.reactivestreams:reactive-streams") + compile("io.projectreactor:reactor-core") + optional(project(":spring-context-support")) // for FreeMarker support + provided "javax.servlet:javax.servlet-api:${servletVersion}" + optional("javax.xml.bind:jaxb-api:${jaxbVersion}") + optional("com.fasterxml.jackson.core:jackson-databind:${jackson2Version}") + optional("org.freemarker:freemarker:${freemarkerVersion}") + optional("org.apache.httpcomponents:httpclient:${httpclientVersion}") { + exclude group: "commons-logging", module: "commons-logging" + } + optional('org.webjars:webjars-locator:0.32-1') + optional("io.projectreactor.ipc:reactor-netty") + optional("io.reactivex:rxjava:${rxjavaVersion}") + optional("io.reactivex:rxjava-reactive-streams:${rxjavaAdapterVersion}") + optional("javax.websocket:javax.websocket-api:${websocketVersion}") + optional("org.apache.tomcat:tomcat-websocket:${tomcatVersion}") { + exclude group: "org.apache.tomcat", module: "tomcat-websocket-api" + exclude group: "org.apache.tomcat", module: "tomcat-servlet-api" + } + optional("org.eclipse.jetty.websocket:websocket-server:${jettyVersion}") { + exclude group: "javax.servlet", module: "javax.servlet" + } + optional("io.undertow:undertow-websockets-jsr:${undertowVersion}") { + exclude group: "org.jboss.spec.javax.websocket", module: "jboss-websocket-api_1.1_spec" + } + optional("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") + optional("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}") + testCompile("io.projectreactor:reactor-test") + testCompile("javax.validation:validation-api:${beanvalVersion}") + testCompile("org.hibernate:hibernate-validator:${hibvalVersion}") + testCompile("org.apache.tomcat:tomcat-util:${tomcatVersion}") + testCompile("org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}") + testCompile("org.eclipse.jetty:jetty-server:${jettyVersion}") + testCompile("org.eclipse.jetty:jetty-servlet:${jettyVersion}") + testCompile "io.reactivex.rxjava2:rxjava:${rxjava2Version}" + testCompile("io.undertow:undertow-core:${undertowVersion}") + testCompile("io.reactivex:rxnetty-http:${rxnettyVersion}") { + exclude group: 'io.reactivex', module: 'rxjava' + } + testCompile("com.fasterxml:aalto-xml:1.0.0") + testCompile("org.xmlunit:xmlunit-matchers:${xmlunitVersion}") + testCompile("com.squareup.okhttp3:mockwebserver:${okhttp3Version}") + testCompile("org.jetbrains.kotlin:kotlin-script-runtime:${kotlinVersion}") + testRuntime("org.jetbrains.kotlin:kotlin-script-util:${kotlinVersion}") + testRuntime("org.jetbrains.kotlin:kotlin-compiler:${kotlinVersion}") + testRuntime("org.jruby:jruby:9.1.9.0") + testRuntime("org.python:jython-standalone:2.5.3") + testRuntime("org.synchronoss.cloud:nio-multipart-parser:${niomultipartVersion}") + testRuntime("org.webjars:underscorejs:1.8.3") + testRuntime("org.glassfish:javax.el:3.0.1-b08") + testRuntime("com.sun.xml.bind:jaxb-core:${jaxbVersion}") + testRuntime("com.sun.xml.bind:jaxb-impl:${jaxbVersion}") + testRuntime("javax.activation:activation:${activationApiVersion}") + } +} + project("spring-test") { description = "Spring TestContext Framework" @@ -1074,6 +1077,7 @@ project("spring-test") { testRuntime("org.apache.logging.log4j:log4j-jul:${log4jVersion}") // Java Util Logging for JUnit 5 testRuntime("org.ehcache:ehcache:${ehcache3Version}") testRuntime("org.terracotta:management-model:2.0.0") + testRuntime("javax.annotation:javax.annotation-api:${annotationApiVersion}") testRuntime("javax.el:javax.el-api:${elApiVersion}") testRuntime("org.glassfish:javax.el:3.0.1-b08") testRuntime("com.sun.xml.bind:jaxb-core:${jaxbVersion}") @@ -1251,7 +1255,7 @@ configure(rootProject) { task wrapper(type: Wrapper) { description = "Generates gradlew[.bat] scripts" - gradleVersion = '3.5' + gradleVersion = '3.5.1' doLast() { def gradleOpts = "-XX:MaxMetaspaceSize=1024m -Xmx1024m" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index edb8a3b0004483f85dc5727969cdbdc90515bbd4..9e54d4019e9679ee71f5a484ccd8b9ba82631dc8 100644 GIT binary patch delta 19264 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 L8`fb}o#@^FL53gj delta 18813 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 ctor) { if ((!Modifier.isPublic(ctor.getModifiers()) || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers())) && !ctor.isAccessible()) { diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java index 346fc2aa19f..848696e6ab4 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java @@ -581,13 +581,9 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { private final TypeDescriptor typeDescriptor; - private final boolean needsToBeMadeAccessible; - OptimalPropertyAccessor(InvokerPair target) { this.member = target.member; this.typeDescriptor = target.typeDescriptor; - this.needsToBeMadeAccessible = (!Modifier.isPublic(this.member.getModifiers()) || - !Modifier.isPublic(this.member.getDeclaringClass().getModifiers())); } @Override @@ -625,9 +621,7 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { if (this.member instanceof Method) { Method method = (Method) this.member; try { - if (this.needsToBeMadeAccessible && !method.isAccessible()) { - method.setAccessible(true); - } + ReflectionUtils.makeAccessible(method); Object value = method.invoke(target); return new TypedValue(value, this.typeDescriptor.narrow(value)); } @@ -638,9 +632,7 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { else { Field field = (Field) this.member; try { - if (this.needsToBeMadeAccessible && !field.isAccessible()) { - field.setAccessible(true); - } + ReflectionUtils.makeAccessible(field); Object value = field.get(target); return new TypedValue(value, this.typeDescriptor.narrow(value)); } diff --git a/spring-web/src/main/java/org/springframework/http/codec/xml/XmlEventDecoder.java b/spring-web/src/main/java/org/springframework/http/codec/xml/XmlEventDecoder.java index a632294738d..1493c894b16 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/xml/XmlEventDecoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/xml/XmlEventDecoder.java @@ -18,10 +18,10 @@ package org.springframework.http.codec.xml; import java.io.InputStream; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.function.Function; -import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.XMLEvent; @@ -46,14 +46,16 @@ import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; /** - * Decodes a {@link DataBuffer} stream into a stream of {@link XMLEvent}s. That is, given - * the following XML: + * Decodes a {@link DataBuffer} stream into a stream of {@link XMLEvent}s. + * That is, given the following XML: + * *
{@code
  * 
  *     foo
  *     bar
  * }
  * 
+ * * this method with result in a flux with the following events: *
    *
  1. {@link javax.xml.stream.events.StartDocument}
  2. @@ -75,12 +77,12 @@ import org.springframework.util.MimeTypeUtils; */ public class XmlEventDecoder extends AbstractDecoder { + private static final XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + private static final boolean aaltoPresent = ClassUtils.isPresent( "com.fasterxml.aalto.AsyncXMLStreamReader", XmlEventDecoder.class.getClassLoader()); - private static final XMLInputFactory inputFactory = XMLInputFactory.newFactory(); - - boolean useAalto = true; + boolean useAalto = aaltoPresent; public XmlEventDecoder() { @@ -89,12 +91,12 @@ public class XmlEventDecoder extends AbstractDecoder { @Override - @SuppressWarnings("unchecked") + @SuppressWarnings({"rawtypes", "unchecked"}) // on JDK 9 where XMLEventReader is Iterator public Flux decode(Publisher inputStream, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { Flux flux = Flux.from(inputStream); - if (useAalto && aaltoPresent) { + if (useAalto) { return flux.flatMap(new AaltoDataBufferToXmlEvent()); } else { @@ -103,7 +105,7 @@ public class XmlEventDecoder extends AbstractDecoder { flatMapMany(dataBuffer -> { try { InputStream is = dataBuffer.asInputStream(); - XMLEventReader eventReader = inputFactory.createXMLEventReader(is); + Iterator eventReader = inputFactory.createXMLEventReader(is); return Flux.fromIterable((Iterable) () -> eventReader); } catch (XMLStreamException ex) { @@ -127,8 +129,7 @@ public class XmlEventDecoder extends AbstractDecoder { private final AsyncXMLStreamReader streamReader = inputFactory.createAsyncForByteBuffer(); - private final XMLEventAllocator eventAllocator = - EventAllocatorImpl.getDefaultInstance(); + private final XMLEventAllocator eventAllocator = EventAllocatorImpl.getDefaultInstance(); @Override public Publisher apply(DataBuffer dataBuffer) { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java index b38e6cca460..8713594a9f3 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; +import org.junit.Ignore; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -30,15 +31,15 @@ import org.springframework.http.MediaType; import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse; import org.springframework.mock.http.server.reactive.test.MockServerWebExchange; -import org.springframework.mock.web.test.MockHttpServletResponse; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; /** - * Unit tests for Kotlin script templates running on Kotlin JSR 223 support + * Unit tests for Kotlin script templates running on Kotlin JSR-223 support. * * @author Sebastien Deleuze */ +@Ignore // for JDK 9 compatibility public class KotlinScriptTemplateTests { @Test @@ -74,6 +75,7 @@ public class KotlinScriptTemplateTests { response.getBodyAsString().block()); } + private MockServerHttpResponse renderViewWithModel(String viewUrl, Map model, Locale locale, Class configuration) throws Exception { ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); view.setLocale(locale); @@ -115,6 +117,7 @@ public class KotlinScriptTemplateTests { } } + @Configuration static class ScriptTemplatingConfigurationWithoutRenderFunction { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java index 6ebaa384057..f3076495f0e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,10 +21,9 @@ import java.util.Locale; import java.util.Map; import javax.servlet.ServletContext; -import static org.junit.Assert.assertEquals; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; -import static org.mockito.Mockito.mock; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; @@ -35,11 +34,15 @@ import org.springframework.mock.web.test.MockHttpServletResponse; import org.springframework.mock.web.test.MockServletContext; import org.springframework.web.context.WebApplicationContext; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + /** - * Unit tests for Kotlin script templates running on Kotlin JSR 223 support + * Unit tests for Kotlin script templates running on Kotlin JSR-223 support. * * @author Sebastien Deleuze */ +@Ignore // for JDK 9 compatibility public class KotlinScriptTemplateTests { private WebApplicationContext webAppContext; @@ -54,6 +57,7 @@ public class KotlinScriptTemplateTests { this.servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.webAppContext); } + @Test public void renderTemplateWithFrenchLocale() throws Exception { Map model = new HashMap<>(); @@ -87,6 +91,7 @@ public class KotlinScriptTemplateTests { response.getContentAsString()); } + private MockHttpServletResponse renderViewWithModel(String viewUrl, Map model, Locale locale, Class configuration) throws Exception { ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); view.setLocale(locale);