diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 585b808b..7715730c 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -8,7 +8,7 @@ on: env: # Default versions for canonical release build - DEFAULT_JAVA_VERSION: '8' + DEFAULT_JAVA_VERSION: '11' DEFAULT_JRUBY_VERSION: '9.4.12.1' # Should match pom.xml property (AND a version inside the test matrix) jobs: @@ -18,11 +18,9 @@ jobs: strategy: matrix: - jruby_version: [ '9.3.15.0', '9.4.12.1', '10.0.0.1' ] - java_version: [ '8', '11', '17', '21' ] + jruby_version: [ '9.4.12.1', '10.0.0.1' ] + java_version: [ '11', '17', '21' ] exclude: - - jruby_version: '10.0.0.1' - java_version: '8' # JRuby 10 requires Java 21 - jruby_version: '10.0.0.1' java_version: '11' # JRuby 10 requires Java 21 - jruby_version: '10.0.0.1' @@ -54,22 +52,12 @@ jobs: strategy: matrix: - jruby_version: [ '9.3.15.0', '9.4.12.1', '10.0.0.1' ] - java_version: [ '8', '11', '17', '21' ] + jruby_version: [ '9.4.12.1', '10.0.0.1' ] + java_version: [ '11', '17', '21' ] appraisal: [ 'rails50', 'rails52', 'rails60', 'rails61', 'rails70', 'rails71', 'rails72', 'rails80' ] exclude: - - jruby_version: '9.3.15.0' - appraisal: 'rails70' # Requires Ruby 2.7 compatibility, which JRuby 9.3 does not support - - jruby_version: '9.3.15.0' - appraisal: 'rails71' # Requires Ruby 2.7 compatibility, which JRuby 9.3 does not support - - jruby_version: '9.3.15.0' - appraisal: 'rails72' # Requires Ruby 3.1 compatibility, which JRuby 9.3 does not support - - jruby_version: '9.3.15.0' - appraisal: 'rails80' # Requires Ruby 3.4 compatibility, which JRuby 9.3 does not support - jruby_version: '9.4.12.1' appraisal: 'rails80' # Requires Ruby 3.4 compatibility, which JRuby 9.4 does not support - - jruby_version: '10.0.0.1' - java_version: '8' # JRuby 10 requires Java 21 - jruby_version: '10.0.0.1' java_version: '11' # JRuby 10 requires Java 21 - jruby_version: '10.0.0.1' @@ -95,7 +83,7 @@ jobs: with: ruby-version: jruby-${{ matrix.jruby_version }} bundler-cache: 'false' # Need to install later so we can vary from Gemfile.lock as required for JRuby version compatibility - bundler: ${{ startsWith(matrix.jruby_version, '9.3') && '2.3.27' || 'Gemfile.lock' }} + bundler: 'Gemfile.lock' - name: Run appraisal for ${{ matrix.appraisal }} run: bundle install && bundle exec rake spec diff --git a/Gemfile.lock b/Gemfile.lock index cb645130..498bb6d3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -24,7 +24,6 @@ GEM thor (1.3.2) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/History.md b/History.md index 2bd3d9a7..c62ce6ff 100644 --- a/History.md +++ b/History.md @@ -3,6 +3,9 @@ - Adds basic compatibility with JRuby 10.0 - Drop unnecessary jruby.compat.version and RackConfig.getCompatVersion() API - Drop JMS support +- Drop support for JRuby 9.3 +- Require Java 11 or later +- Support Jakarta Servlet API 4.0 (JEE 8) - update (bundled) rack to 2.2.16 ## 1.2.4 (UNRELEASED) diff --git a/README.md b/README.md index c7f0dcec..07ab6efa 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ current stable 1.1.x releases.** ## Compatibility JRuby-Rack 1.3.x -- aims to be compatible with JRuby 9.3 -> 10.0 and their supported JDK versions -- supports any container compatible with Java Servlet 3.0 API +- aims to be compatible with JRuby 9.4 -> 10.0 and Java 11+ +- supports any container compatible with Java Servlet 4.0 API JRuby-Rack 1.2.x - compatible with JRuby 9.3 -> 9.4 and their supported JDK versions diff --git a/gemfiles/rails50.gemfile.lock b/gemfiles/rails50.gemfile.lock index b1a74a08..b7ba3a13 100644 --- a/gemfiles/rails50.gemfile.lock +++ b/gemfiles/rails50.gemfile.lock @@ -138,7 +138,6 @@ GEM websocket-extensions (0.1.5) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/gemfiles/rails52.gemfile.lock b/gemfiles/rails52.gemfile.lock index 84ae5316..d370e2f9 100644 --- a/gemfiles/rails52.gemfile.lock +++ b/gemfiles/rails52.gemfile.lock @@ -146,7 +146,6 @@ GEM websocket-extensions (0.1.5) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/gemfiles/rails60.gemfile.lock b/gemfiles/rails60.gemfile.lock index 3ae56ccf..26a49ae1 100644 --- a/gemfiles/rails60.gemfile.lock +++ b/gemfiles/rails60.gemfile.lock @@ -162,7 +162,6 @@ GEM zeitwerk (2.7.2) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/gemfiles/rails61.gemfile.lock b/gemfiles/rails61.gemfile.lock index 07ab6fbd..cb3c7846 100644 --- a/gemfiles/rails61.gemfile.lock +++ b/gemfiles/rails61.gemfile.lock @@ -165,7 +165,6 @@ GEM zeitwerk (2.7.2) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/gemfiles/rails70.gemfile.lock b/gemfiles/rails70.gemfile.lock index 9ef1d639..028d0ebe 100644 --- a/gemfiles/rails70.gemfile.lock +++ b/gemfiles/rails70.gemfile.lock @@ -162,7 +162,6 @@ GEM zeitwerk (2.7.2) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/gemfiles/rails71.gemfile.lock b/gemfiles/rails71.gemfile.lock index 7022dad1..cb803a22 100644 --- a/gemfiles/rails71.gemfile.lock +++ b/gemfiles/rails71.gemfile.lock @@ -203,7 +203,6 @@ GEM zeitwerk (2.7.2) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/gemfiles/rails72.gemfile.lock b/gemfiles/rails72.gemfile.lock index c6bcb461..c819de22 100644 --- a/gemfiles/rails72.gemfile.lock +++ b/gemfiles/rails72.gemfile.lock @@ -197,7 +197,6 @@ GEM zeitwerk (2.7.2) PLATFORMS - universal-java-1.8 universal-java-11 universal-java-17 universal-java-21 diff --git a/pom.xml b/pom.xml index c3060275..e1a76702 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 3.0.5 ${project.build.directory}/rubygems 2.0.17 - 4.3.30.RELEASE + 5.3.39 @@ -99,9 +99,9 @@ provided - javax.servlet - javax.servlet-api - 3.0.1 + jakarta.servlet + jakarta.servlet-api + 4.0.4 provided @@ -199,8 +199,8 @@ maven-compiler-plugin 3.14.0 - 8 - 8 + 11 + 11 true true diff --git a/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java b/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java index 5c2f05be..f0042879 100644 --- a/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java +++ b/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java @@ -270,57 +270,97 @@ public void declareRoles(String... roleNames) { context.declareRoles(roleNames); } + @Override + public String getVirtualServerName() { + return context.getVirtualServerName(); + } + + @Override + public int getSessionTimeout() { + return context.getSessionTimeout(); + } + + @Override + public void setSessionTimeout(int sessionTimeout) { + context.setSessionTimeout(sessionTimeout); + } + + @Override + public String getRequestCharacterEncoding() { + return context.getRequestCharacterEncoding(); + } + + @Override + public void setRequestCharacterEncoding(String encoding) { + context.setRequestCharacterEncoding(encoding); + } + + @Override + public String getResponseCharacterEncoding() { + return context.getResponseCharacterEncoding(); + } + + @Override + public void setResponseCharacterEncoding(String encoding) { + context.setResponseCharacterEncoding(encoding); + } + @Override public T createServlet(Class type) throws ServletException { return context.createServlet(type); } - @Override // 3.0 in method signature + @Override public ServletRegistration.Dynamic addServlet(String servletName, String className) throws IllegalArgumentException, IllegalStateException { return context.addServlet(servletName, className); } - @Override // 3.0 in method signature + @Override public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet) throws IllegalArgumentException, IllegalStateException { return context.addServlet(servletName, servlet); } - @Override // 3.0 in method signature + @Override public ServletRegistration.Dynamic addServlet(String servletName, Class servletClass) throws IllegalArgumentException, IllegalStateException { return context.addServlet(servletName, servletClass); } - @Override // 3.0 in method signature + @Override + public ServletRegistration.Dynamic addJspFile(String servletName, String jspFile) { + return context.addJspFile(servletName, jspFile); + } + + @Override public ServletRegistration getServletRegistration(String servletName) { return context.getServletRegistration(servletName); } - @Override // 3.0 in method signature + @Override public Map getServletRegistrations() { return context.getServletRegistrations(); } - @Override // 3.0 in method signature + @Override public T createFilter(Class type) throws ServletException { return context.createFilter(type); } - @Override // 3.0 in method signature + @Override public FilterRegistration.Dynamic addFilter(String filterName, String className) throws IllegalArgumentException, IllegalStateException { return context.addFilter(filterName, className); } - @Override // 3.0 in method signature + @Override public FilterRegistration.Dynamic addFilter(String filterName, Filter filter) throws IllegalArgumentException, IllegalStateException { return context.addFilter(filterName, filter); } - @Override // 3.0 in method signature + @Override public FilterRegistration.Dynamic addFilter(String filterName, Class filterClass) throws IllegalArgumentException, IllegalStateException { return context.addFilter(filterName, filterClass); } - @Override // 3.0 in method signature + @Override public FilterRegistration getFilterRegistration(String filterName) { return context.getFilterRegistration(filterName); } @@ -350,7 +390,7 @@ public T createListener(Class listenerClass) throws return context.createListener(listenerClass); } - @Override // 3.0 in method signature + @Override public SessionCookieConfig getSessionCookieConfig() { return context.getSessionCookieConfig(); } @@ -370,7 +410,7 @@ public Set getEffectiveSessionTrackingModes() { return context.getEffectiveSessionTrackingModes(); } - @Override // 3.0 in method signature + @Override public JspConfigDescriptor getJspConfigDescriptor() { return context.getJspConfigDescriptor(); } diff --git a/src/main/java/org/jruby/rack/servlet/ResponseCapture.java b/src/main/java/org/jruby/rack/servlet/ResponseCapture.java index c744c5d2..4bf8b95a 100644 --- a/src/main/java/org/jruby/rack/servlet/ResponseCapture.java +++ b/src/main/java/org/jruby/rack/servlet/ResponseCapture.java @@ -19,6 +19,7 @@ import java.util.Set; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; @@ -166,7 +167,16 @@ public ServletOutputStream getOutputStream() throws IOException { // backwards compatibility with isError() : return new ServletOutputStream() { @Override - public void write(int b) throws IOException { + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + } + + @Override + public void write(int b) { // swallow output, because we're going to discard it } }; diff --git a/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java b/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java index 54532797..68cbc1b9 100644 --- a/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java +++ b/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java @@ -13,6 +13,7 @@ import java.io.RandomAccessFile; import java.nio.ByteBuffer; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; /** @@ -401,5 +402,18 @@ public int getCurrentBufferSize() { public int getMaximumBufferSize() { return bufferMax; } - + + @Override + public boolean isFinished() { + return buffer != null; + } + + @Override + public boolean isReady() { + return buffer != null; + } + + @Override // 4.0 in method signature + public void setReadListener(ReadListener readListener) { + } } diff --git a/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java b/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java index 42cebcae..6a7efd48 100644 --- a/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java +++ b/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java @@ -16,6 +16,7 @@ import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; +import javax.servlet.WriteListener; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; @@ -158,7 +159,7 @@ private void initializeOutputStream() { */ private static class ByteArrayServletOutputStream extends ServletOutputStream { - private final static String LINE_SEPARATOR = System.getProperty("line.separator"); + private final static String LINE_SEPARATOR = System.lineSeparator(); private final DataOutputStream dataOutputStream; private final String charSet; @@ -226,6 +227,15 @@ public void println(double d) throws IOException { println(); } + @Override + public boolean isReady() { + return false; + } + + @Override // 4.0 in method signature + public void setWriteListener(WriteListener writeListener) { + } + @Override public void println(float f) throws IOException { print(f);