diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e94eadf..9ee07810 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.0 (UNRELEASED) + +- Support Jakarta Servlet API 5.0 → 6.1 (Jakarta EE 9 → 11) + ## 1.3.0 (UNRELEASED) - Officially support Javax Servlet API 4.0 (JEE 8) diff --git a/README.md b/README.md index b55e7001..201a9b50 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ For more information on Rack, visit http://rack.github.io/. ## Compatibility -| JRuby-Rack Series | Status | Rack | JRuby | Java | Rails | Target Servlet API | Notes | -|----------------------------------------------------------------|---------------|-----------|-------------|------|-----------|---------------------|----------------------------------------------------------------------| -| **2.0 (_planned_, _unreleased_)** | Dev | 2.2 | 10.0 → 10.1 | 21+ | 7.2 → 8.0 | 5.0+ (Jakarta EE 9) | ❌ Servlet < 5.0 containers will not work | -| **1.3 (master, _unreleased_)** | Dev | 2.2 | 10.0 → 10.1 | 21+ | 7.2 → 8.0 | 4.0 (Java EE 8) | ✅ _Unofficial_: Servlet 2.5 → 3.1 & Rails 6.1 → 7.1 also likely OK. | -| [**1.2**](https://github.com/jruby/jruby-rack/tree/1.2-stable) | Maintained | 2.2 | 9.3 → 10.1 | 8+ | 5.0 → 8.0 | 3.0 (Java EE 6) | ✅ _Unofficial_: Servlet 3.1 → 4.0 also OK with most containers | -| [**1.1**](https://github.com/jruby/jruby-rack/tree/1.1-stable) | EOL @ 2024-05 | 1.x → 2.2 | 1.6 → 9.4 | 6+ | 2.1 → 5.2 | 2.5 (Java EE 5) | ✅ _Unofficial_: Servlet 3.0 → 4.0 also OK with most containers | -| [**1.0**](https://github.com/jruby/jruby-rack/tree/1.0.10) | EOL @ 2011-11 | 0.9 → 1.x | 1.1 → 1.9 | 5+ | 2.1 → 3.x | 2.5 (Java EE 5) | | +| JRuby-Rack Series | Status | Rack | JRuby | Java | Rails | Servlet API (min → mostly supported) | Notes | +|----------------------------------------------------------------|---------------|-----------|-------------|------|-----------|--------------------------------------|-----------------------------------------------------------| +| **2.0 (_planned_, _unreleased_)** | Dev | 2.2 | 10.0 → 10.1 | 21+ | 7.2 → 8.0 | 5.0 → 6.1 (Jakarta EE 9 → 11) | ❌ Servlet < 5.0 containers will not work | +| **1.3 (master, _unreleased_)** | Dev | 2.2 | 10.0 → 10.1 | 21+ | 7.2 → 8.0 | 4.0 (Java EE 8) | ✅ _Unofficial_: Rails 6.1 → 7.1 untested, but likely OK. | +| [**1.2**](https://github.com/jruby/jruby-rack/tree/1.2-stable) | Maintained | 2.2 | 9.3 → 10.1 | 8+ | 5.0 → 8.0 | 3.0 → 4.0 (Java EE 6 → 7) | | +| [**1.1**](https://github.com/jruby/jruby-rack/tree/1.1-stable) | EOL @ 2024-05 | 1.x → 2.2 | 1.6 → 9.4 | 6+ | 2.1 → 5.2 | 2.5 → 4.0 (Java EE 5 → 7) | | +| [**1.0**](https://github.com/jruby/jruby-rack/tree/1.0.10) | EOL @ 2011-11 | 0.9 → 1.x | 1.1 → 1.9 | 5+ | 2.1 → 3.x | 2.5 (Java EE 5) | | ## Getting Started @@ -289,7 +289,7 @@ Or the equivalent of doing `bundle exec rackup ...` if you're using Bundler : ## Logging JRuby-Rack sets up a delegate logger for Rails that sends logging output to -`javax.servlet.ServletContext#log` by default. If you wish to use a different +`jakarta.servlet.ServletContext#log` by default. If you wish to use a different logging system, configure `jruby.rack.logging` as follows: - `servlet_context` (default): Sends log messages to the servlet context. diff --git a/pom.xml b/pom.xml index 47d2d797..e3e12c9d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,12 +5,12 @@ This source code is available under the MIT license. See the file LICENSE.txt for details. --> - + 4.0.0 org.jruby.rack jruby-rack - 1.3.0-SNAPSHOT + 2.0.0-SNAPSHOT JRuby-Rack https://github.com/jruby/jruby-rack/ @@ -19,7 +19,10 @@ + UTF-8 + 3.0.6 + ${project.build.directory}/rubygems 10.0.6.0 @@ -27,11 +30,17 @@ ${jruby.compat.version} - 3.0.6 - ${project.build.directory}/rubygems + + 5.0.0 + 3.0.0 + + + 6.1.0 + 6.0.1 + 6.2.19 + 2.0.18 2.26.1 - 5.3.39 @@ -91,13 +100,13 @@ jakarta.servlet jakarta.servlet-api - 4.0.4 + ${servlet-api.compat.version} provided jakarta.servlet.jsp jakarta.servlet.jsp-api - 2.3.6 + ${servlet-jsp-api.compat.version} provided @@ -132,20 +141,20 @@ org.springframework - spring-web + spring-test ${spring.version} test org.springframework - spring-test + spring-web ${spring.version} test jakarta.el jakarta.el-api - 3.0.3 + ${el-api.test.version} test @@ -230,6 +239,26 @@ ${project.build.directory}/lib org.jruby,rubygems + + jakarta.servlet-api + + + + copy-test-servlet-api + process-sources + + copy + + + + + + jakarta.servlet + jakarta.servlet-api + ${servlet-api.test.version} + + + ${project.build.directory}/lib @@ -271,7 +300,11 @@ test rake + speconly SKIP_SPECS=${skipTests} + + false diff --git a/src/main/java/org/jruby/rack/AbstractFilter.java b/src/main/java/org/jruby/rack/AbstractFilter.java index 898e82ee..85c1879c 100644 --- a/src/main/java/org/jruby/rack/AbstractFilter.java +++ b/src/main/java/org/jruby/rack/AbstractFilter.java @@ -8,14 +8,14 @@ package org.jruby.rack; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jruby.rack.servlet.RequestCapture; import org.jruby.rack.servlet.ResponseCapture; import org.jruby.rack.servlet.ServletRackEnvironment; diff --git a/src/main/java/org/jruby/rack/AbstractServlet.java b/src/main/java/org/jruby/rack/AbstractServlet.java index e52b37c3..fc4d1e9e 100644 --- a/src/main/java/org/jruby/rack/AbstractServlet.java +++ b/src/main/java/org/jruby/rack/AbstractServlet.java @@ -8,13 +8,13 @@ package org.jruby.rack; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jruby.rack.servlet.ServletRackEnvironment; import org.jruby.rack.servlet.ServletRackResponseEnvironment; diff --git a/src/main/java/org/jruby/rack/RackDispatcher.java b/src/main/java/org/jruby/rack/RackDispatcher.java index a0ea2f1a..6cf2cf38 100644 --- a/src/main/java/org/jruby/rack/RackDispatcher.java +++ b/src/main/java/org/jruby/rack/RackDispatcher.java @@ -8,7 +8,8 @@ package org.jruby.rack; import java.io.IOException; -import javax.servlet.ServletException; + +import jakarta.servlet.ServletException; /** * diff --git a/src/main/java/org/jruby/rack/RackEnvironment.java b/src/main/java/org/jruby/rack/RackEnvironment.java index 9d95fbb4..03c1dbf5 100644 --- a/src/main/java/org/jruby/rack/RackEnvironment.java +++ b/src/main/java/org/jruby/rack/RackEnvironment.java @@ -13,7 +13,7 @@ /** * Represent a Rack environment (that will most likely by wrapping a - * {@link javax.servlet.http.HttpServletRequest}). + * {@link jakarta.servlet.http.HttpServletRequest}). * Allows Rack applications to be loaded outside of JEE servlet environments. * * @see org.jruby.rack.servlet.ServletRackEnvironment @@ -37,7 +37,7 @@ public interface RackEnvironment { // The following methods are specific to the rack environment /** - * @see javax.servlet.ServletRequest#getInputStream() + * @see jakarta.servlet.ServletRequest#getInputStream() * @return the input as a stream * @throws IOException if there's an IO exception */ @@ -53,107 +53,107 @@ public interface RackEnvironment { // The following methods are usually inherited from the servlet request /** - * @see javax.servlet.http.HttpServletRequest#getPathInfo() + * @see jakarta.servlet.http.HttpServletRequest#getPathInfo() * @return the request path info */ String getPathInfo(); /** * Request URI should include the query string if available. - * @see javax.servlet.http.HttpServletRequest#getRequestURI() + * @see jakarta.servlet.http.HttpServletRequest#getRequestURI() * @return the request URI */ String getRequestURI(); /** - * @see javax.servlet.http.HttpServletRequest#getAttributeNames() + * @see jakarta.servlet.http.HttpServletRequest#getAttributeNames() * @return an enumeration of all attribute names */ Enumeration getAttributeNames(); /** - * @see javax.servlet.http.HttpServletRequest#getAttribute(String) + * @see jakarta.servlet.http.HttpServletRequest#getAttribute(String) * @param key the attribute key * @return the attribute value */ Object getAttribute(String key); /** - * @see javax.servlet.http.HttpServletRequest#setAttribute(String, Object) + * @see jakarta.servlet.http.HttpServletRequest#setAttribute(String, Object) * @param key the key * @param value the value */ void setAttribute(String key, Object value); /** - * @see javax.servlet.http.HttpServletRequest#getHeaderNames() + * @see jakarta.servlet.http.HttpServletRequest#getHeaderNames() * @return an enumeration of all header names */ Enumeration getHeaderNames(); /** - * @see javax.servlet.http.HttpServletRequest#getHeader(String) + * @see jakarta.servlet.http.HttpServletRequest#getHeader(String) * @param name the header name * @return the header value */ String getHeader(String name); /** - * @see javax.servlet.http.HttpServletRequest#getScheme() + * @see jakarta.servlet.http.HttpServletRequest#getScheme() * @return the request scheme */ String getScheme(); /** - * @see javax.servlet.http.HttpServletRequest#getContentType() + * @see jakarta.servlet.http.HttpServletRequest#getContentType() * @return the content type */ String getContentType(); /** - * @see javax.servlet.http.HttpServletRequest#getContentLength() + * @see jakarta.servlet.http.HttpServletRequest#getContentLength() * @return the content length */ int getContentLength(); /** - * @see javax.servlet.http.HttpServletRequest#getMethod() + * @see jakarta.servlet.http.HttpServletRequest#getMethod() * @return the request method */ String getMethod(); /** - * @see javax.servlet.http.HttpServletRequest#getQueryString() + * @see jakarta.servlet.http.HttpServletRequest#getQueryString() * @return the query string */ String getQueryString(); /** - * @see javax.servlet.http.HttpServletRequest#getServerName() + * @see jakarta.servlet.http.HttpServletRequest#getServerName() * @return the server name */ String getServerName(); /** - * @see javax.servlet.http.HttpServletRequest#getServerPort() + * @see jakarta.servlet.http.HttpServletRequest#getServerPort() * @return the server port */ int getServerPort(); /** - * @see javax.servlet.ServletRequest#getRemoteHost() + * @see jakarta.servlet.ServletRequest#getRemoteHost() * @return the remote host */ String getRemoteHost(); /** - * @see javax.servlet.ServletRequest#getRemoteAddr() + * @see jakarta.servlet.ServletRequest#getRemoteAddr() * @return the remote address */ String getRemoteAddr(); /** - * @see javax.servlet.http.HttpServletRequest#getRemoteUser() + * @see jakarta.servlet.http.HttpServletRequest#getRemoteUser() * @return the remote user */ String getRemoteUser(); diff --git a/src/main/java/org/jruby/rack/RackFilter.java b/src/main/java/org/jruby/rack/RackFilter.java index 09cc21f9..73ffae88 100644 --- a/src/main/java/org/jruby/rack/RackFilter.java +++ b/src/main/java/org/jruby/rack/RackFilter.java @@ -9,13 +9,13 @@ import java.io.IOException; import java.net.MalformedURLException; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; import org.jruby.rack.servlet.RequestCapture; import org.jruby.rack.servlet.ResponseCapture; import org.jruby.rack.servlet.ServletRackContext; diff --git a/src/main/java/org/jruby/rack/RackResponseEnvironment.java b/src/main/java/org/jruby/rack/RackResponseEnvironment.java index b5f14bc7..c3a4c4a6 100644 --- a/src/main/java/org/jruby/rack/RackResponseEnvironment.java +++ b/src/main/java/org/jruby/rack/RackResponseEnvironment.java @@ -16,8 +16,8 @@ * handle and return the Rack response) interface. * It is likely to be (only) implemented as a HTTP servlet response. * - * @see javax.servlet.ServletResponse - * @see javax.servlet.http.HttpServletResponse + * @see jakarta.servlet.ServletResponse + * @see jakarta.servlet.http.HttpServletResponse * @see RackResponse * * @author nicksieger @@ -26,30 +26,30 @@ public interface RackResponseEnvironment { /** * @return whether the underlying response has been committed. - * @see javax.servlet.ServletResponse#isCommitted() + * @see jakarta.servlet.ServletResponse#isCommitted() */ boolean isCommitted(); /** * Reset the response (buffer) so we can begin a new response. - * @see javax.servlet.ServletResponse#reset() + * @see jakarta.servlet.ServletResponse#reset() */ void reset(); /** - * @see javax.servlet.ServletResponse#setContentType(String) + * @see jakarta.servlet.ServletResponse#setContentType(String) * @param type the content type */ void setContentType(String type) ; /** - * @see javax.servlet.ServletResponse#setContentLength(int) + * @see jakarta.servlet.ServletResponse#setContentLength(int) * @param length the content length */ void setContentLength(int length) ; /** - * @see javax.servlet.ServletResponse#setCharacterEncoding(String) + * @see jakarta.servlet.ServletResponse#setCharacterEncoding(String) * @param charset the charset */ void setCharacterEncoding(String charset) ; @@ -106,13 +106,13 @@ public interface RackResponseEnvironment { void sendError(int code) throws IOException; /** - * @see javax.servlet.ServletResponse#getOutputStream() + * @see jakarta.servlet.ServletResponse#getOutputStream() * @return the output stream */ OutputStream getOutputStream() throws IOException; /** - * @see javax.servlet.ServletResponse#getWriter() + * @see jakarta.servlet.ServletResponse#getWriter() * @return the writer */ PrintWriter getWriter() throws IOException; diff --git a/src/main/java/org/jruby/rack/RackServlet.java b/src/main/java/org/jruby/rack/RackServlet.java index e5bf4944..a67c78ff 100644 --- a/src/main/java/org/jruby/rack/RackServlet.java +++ b/src/main/java/org/jruby/rack/RackServlet.java @@ -7,7 +7,7 @@ package org.jruby.rack; -import javax.servlet.ServletConfig; +import jakarta.servlet.ServletConfig; @SuppressWarnings("serial") public class RackServlet extends AbstractServlet { diff --git a/src/main/java/org/jruby/rack/RackServletContextListener.java b/src/main/java/org/jruby/rack/RackServletContextListener.java index 2fee5092..df470f5d 100644 --- a/src/main/java/org/jruby/rack/RackServletContextListener.java +++ b/src/main/java/org/jruby/rack/RackServletContextListener.java @@ -7,10 +7,9 @@ package org.jruby.rack; -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; import org.jruby.rack.servlet.DefaultServletRackContext; import org.jruby.rack.servlet.ServletRackConfig; import org.jruby.rack.servlet.ServletRackContext; diff --git a/src/main/java/org/jruby/rack/RackTag.java b/src/main/java/org/jruby/rack/RackTag.java index 73b4d8e1..30ae25a1 100644 --- a/src/main/java/org/jruby/rack/RackTag.java +++ b/src/main/java/org/jruby/rack/RackTag.java @@ -7,12 +7,11 @@ package org.jruby.rack; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.JspException; -import javax.servlet.jsp.tagext.TagSupport; - +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.jsp.JspException; +import jakarta.servlet.jsp.tagext.TagSupport; import org.jruby.rack.servlet.ServletRackEnvironment; @SuppressWarnings("serial") diff --git a/src/main/java/org/jruby/rack/UnmappedRackFilter.java b/src/main/java/org/jruby/rack/UnmappedRackFilter.java index 0ad45a67..fb5a74dc 100644 --- a/src/main/java/org/jruby/rack/UnmappedRackFilter.java +++ b/src/main/java/org/jruby/rack/UnmappedRackFilter.java @@ -13,11 +13,11 @@ import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletResponse; import org.jruby.rack.servlet.RequestCapture; import org.jruby.rack.servlet.ResponseCapture; diff --git a/src/main/java/org/jruby/rack/embed/Servlet.java b/src/main/java/org/jruby/rack/embed/Servlet.java index 69974537..1f0ad34c 100644 --- a/src/main/java/org/jruby/rack/embed/Servlet.java +++ b/src/main/java/org/jruby/rack/embed/Servlet.java @@ -7,8 +7,7 @@ */ package org.jruby.rack.embed; -import javax.servlet.ServletConfig; - +import jakarta.servlet.ServletConfig; import org.jruby.rack.AbstractServlet; import org.jruby.rack.RackContext; import org.jruby.rack.RackDispatcher; diff --git a/src/main/java/org/jruby/rack/ext/Logger.java b/src/main/java/org/jruby/rack/ext/Logger.java index 86ae1c29..b4ed74c6 100644 --- a/src/main/java/org/jruby/rack/ext/Logger.java +++ b/src/main/java/org/jruby/rack/ext/Logger.java @@ -23,8 +23,7 @@ */ package org.jruby.rack.ext; -import javax.servlet.ServletContext; - +import jakarta.servlet.ServletContext; import org.jruby.Ruby; import org.jruby.RubyClass; import org.jruby.RubyException; diff --git a/src/main/java/org/jruby/rack/logging/ServletContextLogger.java b/src/main/java/org/jruby/rack/logging/ServletContextLogger.java index 9ea6a3bc..3c02b668 100644 --- a/src/main/java/org/jruby/rack/logging/ServletContextLogger.java +++ b/src/main/java/org/jruby/rack/logging/ServletContextLogger.java @@ -7,8 +7,7 @@ */ package org.jruby.rack.logging; -import javax.servlet.ServletContext; - +import jakarta.servlet.ServletContext; import org.jruby.rack.RackLogger; public class ServletContextLogger extends RackLogger.Base { diff --git a/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java b/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java index 13fb2af5..11a0914e 100644 --- a/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java +++ b/src/main/java/org/jruby/rack/servlet/DefaultServletRackContext.java @@ -16,17 +16,17 @@ import java.util.EventListener; import java.util.Map; import java.util.Set; -import javax.servlet.Filter; -import javax.servlet.FilterRegistration; -import javax.servlet.RequestDispatcher; -import javax.servlet.Servlet; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; -import javax.servlet.SessionCookieConfig; -import javax.servlet.SessionTrackingMode; -import javax.servlet.descriptor.JspConfigDescriptor; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterRegistration; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRegistration; +import jakarta.servlet.SessionCookieConfig; +import jakarta.servlet.SessionTrackingMode; +import jakarta.servlet.descriptor.JspConfigDescriptor; import org.jruby.rack.RackApplicationFactory; import org.jruby.rack.RackConfig; import org.jruby.rack.RackLogger; @@ -205,8 +205,6 @@ public void log(Exception e, String msg) { logger.log(msg, e); } - // RackLogger - @Override public boolean isEnabled(Level level) { return logger.isEnabled(level); diff --git a/src/main/java/org/jruby/rack/servlet/HttpUtils.java b/src/main/java/org/jruby/rack/servlet/HttpUtils.java new file mode 100644 index 00000000..edd7ad71 --- /dev/null +++ b/src/main/java/org/jruby/rack/servlet/HttpUtils.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 1997-2018 Oracle and/or its affiliates and others. + * All rights reserved. + * Copyright 2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jruby.rack.servlet; + +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; + +/** + * @deprecated As of Java(tm) Servlet API 2.3. These methods were only useful with the default encoding and have been + * moved to the request interfaces. + * @implNote Propagated to jruby-rack from old Javax Servlet API <= 4.0. + * + */ +@Deprecated +public class HttpUtils { + + private HttpUtils() {} + + /** + * Parses a query string passed from the client to the server and builds a HashMap object with + * key-value pairs. The query string should be in the form of a string packaged by the GET or POST method, that is, + * it should have key-value pairs in the form key=value, with each pair separated from the next by a & + * character. + * + *

