3f89e412 by Ean Schuessler

Migrate to Jakarta EE Servlet 6.0

- Update build.gradle: jakarta.servlet-api:6.1.0
- Update EnhancedMcpServlet.groovy: Jakarta imports and servlet attributes
- Update WebFacadeStub.groovy: Complete Jakarta migration
  - New Servlet 6.0 methods (getRequestId, getProtocolRequestId, getServletConnection)
  - Removed deprecated methods (getSessionContext, getRealPath, etc.)
  - New sendRedirect(String, int, boolean) overload
- Update TestHealthServlet.java: Jakarta servlet imports

Aligns with upstream framework migration to Jakarta EE.
1 parent 979d1afd
...@@ -34,7 +34,7 @@ dependencies { ...@@ -34,7 +34,7 @@ dependencies {
34 compileOnly project(':framework') 34 compileOnly project(':framework')
35 35
36 // Servlet API (provided by framework, but needed for compilation) 36 // Servlet API (provided by framework, but needed for compilation)
37 compileOnly 'javax.servlet:javax.servlet-api:4.0.1' 37 compileOnly 'jakarta.servlet:jakarta.servlet-api:6.1.0'
38 38
39 // Test dependencies 39 // Test dependencies
40 testImplementation project(':framework') 40 testImplementation project(':framework')
......
...@@ -25,11 +25,11 @@ import org.moqui.context.ExecutionContext ...@@ -25,11 +25,11 @@ import org.moqui.context.ExecutionContext
25 import org.slf4j.Logger 25 import org.slf4j.Logger
26 import org.slf4j.LoggerFactory 26 import org.slf4j.LoggerFactory
27 27
28 import javax.servlet.ServletConfig 28 import jakarta.servlet.ServletConfig
29 import javax.servlet.ServletException 29 import jakarta.servlet.ServletException
30 import javax.servlet.http.HttpServlet 30 import jakarta.servlet.http.HttpServlet
31 import javax.servlet.http.HttpServletRequest 31 import jakarta.servlet.http.HttpServletRequest
32 import javax.servlet.http.HttpServletResponse 32 import jakarta.servlet.http.HttpServletResponse
33 import java.sql.Timestamp 33 import java.sql.Timestamp
34 import java.util.concurrent.ConcurrentHashMap 34 import java.util.concurrent.ConcurrentHashMap
35 import java.util.concurrent.atomic.AtomicBoolean 35 import java.util.concurrent.atomic.AtomicBoolean
...@@ -281,8 +281,8 @@ class EnhancedMcpServlet extends HttpServlet { ...@@ -281,8 +281,8 @@ class EnhancedMcpServlet extends HttpServlet {
281 // Modify request path to avoid ScreenResourceNotFoundException 281 // Modify request path to avoid ScreenResourceNotFoundException
282 String originalRequestURI = request.getRequestURI() 282 String originalRequestURI = request.getRequestURI()
283 String originalPathInfo = request.getPathInfo() 283 String originalPathInfo = request.getPathInfo()
284 request.setAttribute("javax.servlet.include.request_uri", "/mcp") 284 request.setAttribute("jakarta.servlet.include.request_uri", "/mcp")
285 request.setAttribute("javax.servlet.include.path_info", "") 285 request.setAttribute("jakarta.servlet.include.path_info", "")
286 286
287 try { 287 try {
288 ec.initWebFacade(webappName, request, response) 288 ec.initWebFacade(webappName, request, response)
......
...@@ -21,10 +21,10 @@ import org.moqui.impl.context.ContextJavaUtil ...@@ -21,10 +21,10 @@ import org.moqui.impl.context.ContextJavaUtil
21 import org.slf4j.Logger 21 import org.slf4j.Logger
22 import org.slf4j.LoggerFactory 22 import org.slf4j.LoggerFactory
23 23
24 import javax.servlet.ServletContext 24 import jakarta.servlet.ServletContext
25 import javax.servlet.http.HttpServletRequest 25 import jakarta.servlet.http.HttpServletRequest
26 import javax.servlet.http.HttpServletResponse 26 import jakarta.servlet.http.HttpServletResponse
27 import javax.servlet.http.HttpSession 27 import jakarta.servlet.http.HttpSession
28 import java.util.ArrayList 28 import java.util.ArrayList
29 import java.util.EventListener 29 import java.util.EventListener
30 30
...@@ -340,6 +340,9 @@ class WebFacadeStub implements WebFacade { ...@@ -340,6 +340,9 @@ class WebFacadeStub implements WebFacade {
340 } 340 }
341 } 341 }
342 342
343 @Override String getRequestId() { return null }
344 @Override String getProtocolRequestId() { return null }
345 @Override jakarta.servlet.ServletConnection getServletConnection() { return null }
343 @Override String getMethod() { return method } 346 @Override String getMethod() { return method }
344 @Override String getScheme() { return "http" } 347 @Override String getScheme() { return "http" }
345 @Override String getServerName() { return "localhost" } 348 @Override String getServerName() { return "localhost" }
...@@ -402,10 +405,10 @@ class WebFacadeStub implements WebFacade { ...@@ -402,10 +405,10 @@ class WebFacadeStub implements WebFacade {
402 @Override boolean isRequestedSessionIdFromURL() { return false } 405 @Override boolean isRequestedSessionIdFromURL() { return false }
403 @Override java.util.Locale getLocale() { return Locale.US } 406 @Override java.util.Locale getLocale() { return Locale.US }
404 @Override java.util.Enumeration<java.util.Locale> getLocales() { return Collections.enumeration([Locale.US]) } 407 @Override java.util.Enumeration<java.util.Locale> getLocales() { return Collections.enumeration([Locale.US]) }
405 @Override javax.servlet.ServletInputStream getInputStream() throws java.io.IOException { 408 @Override jakarta.servlet.ServletInputStream getInputStream() throws java.io.IOException {
406 return new javax.servlet.ServletInputStream() { 409 return new jakarta.servlet.ServletInputStream() {
407 @Override boolean isReady() { return true } 410 @Override boolean isReady() { return true }
408 @Override void setReadListener(javax.servlet.ReadListener readListener) {} 411 @Override void setReadListener(jakarta.servlet.ReadListener readListener) {}
409 @Override int read() throws java.io.IOException { return -1 } 412 @Override int read() throws java.io.IOException { return -1 }
410 @Override boolean isFinished() { return true } 413 @Override boolean isFinished() { return true }
411 } 414 }
...@@ -416,28 +419,26 @@ class WebFacadeStub implements WebFacade { ...@@ -416,28 +419,26 @@ class WebFacadeStub implements WebFacade {
416 @Override ServletContext getServletContext() { return null } 419 @Override ServletContext getServletContext() { return null }
417 @Override boolean isAsyncStarted() { return false } 420 @Override boolean isAsyncStarted() { return false }
418 @Override boolean isAsyncSupported() { return false } 421 @Override boolean isAsyncSupported() { return false }
419 @Override javax.servlet.AsyncContext getAsyncContext() { return null } 422 @Override jakarta.servlet.AsyncContext getAsyncContext() { return null }
420 @Override javax.servlet.DispatcherType getDispatcherType() { return null } 423 @Override jakarta.servlet.DispatcherType getDispatcherType() { return null }
421 424
422 // Additional required methods for HttpServletRequest 425 // Additional required methods for HttpServletRequest
423 @Override long getContentLengthLong() { return 0 } 426 @Override long getContentLengthLong() { return 0 }
424 @Override java.util.Enumeration<String> getParameterNames() { return Collections.enumeration(parameters.keySet()) } 427 @Override java.util.Enumeration<String> getParameterNames() { return Collections.enumeration(parameters.keySet()) }
425 @Override javax.servlet.RequestDispatcher getRequestDispatcher(String path) { return null } 428 @Override jakarta.servlet.RequestDispatcher getRequestDispatcher(String path) { return null }
426 @Override String getRealPath(String path) { return null }
427 @Override int getRemotePort() { return 0 } 429 @Override int getRemotePort() { return 0 }
428 @Override javax.servlet.AsyncContext startAsync() { return null } 430 @Override jakarta.servlet.AsyncContext startAsync() { return null }
429 @Override javax.servlet.AsyncContext startAsync(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response) { return null } 431 @Override jakarta.servlet.AsyncContext startAsync(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response) { return null }
430 @Override javax.servlet.http.Cookie[] getCookies() { return null } 432 @Override jakarta.servlet.http.Cookie[] getCookies() { return null }
431 @Override long getDateHeader(String name) { return 0 } 433 @Override long getDateHeader(String name) { return 0 }
432 @Override int getIntHeader(String name) { return 0 } 434 @Override int getIntHeader(String name) { return 0 }
433 @Override String changeSessionId() { return session ? session.getId() : "mock-session-id" } 435 @Override String changeSessionId() { return session ? session.getId() : "mock-session-id" }
434 @Override boolean isRequestedSessionIdFromUrl() { return false } 436 @Override boolean authenticate(jakarta.servlet.http.HttpServletResponse response) { return false }
435 @Override boolean authenticate(javax.servlet.http.HttpServletResponse response) { return false }
436 @Override void login(String username, String password) {} 437 @Override void login(String username, String password) {}
437 @Override void logout() {} 438 @Override void logout() {}
438 @Override java.util.Collection<javax.servlet.http.Part> getParts() { return [] } 439 @Override java.util.Collection<jakarta.servlet.http.Part> getParts() { return [] }
439 @Override javax.servlet.http.Part getPart(String name) { return null } 440 @Override jakarta.servlet.http.Part getPart(String name) { return null }
440 @Override <T extends javax.servlet.http.HttpUpgradeHandler> T upgrade(Class<T> handlerClass) { return null } 441 @Override <T extends jakarta.servlet.http.HttpUpgradeHandler> T upgrade(Class<T> handlerClass) { return null }
441 } 442 }
442 443
443 static class MockHttpServletResponse implements HttpServletResponse { 444 static class MockHttpServletResponse implements HttpServletResponse {
...@@ -452,10 +453,10 @@ class WebFacadeStub implements WebFacade { ...@@ -452,10 +453,10 @@ class WebFacadeStub implements WebFacade {
452 void setMockSession(HttpSession session) { this.mockSession = session } 453 void setMockSession(HttpSession session) { this.mockSession = session }
453 454
454 @Override PrintWriter getWriter() throws java.io.IOException { return printWriter } 455 @Override PrintWriter getWriter() throws java.io.IOException { return printWriter }
455 @Override javax.servlet.ServletOutputStream getOutputStream() throws java.io.IOException { 456 @Override jakarta.servlet.ServletOutputStream getOutputStream() throws java.io.IOException {
456 return new javax.servlet.ServletOutputStream() { 457 return new jakarta.servlet.ServletOutputStream() {
457 @Override boolean isReady() { return true } 458 @Override boolean isReady() { return true }
458 @Override void setWriteListener(javax.servlet.WriteListener writeListener) {} 459 @Override void setWriteListener(jakarta.servlet.WriteListener writeListener) {}
459 @Override void write(int b) throws java.io.IOException { writer.write(b) } 460 @Override void write(int b) throws java.io.IOException { writer.write(b) }
460 } 461 }
461 } 462 }
...@@ -488,11 +489,10 @@ class WebFacadeStub implements WebFacade { ...@@ -488,11 +489,10 @@ class WebFacadeStub implements WebFacade {
488 // Other required methods with minimal implementations 489 // Other required methods with minimal implementations
489 @Override String encodeURL(String url) { return url } 490 @Override String encodeURL(String url) { return url }
490 @Override String encodeRedirectURL(String url) { return url } 491 @Override String encodeRedirectURL(String url) { return url }
491 @Override String encodeUrl(String url) { return url }
492 @Override String encodeRedirectUrl(String url) { return url }
493 @Override void sendError(int sc, String msg) throws java.io.IOException { status = sc } 492 @Override void sendError(int sc, String msg) throws java.io.IOException { status = sc }
494 @Override void sendError(int sc) throws java.io.IOException { status = sc } 493 @Override void sendError(int sc) throws java.io.IOException { status = sc }
495 @Override void sendRedirect(String location) throws java.io.IOException {} 494 @Override void sendRedirect(String location) throws java.io.IOException {}
495 @Override void sendRedirect(String location, int sc, boolean clearBuffer) throws java.io.IOException {}
496 @Override void setDateHeader(String name, long date) {} 496 @Override void setDateHeader(String name, long date) {}
497 @Override void addDateHeader(String name, long date) {} 497 @Override void addDateHeader(String name, long date) {}
498 @Override void setIntHeader(String name, int value) {} 498 @Override void setIntHeader(String name, int value) {}
...@@ -501,8 +501,7 @@ class WebFacadeStub implements WebFacade { ...@@ -501,8 +501,7 @@ class WebFacadeStub implements WebFacade {
501 501
502 // Additional required methods for HttpServletResponse 502 // Additional required methods for HttpServletResponse
503 @Override void setLocale(Locale locale) {} 503 @Override void setLocale(Locale locale) {}
504 @Override void addCookie(javax.servlet.http.Cookie cookie) {} 504 @Override void addCookie(jakarta.servlet.http.Cookie cookie) {}
505 @Override void setStatus(int sc, String sm) { this.status = sc }
506 } 505 }
507 506
508 static class MockHttpSession implements HttpSession { 507 static class MockHttpSession implements HttpSession {
...@@ -521,16 +520,11 @@ class WebFacadeStub implements WebFacade { ...@@ -521,16 +520,11 @@ class WebFacadeStub implements WebFacade {
521 @Override long getCreationTime() { return creationTime } 520 @Override long getCreationTime() { return creationTime }
522 @Override String getId() { return id } 521 @Override String getId() { return id }
523 @Override long getLastAccessedTime() { return System.currentTimeMillis() } 522 @Override long getLastAccessedTime() { return System.currentTimeMillis() }
524 @Override javax.servlet.ServletContext getServletContext() { return null } 523 @Override jakarta.servlet.ServletContext getServletContext() { return null }
525 @Override void setMaxInactiveInterval(int interval) {} 524 @Override void setMaxInactiveInterval(int interval) {}
526 @Override int getMaxInactiveInterval() { return 1800 } 525 @Override int getMaxInactiveInterval() { return 1800 }
527 @Override javax.servlet.http.HttpSessionContext getSessionContext() { return null }
528 @Override void invalidate() {} 526 @Override void invalidate() {}
529 @Override boolean isNew() { return false } 527 @Override boolean isNew() { return false }
530 @Override void putValue(String name, Object value) { setAttribute(name, value) }
531 @Override Object getValue(String name) { return getAttribute(name) }
532 @Override void removeValue(String name) { removeAttribute(name) }
533 @Override String[] getValueNames() { return attributes.keySet() as String[] }
534 } 528 }
535 529
536 static class MockServletContext implements ServletContext { 530 static class MockServletContext implements ServletContext {
...@@ -548,8 +542,8 @@ class WebFacadeStub implements WebFacade { ...@@ -548,8 +542,8 @@ class WebFacadeStub implements WebFacade {
548 @Override String getRealPath(String path) { return null } 542 @Override String getRealPath(String path) { return null }
549 @Override java.io.InputStream getResourceAsStream(String path) { return null } 543 @Override java.io.InputStream getResourceAsStream(String path) { return null }
550 @Override java.net.URL getResource(String path) throws java.net.MalformedURLException { return null } 544 @Override java.net.URL getResource(String path) throws java.net.MalformedURLException { return null }
551 @Override javax.servlet.RequestDispatcher getRequestDispatcher(String path) { return null } 545 @Override jakarta.servlet.RequestDispatcher getRequestDispatcher(String path) { return null }
552 @Override javax.servlet.RequestDispatcher getNamedDispatcher(String name) { return null } 546 @Override jakarta.servlet.RequestDispatcher getNamedDispatcher(String name) { return null }
553 @Override String getInitParameter(String name) { return null } 547 @Override String getInitParameter(String name) { return null }
554 @Override java.util.Enumeration<String> getInitParameterNames() { return Collections.enumeration([]) } 548 @Override java.util.Enumeration<String> getInitParameterNames() { return Collections.enumeration([]) }
555 @Override boolean setInitParameter(String name, String value) { return false } 549 @Override boolean setInitParameter(String name, String value) { return false }
...@@ -557,37 +551,33 @@ class WebFacadeStub implements WebFacade { ...@@ -557,37 +551,33 @@ class WebFacadeStub implements WebFacade {
557 @Override ServletContext getContext(String uripath) { return null } 551 @Override ServletContext getContext(String uripath) { return null }
558 @Override int getEffectiveMajorVersion() { return 4 } 552 @Override int getEffectiveMajorVersion() { return 4 }
559 @Override int getEffectiveMinorVersion() { return 0 } 553 @Override int getEffectiveMinorVersion() { return 0 }
560 @Override javax.servlet.Servlet getServlet(String name) throws javax.servlet.ServletException { return null }
561 @Override java.util.Enumeration<javax.servlet.Servlet> getServlets() { return Collections.enumeration([]) }
562 @Override java.util.Enumeration<String> getServletNames() { return Collections.enumeration([]) }
563 @Override void log(String msg) {} 554 @Override void log(String msg) {}
564 @Override void log(Exception exception, String msg) {}
565 @Override void log(String msg, Throwable throwable) {} 555 @Override void log(String msg, Throwable throwable) {}
566 556
567 // Additional required methods for ServletContext 557 // Additional required methods for ServletContext
568 @Override java.util.Set<String> getResourcePaths(String path) { return null } 558 @Override java.util.Set<String> getResourcePaths(String path) { return null }
569 @Override javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, String className) { return null } 559 @Override jakarta.servlet.ServletRegistration.Dynamic addServlet(String servletName, String className) { return null }
570 @Override javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, javax.servlet.Servlet servlet) { return null } 560 @Override jakarta.servlet.ServletRegistration.Dynamic addServlet(String servletName, jakarta.servlet.Servlet servlet) { return null }
571 @Override javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, Class<? extends javax.servlet.Servlet> servletClass) { return null } 561 @Override jakarta.servlet.ServletRegistration.Dynamic addServlet(String servletName, Class<? extends jakarta.servlet.Servlet> servletClass) { return null }
572 @Override javax.servlet.ServletRegistration.Dynamic addJspFile(String jspName, String jspFile) { return null } 562 @Override jakarta.servlet.ServletRegistration.Dynamic addJspFile(String jspName, String jspFile) { return null }
573 @Override <T extends javax.servlet.Servlet> T createServlet(Class<T> clazz) { return null } 563 @Override <T extends jakarta.servlet.Servlet> T createServlet(Class<T> clazz) { return null }
574 @Override javax.servlet.ServletRegistration getServletRegistration(String servletName) { return null } 564 @Override jakarta.servlet.ServletRegistration getServletRegistration(String servletName) { return null }
575 @Override java.util.Map<String, ? extends javax.servlet.ServletRegistration> getServletRegistrations() { return [:] } 565 @Override java.util.Map<String, ? extends jakarta.servlet.ServletRegistration> getServletRegistrations() { return [:] }
576 @Override javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className) { return null } 566 @Override jakarta.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className) { return null }
577 @Override javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, javax.servlet.Filter filter) { return null } 567 @Override jakarta.servlet.FilterRegistration.Dynamic addFilter(String filterName, jakarta.servlet.Filter filter) { return null }
578 @Override javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends javax.servlet.Filter> filterClass) { return null } 568 @Override jakarta.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends jakarta.servlet.Filter> filterClass) { return null }
579 @Override <T extends javax.servlet.Filter> T createFilter(Class<T> clazz) { return null } 569 @Override <T extends jakarta.servlet.Filter> T createFilter(Class<T> clazz) { return null }
580 @Override javax.servlet.FilterRegistration getFilterRegistration(String filterName) { return null } 570 @Override jakarta.servlet.FilterRegistration getFilterRegistration(String filterName) { return null }
581 @Override java.util.Map<String, ? extends javax.servlet.FilterRegistration> getFilterRegistrations() { return [:] } 571 @Override java.util.Map<String, ? extends jakarta.servlet.FilterRegistration> getFilterRegistrations() { return [:] }
582 @Override javax.servlet.SessionCookieConfig getSessionCookieConfig() { return null } 572 @Override jakarta.servlet.SessionCookieConfig getSessionCookieConfig() { return null }
583 @Override void setSessionTrackingModes(java.util.Set<javax.servlet.SessionTrackingMode> sessionTrackingModes) {} 573 @Override void setSessionTrackingModes(java.util.Set<jakarta.servlet.SessionTrackingMode> sessionTrackingModes) {}
584 @Override java.util.Set<javax.servlet.SessionTrackingMode> getDefaultSessionTrackingModes() { return [] as Set } 574 @Override java.util.Set<jakarta.servlet.SessionTrackingMode> getDefaultSessionTrackingModes() { return [] as Set }
585 @Override java.util.Set<javax.servlet.SessionTrackingMode> getEffectiveSessionTrackingModes() { return [] as Set } 575 @Override java.util.Set<jakarta.servlet.SessionTrackingMode> getEffectiveSessionTrackingModes() { return [] as Set }
586 @Override void addListener(String className) {} 576 @Override void addListener(String className) {}
587 @Override void addListener(EventListener listener) {} 577 @Override void addListener(EventListener listener) {}
588 @Override void addListener(Class<? extends EventListener> listenerClass) {} 578 @Override void addListener(Class<? extends EventListener> listenerClass) {}
589 @Override <T extends EventListener> T createListener(Class<T> clazz) { return null } 579 @Override <T extends EventListener> T createListener(Class<T> clazz) { return null }
590 @Override javax.servlet.descriptor.JspConfigDescriptor getJspConfigDescriptor() { return null } 580 @Override jakarta.servlet.descriptor.JspConfigDescriptor getJspConfigDescriptor() { return null }
591 @Override ClassLoader getClassLoader() { return null } 581 @Override ClassLoader getClassLoader() { return null }
592 @Override void declareRoles(String... roleNames) {} 582 @Override void declareRoles(String... roleNames) {}
593 @Override String getVirtualServerName() { return "localhost" } 583 @Override String getVirtualServerName() { return "localhost" }
......
...@@ -13,10 +13,10 @@ ...@@ -13,10 +13,10 @@
13 */ 13 */
14 package org.moqui.mcp.test; 14 package org.moqui.mcp.test;
15 15
16 import javax.servlet.ServletException; 16 import jakarta.servlet.ServletException;
17 import javax.servlet.http.HttpServlet; 17 import jakarta.servlet.http.HttpServlet;
18 import javax.servlet.http.HttpServletRequest; 18 import jakarta.servlet.http.HttpServletRequest;
19 import javax.servlet.http.HttpServletResponse; 19 import jakarta.servlet.http.HttpServletResponse;
20 import java.io.IOException; 20 import java.io.IOException;
21 import java.io.PrintWriter; 21 import java.io.PrintWriter;
22 22
......