+ * A key can appear more than once in the query string with different values. However, the key appears only once in + * the HashMap, with its value being an array of strings containing the multiple values sent by the query string. + * + *

+ * The keys and values in the HashMap are stored in their decoded form, so any + characters are converted to + * spaces, and characters sent in hexadecimal notation (like %xx) are converted to ASCII characters. + * + * @param s a string containing the query to be parsed + * + * @return a Map object built from the parsed key-value pairs + * + * @exception IllegalArgumentException if the query string is invalid + */ + public static Map parseQueryString(String s) { + + String valArray[]; + + if (s == null) { + throw new IllegalArgumentException(); + } + + Map ht = new HashMap<>(); + StringBuilder sb = new StringBuilder(); + StringTokenizer st = new StringTokenizer(s, "&"); + while (st.hasMoreTokens()) { + String pair = st.nextToken(); + int pos = pair.indexOf('='); + if (pos == -1) { + // XXX + // should give more detail about the illegal argument + throw new IllegalArgumentException(); + } + String key = parseName(pair.substring(0, pos), sb); + String val = parseName(pair.substring(pos + 1), sb); + if (ht.containsKey(key)) { + String oldVals[] = ht.get(key); + valArray = new String[oldVals.length + 1]; + System.arraycopy(oldVals, 0, valArray, 0, oldVals.length); + valArray[oldVals.length] = val; + } else { + valArray = new String[1]; + valArray[0] = val; + } + ht.put(key, valArray); + } + + return ht; + } + + /* + * Parse a name in the query string. + */ + private static String parseName(String s, StringBuilder sb) { + sb.setLength(0); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '+': + sb.append(' '); + break; + case '%': + try { + sb.append((char) Integer.parseInt(s.substring(i + 1, i + 3), 16)); + i += 2; + } catch (NumberFormatException e) { + // XXX + // need to be more specific about illegal arg + throw new IllegalArgumentException(); + } catch (StringIndexOutOfBoundsException e) { + String rest = s.substring(i); + sb.append(rest); + if (rest.length() == 2) + i++; + } + + break; + default: + sb.append(c); + break; + } + } + + return sb.toString(); + } + +} diff --git a/src/main/java/org/jruby/rack/servlet/RequestCapture.java b/src/main/java/org/jruby/rack/servlet/RequestCapture.java index 81f0e835..4220af86 100644 --- a/src/main/java/org/jruby/rack/servlet/RequestCapture.java +++ b/src/main/java/org/jruby/rack/servlet/RequestCapture.java @@ -16,9 +16,10 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; + +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; /** * Request wrapper passed to filter chain. diff --git a/src/main/java/org/jruby/rack/servlet/ResponseCapture.java b/src/main/java/org/jruby/rack/servlet/ResponseCapture.java index 31bfd7ba..1b16a2b0 100644 --- a/src/main/java/org/jruby/rack/servlet/ResponseCapture.java +++ b/src/main/java/org/jruby/rack/servlet/ResponseCapture.java @@ -12,11 +12,12 @@ import java.io.PrintWriter; import java.util.Collection; import java.util.Collections; -import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpServletResponseWrapper; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; /** * Response wrapper passed to filter chain. @@ -81,15 +82,6 @@ public void setStatus(int status) { } } - @Override - @Deprecated // Deprecated in API parent - @SuppressWarnings("deprecation") // Deprecated in API parent - public void setStatus(int status, String message) { - if ( handleStatus(status, false) ) { - super.setStatus(status, message); - } - } - @Override public void sendError(int status) throws IOException { if ( handleStatus(status, true) ) { diff --git a/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java b/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java index c20aa38d..7367b7b8 100644 --- a/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java +++ b/src/main/java/org/jruby/rack/servlet/RewindableInputStream.java @@ -12,8 +12,9 @@ import java.io.InputStream; import java.io.RandomAccessFile; import java.nio.ByteBuffer; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; /** * Originally inspired by Kirk's RewindableInputStream ... diff --git a/src/main/java/org/jruby/rack/servlet/ServletRackConfig.java b/src/main/java/org/jruby/rack/servlet/ServletRackConfig.java index 3fa00530..87a3e377 100644 --- a/src/main/java/org/jruby/rack/servlet/ServletRackConfig.java +++ b/src/main/java/org/jruby/rack/servlet/ServletRackConfig.java @@ -7,8 +7,7 @@ package org.jruby.rack.servlet; -import javax.servlet.ServletContext; - +import jakarta.servlet.ServletContext; import org.jruby.rack.DefaultRackConfig; import org.jruby.rack.RackLogger; import org.jruby.rack.logging.ServletContextLogger; diff --git a/src/main/java/org/jruby/rack/servlet/ServletRackContext.java b/src/main/java/org/jruby/rack/servlet/ServletRackContext.java index bb67a335..f9a39d28 100644 --- a/src/main/java/org/jruby/rack/servlet/ServletRackContext.java +++ b/src/main/java/org/jruby/rack/servlet/ServletRackContext.java @@ -7,8 +7,7 @@ package org.jruby.rack.servlet; -import javax.servlet.ServletContext; - +import jakarta.servlet.ServletContext; import org.jruby.rack.RackApplicationFactory; import org.jruby.rack.RackContext; diff --git a/src/main/java/org/jruby/rack/servlet/ServletRackEnvironment.java b/src/main/java/org/jruby/rack/servlet/ServletRackEnvironment.java index c207515d..288310a6 100644 --- a/src/main/java/org/jruby/rack/servlet/ServletRackEnvironment.java +++ b/src/main/java/org/jruby/rack/servlet/ServletRackEnvironment.java @@ -8,11 +8,11 @@ package org.jruby.rack.servlet; import java.io.IOException; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; import org.jruby.rack.RackContext; import org.jruby.rack.RackEnvironment; diff --git a/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java b/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java index 545de948..b53cc67c 100644 --- a/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java +++ b/src/main/java/org/jruby/rack/servlet/ServletRackIncludedResponse.java @@ -13,11 +13,12 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; -import javax.servlet.ServletOutputStream; -import javax.servlet.ServletResponse; -import javax.servlet.WriteListener; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpServletResponseWrapper; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; /** * Response wrapper used to buffer the output of a server-side include. diff --git a/src/main/java/org/jruby/rack/servlet/ServletRackResponseEnvironment.java b/src/main/java/org/jruby/rack/servlet/ServletRackResponseEnvironment.java index 93953cac..a93481e2 100644 --- a/src/main/java/org/jruby/rack/servlet/ServletRackResponseEnvironment.java +++ b/src/main/java/org/jruby/rack/servlet/ServletRackResponseEnvironment.java @@ -7,9 +7,8 @@ package org.jruby.rack.servlet; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpServletResponseWrapper; - +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; import org.jruby.rack.RackResponseEnvironment; /** diff --git a/src/main/ruby/jruby/rack/servlet_ext.rb b/src/main/ruby/jruby/rack/servlet_ext.rb index 4df3b62e..bb1e2e41 100644 --- a/src/main/ruby/jruby/rack/servlet_ext.rb +++ b/src/main/ruby/jruby/rack/servlet_ext.rb @@ -9,7 +9,7 @@ # Ruby-friendly extensions to the Servlet API. -module Java::JavaxServlet::ServletContext +module Java::JakartaServlet::ServletContext # Fetch an attribute from the servlet context. def [](key) getAttribute(key.to_s) @@ -38,7 +38,7 @@ def each end end -module Java::JavaxServlet::ServletRequest +module Java::JakartaServlet::ServletRequest # Fetch an attribute from the servlet request. def [](key) getAttribute(key.to_s) @@ -67,7 +67,7 @@ def each end end -module Java::JavaxServletHttp::HttpSession +module Java::JakartaServletHttp::HttpSession # Fetch an attribute from the session. def [](key) getAttribute(key.to_s) diff --git a/src/main/ruby/jruby/rack/version.rb b/src/main/ruby/jruby/rack/version.rb index d77aa9b6..f3f34c54 100644 --- a/src/main/ruby/jruby/rack/version.rb +++ b/src/main/ruby/jruby/rack/version.rb @@ -8,6 +8,6 @@ module JRuby module Rack - VERSION = '1.3.0.SNAPSHOT' + VERSION = '2.0.0.SNAPSHOT' end end diff --git a/src/main/ruby/rack/handler/servlet/default_env.rb b/src/main/ruby/rack/handler/servlet/default_env.rb index 4c196a84..047b45dc 100644 --- a/src/main/ruby/rack/handler/servlet/default_env.rb +++ b/src/main/ruby/rack/handler/servlet/default_env.rb @@ -231,14 +231,14 @@ def load_variable(env, key) def load_builtin(env, key) case key - when 'rack.version' then env[key] = ::Rack::RELEASE - when 'rack.multithread' then env[key] = true - when 'rack.multiprocess' then env[key] = false - when 'rack.run_once' then env[key] = false - when 'rack.hijack?' then env[key] = false - when 'rack.input' then + when 'rack.version' then env[key] = ::Rack::RELEASE + when 'rack.multithread' then env[key] = true + when 'rack.multiprocess' then env[key] = false + when 'rack.run_once' then env[key] = false + when 'rack.hijack?' then env[key] = false + when 'rack.input' then env[key] = @servlet_env ? JRuby::Rack::Input.new(@servlet_env) : nil - when 'rack.errors' then context = rack_context + when 'rack.errors' then context = rack_context env[key] = context ? JRuby::Rack::ServletLog.new(context) : nil when 'rack.url_scheme' env[key] = scheme = @servlet_env ? @servlet_env.getScheme : nil @@ -246,9 +246,9 @@ def load_builtin(env, key) scheme when 'java.servlet_request' then env[key] = servlet_request when 'java.servlet_response' then env[key] = servlet_response - when 'java.servlet_context' then env[key] = servlet_context - when 'jruby.rack.context' then env[key] = rack_context - when 'jruby.rack.version' then env[key] = JRuby::Rack::VERSION + when 'java.servlet_context' then env[key] = @servlet_env.servlet_context + when 'jruby.rack.context' then env[key] = rack_context + when 'jruby.rack.version' then env[key] = JRuby::Rack::VERSION else nil end @@ -274,20 +274,6 @@ def servlet_response @servlet_env.respond_to?(:response) ? @servlet_env.response : @servlet_env end - def servlet_context - if @servlet_env.respond_to?(:servlet_context) # @since Servlet 3.0 - @servlet_env.servlet_context # ServletRequest#getServletContext() - else - if @servlet_env.respond_to?(:context) && - @servlet_env.context.is_a?(javax.servlet.ServletContext) - @servlet_env.context - else - JRuby::Rack.context || - ( servlet_request ? servlet_request.servlet_context : nil ) - end - end - end - TRANSIENT_KEYS = [ 'rack.input', 'rack.errors', 'java.servlet_request', 'java.servlet_response', 'java.servlet_context', 'jruby.rack.context' diff --git a/src/main/ruby/rack/handler/servlet/servlet_env.rb b/src/main/ruby/rack/handler/servlet/servlet_env.rb index 4fd35805..2e37a229 100644 --- a/src/main/ruby/rack/handler/servlet/servlet_env.rb +++ b/src/main/ruby/rack/handler/servlet/servlet_env.rb @@ -52,7 +52,7 @@ def load_env_key(env, key) POST_PARAM_METHODS = [ 'POST', 'PUT', 'DELETE' ].freeze # Load parameters into the (Rack) env from the Servlet API. - # using javax.servlet.http.HttpServletRequest#getParameterMap + # using Java::JakartaServletHttp::HttpServletRequest#getParameterMap def load_parameters get_only = ! POST_PARAM_METHODS.include?( @servlet_env.getMethod ) # we only need to really do this for POSTs but we'll handle all @@ -147,7 +147,7 @@ def store_parameter(key, val, hash) COOKIE_HASH = "rack.request.cookie_hash".freeze # Load cookies into the (Rack) env from the Servlet API. - # using javax.servlet.http.HttpServletRequest#getCookies + # using Java::JakartaServletHttp::HttpServletRequest#getCookies def load_cookies cookie_hash = {} (@servlet_env.getCookies || []).each do |cookie| @@ -178,7 +178,7 @@ def query_values(key) end def parse_query_string - Java::JavaxServletHttp::HttpUtils.parseQueryString(query_string) + Java::OrgJrubyRackServlet::HttpUtils.parseQueryString(query_string) end def mark_parameter_error(msg) diff --git a/src/spec/java/org/jruby/rack/fake/FakeJspWriter.java b/src/spec/java/org/jruby/rack/fake/FakeJspWriter.java index b8f7a96b..f32fac9e 100644 --- a/src/spec/java/org/jruby/rack/fake/FakeJspWriter.java +++ b/src/spec/java/org/jruby/rack/fake/FakeJspWriter.java @@ -8,7 +8,8 @@ package org.jruby.rack.fake; import java.io.IOException; -import javax.servlet.jsp.JspWriter; + +import jakarta.servlet.jsp.JspWriter; /** * Currently only used as a mock for testing. diff --git a/src/spec/java/org/jruby/rack/fake/FakePageContext.java b/src/spec/java/org/jruby/rack/fake/FakePageContext.java index aceb3043..c0d0fb5d 100644 --- a/src/spec/java/org/jruby/rack/fake/FakePageContext.java +++ b/src/spec/java/org/jruby/rack/fake/FakePageContext.java @@ -7,22 +7,21 @@ package org.jruby.rack.fake; -import java.io.IOException; import java.util.Enumeration; -import javax.el.ELContext; -import javax.servlet.Servlet; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.el.ExpressionEvaluator; -import javax.servlet.jsp.el.VariableResolver; + +import jakarta.el.ELContext; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import jakarta.servlet.jsp.JspWriter; +import jakarta.servlet.jsp.PageContext; +import jakarta.servlet.jsp.el.ExpressionEvaluator; +import jakarta.servlet.jsp.el.VariableResolver; /** * Currently only used as a mock for testing. diff --git a/src/spec/java/org/jruby/rack/mock/RackLoggingMockServletContext.java b/src/spec/java/org/jruby/rack/mock/RackLoggingMockServletContext.java index 0567f934..46a0cff7 100644 --- a/src/spec/java/org/jruby/rack/mock/RackLoggingMockServletContext.java +++ b/src/spec/java/org/jruby/rack/mock/RackLoggingMockServletContext.java @@ -53,13 +53,6 @@ public void log(String message) { logger.log(message); } - @Override - @Deprecated // Deprecated in API parent - @SuppressWarnings("deprecation") // Deprecated in API parent - public void log(Exception ex, String message) { - logger.log(message, ex); - } - @Override public void log(String message, Throwable ex) { logger.log(message, ex); diff --git a/src/spec/java/org/jruby/rack/mock/fail/FailingHttpServletResponse.java b/src/spec/java/org/jruby/rack/mock/fail/FailingHttpServletResponse.java index 64986d01..4c4ce08d 100644 --- a/src/spec/java/org/jruby/rack/mock/fail/FailingHttpServletResponse.java +++ b/src/spec/java/org/jruby/rack/mock/fail/FailingHttpServletResponse.java @@ -24,8 +24,8 @@ package org.jruby.rack.mock.fail; import java.io.IOException; -import javax.servlet.ServletOutputStream; +import jakarta.servlet.ServletOutputStream; import org.springframework.mock.web.MockHttpServletResponse; /** diff --git a/src/spec/ruby/jruby/rack/booter_spec.rb b/src/spec/ruby/jruby/rack/booter_spec.rb index 9cebdb91..15c3da42 100644 --- a/src/spec/ruby/jruby/rack/booter_spec.rb +++ b/src/spec/ruby/jruby/rack/booter_spec.rb @@ -267,7 +267,7 @@ before :each do # NOTE: this is obviously poor testing but it's easier to let the factory # setup the runtime for us than to hand copy/stub/mock all code involved - servlet_context = javax.servlet.ServletContext.impl do |name, *args| + servlet_context = Java::JakartaServlet::ServletContext.impl do |name, *args| case name.to_sym when :getRealPath then case args.first @@ -314,7 +314,7 @@ before :each do # NOTE: this is obviously poor testing but it's easier to let the factory # setup the runtime for us than to hand copy/stub/mock all code involved - servlet_context = javax.servlet.ServletContext.impl do |name, *args| + servlet_context = Java::JakartaServlet::ServletContext.impl do |name, *args| case name.to_sym when :getRealPath then case args.first diff --git a/src/spec/ruby/jruby/rack/integration_spec.rb b/src/spec/ruby/jruby/rack/integration_spec.rb index 22569091..2227244d 100644 --- a/src/spec/ruby/jruby/rack/integration_spec.rb +++ b/src/spec/ruby/jruby/rack/integration_spec.rb @@ -27,7 +27,7 @@ ) listener = org.jruby.rack.RackServletContextListener.new - listener.contextInitialized javax.servlet.ServletContextEvent.new(@servlet_context) + listener.contextInitialized Java::JakartaServlet::ServletContextEvent.new(@servlet_context) rack_factory = @servlet_context.getAttribute("rack.factory") expect(rack_factory).to be_a(RackApplicationFactory) @@ -45,7 +45,7 @@ "run lambda { |env| [ 200, {'Via' => 'JRuby-Rack', 'Content-Type' => 'text/plain'}, 'OK' ] }" ) listener = org.jruby.rack.RackServletContextListener.new - listener.contextInitialized javax.servlet.ServletContextEvent.new(@servlet_context) + listener.contextInitialized Java::JakartaServlet::ServletContextEvent.new(@servlet_context) @rack_context = @servlet_context.getAttribute("rack.context") @rack_factory = @servlet_context.getAttribute("rack.factory") end @@ -106,7 +106,7 @@ servlet_context.addInitParameter('jruby.max.runtimes', '2') listener = org.jruby.rack.rails.RailsServletContextListener.new - listener.contextInitialized javax.servlet.ServletContextEvent.new(servlet_context) + listener.contextInitialized Java::JakartaServlet::ServletContextEvent.new(servlet_context) rack_factory = servlet_context.getAttribute("rack.factory") expect(rack_factory).to be_a(RackApplicationFactory) @@ -121,7 +121,7 @@ it "initializes shared (thread-safe) by default" do listener = org.jruby.rack.rails.RailsServletContextListener.new - listener.contextInitialized javax.servlet.ServletContextEvent.new(servlet_context) + listener.contextInitialized Java::JakartaServlet::ServletContextEvent.new(servlet_context) rack_factory = servlet_context.getAttribute("rack.factory") expect(rack_factory).to be_a(RackApplicationFactory) @@ -135,7 +135,7 @@ servlet_context.addInitParameter('jruby.max.runtimes', '1') listener = org.jruby.rack.rails.RailsServletContextListener.new - listener.contextInitialized javax.servlet.ServletContextEvent.new(servlet_context) + listener.contextInitialized Java::JakartaServlet::ServletContextEvent.new(servlet_context) rack_factory = servlet_context.getAttribute("rack.factory") expect(rack_factory).to be_a(RackApplicationFactory) @@ -239,7 +239,7 @@ def initialize_rails(env = nil, servlet_context = @servlet_context) yield(servlet_context, listener) if block_given? - listener.contextInitialized javax.servlet.ServletContextEvent.new(servlet_context) + listener.contextInitialized Java::JakartaServlet::ServletContextEvent.new(servlet_context) @rack_context = servlet_context.getAttribute("rack.context") @rack_factory = servlet_context.getAttribute("rack.factory") @servlet_context = servlet_context diff --git a/src/spec/ruby/jruby/rack/response_spec.rb b/src/spec/ruby/jruby/rack/response_spec.rb index 95f745d4..dfdf2d3a 100644 --- a/src/spec/ruby/jruby/rack/response_spec.rb +++ b/src/spec/ruby/jruby/rack/response_spec.rb @@ -16,7 +16,7 @@ JRuby::Rack::Response.new [status, headers, body] end - let(:servlet_response) { javax.servlet.http.HttpServletResponse.impl {} } + let(:servlet_response) { Java::JakartaServletHttp::HttpServletResponse.impl {} } let(:response_environment) { new_response_environment(servlet_response) } diff --git a/src/spec/ruby/jruby/rack/servlet_ext_spec.rb b/src/spec/ruby/jruby/rack/servlet_ext_spec.rb index 1742adde..29b1017b 100644 --- a/src/spec/ruby/jruby/rack/servlet_ext_spec.rb +++ b/src/spec/ruby/jruby/rack/servlet_ext_spec.rb @@ -80,11 +80,11 @@ end - describe Java::JavaxServlet::ServletContext do + describe Java::JakartaServlet::ServletContext do let(:subject) do context = org.springframework.mock.web.MockServletContext.new - context.removeAttribute("javax.servlet.context.tempdir") + context.removeAttribute("jakarta.servlet.context.tempdir") context end @@ -92,10 +92,10 @@ end - describe Java::JavaxServlet::ServletRequest do + describe Java::JakartaServlet::ServletRequest do before :each do - @request = Java::JavaxServlet::ServletRequest.impl {} + @request = Java::JakartaServlet::ServletRequest.impl {} end it "should allow #[] to access request attributes" do @@ -125,10 +125,10 @@ end - describe Java::JavaxServletHttp::HttpSession do + describe Java::JakartaServletHttp::HttpSession do before :each do - @session = Java::JavaxServletHttp::HttpSession.impl {} + @session = Java::JakartaServletHttp::HttpSession.impl {} end it "should allow #[] to access session attributes" do diff --git a/src/spec/ruby/rack/embed/filter_spec.rb b/src/spec/ruby/rack/embed/filter_spec.rb index a2d3ba09..afded699 100644 --- a/src/spec/ruby/rack/embed/filter_spec.rb +++ b/src/spec/ruby/rack/embed/filter_spec.rb @@ -10,11 +10,11 @@ let(:chain) { double "filter chain" } let(:request) do - javax.servlet.http.HttpServletRequest.impl {}.tap do |request| + Java::JakartaServletHttp::HttpServletRequest.impl {}.tap do |request| allow(request).to receive(:getInputStream).and_return(StubServletInputStream.new) end end - let(:response) { javax.servlet.http.HttpServletResponse.impl {} } + let(:response) { Java::JakartaServletHttp::HttpServletResponse.impl {} } it "serves all requests using the given rack application" do rack_response = double "rack response" diff --git a/src/spec/ruby/rack/filter_spec.rb b/src/spec/ruby/rack/filter_spec.rb index a5b4cec5..a2812404 100644 --- a/src/spec/ruby/rack/filter_spec.rb +++ b/src/spec/ruby/rack/filter_spec.rb @@ -14,7 +14,7 @@ let(:chain) { double "filter chain" } def stub_request(path_info) - @request = javax.servlet.http.HttpServletRequest.impl {} + @request = Java::JakartaServletHttp::HttpServletRequest.impl {} allow(@request).to receive(:setAttribute) if block_given? yield @request, path_info @@ -27,7 +27,7 @@ def stub_request(path_info) before :each do stub_request("/index") - @response = javax.servlet.http.HttpServletResponse.impl {} + @response = Java::JakartaServletHttp::HttpServletResponse.impl {} allow(@rack_context).to receive(:getResource).and_return nil allow(@rack_config).to receive(:getProperty) do |key, default| (key || raise("missing key")) && default @@ -339,7 +339,7 @@ def isHandled(arg) end it "configures not handled statuses on init" do - servlet_context = javax.servlet.ServletContext.impl do |name, *args| + servlet_context = Java::JakartaServlet::ServletContext.impl do |name, *args| case name.to_sym when :getAttribute if args[0] == "rack.context" @@ -349,7 +349,7 @@ def isHandled(arg) nil end end - config = javax.servlet.FilterConfig.impl do |name, *args| + config = Java::JakartaServlet::FilterConfig.impl do |name, *args| case name.to_sym when :getServletContext then servlet_context when :getInitParameter diff --git a/src/spec/ruby/rack/handler/servlet_spec.rb b/src/spec/ruby/rack/handler/servlet_spec.rb index 186278d6..6eedad04 100644 --- a/src/spec/ruby/rack/handler/servlet_spec.rb +++ b/src/spec/ruby/rack/handler/servlet_spec.rb @@ -332,7 +332,7 @@ def _env it "exposes the servlet context xxxx" do env = servlet.create_env @servlet_env - expect(env['java.servlet_context']).to be_a javax.servlet.ServletContext + expect( env['java.servlet_context'] ).to be_a Java::JakartaServlet::ServletContext end it "exposes the rack context" do @@ -1071,9 +1071,9 @@ def servlet.create_env(servlet_env) it "sets cookies from servlet requests" do cookies = [] - cookies << javax.servlet.http.Cookie.new('foo', 'bar') - cookies << javax.servlet.http.Cookie.new('bar', '142') - servlet_request.setCookies cookies.to_java :'javax.servlet.http.Cookie' + cookies << Java::JakartaServletHttp::Cookie.new('foo', 'bar') + cookies << Java::JakartaServletHttp::Cookie.new('bar', '142') + servlet_request.setCookies cookies.to_java :'jakarta.servlet.http.Cookie' env = servlet.create_env(servlet_env) rack_request = Rack::Request.new(env) expect(rack_request.cookies).to eq({ 'foo' => 'bar', 'bar' => '142' }) @@ -1085,7 +1085,7 @@ def servlet.create_env(servlet_env) rack_request = Rack::Request.new(env) expect(rack_request.cookies).to eq({}) - servlet_request.setCookies [].to_java :'javax.servlet.http.Cookie' + servlet_request.setCookies [].to_java :'jakarta.servlet.http.Cookie' env = servlet.create_env(servlet_env) rack_request = Rack::Request.new(env) expect(rack_request.cookies).to eq({}) @@ -1093,9 +1093,9 @@ def servlet.create_env(servlet_env) it "sets a single cookie from servlet requests" do cookies = [] - cookies << javax.servlet.http.Cookie.new('foo', 'bar') - cookies << javax.servlet.http.Cookie.new('foo', '142') - servlet_request.setCookies cookies.to_java :'javax.servlet.http.Cookie' + cookies << Java::JakartaServletHttp::Cookie.new('foo', 'bar') + cookies << Java::JakartaServletHttp::Cookie.new('foo', '142') + servlet_request.setCookies cookies.to_java :'jakarta.servlet.http.Cookie' env = servlet.create_env(servlet_env) rack_request = Rack::Request.new(env) expect(rack_request.cookies).to eq({ 'foo' => 'bar' }) diff --git a/src/spec/ruby/rack/servlet_context_listener_spec.rb b/src/spec/ruby/rack/servlet_context_listener_spec.rb index 7442eadb..73b69f4b 100644 --- a/src/spec/ruby/rack/servlet_context_listener_spec.rb +++ b/src/spec/ruby/rack/servlet_context_listener_spec.rb @@ -16,7 +16,7 @@ end let(:servlet_context_event) do - javax.servlet.ServletContextEvent.new @servlet_context + Java::JakartaServlet::ServletContextEvent.new @servlet_context end describe "contextInitialized" do diff --git a/src/spec/ruby/rack/servlet_spec.rb b/src/spec/ruby/rack/servlet_spec.rb index 08232580..1f77a3a9 100644 --- a/src/spec/ruby/rack/servlet_spec.rb +++ b/src/spec/ruby/rack/servlet_spec.rb @@ -10,8 +10,8 @@ describe org.jruby.rack.RackServlet, "service" do it "should delegate to process" do - request = javax.servlet.http.HttpServletRequest.impl {} - response = javax.servlet.http.HttpServletResponse.impl {} + request = Java::JakartaServletHttp::HttpServletRequest.impl {} + response = Java::JakartaServletHttp::HttpServletResponse.impl {} dispatcher = double "dispatcher" expect(dispatcher).to receive(:process) servlet = org.jruby.rack.RackServlet.new dispatcher, @rack_context diff --git a/src/spec/ruby/rack/tag_spec.rb b/src/spec/ruby/rack/tag_spec.rb index 337952e6..f04a93e2 100644 --- a/src/spec/ruby/rack/tag_spec.rb +++ b/src/spec/ruby/rack/tag_spec.rb @@ -58,7 +58,7 @@ def call(request) begin @tag.doEndTag - rescue Java::JavaxServletJsp::JspException + rescue Java::JakartaServletJsp::JspException # noop end end diff --git a/src/spec/ruby/spec_helper.rb b/src/spec/ruby/spec_helper.rb index d3ccae07..ddc2b2b4 100644 --- a/src/spec/ruby/spec_helper.rb +++ b/src/spec/ruby/spec_helper.rb @@ -5,8 +5,8 @@ $CLASSPATH << File.expand_path('test-classes', target) jars.each { |jar| $CLASSPATH << File.expand_path(jar, lib) } -java_import 'javax.servlet.http.HttpServletRequest' -java_import 'javax.servlet.http.HttpServletResponse' +java_import 'jakarta.servlet.http.HttpServletRequest' +java_import 'jakarta.servlet.http.HttpServletResponse' java_import 'org.jruby.rack.RackApplicationFactory' java_import 'org.jruby.rack.DefaultRackApplicationFactory' @@ -23,7 +23,7 @@ module SharedHelpers def mock_servlet_context - @servlet_context = Java::JavaxServlet::ServletContext.impl {} + @servlet_context = Java::JakartaServlet::ServletContext.impl {} @rack_config ||= Java::OrgJrubyRack::RackConfig.impl {} @rack_context ||= Java::OrgJrubyRackServlet::ServletRackContext.impl {} [@rack_context, @servlet_context].each do |context| @@ -36,7 +36,7 @@ def mock_servlet_context allow(context).to receive(:init_parameter_names).and_return [] end allow(@rack_context).to receive(:getConfig).and_return @rack_config - @servlet_config ||= Java::JavaxServlet::ServletConfig.impl {} + @servlet_config ||= Java::JakartaServlet::ServletConfig.impl {} allow(@servlet_config).to receive(:getServletName).and_return "a Servlet" allow(@servlet_config).to receive(:getServletContext).and_return @servlet_context @servlet_context @@ -152,10 +152,10 @@ def should_eval_as_not_nil(code) end -java_import org.springframework.mock.web.MockServletConfig -java_import org.springframework.mock.web.MockServletContext -java_import org.springframework.mock.web.MockHttpServletRequest -java_import org.springframework.mock.web.MockHttpServletResponse +java_import 'org.springframework.mock.web.MockServletConfig' +java_import 'org.springframework.mock.web.MockServletContext' +java_import 'org.springframework.mock.web.MockHttpServletRequest' +java_import 'org.springframework.mock.web.MockHttpServletResponse' class StubInputStream < java.io.InputStream @@ -193,7 +193,7 @@ def flush; end end -class StubServletInputStream < javax.servlet.ServletInputStream +class StubServletInputStream < Java::JakartaServlet::ServletInputStream def initialize(val = "") @delegate = StubInputStream.new(val)