r = new ArrayList<>();
- Enumeration e = Stapler.getCurrentRequest().getHeaders(name);
+ Enumeration e = Stapler.getCurrentRequest2().getHeaders(name);
while (e.hasMoreElements()) {
r.add(e.nextElement().toString());
}
@@ -2366,6 +2453,7 @@ public class Functions {
* Advertises the minimum set of HTTP headers that assist programmatic
* discovery of Jenkins.
*/
+ @SuppressFBWarnings(value = "UC_USELESS_VOID_METHOD", justification = "TODO needs triage")
public static void advertiseHeaders(HttpServletResponse rsp) {
Jenkins j = Jenkins.getInstanceOrNull();
if (j != null) {
@@ -2375,6 +2463,14 @@ public class Functions {
}
}
+ /**
+ * @deprecated use {@link #advertiseHeaders(HttpServletResponse)}
+ */
+ @Deprecated
+ public static void advertiseHeaders(javax.servlet.http.HttpServletResponse rsp) {
+ advertiseHeaders(HttpServletResponseWrapper.toJakartaHttpServletResponse(rsp));
+ }
+
@Restricted(NoExternalUse.class) // for actions.jelly and ContextMenu.add
public static boolean isContextMenuVisible(Action a) {
if (a instanceof ModelObjectWithContextMenu.ContextMenuVisibility) {
@@ -2449,7 +2545,7 @@ public class Functions {
return iconGuess;
}
- StaplerRequest currentRequest = Stapler.getCurrentRequest();
+ StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
String rootURL = currentRequest.getContextPath();
Icon iconMetadata = tryGetIcon(iconGuess);
diff --git a/core/src/main/java/hudson/LocalPluginManager.java b/core/src/main/java/hudson/LocalPluginManager.java
index d1fcfd678e..7ee8c68b40 100644
--- a/core/src/main/java/hudson/LocalPluginManager.java
+++ b/core/src/main/java/hudson/LocalPluginManager.java
@@ -26,11 +26,12 @@ package hudson;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
+import io.jenkins.servlet.ServletContextWrapper;
+import jakarta.servlet.ServletContext;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.logging.Logger;
-import javax.servlet.ServletContext;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
@@ -49,12 +50,20 @@ public class LocalPluginManager extends PluginManager {
super(context, new File(rootDir, "plugins"));
}
+ /**
+ * @deprecated use {@link #LocalPluginManager(ServletContext, File)}
+ */
+ @Deprecated
+ public LocalPluginManager(@CheckForNull javax.servlet.ServletContext context, @NonNull File rootDir) {
+ this(context != null ? ServletContextWrapper.toJakartaServletContext(context) : null, rootDir);
+ }
+
/**
* Creates a new LocalPluginManager
* @param jenkins Jenkins instance that will use the plugin manager.
*/
public LocalPluginManager(@NonNull Jenkins jenkins) {
- this(jenkins.servletContext, jenkins.getRootDir());
+ this(jenkins.getServletContext(), jenkins.getRootDir());
}
/**
@@ -62,7 +71,7 @@ public class LocalPluginManager extends PluginManager {
* @param rootDir Jenkins home directory.
*/
public LocalPluginManager(@NonNull File rootDir) {
- this(null, rootDir);
+ this((ServletContext) null, rootDir);
}
@Override
diff --git a/core/src/main/java/hudson/Plugin.java b/core/src/main/java/hudson/Plugin.java
index c87a2cbe9b..1427da9fda 100644
--- a/core/src/main/java/hudson/Plugin.java
+++ b/core/src/main/java/hudson/Plugin.java
@@ -33,25 +33,29 @@ import hudson.model.Descriptor.FormException;
import hudson.model.Saveable;
import hudson.model.listeners.ItemListener;
import hudson.model.listeners.SaveableListener;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
import jenkins.model.GlobalConfiguration;
import jenkins.model.Jenkins;
import jenkins.model.Loadable;
+import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties;
import net.sf.json.JSONObject;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
/**
* Base class of Hudson plugin.
@@ -92,11 +96,11 @@ public abstract class Plugin implements Loadable, Saveable, StaplerProxy {
/**
* You do not need to create custom subtypes:
*
- * - {@code config.jelly}, {@link #configure(StaplerRequest, JSONObject)}, {@link #load}, and {@link #save}
+ *
- {@code config.jelly}, {@link #configure(StaplerRequest2, JSONObject)}, {@link #load}, and {@link #save}
* can be replaced by {@link GlobalConfiguration}
*
- {@link #start} and {@link #postInitialize} can be replaced by {@link Initializer} (or {@link ItemListener#onLoaded})
*
- {@link #stop} can be replaced by {@link Terminator}
- *
- {@link #setServletContext} can be replaced by {@link Jenkins#servletContext}
+ *
- {@link #setServletContext} can be replaced by {@link Jenkins#getServletContext}
*
* Note that every plugin gets a {@link DummyImpl} by default,
* which will still route the URL space, serve {@link #getWrapper}, and so on.
@@ -189,10 +193,10 @@ public abstract class Plugin implements Loadable, Saveable, StaplerProxy {
/**
* @since 1.233
- * @deprecated as of 1.305 override {@link #configure(StaplerRequest,JSONObject)} instead
+ * @deprecated as of 1.305 override {@link #configure(StaplerRequest2,JSONObject)} instead
*/
@Deprecated
- public void configure(JSONObject formData) throws IOException, ServletException, FormException {
+ public void configure(JSONObject formData) throws IOException, javax.servlet.ServletException, FormException {
}
/**
@@ -220,16 +224,60 @@ public abstract class Plugin implements Loadable, Saveable, StaplerProxy {
*
* If you are using this method, you'll likely be interested in
* using {@link #save()} and {@link #load()}.
+ * @since TODO
+ */
+ public void configure(StaplerRequest2 req, JSONObject formData) throws IOException, ServletException, FormException {
+ try {
+ if (Util.isOverridden(Plugin.class, getClass(), "configure", StaplerRequest.class, JSONObject.class)) {
+ configure(StaplerRequest.fromStaplerRequest2(req), formData);
+ } else {
+ configure(formData);
+ }
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #configure(StaplerRequest2, JSONObject)}
* @since 1.305
*/
- public void configure(StaplerRequest req, JSONObject formData) throws IOException, ServletException, FormException {
+ @Deprecated
+ public void configure(StaplerRequest req, JSONObject formData) throws IOException, javax.servlet.ServletException, FormException {
configure(formData);
}
/**
* This method serves static resources in the plugin under {@code hudson/plugin/SHORTNAME}.
+ *
+ * @since TODO
*/
- public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doDynamic(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
+ if (Util.isOverridden(Plugin.class, getClass(), "doDynamic", StaplerRequest.class, StaplerResponse.class)) {
+ try {
+ doDynamic(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ doDynamicImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doDynamic(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doDynamicImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private void doDynamicImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
String path = req.getRestOfPath();
String pathUC = path.toUpperCase(Locale.ENGLISH);
diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java
index 16c22e9ca9..e1f5d4cc11 100644
--- a/core/src/main/java/hudson/PluginManager.java
+++ b/core/src/main/java/hudson/PluginManager.java
@@ -66,6 +66,10 @@ import hudson.util.Retrier;
import hudson.util.Service;
import hudson.util.VersionNumber;
import hudson.util.XStream2;
+import io.jenkins.servlet.ServletContextWrapper;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FilenameFilter;
@@ -118,8 +122,6 @@ import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
@@ -134,6 +136,7 @@ import jenkins.install.InstallUtil;
import jenkins.model.Jenkins;
import jenkins.plugins.DetachedPluginsUtil;
import jenkins.security.CustomClassFilter;
+import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties;
import jenkins.util.io.OnMaster;
import jenkins.util.xml.RestrictiveEntityResolver;
@@ -143,8 +146,8 @@ import org.apache.commons.fileupload2.core.DiskFileItem;
import org.apache.commons.fileupload2.core.DiskFileItemFactory;
import org.apache.commons.fileupload2.core.FileItem;
import org.apache.commons.fileupload2.core.FileUploadException;
-import org.apache.commons.fileupload2.javax.JavaxServletDiskFileUpload;
-import org.apache.commons.fileupload2.javax.JavaxServletFileUpload;
+import org.apache.commons.fileupload2.jakarta.servlet5.JakartaServletDiskFileUpload;
+import org.apache.commons.fileupload2.jakarta.servlet5.JakartaServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
@@ -165,7 +168,8 @@ import org.kohsuke.stapler.StaplerFallback;
import org.kohsuke.stapler.StaplerOverridable;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST;
@@ -237,11 +241,22 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
return klass.getConstructor(Jenkins.class).newInstance(jenkins);
}
},
+ SC_FILE2 {
+ @Override
+ @NonNull PluginManager doCreate(@NonNull Class extends PluginManager> klass,
+ @NonNull Jenkins jenkins) throws ReflectiveOperationException {
+ return klass.getConstructor(ServletContext.class, File.class).newInstance(jenkins.getServletContext(), jenkins.getRootDir());
+ }
+ },
+ /**
+ * @deprecated use {@link #SC_FILE2}
+ */
+ @Deprecated
SC_FILE {
@Override
@NonNull PluginManager doCreate(@NonNull Class extends PluginManager> klass,
@NonNull Jenkins jenkins) throws ReflectiveOperationException {
- return klass.getConstructor(ServletContext.class, File.class).newInstance(jenkins.servletContext, jenkins.getRootDir());
+ return klass.getConstructor(javax.servlet.ServletContext.class, File.class).newInstance(jenkins.servletContext, jenkins.getRootDir());
}
},
FILE {
@@ -363,6 +378,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
*/
private final PluginStrategy strategy;
+ /**
+ * @since TODO
+ */
protected PluginManager(ServletContext context, File rootDir) {
this.context = context;
@@ -378,6 +396,14 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
strategy = createPluginStrategy();
}
+ /**
+ * @deprecated use {@link #PluginManager(ServletContext, File)}
+ */
+ @Deprecated
+ protected PluginManager(javax.servlet.ServletContext context, File rootDir) {
+ this(context != null ? ServletContextWrapper.toJakartaServletContext(context) : null, rootDir);
+ }
+
public Api getApi() {
Jenkins.get().checkPermission(Jenkins.SYSTEM_READ);
return new Api(this);
@@ -655,7 +681,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
protected @NonNull Set loadPluginsFromWar(@NonNull String fromPath, @CheckForNull FilenameFilter filter) {
Set names = new HashSet<>();
- ServletContext context = Jenkins.get().servletContext;
+ ServletContext context = Jenkins.get().getServletContext();
Set plugins = Util.fixNull(context.getResourcePaths(fromPath));
Set copiedPlugins = new HashSet<>();
Set dependencies = new HashSet<>();
@@ -723,7 +749,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
String dependencySpec = manifest.getMainAttributes().getValue("Plugin-Dependencies");
if (dependencySpec != null) {
String[] dependencyTokens = dependencySpec.split(",");
- ServletContext context = Jenkins.get().servletContext;
+ ServletContext context = Jenkins.get().getServletContext();
for (String dependencyToken : dependencyTokens) {
if (dependencyToken.endsWith(";resolution:=optional")) {
@@ -1597,7 +1623,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
@RequirePOST
- public HttpResponse doUpdateSources(StaplerRequest req) throws IOException {
+ public HttpResponse doUpdateSources(StaplerRequest2 req) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (req.hasParameter("remove")) {
@@ -1632,7 +1658,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* Performs the installation of the plugins.
*/
@RequirePOST
- public void doInstall(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doInstall(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
Set plugins = new LinkedHashSet<>();
@@ -1656,12 +1682,12 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @param req The request object.
* @return A JSON response that includes a "correlationId" in the "data" element.
* That "correlationId" can then be used in calls to
- * {@link UpdateCenter#doInstallStatus(org.kohsuke.stapler.StaplerRequest)}.
+ * {@link UpdateCenter#doInstallStatus(org.kohsuke.stapler.StaplerRequest2)}.
* @throws IOException Error reading JSON payload fro request.
*/
@RequirePOST
@Restricted(DoNotUse.class) // WebOnly
- public HttpResponse doInstallPlugins(StaplerRequest req) throws IOException {
+ public HttpResponse doInstallPlugins(StaplerRequest2 req) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
String payload = IOUtils.toString(req.getInputStream(), req.getCharacterEncoding());
JSONObject request = JSONObject.fromObject(payload);
@@ -1815,7 +1841,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
@POST
- public HttpResponse doProxyConfigure(StaplerRequest req) throws IOException, ServletException {
+ public HttpResponse doProxyConfigure(StaplerRequest2 req) throws IOException, ServletException {
Jenkins jenkins = Jenkins.get();
jenkins.checkPermission(Jenkins.ADMINISTER);
@@ -1880,14 +1906,39 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* Uploads a plugin.
*/
@RequirePOST
- public HttpResponse doUploadPlugin(StaplerRequest req) throws IOException, ServletException {
+ public HttpResponse doUploadPlugin(StaplerRequest2 req) throws IOException, ServletException {
+ if (Util.isOverridden(PluginManager.class, getClass(), "doUploadPlugin", StaplerRequest.class)) {
+ try {
+ return doUploadPlugin(StaplerRequest.fromStaplerRequest2(req));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ return doUploadPluginImpl(req);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doUploadPlugin(StaplerRequest2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ public HttpResponse doUploadPlugin(StaplerRequest req) throws IOException, javax.servlet.ServletException {
+ try {
+ return doUploadPluginImpl(StaplerRequest.toStaplerRequest2(req));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private HttpResponse doUploadPluginImpl(StaplerRequest2 req) throws IOException, ServletException {
try {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
String fileName = "";
PluginCopier copier;
File tmpDir = Files.createTempDirectory("uploadDir").toFile();
- JavaxServletFileUpload upload = new JavaxServletDiskFileUpload(DiskFileItemFactory.builder().setFile(tmpDir).get());
+ JakartaServletFileUpload upload = new JakartaServletDiskFileUpload(DiskFileItemFactory.builder().setFile(tmpDir).get());
List items = upload.parseRequest(req);
String string = items.get(1).getString();
if (string != null && !string.isBlank()) {
@@ -1965,7 +2016,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
@Restricted(NoExternalUse.class)
- @RequirePOST public FormValidation doCheckPluginUrl(StaplerRequest request, @QueryParameter String value) throws IOException {
+ @RequirePOST public FormValidation doCheckPluginUrl(StaplerRequest2 request, @QueryParameter String value) throws IOException {
if (value != null && !value.isBlank()) {
try {
URL url = new URL(value);
@@ -1984,7 +2035,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
@Restricted(NoExternalUse.class)
- @RequirePOST public FormValidation doCheckUpdateSiteUrl(StaplerRequest request, @QueryParameter String value) throws InterruptedException {
+ @RequirePOST public FormValidation doCheckUpdateSiteUrl(StaplerRequest2 request, @QueryParameter String value) throws InterruptedException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
return checkUpdateSiteURL(value);
}
@@ -2217,7 +2268,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
/**
- * Like {@link #doInstallNecessaryPlugins(StaplerRequest)} but only checks if everything is installed
+ * Like {@link #doInstallNecessaryPlugins(StaplerRequest2)} but only checks if everything is installed
* or if some plugins need updates or installation.
*
* This method runs without side-effect. I'm still requiring the ADMINISTER permission since
@@ -2227,7 +2278,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @since 1.483
*/
@RequirePOST
- public JSONArray doPrevalidateConfig(StaplerRequest req) throws IOException {
+ public JSONArray doPrevalidateConfig(StaplerRequest2 req) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
JSONArray response = new JSONArray();
@@ -2252,7 +2303,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @since 1.483
*/
@RequirePOST
- public HttpResponse doInstallNecessaryPlugins(StaplerRequest req) throws IOException {
+ public HttpResponse doInstallNecessaryPlugins(StaplerRequest2 req) throws IOException {
prevalidateConfig(req.getInputStream());
return HttpResponses.redirectViaContextPath("pluginManager/updates/");
}
diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java
index 47cfcb02d9..c8cd9f5240 100644
--- a/core/src/main/java/hudson/PluginWrapper.java
+++ b/core/src/main/java/hudson/PluginWrapper.java
@@ -80,8 +80,8 @@ import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST;
@@ -1212,7 +1212,7 @@ public class PluginWrapper implements Comparable, ModelObject {
/**
* Depending on whether the user said "dismiss" or "correct", send him to the right place.
*/
- public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException {
+ public void doAct(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
if (req.hasParameter("correct")) {
rsp.sendRedirect(req.getContextPath() + "/pluginManager");
diff --git a/core/src/main/java/hudson/ProxyConfigurationManager.java b/core/src/main/java/hudson/ProxyConfigurationManager.java
index 52f15f84c8..d3ae0d79ee 100644
--- a/core/src/main/java/hudson/ProxyConfigurationManager.java
+++ b/core/src/main/java/hudson/ProxyConfigurationManager.java
@@ -32,7 +32,7 @@ import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
@Extension @Restricted(NoExternalUse.class)
public class ProxyConfigurationManager extends GlobalConfiguration {
@@ -48,7 +48,7 @@ public class ProxyConfigurationManager extends GlobalConfiguration {
}
@Override
- public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
+ public boolean configure(StaplerRequest2 req, JSONObject json) throws FormException {
ProxyConfiguration pc = req.bindJSON(ProxyConfiguration.class, json);
try {
saveProxyConfiguration(pc);
diff --git a/core/src/main/java/hudson/ResponseHeaderFilter.java b/core/src/main/java/hudson/ResponseHeaderFilter.java
index 90fb0be87d..416e5c4c69 100644
--- a/core/src/main/java/hudson/ResponseHeaderFilter.java
+++ b/core/src/main/java/hudson/ResponseHeaderFilter.java
@@ -24,15 +24,15 @@
package hudson;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
+import org.kohsuke.stapler.CompatibleFilter;
/**
* This filter allows you to modify headers set by the container or other servlets
@@ -77,7 +77,7 @@ import javax.servlet.http.HttpServletResponse;
*
* @author Mike Wille
*/
-public class ResponseHeaderFilter implements Filter {
+public class ResponseHeaderFilter implements CompatibleFilter {
private FilterConfig config;
@Override
diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java
index abe9f97d65..5ca66e9c44 100644
--- a/core/src/main/java/hudson/Util.java
+++ b/core/src/main/java/hudson/Util.java
@@ -125,6 +125,7 @@ import org.apache.tools.ant.types.FileSet;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
/**
* Various utility methods that don't have more proper home.
@@ -1850,9 +1851,11 @@ public class Util {
/**
* Find the specific ancestor, or throw an exception.
* Useful for an ancestor we know is inside the URL to ease readability
+ *
+ * @since TODO
*/
@Restricted(NoExternalUse.class)
- public static @NonNull T getNearestAncestorOfTypeOrThrow(@NonNull StaplerRequest request, @NonNull Class clazz) {
+ public static @NonNull T getNearestAncestorOfTypeOrThrow(@NonNull StaplerRequest2 request, @NonNull Class clazz) {
T t = request.findAncestorObject(clazz);
if (t == null) {
throw new IllegalArgumentException("No ancestor of type " + clazz.getName() + " in the request");
@@ -1860,6 +1863,15 @@ public class Util {
return t;
}
+ /**
+ * @deprecated use {@link #getNearestAncestorOfTypeOrThrow(StaplerRequest2, Class)}
+ */
+ @Deprecated
+ @Restricted(NoExternalUse.class)
+ public static @NonNull T getNearestAncestorOfTypeOrThrow(@NonNull StaplerRequest request, @NonNull Class clazz) {
+ return getNearestAncestorOfTypeOrThrow(StaplerRequest.toStaplerRequest2(request), clazz);
+ }
+
@Restricted(NoExternalUse.class)
public static void printRedirect(String contextPath, String redirectUrl, String message, PrintWriter out) {
out.printf(
diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java
index 9f328328c7..986452797f 100644
--- a/core/src/main/java/hudson/WebAppMain.java
+++ b/core/src/main/java/hudson/WebAppMain.java
@@ -45,6 +45,12 @@ import hudson.util.InsufficientPermissionDetected;
import hudson.util.NoHomeDir;
import hudson.util.NoTempDir;
import hudson.util.RingBufferLogHandler;
+import io.jenkins.servlet.ServletContextEventWrapper;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.SessionTrackingMode;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
@@ -65,11 +71,6 @@ import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletResponse;
-import javax.servlet.SessionTrackingMode;
import jenkins.model.Jenkins;
import jenkins.util.JenkinsJVM;
import jenkins.util.SystemProperties;
@@ -320,10 +321,21 @@ public class WebAppMain implements ServletContextListener {
}
}
+ /**
+ * @since TODO
+ */
public static void installExpressionFactory(ServletContextEvent event) {
JellyFacet.setExpressionFactory(event, new ExpressionFactory2());
}
+ /**
+ * @deprecated use {@link #installExpressionFactory(ServletContextEvent)}
+ */
+ @Deprecated
+ public static void installExpressionFactory(javax.servlet.ServletContextEvent event) {
+ installExpressionFactory(ServletContextEventWrapper.toJakartaServletContextEvent(event));
+ }
+
/**
* Installs log handler to monitor all Hudson logs.
*/
diff --git a/core/src/main/java/hudson/cli/CLIAction.java b/core/src/main/java/hudson/cli/CLIAction.java
index 9e29b14156..a2fc5f5901 100644
--- a/core/src/main/java/hudson/cli/CLIAction.java
+++ b/core/src/main/java/hudson/cli/CLIAction.java
@@ -26,6 +26,8 @@ package hudson.cli;
import hudson.Extension;
import hudson.model.UnprotectedRootAction;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
@@ -45,8 +47,6 @@ import java.util.Map;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins;
import jenkins.util.FullDuplexHttpService;
import jenkins.util.SystemProperties;
@@ -59,8 +59,8 @@ import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.springframework.security.core.Authentication;
/**
@@ -97,7 +97,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
return "cli";
}
- public void doCommand(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
+ public void doCommand(StaplerRequest2 req, StaplerResponse2 rsp) throws ServletException, IOException {
final Jenkins jenkins = Jenkins.get();
jenkins.checkPermission(Jenkins.READ);
@@ -121,7 +121,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
/**
* WebSocket endpoint.
*/
- public HttpResponse doWs(StaplerRequest req) {
+ public HttpResponse doWs(StaplerRequest2 req) {
if (!WebSockets.isSupported()) {
return HttpResponses.notFound();
}
@@ -216,7 +216,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
@Override
public Object getTarget() {
- StaplerRequest req = Stapler.getCurrentRequest();
+ StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req.getRestOfPath().isEmpty() && "POST".equals(req.getMethod())) {
// CLI connection request
if ("false".equals(req.getParameter("remoting"))) {
@@ -349,7 +349,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
}
@Override
- protected FullDuplexHttpService createService(StaplerRequest req, UUID uuid) throws IOException {
+ protected FullDuplexHttpService createService(StaplerRequest2 req, UUID uuid) throws IOException {
return new FullDuplexHttpService(uuid) {
@Override
protected void run(InputStream upload, OutputStream download) throws IOException, InterruptedException {
diff --git a/core/src/main/java/hudson/cli/CliCrumbExclusion.java b/core/src/main/java/hudson/cli/CliCrumbExclusion.java
index 4e3064f431..08c204eb55 100644
--- a/core/src/main/java/hudson/cli/CliCrumbExclusion.java
+++ b/core/src/main/java/hudson/cli/CliCrumbExclusion.java
@@ -26,11 +26,11 @@ package hudson.cli;
import hudson.Extension;
import hudson.security.csrf.CrumbExclusion;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse;
diff --git a/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java b/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java
index 6b29dcf529..aab260747f 100644
--- a/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java
+++ b/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java
@@ -50,7 +50,7 @@ public class ReloadConfigurationCommand extends CLICommand {
// Or perhaps simpler to inline the thread body of doReload?
j.doReload();
Object app;
- while ((app = WebApp.get(j.servletContext).getApp()) instanceof HudsonIsLoading) {
+ while ((app = WebApp.get(j.getServletContext()).getApp()) instanceof HudsonIsLoading) {
Thread.sleep(100);
}
if (app instanceof Jenkins) {
diff --git a/core/src/main/java/hudson/cli/UpdateNodeCommand.java b/core/src/main/java/hudson/cli/UpdateNodeCommand.java
index c9210f89cc..5909a2f0fc 100644
--- a/core/src/main/java/hudson/cli/UpdateNodeCommand.java
+++ b/core/src/main/java/hudson/cli/UpdateNodeCommand.java
@@ -26,8 +26,8 @@ package hudson.cli;
import hudson.Extension;
import hudson.model.Node;
+import jakarta.servlet.ServletException;
import java.io.IOException;
-import javax.servlet.ServletException;
import org.kohsuke.args4j.Argument;
/**
diff --git a/core/src/main/java/hudson/console/AnnotatedLargeText.java b/core/src/main/java/hudson/console/AnnotatedLargeText.java
index 4e0d3b9908..1798512f3e 100644
--- a/core/src/main/java/hudson/console/AnnotatedLargeText.java
+++ b/core/src/main/java/hudson/console/AnnotatedLargeText.java
@@ -30,6 +30,7 @@ import static java.lang.Math.abs;
import edu.umd.cs.findbugs.annotations.CheckReturnValue;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import hudson.Util;
import hudson.remoting.ObjectInputStreamEx;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -50,10 +51,13 @@ import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import jenkins.model.Jenkins;
import jenkins.security.CryptoConfidentialKey;
+import jenkins.security.stapler.StaplerNotDispatchable;
import org.jenkinsci.remoting.util.AnonymousClassWarnings;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.framework.io.ByteBuffer;
import org.kohsuke.stapler.framework.io.LargeText;
@@ -90,14 +94,44 @@ public class AnnotatedLargeText extends LargeText {
this.context = context;
}
+ /**
+ * @since TODO
+ */
+ public void doProgressiveHtml(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
+ if (Util.isOverridden(AnnotatedLargeText.class, getClass(), "doProgressiveHtml", StaplerRequest.class, StaplerResponse.class)) {
+ doProgressiveHtml(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } else {
+ doProgressiveHtmlImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doProgressiveHtml(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
public void doProgressiveHtml(StaplerRequest req, StaplerResponse rsp) throws IOException {
+ doProgressiveHtmlImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ }
+
+ private void doProgressiveHtmlImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
req.setAttribute("html", true);
doProgressText(req, rsp);
}
/**
* Aliasing what I think was a wrong name in {@link LargeText}
+ *
+ * @since TODO
*/
+ public void doProgressiveText(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
+ doProgressText(req, rsp);
+ }
+
+ /**
+ * @deprecated use {@link #doProgressiveText(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
public void doProgressiveText(StaplerRequest req, StaplerResponse rsp) throws IOException {
doProgressText(req, rsp);
}
@@ -107,16 +141,35 @@ public class AnnotatedLargeText extends LargeText {
* and use this request attribute to differentiate.
*/
private boolean isHtml() {
- StaplerRequest req = Stapler.getCurrentRequest();
+ StaplerRequest2 req = Stapler.getCurrentRequest2();
return req != null && req.getAttribute("html") != null;
}
+ /**
+ * @since TODO
+ */
@Override
+ protected void setContentType(StaplerResponse2 rsp) {
+ if (Util.isOverridden(AnnotatedLargeText.class, getClass(), "setContentType", StaplerResponse.class)) {
+ setContentType(StaplerResponse.fromStaplerResponse2(rsp));
+ } else {
+ setContentTypeImpl(rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #setContentType(StaplerResponse2)}
+ */
+ @Deprecated
protected void setContentType(StaplerResponse rsp) {
+ setContentTypeImpl(StaplerResponse.toStaplerResponse2(rsp));
+ }
+
+ private void setContentTypeImpl(StaplerResponse2 rsp) {
rsp.setContentType(isHtml() ? "text/html;charset=UTF-8" : "text/plain;charset=UTF-8");
}
- private ConsoleAnnotator createAnnotator(StaplerRequest req) throws IOException {
+ private ConsoleAnnotator createAnnotator(StaplerRequest2 req) throws IOException {
try {
String base64 = req != null ? req.getHeader("X-ConsoleAnnotator") : null;
if (base64 != null) {
@@ -176,7 +229,7 @@ public class AnnotatedLargeText extends LargeText {
@CheckReturnValue
public long writeHtmlTo(long start, Writer w) throws IOException {
ConsoleAnnotationOutputStream caw = new ConsoleAnnotationOutputStream<>(
- w, createAnnotator(Stapler.getCurrentRequest()), context, charset);
+ w, createAnnotator(Stapler.getCurrentRequest2()), context, charset);
long r = super.writeLogTo(start, caw);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -185,7 +238,7 @@ public class AnnotatedLargeText extends LargeText {
oos.writeLong(System.currentTimeMillis()); // send timestamp to prevent a replay attack
oos.writeObject(caw.getConsoleAnnotator());
oos.close();
- StaplerResponse rsp = Stapler.getCurrentResponse();
+ StaplerResponse2 rsp = Stapler.getCurrentResponse2();
if (rsp != null)
rsp.setHeader("X-ConsoleAnnotator", Base64.getEncoder().encodeToString(baos.toByteArray()));
return r;
diff --git a/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java b/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java
index bb68ccc661..e63e2dab5c 100644
--- a/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java
+++ b/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java
@@ -28,13 +28,13 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.DescriptorExtensionList;
import hudson.ExtensionPoint;
import hudson.model.Descriptor;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
/**
@@ -81,12 +81,12 @@ public abstract class ConsoleAnnotationDescriptor extends Descriptor implements ExtensionPoint {
* Serves the JavaScript file associated with this console annotator factory.
*/
@WebMethod(name = "script.js")
- public void doScriptJs(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doScriptJs(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
rsp.serveFile(req, getResource("/script.js"), TimeUnit.DAYS.toMillis(1));
}
@WebMethod(name = "style.css")
- public void doStyleCss(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doStyleCss(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
rsp.serveFile(req, getResource("/style.css"), TimeUnit.DAYS.toMillis(1));
}
diff --git a/core/src/main/java/hudson/console/HyperlinkNote.java b/core/src/main/java/hudson/console/HyperlinkNote.java
index 1e582dab2b..8aa0116605 100644
--- a/core/src/main/java/hudson/console/HyperlinkNote.java
+++ b/core/src/main/java/hudson/console/HyperlinkNote.java
@@ -37,7 +37,7 @@ import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.Stapler;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
/**
* Turns a text into a hyperlink by specifying the URL separately.
@@ -62,7 +62,7 @@ public class HyperlinkNote extends ConsoleNote {
public ConsoleAnnotator annotate(Object context, MarkupText text, int charPos) {
String url = this.url;
if (url.startsWith("/")) {
- StaplerRequest req = Stapler.getCurrentRequest();
+ StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req != null) {
// if we are serving HTTP request, we want to use app relative URL
url = req.getContextPath() + url;
diff --git a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java
index e2bfa4678f..425c521509 100644
--- a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java
+++ b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java
@@ -65,8 +65,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -310,7 +310,7 @@ public class OldDataMonitor extends AdministrativeMonitor {
* Depending on whether the user said "yes" or "no", send him to the right place.
*/
@RequirePOST
- public HttpResponse doAct(StaplerRequest req, StaplerResponse rsp) throws IOException {
+ public HttpResponse doAct(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
if (req.hasParameter("no")) {
disable(true);
return HttpResponses.redirectViaContextPath("/manage");
@@ -324,7 +324,7 @@ public class OldDataMonitor extends AdministrativeMonitor {
* Remove those items from the data map.
*/
@RequirePOST
- public HttpResponse doUpgrade(StaplerRequest req, StaplerResponse rsp) {
+ public HttpResponse doUpgrade(StaplerRequest2 req, StaplerResponse2 rsp) {
final String thruVerParam = req.getParameter("thruVer");
final VersionNumber thruVer = thruVerParam.equals("all") ? null : new VersionNumber(thruVerParam);
@@ -341,7 +341,7 @@ public class OldDataMonitor extends AdministrativeMonitor {
* Remove those items from the data map.
*/
@RequirePOST
- public HttpResponse doDiscard(StaplerRequest req, StaplerResponse rsp) {
+ public HttpResponse doDiscard(StaplerRequest2 req, StaplerResponse2 rsp) {
saveAndRemoveEntries(entry -> entry.getValue().max == null);
return HttpResponses.forwardToPreviousPage();
@@ -377,7 +377,7 @@ public class OldDataMonitor extends AdministrativeMonitor {
data.keySet().removeAll(removed);
}
- public HttpResponse doIndex(StaplerResponse rsp) throws IOException {
+ public HttpResponse doIndex(StaplerResponse2 rsp) throws IOException {
return new HttpRedirect("manage");
}
diff --git a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java
index af7b2579db..374df6da78 100644
--- a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java
+++ b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java
@@ -41,7 +41,7 @@ import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -68,7 +68,7 @@ public class ReverseProxySetupMonitor extends AdministrativeMonitor {
@Restricted(DoNotUse.class) // WebOnly
@RestrictedSince("2.235")
- public HttpResponse doTest(StaplerRequest request, @QueryParameter boolean testWithContext) {
+ public HttpResponse doTest(StaplerRequest2 request, @QueryParameter boolean testWithContext) {
String referer = request.getReferer();
Jenkins j = Jenkins.get();
String redirect;
diff --git a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java
index 6412ac63bc..1ea6c6336a 100644
--- a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java
+++ b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java
@@ -30,8 +30,8 @@ import hudson.security.Permission;
import java.io.IOException;
import jenkins.model.Jenkins;
import org.jenkinsci.Symbol;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -64,7 +64,7 @@ public class TooManyJobsButNoView extends AdministrativeMonitor {
* Depending on whether the user said "yes" or "no", send him to the right place.
*/
@RequirePOST
- public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException {
+ public void doAct(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (req.hasParameter("no")) {
disable(true);
diff --git a/core/src/main/java/hudson/init/impl/GroovyInitScript.java b/core/src/main/java/hudson/init/impl/GroovyInitScript.java
index 17f6a4702c..ffe8c77513 100644
--- a/core/src/main/java/hudson/init/impl/GroovyInitScript.java
+++ b/core/src/main/java/hudson/init/impl/GroovyInitScript.java
@@ -39,6 +39,6 @@ import jenkins.util.groovy.GroovyHookScript;
public class GroovyInitScript {
@Initializer(after = JOB_CONFIG_ADAPTED)
public static void init(Jenkins j) {
- new GroovyHookScript("init", j.servletContext, j.getRootDir(), j.getPluginManager().uberClassLoader).run();
+ new GroovyHookScript("init", j.getServletContext(), j.getRootDir(), j.getPluginManager().uberClassLoader).run();
}
}
diff --git a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java
index c305e9a6fe..4a8d6ce519 100644
--- a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java
+++ b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java
@@ -2,22 +2,22 @@ package hudson.init.impl;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import hudson.init.Initializer;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.EOFException;
import java.io.IOException;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins;
import org.kohsuke.MetaInfServices;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.Stapler;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.UncaughtExceptionFilter;
import org.kohsuke.stapler.WebApp;
@@ -30,7 +30,7 @@ public class InstallUncaughtExceptionHandler {
@Initializer
public static void init(final Jenkins j) throws IOException {
- UncaughtExceptionFilter.setUncaughtExceptionHandler(j.servletContext, (e, context, req, rsp) -> handleException(j, e, req, rsp, 500));
+ UncaughtExceptionFilter.setUncaughtExceptionHandler(j.getServletContext(), (e, context, req, rsp) -> handleException(j, e, req, rsp, 500));
try {
Thread.setDefaultUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler());
LOGGER.log(Level.FINE, "Successfully installed a global UncaughtExceptionHandler.");
@@ -53,10 +53,10 @@ public class InstallUncaughtExceptionHandler {
String id = UUID.randomUUID().toString();
LOGGER.log(isEOFException(e) ? Level.FINE : Level.WARNING, "Caught unhandled exception with ID " + id, e);
req.setAttribute("jenkins.exception.id", id);
- req.setAttribute("javax.servlet.error.exception", e);
+ req.setAttribute("jakarta.servlet.error.exception", e);
rsp.setStatus(code);
try {
- WebApp.get(j.servletContext).getSomeStapler().invoke(req, rsp, j, "/oops");
+ WebApp.get(j.getServletContext()).getSomeStapler().invoke(req, rsp, j, "/oops");
} catch (ServletException | IOException x) {
if (!Stapler.isSocketException(x)) {
throw x;
@@ -75,7 +75,7 @@ public class InstallUncaughtExceptionHandler {
}
return new HttpResponses.HttpResponseException(cause) {
@Override
- public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
handleException(Jenkins.get(), cause, req, rsp, code);
}
};
diff --git a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java
index 875a3e4ef7..c54a90d1c5 100644
--- a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java
+++ b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java
@@ -35,6 +35,7 @@ import hudson.model.ManagementLink;
import hudson.model.TaskListener;
import hudson.util.StreamTaskListener;
import hudson.util.jna.DotNet;
+import jakarta.servlet.ServletException;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@@ -43,7 +44,6 @@ import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
import org.apache.commons.io.FileUtils;
@@ -52,8 +52,8 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Move;
import org.apache.tools.ant.types.FileSet;
import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -116,7 +116,7 @@ public class WindowsInstallerLink extends ManagementLink {
* Performs installation.
*/
@RequirePOST
- public void doDoInstall(StaplerRequest req, StaplerResponse rsp, @QueryParameter("dir") String _dir) throws IOException, ServletException {
+ public void doDoInstall(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter("dir") String _dir) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (installationDir != null) {
@@ -168,7 +168,7 @@ public class WindowsInstallerLink extends ManagementLink {
/**
* Copies a single resource into the target folder, by the given name, and handle errors gracefully.
*/
- private void copy(StaplerRequest req, StaplerResponse rsp, File dir, URL src, String name) throws ServletException, IOException {
+ private void copy(StaplerRequest2 req, StaplerResponse2 rsp, File dir, URL src, String name) throws ServletException, IOException {
try {
FileUtils.copyURLToFile(src, new File(dir, name));
} catch (IOException e) {
@@ -179,7 +179,7 @@ public class WindowsInstallerLink extends ManagementLink {
}
@RequirePOST
- public void doRestart(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doRestart(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (installationDir == null) {
@@ -250,11 +250,11 @@ public class WindowsInstallerLink extends ManagementLink {
/**
* Displays the error in a page.
*/
- protected final void sendError(Exception e, StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
+ protected final void sendError(Exception e, StaplerRequest2 req, StaplerResponse2 rsp) throws ServletException, IOException {
sendError(e.getMessage(), req, rsp);
}
- protected final void sendError(String message, StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
+ protected final void sendError(String message, StaplerRequest2 req, StaplerResponse2 rsp) throws ServletException, IOException {
req.setAttribute("message", message);
req.setAttribute("pre", true);
rsp.forward(Jenkins.get(), "error", req);
diff --git a/core/src/main/java/hudson/logging/LogRecorder.java b/core/src/main/java/hudson/logging/LogRecorder.java
index 86aea65750..ad4c400285 100644
--- a/core/src/main/java/hudson/logging/LogRecorder.java
+++ b/core/src/main/java/hudson/logging/LogRecorder.java
@@ -48,6 +48,7 @@ import hudson.util.FormValidation;
import hudson.util.HttpResponses;
import hudson.util.RingBufferLogHandler;
import hudson.util.XStream2;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
@@ -71,7 +72,6 @@ import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.model.Loadable;
import jenkins.security.MasterToSlaveCallable;
@@ -82,8 +82,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST;
@@ -439,7 +439,7 @@ public class LogRecorder extends AbstractModelObject implements Loadable, Saveab
* Accepts submission from the configuration page.
*/
@POST
- public synchronized void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public synchronized void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
JSONObject src = req.getSubmittedForm();
@@ -536,7 +536,7 @@ public class LogRecorder extends AbstractModelObject implements Loadable, Saveab
* Deletes this recorder, then go back to the parent.
*/
@RequirePOST
- public synchronized void doDoDelete(StaplerResponse rsp) throws IOException, ServletException {
+ public synchronized void doDoDelete(StaplerResponse2 rsp) throws IOException, ServletException {
delete();
rsp.sendRedirect2("..");
}
@@ -562,7 +562,7 @@ public class LogRecorder extends AbstractModelObject implements Loadable, Saveab
/**
* RSS feed for log entries.
*/
- public void doRss(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doRss(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
LogRecorderManager.doRss(req, rsp, getLogRecords());
}
diff --git a/core/src/main/java/hudson/logging/LogRecorderManager.java b/core/src/main/java/hudson/logging/LogRecorderManager.java
index 70856024df..2c589adaa6 100644
--- a/core/src/main/java/hudson/logging/LogRecorderManager.java
+++ b/core/src/main/java/hudson/logging/LogRecorderManager.java
@@ -38,6 +38,7 @@ import hudson.model.Failure;
import hudson.model.RSS;
import hudson.util.CopyOnWriteMap;
import hudson.util.FormValidation;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
@@ -53,7 +54,6 @@ import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration;
import jenkins.model.ModelObjectWithChildren;
@@ -68,8 +68,8 @@ import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerProxy;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -188,7 +188,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje
}
@Override
- public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
+ public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
ContextMenu menu = new ContextMenu();
menu.add("all", "All Jenkins Logs");
for (LogRecorder lr : recorders) {
@@ -225,14 +225,14 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje
/**
* RSS feed for log entries.
*/
- public void doRss(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doRss(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
doRss(req, rsp, Jenkins.logRecords);
}
/**
* Renders the given log recorders as RSS.
*/
- /*package*/ static void doRss(StaplerRequest req, StaplerResponse rsp, List logs) throws IOException, ServletException {
+ /*package*/ static void doRss(StaplerRequest2 req, StaplerResponse2 rsp, List logs) throws IOException, ServletException {
// filter log records based on the log level
String entryType = "all";
String level = req.getParameter("level");
diff --git a/core/src/main/java/hudson/markup/MarkupFormatter.java b/core/src/main/java/hudson/markup/MarkupFormatter.java
index e588e0cfcc..a3bf53a739 100644
--- a/core/src/main/java/hudson/markup/MarkupFormatter.java
+++ b/core/src/main/java/hudson/markup/MarkupFormatter.java
@@ -28,6 +28,7 @@ import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.ExtensionPoint;
import hudson.model.AbstractDescribableImpl;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -44,7 +45,8 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.verb.GET;
import org.kohsuke.stapler.verb.POST;
@@ -138,7 +140,7 @@ public abstract class MarkupFormatter extends AbstractDescribableImpl headers) {
// TODO Move to Stapler's HttpResponses, (also add a corresponding 'text' method)
- return (req, rsp, node) -> {
- rsp.setContentType("text/html;charset=UTF-8");
- rsp.setStatus(status);
- for (Map.Entry header : headers.entrySet()) {
- rsp.setHeader(header.getKey(), header.getValue());
+ return new HttpResponse() {
+ @Override
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
+ rsp.setContentType("text/html;charset=UTF-8");
+ rsp.setStatus(status);
+ for (Map.Entry header : headers.entrySet()) {
+ rsp.setHeader(header.getKey(), header.getValue());
+ }
+ PrintWriter pw = rsp.getWriter();
+ pw.print(html);
+ pw.flush();
}
- PrintWriter pw = rsp.getWriter();
- pw.print(html);
- pw.flush();
};
}
}
diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java
index 85d62df788..d993d722ea 100644
--- a/core/src/main/java/hudson/model/AbstractBuild.java
+++ b/core/src/main/java/hudson/model/AbstractBuild.java
@@ -62,6 +62,8 @@ import hudson.util.AdaptedIterator;
import hudson.util.HttpResponses;
import hudson.util.Iterators;
import hudson.util.VariableResolver;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
@@ -81,7 +83,6 @@ import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.model.lazy.BuildReference;
import jenkins.model.lazy.LazyBuildMixIn;
@@ -275,7 +276,7 @@ public abstract class AbstractBuild, R extends A
*/
@Deprecated(since = "2.364")
public String getUpUrl() {
- return Functions.getNearestAncestorUrl(Stapler.getCurrentRequest(), getParent()) + '/';
+ return Functions.getNearestAncestorUrl(Stapler.getCurrentRequest2(), getParent()) + '/';
}
/**
@@ -1391,8 +1392,12 @@ public abstract class AbstractBuild
, R extends A
*/
@Deprecated
@RequirePOST // #doStop() should be preferred, but better to be safe
- public void doStop(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
- doStop().generateResponse(req, rsp, this);
+ public void doStop(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doStop().generateResponse(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), this);
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
}
/**
diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java
index adebec8f28..af64ff19df 100644
--- a/core/src/main/java/hudson/model/AbstractItem.java
+++ b/core/src/main/java/hudson/model/AbstractItem.java
@@ -25,7 +25,7 @@
package hudson.model;
-import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.NonNull;
@@ -47,6 +47,8 @@ import hudson.util.AtomicFileWriter;
import hudson.util.FormValidation;
import hudson.util.IOUtils;
import hudson.util.Secret;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
@@ -59,7 +61,6 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.servlet.ServletException;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.sax.SAXSource;
@@ -70,6 +71,7 @@ import jenkins.model.Jenkins;
import jenkins.model.Loadable;
import jenkins.model.queue.ItemDeletion;
import jenkins.security.NotReallyRoleSensitiveCallable;
+import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties;
import jenkins.util.xml.XMLUtils;
import org.apache.tools.ant.Project;
@@ -87,7 +89,9 @@ import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@@ -530,7 +534,7 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
@Override
public final String getUrl() {
// try to stick to the current view if possible
- StaplerRequest req = Stapler.getCurrentRequest();
+ StaplerRequest2 req = Stapler.getCurrentRequest2();
String shortUrl = getShortUrl();
String uri = req == null ? null : req.getRequestURI();
if (req != null) {
@@ -644,9 +648,36 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
/**
* Accepts the new description.
+ *
+ * @since TODO
*/
@RequirePOST
- public synchronized void doSubmitDescription(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public synchronized void doSubmitDescription(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
+ if (Util.isOverridden(AbstractItem.class, getClass(), "doSubmitDescription", StaplerRequest.class, StaplerResponse.class)) {
+ try {
+ doSubmitDescription(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ doSubmitDescriptionImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doSubmitDescription(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ public synchronized void doSubmitDescription(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doSubmitDescriptionImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private void doSubmitDescriptionImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
checkPermission(CONFIGURE);
setDescription(req.getParameter("description"));
@@ -658,9 +689,32 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
* Note on the funny name: for reasons of historical compatibility, this URL is {@code /doDelete}
* since it predates {@code }. {@code /delete} goes to a Jelly page
* which should now be unused by core but is left in case plugins are still using it.
+ *
+ * @since TODO
*/
@RequirePOST
- public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException {
+ public void doDoDelete(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, InterruptedException {
+ if (Util.isOverridden(AbstractItem.class, getClass(), "doDoDelete", StaplerRequest.class, StaplerResponse.class)) {
+ try {
+ doDoDelete(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ doDoDeleteImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doDoDelete(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException, InterruptedException {
+ doDoDeleteImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ }
+
+ private void doDoDeleteImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, InterruptedException {
delete();
if (req == null || rsp == null) { // CLI
return;
@@ -681,8 +735,28 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
rsp.sendRedirect2(req.getContextPath() + '/' + url);
}
+ /**
+ * @since TODO
+ */
@Override
- public void delete(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void delete(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
+ deleteImpl(rsp);
+ }
+
+ /**
+ * @deprecated use {@link #delete(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @Override
+ public void delete(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ deleteImpl(StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private void deleteImpl(StaplerResponse2 rsp) throws IOException, ServletException {
try {
delete();
rsp.setStatus(204);
@@ -755,10 +829,31 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
/**
* Accepts {@code config.xml} submission, as well as serve it.
+ *
+ * @since TODO
*/
@WebMethod(name = "config.xml")
+ public void doConfigDotXml(StaplerRequest2 req, StaplerResponse2 rsp)
+ throws IOException {
+ if (Util.isOverridden(AbstractItem.class, getClass(), "doConfigDotXml", StaplerRequest.class, StaplerResponse.class)) {
+ doConfigDotXml(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } else {
+ doConfigDotXmlImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doConfigDotXml(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
public void doConfigDotXml(StaplerRequest req, StaplerResponse rsp)
throws IOException {
+ doConfigDotXmlImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ }
+
+ private void doConfigDotXmlImpl(StaplerRequest2 req, StaplerResponse2 rsp)
+ throws IOException {
if (req.getMethod().equals("GET")) {
// read
rsp.setContentType("application/xml");
diff --git a/core/src/main/java/hudson/model/AbstractModelObject.java b/core/src/main/java/hudson/model/AbstractModelObject.java
index f6c7104f8e..87b42527a8 100644
--- a/core/src/main/java/hudson/model/AbstractModelObject.java
+++ b/core/src/main/java/hudson/model/AbstractModelObject.java
@@ -29,11 +29,14 @@ import hudson.search.SearchFactory;
import hudson.search.SearchIndex;
import hudson.search.SearchIndexBuilder;
import hudson.search.SearchableModelObject;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
import java.io.IOException;
-import javax.servlet.ServletException;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -45,33 +48,69 @@ public abstract class AbstractModelObject implements SearchableModelObject {
/**
* Displays the error in a page.
*/
- protected final void sendError(Exception e, StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
+ protected final void sendError(Exception e, StaplerRequest2 req, StaplerResponse2 rsp) throws ServletException, IOException {
req.setAttribute("exception", e);
sendError(e.getMessage(), req, rsp);
}
- protected final void sendError(Exception e) throws ServletException, IOException {
- sendError(e, Stapler.getCurrentRequest(), Stapler.getCurrentResponse());
+ /**
+ * @deprecated use {@link #sendError(Exception, StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ protected final void sendError(Exception e, StaplerRequest req, StaplerResponse rsp) throws javax.servlet.ServletException, IOException {
+ try {
+ sendError(e, StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException ex) {
+ throw ServletExceptionWrapper.fromJakartaServletException(ex);
+ }
}
- protected final void sendError(String message, StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
+ protected final void sendError(Exception e) throws ServletException, IOException {
+ sendError(e, Stapler.getCurrentRequest2(), Stapler.getCurrentResponse2());
+ }
+
+ protected final void sendError(String message, StaplerRequest2 req, StaplerResponse2 rsp) throws ServletException, IOException {
req.setAttribute("message", message);
rsp.forward(this, "error", req);
}
+ /**
+ * @deprecated use {@link #sendError(String, StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ protected final void sendError(String message, StaplerRequest req, StaplerResponse rsp) throws javax.servlet.ServletException, IOException {
+ try {
+ sendError(message, StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
/**
* @param pre
* If true, the message is put in a PRE tag.
*/
- protected final void sendError(String message, StaplerRequest req, StaplerResponse rsp, boolean pre) throws ServletException, IOException {
+ protected final void sendError(String message, StaplerRequest2 req, StaplerResponse2 rsp, boolean pre) throws ServletException, IOException {
req.setAttribute("message", message);
if (pre)
req.setAttribute("pre", true);
rsp.forward(this, "error", req);
}
+ /**
+ * @deprecated use {@link #sendError(String, StaplerRequest2, StaplerResponse2, boolean)}
+ */
+ @Deprecated
+ protected final void sendError(String message, StaplerRequest req, StaplerResponse rsp, boolean pre) throws javax.servlet.ServletException, IOException {
+ try {
+ sendError(message, StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), pre);
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
protected final void sendError(String message) throws ServletException, IOException {
- sendError(message, Stapler.getCurrentRequest(), Stapler.getCurrentResponse());
+ sendError(message, Stapler.getCurrentRequest2(), Stapler.getCurrentResponse2());
}
/**
@@ -82,7 +121,7 @@ public abstract class AbstractModelObject implements SearchableModelObject {
*/
@Deprecated
protected final void requirePOST() throws ServletException {
- StaplerRequest req = Stapler.getCurrentRequest();
+ StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req == null) return; // invoked outside the context of servlet
String method = req.getMethod();
if (!method.equalsIgnoreCase("POST"))
diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java
index 917ff1f7b8..a380943687 100644
--- a/core/src/main/java/hudson/model/AbstractProject.java
+++ b/core/src/main/java/hudson/model/AbstractProject.java
@@ -77,6 +77,8 @@ import hudson.util.AlternativeUiTextProvider;
import hudson.util.AlternativeUiTextProvider.Message;
import hudson.util.DescribableList;
import hudson.util.FormValidation;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@@ -96,7 +98,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.model.BlockedBecauseOfBuildInProgress;
import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn;
@@ -120,7 +121,9 @@ import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST;
@@ -769,7 +772,7 @@ public abstract class AbstractProject, R extends
@Override
@POST
- public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException {
+ public void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
super.doConfigSubmit(req, rsp);
updateTransientActions();
@@ -1726,10 +1729,14 @@ public abstract class AbstractProject
, R extends
//
//
- /** @deprecated use {@link #doBuild(StaplerRequest, StaplerResponse, TimeDuration)} */
+ /** @deprecated use {@link #doBuild(StaplerRequest2, StaplerResponse2, TimeDuration)} */
@Deprecated
- public void doBuild(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
- doBuild(req, rsp, TimeDuration.fromString(req.getParameter("delay")));
+ public void doBuild(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doBuild(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), TimeDuration.fromString(req.getParameter("delay")));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
}
/**
@@ -1739,7 +1746,7 @@ public abstract class AbstractProject
, R extends
* Inject {@link TimeDuration}.
*/
@Deprecated
- public int getDelay(StaplerRequest req) throws ServletException {
+ public int getDelay(StaplerRequest req) throws javax.servlet.ServletException {
String delay = req.getParameter("delay");
if (delay == null) return getQuietPeriod();
@@ -1749,26 +1756,59 @@ public abstract class AbstractProject
, R extends
if (delay.endsWith("secs")) delay = delay.substring(0, delay.length() - 4);
return Integer.parseInt(delay);
} catch (NumberFormatException e) {
- throw new ServletException("Invalid delay parameter value: " + delay, e);
+ throw new javax.servlet.ServletException("Invalid delay parameter value: " + delay, e);
}
}
- /** @deprecated use {@link #doBuildWithParameters(StaplerRequest, StaplerResponse, TimeDuration)} */
+ /** @deprecated use {@link #doBuildWithParameters(StaplerRequest2, StaplerResponse2, TimeDuration)} */
@Deprecated
- public void doBuildWithParameters(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
- doBuildWithParameters(req, rsp, TimeDuration.fromString(req.getParameter("delay")));
+ public void doBuildWithParameters(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doBuildWithParameters(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), TimeDuration.fromString(req.getParameter("delay")));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
}
@Override // in case schedulePolling was overridden
- public void doPolling(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doPolling(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
BuildAuthorizationToken.checkPermission((Job) this, authToken, req, rsp);
schedulePolling();
rsp.sendRedirect(".");
}
+ /**
+ * @since TODO
+ */
@Override
- protected void submit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException {
+ protected void submit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
+ if (Util.isOverridden(AbstractProject.class, getClass(), "submit", StaplerRequest.class, StaplerResponse.class)) {
+ try {
+ submit(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ super.submit(req, rsp);
+ submitImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #submit(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @Override
+ protected void submit(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException, FormException {
super.submit(req, rsp);
+ try {
+ submitImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private void submitImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
JSONObject json = req.getSubmittedForm();
makeDisabled(!json.optBoolean("enable"));
@@ -1835,14 +1875,18 @@ public abstract class AbstractProject
, R extends
/**
* @deprecated
- * As of 1.261. Use {@link #buildDescribable(StaplerRequest, List)} instead.
+ * As of 1.261. Use {@link #buildDescribable(StaplerRequest2, List)} instead.
*/
@Deprecated
- protected final > List buildDescribable(StaplerRequest req, List extends Descriptor> descriptors, String prefix) throws FormException, ServletException {
- return buildDescribable(req, descriptors);
+ protected final > List buildDescribable(StaplerRequest req, List extends Descriptor> descriptors, String prefix) throws FormException, javax.servlet.ServletException {
+ try {
+ return buildDescribable(StaplerRequest.toStaplerRequest2(req), descriptors);
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
}
- protected final > List buildDescribable(StaplerRequest req, List extends Descriptor> descriptors)
+ protected final > List buildDescribable(StaplerRequest2 req, List extends Descriptor> descriptors)
throws FormException, ServletException {
JSONObject data = req.getSubmittedForm();
@@ -1860,7 +1904,7 @@ public abstract class AbstractProject, R extends
/**
* Serves the workspace files.
*/
- public DirectoryBrowserSupport doWs(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException {
+ public DirectoryBrowserSupport doWs(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, InterruptedException {
checkPermission(Item.WORKSPACE);
FilePath ws = getSomeWorkspace();
if (ws == null || !ws.exists()) {
@@ -1887,7 +1931,7 @@ public abstract class AbstractProject
, R extends
* Wipes out the workspace.
*/
@RequirePOST
- public HttpResponse doDoWipeOutWorkspace() throws IOException, ServletException, InterruptedException {
+ public HttpResponse doDoWipeOutWorkspace() throws IOException, InterruptedException {
checkPermission(Functions.isWipeOutPermissionEnabled() ? WIPEOUT : BUILD);
R b = getSomeBuildWithWorkspace();
FilePath ws = b != null ? b.getWorkspace() : null;
diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java
index 7e3e695d9c..d808831902 100644
--- a/core/src/main/java/hudson/model/Actionable.java
+++ b/core/src/main/java/hudson/model/Actionable.java
@@ -37,8 +37,11 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.ModelObjectWithContextMenu;
import jenkins.model.TransientActionFactory;
+import jenkins.security.stapler.StaplerNotDispatchable;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@@ -338,7 +341,26 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
return null;
}
+ /**
+ * @since TODO
+ */
+ public Object getDynamic(String token, StaplerRequest2 req, StaplerResponse2 rsp) {
+ if (Util.isOverridden(Actionable.class, getClass(), "getDynamic", String.class, StaplerRequest.class, StaplerResponse.class)) {
+ return getDynamic(token, StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } else {
+ return getDynamicImpl(token, req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #getDynamic(String, StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
+ return getDynamicImpl(token, StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ }
+
+ private Object getDynamicImpl(String token, StaplerRequest2 req, StaplerResponse2 rsp) {
for (Action a : getAllActions()) {
if (a == null)
continue; // be defensive
@@ -351,7 +373,29 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
return null;
}
- @Override public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
+ /**
+ * @since TODO
+ */
+ @Override
+ public ContextMenu doContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
+ if (Util.isOverridden(Actionable.class, getClass(), "doContextMenu", StaplerRequest.class, StaplerResponse.class)) {
+ return doContextMenu(StaplerRequest.fromStaplerRequest2(request), StaplerResponse.fromStaplerResponse2(response));
+ } else {
+ return doContextMenuImpl(request, response);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doContextMenu(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ @Override
+ public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
+ return doContextMenuImpl(StaplerRequest.toStaplerRequest2(request), StaplerResponse.toStaplerResponse2(response));
+ }
+
+ private ContextMenu doContextMenuImpl(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
return new ContextMenu().from(this, request, response);
}
diff --git a/core/src/main/java/hudson/model/AdministrativeMonitor.java b/core/src/main/java/hudson/model/AdministrativeMonitor.java
index bdbfb48027..59518ba79e 100644
--- a/core/src/main/java/hudson/model/AdministrativeMonitor.java
+++ b/core/src/main/java/hudson/model/AdministrativeMonitor.java
@@ -37,8 +37,8 @@ import jenkins.model.Jenkins;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerProxy;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -175,7 +175,7 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen
* URL binding to disable this monitor.
*/
@RequirePOST
- public void doDisable(StaplerRequest req, StaplerResponse rsp) throws IOException {
+ public void doDisable(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
disable(true);
rsp.sendRedirect2(req.getContextPath() + "/manage");
@@ -188,7 +188,7 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen
* Changing this permission check to return {@link Jenkins#SYSTEM_READ} will make the active
* administrative monitor appear on {@code manage.jelly} and on the globally visible
* {@link jenkins.management.AdministrativeMonitorsDecorator} to users without Administer permission.
- * {@link #doDisable(StaplerRequest, StaplerResponse)} will still always require Administer permission.
+ * {@link #doDisable(StaplerRequest2, StaplerResponse2)} will still always require Administer permission.
*
*
* This method only allows for a single permission to be returned. If more complex permission checks are required,
diff --git a/core/src/main/java/hudson/model/AllView.java b/core/src/main/java/hudson/model/AllView.java
index ca1ef0d5cc..3972625ea7 100644
--- a/core/src/main/java/hudson/model/AllView.java
+++ b/core/src/main/java/hudson/model/AllView.java
@@ -26,7 +26,10 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
+import hudson.Util;
import hudson.model.Descriptor.FormException;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
@@ -34,12 +37,12 @@ import java.util.Locale;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.util.SystemProperties;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@@ -91,7 +94,7 @@ public class AllView extends View {
@RequirePOST
@Override
- public Item doCreateItem(StaplerRequest req, StaplerResponse rsp)
+ public Item doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException {
ItemGroup extends TopLevelItem> ig = getOwner().getItemGroup();
if (ig instanceof ModifiableItemGroup)
@@ -110,7 +113,24 @@ public class AllView extends View {
}
@Override
- protected void submit(StaplerRequest req) throws IOException, ServletException, FormException {
+ protected void submit(StaplerRequest2 req) throws IOException, ServletException, FormException {
+ if (Util.isOverridden(AllView.class, getClass(), "submit", StaplerRequest.class)) {
+ try {
+ submit(StaplerRequest.fromStaplerRequest2(req));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ // noop
+ }
+ }
+
+ /**
+ * @deprecated use {@link #submit(StaplerRequest2)}
+ */
+ @Deprecated
+ @Override
+ protected void submit(StaplerRequest req) throws IOException, javax.servlet.ServletException, FormException {
// noop
}
diff --git a/core/src/main/java/hudson/model/Api.java b/core/src/main/java/hudson/model/Api.java
index 23e7207211..4b16e1b0b5 100644
--- a/core/src/main/java/hudson/model/Api.java
+++ b/core/src/main/java/hudson/model/Api.java
@@ -25,6 +25,10 @@
package hudson.model;
import hudson.ExtensionList;
+import hudson.Util;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
@@ -34,11 +38,10 @@ import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.stream.StreamResult;
import jenkins.model.Jenkins;
import jenkins.security.SecureRequester;
+import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.xml.FilteredFunctionContext;
import org.dom4j.CharacterData;
import org.dom4j.Document;
@@ -52,7 +55,9 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.Flavor;
import org.kohsuke.stapler.export.Model;
@@ -96,7 +101,7 @@ public class Api extends AbstractModelObject {
/**
* Exposes the bean as XML.
*/
- public void doXml(StaplerRequest req, StaplerResponse rsp,
+ public void doXml(StaplerRequest2 req, StaplerResponse2 rsp,
@QueryParameter String xpath,
@QueryParameter String wrapper,
@QueryParameter String tree,
@@ -212,7 +217,7 @@ public class Api extends AbstractModelObject {
/**
* Generate schema.
*/
- public void doSchema(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doSchema(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
setHeaders(rsp);
rsp.setContentType("application/xml");
StreamResult r = new StreamResult(rsp.getOutputStream());
@@ -223,7 +228,32 @@ public class Api extends AbstractModelObject {
/**
* Exposes the bean as JSON.
*/
- public void doJson(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doJson(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
+ if (Util.isOverridden(Api.class, getClass(), "doJson", StaplerRequest.class, StaplerResponse.class)) {
+ try {
+ doJson(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ doJsonImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doJson(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ public void doJson(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doJsonImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private void doJsonImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
if (req.getParameter("jsonp") == null || permit(req)) {
setHeaders(rsp);
rsp.serveExposedBean(req, bean, req.getParameter("jsonp") == null ? Flavor.JSON : Flavor.JSONP);
@@ -235,12 +265,37 @@ public class Api extends AbstractModelObject {
/**
* Exposes the bean as Python literal.
*/
- public void doPython(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doPython(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
+ if (Util.isOverridden(Api.class, getClass(), "doPython", StaplerRequest.class, StaplerResponse.class)) {
+ try {
+ doPython(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ doPythonImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doPython(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ public void doPython(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doPythonImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private void doPythonImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
setHeaders(rsp);
rsp.serveExposedBean(req, bean, Flavor.PYTHON);
}
- private boolean permit(StaplerRequest req) {
+ private boolean permit(StaplerRequest2 req) {
for (SecureRequester r : ExtensionList.lookup(SecureRequester.class)) {
if (r.permit(req, bean)) {
return true;
@@ -250,7 +305,7 @@ public class Api extends AbstractModelObject {
}
@Restricted(NoExternalUse.class)
- protected void setHeaders(StaplerResponse rsp) {
+ protected void setHeaders(StaplerResponse2 rsp) {
rsp.setHeader("X-Jenkins", Jenkins.VERSION);
rsp.setHeader("X-Jenkins-Session", Jenkins.SESSION_HASH);
// to be really defensive against dumb browsers not taking into consideration the content-type being set
diff --git a/core/src/main/java/hudson/model/AutoCompletionCandidates.java b/core/src/main/java/hudson/model/AutoCompletionCandidates.java
index d2f5f17c25..366f626e31 100644
--- a/core/src/main/java/hudson/model/AutoCompletionCandidates.java
+++ b/core/src/main/java/hudson/model/AutoCompletionCandidates.java
@@ -28,16 +28,16 @@ import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.search.Search;
import hudson.search.UserSearchProperty;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Flavor;
/**
@@ -69,7 +69,7 @@ public class AutoCompletionCandidates implements HttpResponse {
}
@Override
- public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object o) throws IOException, ServletException {
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object o) throws IOException, ServletException {
Search.Result r = new Search.Result();
for (String value : values) {
r.suggestions.add(new hudson.search.Search.Item(value));
diff --git a/core/src/main/java/hudson/model/BallColor.java b/core/src/main/java/hudson/model/BallColor.java
index 5913f59466..3e8dc2f288 100644
--- a/core/src/main/java/hudson/model/BallColor.java
+++ b/core/src/main/java/hudson/model/BallColor.java
@@ -113,7 +113,7 @@ public enum BallColor implements StatusIcon {
@Override
public String getImageOf(String size) {
- return Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH + "/images/" + size + '/' + image;
+ return Stapler.getCurrentRequest2().getContextPath() + Jenkins.RESOURCE_PATH + "/images/" + size + '/' + image;
}
/**
diff --git a/core/src/main/java/hudson/model/BooleanParameterDefinition.java b/core/src/main/java/hudson/model/BooleanParameterDefinition.java
index 6e9db32216..6bf1a50096 100644
--- a/core/src/main/java/hudson/model/BooleanParameterDefinition.java
+++ b/core/src/main/java/hudson/model/BooleanParameterDefinition.java
@@ -33,7 +33,7 @@ import net.sf.json.JSONObject;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
/**
* {@link ParameterDefinition} that is either 'true' or 'false'.
@@ -79,7 +79,7 @@ public class BooleanParameterDefinition extends SimpleParameterDefinition {
}
@Override
- public ParameterValue createValue(StaplerRequest req, JSONObject jo) {
+ public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
BooleanParameterValue value = req.bindJSON(BooleanParameterValue.class, jo);
value.setDescription(getDescription());
return value;
diff --git a/core/src/main/java/hudson/model/BuildAuthorizationToken.java b/core/src/main/java/hudson/model/BuildAuthorizationToken.java
index a09ed113e1..3611824fb5 100644
--- a/core/src/main/java/hudson/model/BuildAuthorizationToken.java
+++ b/core/src/main/java/hudson/model/BuildAuthorizationToken.java
@@ -27,11 +27,13 @@ package hudson.model;
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
import hudson.Util;
import hudson.security.ACL;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
-import javax.servlet.http.HttpServletResponse;
import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.springframework.security.access.AccessDeniedException;
/**
@@ -51,7 +53,10 @@ public final class BuildAuthorizationToken {
this.token = token;
}
- public static BuildAuthorizationToken create(StaplerRequest req) {
+ /**
+ * @since TODO
+ */
+ public static BuildAuthorizationToken create(StaplerRequest2 req) {
if (req.getParameter("pseudoRemoteTrigger") != null) {
String token = Util.fixEmpty(req.getParameter("authToken"));
if (token != null)
@@ -61,11 +66,22 @@ public final class BuildAuthorizationToken {
return null;
}
- @Deprecated public static void checkPermission(AbstractProject, ?> project, BuildAuthorizationToken token, StaplerRequest req, StaplerResponse rsp) throws IOException {
- checkPermission((Job, ?>) project, token, req, rsp);
+ /**
+ * @deprecated use {@link #create(StaplerRequest2)}
+ */
+ @Deprecated
+ public static BuildAuthorizationToken create(StaplerRequest req) {
+ return create(StaplerRequest.toStaplerRequest2(req));
}
- public static void checkPermission(Job, ?> project, BuildAuthorizationToken token, StaplerRequest req, StaplerResponse rsp) throws IOException {
+ @Deprecated public static void checkPermission(AbstractProject, ?> project, BuildAuthorizationToken token, StaplerRequest req, StaplerResponse rsp) throws IOException {
+ checkPermission((Job, ?>) project, token, StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ }
+
+ /**
+ * @since TODO
+ */
+ public static void checkPermission(Job, ?> project, BuildAuthorizationToken token, StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
if (token != null && token.token != null) {
//check the provided token
String providedToken = req.getParameter("token");
@@ -86,6 +102,14 @@ public final class BuildAuthorizationToken {
throw HttpResponses.forwardToView(project, "requirePOST.jelly");
}
+ /**
+ * @deprecated use {@link #checkPermission(Job, BuildAuthorizationToken, StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ public static void checkPermission(Job, ?> project, BuildAuthorizationToken token, StaplerRequest req, StaplerResponse rsp) throws IOException {
+ checkPermission(project, token, StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ }
+
public String getToken() {
return token;
}
diff --git a/core/src/main/java/hudson/model/BuildTimelineWidget.java b/core/src/main/java/hudson/model/BuildTimelineWidget.java
index 9691969162..4f5ccbf1c6 100644
--- a/core/src/main/java/hudson/model/BuildTimelineWidget.java
+++ b/core/src/main/java/hudson/model/BuildTimelineWidget.java
@@ -25,12 +25,15 @@
package hudson.model;
import hudson.util.RunList;
+import jakarta.servlet.ServletException;
+import java.io.IOException;
import java.util.ArrayList;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
/**
* UI widget for showing the SIMILE timeline control.
@@ -60,12 +63,15 @@ public class BuildTimelineWidget {
return builds.getLastBuild();
}
- public HttpResponse doData(StaplerRequest req, @QueryParameter long min, @QueryParameter long max) {
- return (req1, rsp, node) -> {
- JSONObject o = new JSONObject();
- o.put("events", JSONArray.fromObject(new ArrayList<>()));
- rsp.setContentType("text/javascript;charset=UTF-8");
- o.write(rsp.getWriter());
+ public HttpResponse doData(StaplerRequest2 req, @QueryParameter long min, @QueryParameter long max) {
+ return new HttpResponse() {
+ @Override
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
+ JSONObject o = new JSONObject();
+ o.put("events", JSONArray.fromObject(new ArrayList<>()));
+ rsp.setContentType("text/javascript;charset=UTF-8");
+ o.write(rsp.getWriter());
+ }
};
}
diff --git a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java
index 7b12a9b2ce..98bdcf2e80 100644
--- a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java
+++ b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java
@@ -20,7 +20,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported;
/**
@@ -152,7 +152,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition {
}
@Override
- public ParameterValue createValue(StaplerRequest req, JSONObject jo) {
+ public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
StringParameterValue value = req.bindJSON(StringParameterValue.class, jo);
value.setDescription(getDescription());
checkValue(value, value.getValue());
@@ -218,7 +218,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition {
/*
* We need this for JENKINS-26143 -- reflective creation cannot handle setChoices(Object). See that method for context.
*/
- public ParameterDefinition newInstance(@Nullable StaplerRequest req, @NonNull JSONObject formData) throws FormException {
+ public ParameterDefinition newInstance(@Nullable StaplerRequest2 req, @NonNull JSONObject formData) throws FormException {
String name = formData.getString("name");
String desc = formData.getString("description");
String choiceText = formData.getString("choices");
diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java
index 14a311381a..a4878a2c8f 100644
--- a/core/src/main/java/hudson/model/Computer.java
+++ b/core/src/main/java/hudson/model/Computer.java
@@ -26,7 +26,7 @@
package hudson.model;
-import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
@@ -73,6 +73,7 @@ import hudson.util.NamingThreadFactory;
import hudson.util.RemotingDiagnostics;
import hudson.util.RemotingDiagnostics.HeapDump;
import hudson.util.RunList;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -105,7 +106,6 @@ import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.security.ImpersonatingExecutorService;
import jenkins.security.MasterToSlaveCallable;
@@ -129,8 +129,8 @@ import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@@ -227,7 +227,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
* @since 1.607
*/
public void recordTermination() {
- StaplerRequest request = Stapler.getCurrentRequest();
+ StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request != null) {
terminatedBy.add(new TerminationRequest(
String.format("Termination requested at %s by %s [id=%d] from HTTP request for %s",
@@ -416,7 +416,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
/**
* If {@link #getChannel()}==null, attempts to relaunch the agent.
*/
- public abstract void doLaunchSlaveAgent(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException;
+ public abstract void doLaunchSlaveAgent(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException;
/**
* @deprecated since 2009-01-06. Use {@link #connect(boolean)}
@@ -427,7 +427,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
}
/**
- * Do the same as {@link #doLaunchSlaveAgent(StaplerRequest, StaplerResponse)}
+ * Do the same as {@link #doLaunchSlaveAgent(StaplerRequest2, StaplerResponse2)}
* but outside the context of serving a request.
*
*
@@ -1391,12 +1391,12 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
//
//
@Restricted(DoNotUse.class)
- public void doRssAll(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doRssAll(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds());
}
@Restricted(DoNotUse.class)
- public void doRssFailed(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doRssFailed(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().failureOnly());
}
@@ -1407,7 +1407,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
* @since 2.215
*/
@Restricted(DoNotUse.class)
- public void doRssLatest(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doRssLatest(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
final List lastBuilds = new ArrayList<>();
for (AbstractProject, ?> p : Jenkins.get().allItems(AbstractProject.class)) {
if (p.getLastBuild() != null) {
@@ -1452,7 +1452,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
/**
* Dumps the contents of the export table.
*/
- public void doDumpExportTable(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException {
+ public void doDumpExportTable(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, InterruptedException {
// this is a debug probe and may expose sensitive information
checkPermission(Jenkins.ADMINISTER);
@@ -1488,18 +1488,18 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
* For system diagnostics.
* Run arbitrary Groovy script.
*/
- public void doScript(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doScript(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
_doScript(req, rsp, "_script.jelly");
}
/**
* Run arbitrary Groovy script and return result as plain text.
*/
- public void doScriptText(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doScriptText(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
_doScript(req, rsp, "_scriptText.jelly");
}
- protected void _doScript(StaplerRequest req, StaplerResponse rsp, String view) throws IOException, ServletException {
+ protected void _doScript(StaplerRequest2 req, StaplerResponse2 rsp, String view) throws IOException, ServletException {
Jenkins._doScript(req, rsp, req.getView(this, view), getChannel(), getACL());
}
@@ -1507,7 +1507,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
* Accepts the update to the node configuration.
*/
@POST
- public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException {
+ public void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
checkPermission(CONFIGURE);
String proposedName = Util.fixEmptyAndTrim(req.getSubmittedForm().getString("name"));
@@ -1547,7 +1547,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
* Accepts {@code config.xml} submission, as well as serve it.
*/
@WebMethod(name = "config.xml")
- public void doConfigDotXml(StaplerRequest req, StaplerResponse rsp)
+ public void doConfigDotXml(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException {
if (req.getMethod().equals("GET")) {
@@ -1626,7 +1626,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
/**
* Handles incremental log.
*/
- public void doProgressiveLog(StaplerRequest req, StaplerResponse rsp) throws IOException {
+ public void doProgressiveLog(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
getLogText().doProgressText(req, rsp);
}
diff --git a/core/src/main/java/hudson/model/ComputerSet.java b/core/src/main/java/hudson/model/ComputerSet.java
index 5cb798978d..f25d25a19a 100644
--- a/core/src/main/java/hudson/model/ComputerSet.java
+++ b/core/src/main/java/hudson/model/ComputerSet.java
@@ -41,6 +41,7 @@ import hudson.triggers.SafeTimerTask;
import hudson.util.DescribableList;
import hudson.util.FormApply;
import hudson.util.FormValidation;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
@@ -52,7 +53,6 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.model.ModelObjectWithChildren;
import jenkins.model.ModelObjectWithContextMenu.ContextMenu;
@@ -61,8 +61,8 @@ import jenkins.widgets.HasWidgets;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST;
@@ -112,7 +112,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
}
@Override
- public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
+ public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
ContextMenu m = new ContextMenu();
for (Computer c : get_all()) {
m.add(c);
@@ -206,12 +206,12 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
return "/computers/";
}
- public Computer getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
+ public Computer getDynamic(String token, StaplerRequest2 req, StaplerResponse2 rsp) {
return Jenkins.get().getComputer(token);
}
@RequirePOST
- public void do_launchAll(StaplerRequest req, StaplerResponse rsp) throws IOException {
+ public void do_launchAll(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
for (Computer c : get_all()) {
@@ -227,7 +227,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
* TODO: ajax on the client side to wait until the update completion might be nice.
*/
@RequirePOST
- public void doUpdateNow(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doUpdateNow(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.MANAGE);
for (NodeMonitor nodeMonitor : NodeMonitor.getAll()) {
@@ -244,7 +244,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
* First check point in creating a new agent.
*/
@RequirePOST
- public synchronized void doCreateItem(StaplerRequest req, StaplerResponse rsp,
+ public synchronized void doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp,
@QueryParameter String name, @QueryParameter String mode,
@QueryParameter String from) throws IOException, ServletException {
final Jenkins app = Jenkins.get();
@@ -290,7 +290,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
* Really creates a new agent.
*/
@POST
- public synchronized void doDoCreateItem(StaplerRequest req, StaplerResponse rsp,
+ public synchronized void doDoCreateItem(StaplerRequest2 req, StaplerResponse2 rsp,
@QueryParameter String name,
@QueryParameter String type) throws IOException, ServletException, FormException {
final Jenkins app = Jenkins.get();
@@ -348,7 +348,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
* Accepts submission from the configuration page.
*/
@POST
- public synchronized HttpResponse doConfigSubmit(StaplerRequest req) throws IOException, ServletException, FormException {
+ public synchronized HttpResponse doConfigSubmit(StaplerRequest2 req) throws IOException, ServletException, FormException {
BulkChange bc = new BulkChange(MONITORS_OWNER);
try {
Jenkins.get().checkPermission(Jenkins.MANAGE);
diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java
index b5eb07784d..e2067bfc69 100644
--- a/core/src/main/java/hudson/model/Descriptor.java
+++ b/core/src/main/java/hudson/model/Descriptor.java
@@ -25,7 +25,7 @@
package hudson.model;
import static hudson.util.QuotedStringTokenizer.quote;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
+import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
@@ -45,6 +45,9 @@ import hudson.util.FormValidation.CheckMethod;
import hudson.util.ReflectionUtils;
import hudson.util.ReflectionUtils.Parameter;
import hudson.views.ListViewColumn;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletException;
import java.beans.Introspector;
import java.io.File;
import java.io.IOException;
@@ -71,13 +74,12 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
import jenkins.model.GlobalConfiguration;
import jenkins.model.GlobalConfigurationCategory;
import jenkins.model.Jenkins;
import jenkins.model.Loadable;
import jenkins.security.RedactSecretJsonInErrorMessageSanitizer;
+import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.io.OnMaster;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@@ -92,7 +94,9 @@ import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebApp;
import org.kohsuke.stapler.jelly.JellyCompatibleFacet;
import org.kohsuke.stapler.lang.Klass;
@@ -382,7 +386,7 @@ public abstract class Descriptor> implements Loadable,
* @since 1.402
*/
public static String getCurrentDescriptorByNameUrl() {
- StaplerRequest req = Stapler.getCurrentRequest();
+ StaplerRequest2 req = Stapler.getCurrentRequest2();
// this override allows RenderOnDemandClosure to preserve the proper value
Object url = req.getAttribute("currentDescriptorByNameUrl");
@@ -576,16 +580,33 @@ public abstract class Descriptor> implements Loadable,
*
* @throws FormException
* Signals a problem in the submitted form.
+ * @since TODO
+ */
+ public T newInstance(@Nullable StaplerRequest2 req, @NonNull JSONObject formData) throws FormException {
+ if (Util.isOverridden(Descriptor.class, getClass(), "newInstance", StaplerRequest.class, JSONObject.class)) {
+ return newInstance(req != null ? StaplerRequest.fromStaplerRequest2(req) : null, formData);
+ } else {
+ return newInstanceImpl(req, formData);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #newInstance(StaplerRequest2, JSONObject)}
* @since 1.145
*/
+ @Deprecated
public T newInstance(@Nullable StaplerRequest req, @NonNull JSONObject formData) throws FormException {
+ return newInstanceImpl(req != null ? StaplerRequest.toStaplerRequest2(req) : null, formData);
+ }
+
+ private T newInstanceImpl(@Nullable StaplerRequest2 req, @NonNull JSONObject formData) throws FormException {
try {
Method m = getClass().getMethod("newInstance", StaplerRequest.class);
if (!Modifier.isAbstract(m.getDeclaringClass().getModifiers())) {
// this class overrides newInstance(StaplerRequest).
// maintain the backward compatible behavior
- return verifyNewInstance(newInstance(req));
+ return verifyNewInstance(newInstance(StaplerRequest.fromStaplerRequest2(req)));
} else {
if (req == null) {
// yes, req is supposed to be always non-null, but see the note above
@@ -602,16 +623,25 @@ public abstract class Descriptor> implements Loadable,
}
/**
- * Replacement for {@link StaplerRequest#bindJSON(Class, JSONObject)} which honors {@link #newInstance(StaplerRequest, JSONObject)}.
- * This is automatically used inside {@link #newInstance(StaplerRequest, JSONObject)} so a direct call would only be necessary
- * in case the top level binding might use a {@link Descriptor} which overrides {@link #newInstance(StaplerRequest, JSONObject)}.
- * @since 2.342
+ * Replacement for {@link StaplerRequest2#bindJSON(Class, JSONObject)} which honors {@link #newInstance(StaplerRequest2, JSONObject)}.
+ * This is automatically used inside {@link #newInstance(StaplerRequest2, JSONObject)} so a direct call would only be necessary
+ * in case the top level binding might use a {@link Descriptor} which overrides {@link #newInstance(StaplerRequest2, JSONObject)}.
+ * @since TODO
*/
- public static T bindJSON(StaplerRequest req, Class type, JSONObject src) {
+ public static T bindJSON(StaplerRequest2 req, Class type, JSONObject src) {
return bindJSON(req, type, src, false);
}
- private static T bindJSON(StaplerRequest req, Class type, JSONObject src, boolean fromNewInstance) {
+ /**
+ * @deprecated use {@link #bindJSON(StaplerRequest2, Class, JSONObject)}
+ * @since 2.342
+ */
+ @Deprecated
+ public static T bindJSON(StaplerRequest req, Class type, JSONObject src) {
+ return bindJSON(StaplerRequest.toStaplerRequest2(req), type, src);
+ }
+
+ private static T bindJSON(StaplerRequest2 req, Class type, JSONObject src, boolean fromNewInstance) {
BindInterceptor oldInterceptor = req.getBindInterceptor();
try {
NewInstanceBindInterceptor interceptor;
@@ -631,9 +661,9 @@ public abstract class Descriptor> implements Loadable,
}
/**
- * Ensures that calls to {@link StaplerRequest#bindJSON(Class, JSONObject)} from {@link #newInstance(StaplerRequest, JSONObject)} recurse properly.
+ * Ensures that calls to {@link StaplerRequest2#bindJSON(Class, JSONObject)} from {@link #newInstance(StaplerRequest2, JSONObject)} recurse properly.
* {@code doConfigSubmit}-like methods will wind up calling {@code newInstance} directly
- * or via {@link #newInstancesFromHeteroList(StaplerRequest, Object, Collection)},
+ * or via {@link #newInstancesFromHeteroList(StaplerRequest2, Object, Collection)},
* which consult any custom {@code newInstance} overrides for top-level {@link Describable} objects.
* But for nested describable objects Stapler would know nothing about {@code newInstance} without this trick.
*/
@@ -671,7 +701,7 @@ public abstract class Descriptor> implements Loadable,
try {
final Descriptor descriptor = Jenkins.get().getDescriptor(actualType);
if (descriptor != null) {
- return descriptor.newInstance(Stapler.getCurrentRequest(), json);
+ return descriptor.newInstance(Stapler.getCurrentRequest2(), json);
} else {
LOGGER.log(Level.WARNING, "Descriptor not found. Falling back to default instantiation "
+ actualType.getName() + " " + json);
@@ -694,7 +724,7 @@ public abstract class Descriptor> implements Loadable,
if (isApplicable(targetTypeErasure, json)) {
LOGGER.log(Level.FINE, "switching to newInstance {0} {1}", new Object[] {targetTypeErasure.getName(), json});
try {
- return Jenkins.get().getDescriptor(targetTypeErasure).newInstance(Stapler.getCurrentRequest(), json);
+ return Jenkins.get().getDescriptor(targetTypeErasure).newInstance(Stapler.getCurrentRequest2(), json);
} catch (Exception x) {
LOGGER.log(Level.WARNING, "falling back to default instantiation " + targetTypeErasure.getName() + " " + json, x);
}
@@ -776,13 +806,13 @@ public abstract class Descriptor> implements Loadable,
}
try {
- if (Stapler.getCurrentRequest().getView(c, "help" + suffix) != null)
+ if (Stapler.getCurrentRequest2().getView(c, "help" + suffix) != null)
return page;
} catch (IOException e) {
throw new Error(e);
}
- if (getStaticHelpUrl(Stapler.getCurrentRequest(), c, suffix) != null) return page;
+ if (getStaticHelpUrl(Stapler.getCurrentRequest2(), c, suffix) != null) return page;
}
return null;
}
@@ -812,7 +842,7 @@ public abstract class Descriptor> implements Loadable,
/**
* @deprecated
- * As of 1.239, use {@link #configure(StaplerRequest, JSONObject)}.
+ * As of 1.239, use {@link #configure(StaplerRequest2, JSONObject)}.
*/
@Deprecated
public boolean configure(StaplerRequest req) throws FormException {
@@ -829,7 +859,21 @@ public abstract class Descriptor> implements Loadable,
* See the developer documentation.
* @return false
* to keep the client in the same config page.
+ * @since TODO
*/
+ public boolean configure(StaplerRequest2 req, JSONObject json) throws FormException {
+ if (Util.isOverridden(Descriptor.class, getClass(), "configure", StaplerRequest.class, JSONObject.class)) {
+ return configure(StaplerRequest.fromStaplerRequest2(req), json);
+ } else {
+ // compatibility
+ return configure(StaplerRequest.fromStaplerRequest2(req));
+ }
+ }
+
+ /**
+ * @deprecated use {@link #configure(StaplerRequest2, JSONObject)}
+ */
+ @Deprecated
public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
// compatibility
return configure(req);
@@ -895,7 +939,7 @@ public abstract class Descriptor> implements Loadable,
protected List getPossibleViewNames(String baseName) {
List names = new ArrayList<>();
- for (Facet f : WebApp.get(Jenkins.get().servletContext).facets) {
+ for (Facet f : WebApp.get(Jenkins.get().getServletContext()).facets) {
if (f instanceof JellyCompatibleFacet jcf) {
for (String ext : jcf.getScriptExtensions())
names.add(baseName + ext);
@@ -957,7 +1001,32 @@ public abstract class Descriptor> implements Loadable,
/**
* Serves {@code help.html} from the resource of {@link #clazz}.
*/
- public void doHelp(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doHelp(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
+ if (Util.isOverridden(Descriptor.class, getClass(), "doHelp", StaplerRequest.class, StaplerResponse.class)) {
+ try {
+ doHelp(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
+ } catch (javax.servlet.ServletException e) {
+ throw ServletExceptionWrapper.toJakartaServletException(e);
+ }
+ } else {
+ doHelpImpl(req, rsp);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #doHelp(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ @StaplerNotDispatchable
+ public void doHelp(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doHelpImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
+ private void doHelpImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
String path = req.getRestOfPath();
if (path.contains("..")) throw new ServletException("Illegal path: " + path);
@@ -972,13 +1041,13 @@ public abstract class Descriptor> implements Loadable,
}
for (Klass> c = getKlass(); c != null; c = c.getSuperClass()) {
- RequestDispatcher rd = Stapler.getCurrentRequest().getView(c, "help" + path);
+ RequestDispatcher rd = Stapler.getCurrentRequest2().getView(c, "help" + path);
if (rd != null) { // template based help page
rd.forward(req, rsp);
return;
}
- URL url = getStaticHelpUrl(Stapler.getCurrentRequest(), c, path);
+ URL url = getStaticHelpUrl(Stapler.getCurrentRequest2(), c, path);
if (url != null) {
// TODO: generalize macro expansion and perhaps even support JEXL
rsp.setContentType("text/html;charset=UTF-8");
@@ -992,8 +1061,11 @@ public abstract class Descriptor> implements Loadable,
rsp.sendError(SC_NOT_FOUND);
}
+ /**
+ * @since TODO
+ */
@Restricted(NoExternalUse.class)
- public static URL getStaticHelpUrl(StaplerRequest req, Klass> c, String suffix) {
+ public static URL getStaticHelpUrl(StaplerRequest2 req, Klass> c, String suffix) {
String base = "help" + suffix;
URL url;
@@ -1017,6 +1089,15 @@ public abstract class Descriptor> implements Loadable,
return c.getResource(base + ".html");
}
+ /**
+ * @deprecated use {@link #getStaticHelpUrl(StaplerRequest2, Klass, String)}
+ */
+ @Deprecated
+ @Restricted(NoExternalUse.class)
+ public static URL getStaticHelpUrl(StaplerRequest req, Klass> c, String suffix) {
+ return getStaticHelpUrl(StaplerRequest.toStaplerRequest2(req), c, suffix);
+ }
+
//
// static methods
@@ -1061,16 +1142,30 @@ public abstract class Descriptor> implements Loadable,
* List of descriptors to create instances from.
* @return
* Can be empty but never null.
+ * @since TODO
*/
public static >
- List newInstancesFromHeteroList(StaplerRequest req, JSONObject formData, String key,
+ List newInstancesFromHeteroList(StaplerRequest2 req, JSONObject formData, String key,
Collection extends Descriptor> descriptors) throws FormException {
return newInstancesFromHeteroList(req, formData.get(key), descriptors);
}
+ /**
+ * @deprecated use {@link #newInstancesFromHeteroList(StaplerRequest2, JSONObject, String, Collection)}
+ */
+ @Deprecated
public static >
- List newInstancesFromHeteroList(StaplerRequest req, Object formData,
+ List newInstancesFromHeteroList(StaplerRequest req, JSONObject formData, String key,
+ Collection extends Descriptor> descriptors) throws FormException {
+ return newInstancesFromHeteroList(StaplerRequest.toStaplerRequest2(req), formData, key, descriptors);
+ }
+
+ /**
+ * @since TODO
+ */
+ public static >
+ List newInstancesFromHeteroList(StaplerRequest2 req, Object formData,
Collection extends Descriptor> descriptors) throws FormException {
List items = new ArrayList<>();
@@ -1086,7 +1181,7 @@ public abstract class Descriptor> implements Loadable,
if (kind != null) {
// Only applies when Descriptor.getId is overridden.
// Note that kind is only supported here,
- // *not* inside the StaplerRequest.bindJSON which is normally called by newInstance
+ // *not* inside the StaplerRequest2.bindJSON which is normally called by newInstance
// (since Descriptor.newInstance is not itself available to Stapler).
// If you merely override getId for some reason, but use @DataBoundConstructor on your Describable,
// there is no problem; but you can only rely on newInstance being called at top level.
@@ -1114,6 +1209,16 @@ public abstract class Descriptor> implements Loadable,
return items;
}
+ /**
+ * @deprecated use {@link #newInstancesFromHeteroList(StaplerRequest2, JSONObject, String, Collection)}
+ */
+ @Deprecated
+ public static >
+ List newInstancesFromHeteroList(StaplerRequest req, Object formData,
+ Collection extends Descriptor> descriptors) throws FormException {
+ return newInstancesFromHeteroList(StaplerRequest.toStaplerRequest2(req), formData, descriptors);
+ }
+
/**
* Finds a descriptor from a collection by its ID.
* @param id should match {@link #getId}
@@ -1199,7 +1304,7 @@ public abstract class Descriptor> implements Loadable,
}
@Override
- public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
if (FormApply.isApply(req)) {
FormApply.applyResponse("notificationBar.show(" + quote(getMessage()) + ",notificationBar.ERROR)")
.generateResponse(req, rsp, node);
diff --git a/core/src/main/java/hudson/model/DirectlyModifiableView.java b/core/src/main/java/hudson/model/DirectlyModifiableView.java
index 61362272c2..138f33a6a3 100644
--- a/core/src/main/java/hudson/model/DirectlyModifiableView.java
+++ b/core/src/main/java/hudson/model/DirectlyModifiableView.java
@@ -26,8 +26,8 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull;
+import jakarta.servlet.ServletException;
import java.io.IOException;
-import javax.servlet.ServletException;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.interceptor.RequirePOST;
diff --git a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java
index 9d455f4c1b..72da0c7514 100644
--- a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java
+++ b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java
@@ -27,6 +27,9 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.FilePath;
import hudson.Util;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -55,8 +58,6 @@ import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins;
import jenkins.security.MasterToSlaveCallable;
import jenkins.security.ResourceDomainConfiguration;
@@ -70,7 +71,9 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
/**
* Has convenience methods to serve file system.
@@ -157,7 +160,7 @@ public final class DirectoryBrowserSupport implements HttpResponse {
}
@Override
- public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
if (!ResourceDomainConfiguration.isResourceRequest(req) && ResourceDomainConfiguration.isResourceDomainConfigured()) {
resourceToken = ResourceDomainRootAction.get().getToken(this, req);
}
@@ -191,11 +194,15 @@ public final class DirectoryBrowserSupport implements HttpResponse {
* from the {@code doXYZ} method and let Stapler generate a response for you.
*/
@Deprecated
- public void serveFile(StaplerRequest req, StaplerResponse rsp, FilePath root, String icon, boolean serveDirIndex) throws IOException, ServletException, InterruptedException {
- serveFile(req, rsp, root.toVirtualFile(), icon, serveDirIndex);
+ public void serveFile(StaplerRequest req, StaplerResponse rsp, FilePath root, String icon, boolean serveDirIndex) throws IOException, javax.servlet.ServletException, InterruptedException {
+ try {
+ serveFile(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), root.toVirtualFile(), icon, serveDirIndex);
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
}
- private void serveFile(StaplerRequest req, StaplerResponse rsp, VirtualFile root, String icon, boolean serveDirIndex) throws IOException, ServletException, InterruptedException {
+ private void serveFile(StaplerRequest2 req, StaplerResponse2 rsp, VirtualFile root, String icon, boolean serveDirIndex) throws IOException, ServletException, InterruptedException {
// handle form submission
String pattern = req.getParameter("pattern");
if (pattern == null)
@@ -492,7 +499,7 @@ public final class DirectoryBrowserSupport implements HttpResponse {
}
}
- private String getPath(StaplerRequest req) {
+ private String getPath(StaplerRequest2 req) {
String path = req.getRestOfPath();
if (path.isEmpty())
path = "/";
@@ -521,7 +528,7 @@ public final class DirectoryBrowserSupport implements HttpResponse {
return "../".repeat(times);
}
- private static void zip(StaplerResponse rsp, VirtualFile root, VirtualFile dir, String glob) throws IOException, InterruptedException {
+ private static void zip(StaplerResponse2 rsp, VirtualFile root, VirtualFile dir, String glob) throws IOException, InterruptedException {
OutputStream outputStream = rsp.getOutputStream();
try (ZipOutputStream zos = new ZipOutputStream(outputStream)) {
zos.setEncoding(Charset.defaultCharset().displayName()); // TODO JENKINS-20663 make this overridable via query parameter
diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java
index 020399bdd5..94aa1c770d 100644
--- a/core/src/main/java/hudson/model/Executor.java
+++ b/core/src/main/java/hudson/model/Executor.java
@@ -59,7 +59,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
-import javax.servlet.ServletException;
import jenkins.model.CauseOfInterruption;
import jenkins.model.CauseOfInterruption.UserInterruption;
import jenkins.model.InterruptedBuildAction;
@@ -852,7 +851,7 @@ public class Executor extends Thread implements ModelObject {
*/
@RequirePOST
@Deprecated
- public void doStop(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doStop(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
doStop().generateResponse(req, rsp, this);
}
diff --git a/core/src/main/java/hudson/model/Failure.java b/core/src/main/java/hudson/model/Failure.java
index 71318dd046..0546f0a7e0 100644
--- a/core/src/main/java/hudson/model/Failure.java
+++ b/core/src/main/java/hudson/model/Failure.java
@@ -25,12 +25,12 @@
package hudson.model;
import edu.umd.cs.findbugs.annotations.CheckForNull;
+import jakarta.servlet.ServletException;
import java.io.IOException;
-import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
/**
* Represents an error induced by user, encountered during HTTP request processing.
@@ -55,7 +55,7 @@ public class Failure extends RuntimeException implements HttpResponse {
this.pre = pre;
}
- public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node, @CheckForNull Throwable throwable) throws IOException, ServletException {
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node, @CheckForNull Throwable throwable) throws IOException, ServletException {
if (throwable != null) {
req.setAttribute("exception", throwable);
}
@@ -63,7 +63,7 @@ public class Failure extends RuntimeException implements HttpResponse {
}
@Override
- public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
+ public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
req.setAttribute("message", getMessage());
if (pre)
req.setAttribute("pre", true);
diff --git a/core/src/main/java/hudson/model/FileParameterDefinition.java b/core/src/main/java/hudson/model/FileParameterDefinition.java
index 25cb08336d..b8332f5911 100644
--- a/core/src/main/java/hudson/model/FileParameterDefinition.java
+++ b/core/src/main/java/hudson/model/FileParameterDefinition.java
@@ -29,17 +29,17 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension;
import hudson.cli.CLICommand;
+import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Objects;
-import javax.servlet.ServletException;
import net.sf.json.JSONObject;
import org.apache.commons.fileupload2.core.FileItem;
import org.apache.commons.io.FileUtils;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
/**
* {@link ParameterDefinition} for doing file upload.
@@ -65,7 +65,7 @@ public class FileParameterDefinition extends ParameterDefinition {
}
@Override
- public FileParameterValue createValue(StaplerRequest req, JSONObject jo) {
+ public FileParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
FileParameterValue p = req.bindJSON(FileParameterValue.class, jo);
p.setLocation(getName());
p.setDescription(getDescription());
@@ -87,7 +87,7 @@ public class FileParameterDefinition extends ParameterDefinition {
}
@Override
- public ParameterValue createValue(StaplerRequest req) {
+ public ParameterValue createValue(StaplerRequest2 req) {
FileItem src;
try {
src = req.getFileItem2(getName());
diff --git a/core/src/main/java/hudson/model/FileParameterValue.java b/core/src/main/java/hudson/model/FileParameterValue.java
index 343e30bb64..abeb1f4181 100644
--- a/core/src/main/java/hudson/model/FileParameterValue.java
+++ b/core/src/main/java/hudson/model/FileParameterValue.java
@@ -50,8 +50,8 @@ import org.apache.commons.io.FilenameUtils;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
/**
* {@link ParameterValue} for {@link FileParameterDefinition}.
@@ -235,9 +235,9 @@ public class FileParameterValue extends ParameterValue {
}
/**
- * Serve this file parameter in response to a {@link StaplerRequest}.
+ * Serve this file parameter in response to a {@link StaplerRequest2}.
*/
- public DirectoryBrowserSupport doDynamic(StaplerRequest request, StaplerResponse response) {
+ public DirectoryBrowserSupport doDynamic(StaplerRequest2 request, StaplerResponse2 response) {
AbstractBuild build = (AbstractBuild) request.findAncestor(AbstractBuild.class).getObject();
File fileParameter = getFileParameterFolderUnderBuild(build);
return new DirectoryBrowserSupport(build, new FilePath(fileParameter), Messages.FileParameterValue_IndexTitle(), "folder.png", false);
diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java
index 784fa47da2..7d45fd63d7 100644
--- a/core/src/main/java/hudson/model/Hudson.java
+++ b/core/src/main/java/hudson/model/Hudson.java
@@ -38,14 +38,16 @@ import hudson.model.listeners.ItemListener;
import hudson.slaves.ComputerListener;
import hudson.util.CopyOnWriteList;
import hudson.util.FormValidation;
+import io.jenkins.servlet.ServletContextWrapper;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.List;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins;
import org.jvnet.hudson.reactor.ReactorException;
import org.kohsuke.stapler.QueryParameter;
@@ -78,14 +80,36 @@ public class Hudson extends Jenkins {
return (Hudson) Jenkins.get();
}
+ /**
+ * @since TODO
+ */
public Hudson(File root, ServletContext context) throws IOException, InterruptedException, ReactorException {
this(root, context, null);
}
+ /**
+ * @deprecated use {@link #Hudson(File, ServletContext)}
+ */
+ @Deprecated
+ public Hudson(File root, javax.servlet.ServletContext context) throws IOException, InterruptedException, ReactorException {
+ this(root, ServletContextWrapper.toJakartaServletContext(context));
+ }
+
+ /**
+ * @since TODO
+ */
public Hudson(File root, ServletContext context, PluginManager pluginManager) throws IOException, InterruptedException, ReactorException {
super(root, context, pluginManager);
}
+ /**
+ * @deprecated use {@link #Hudson(File, ServletContext, PluginManager)}
+ */
+ @Deprecated
+ public Hudson(File root, javax.servlet.ServletContext context, PluginManager pluginManager) throws IOException, InterruptedException, ReactorException {
+ this(root, ServletContextWrapper.toJakartaServletContext(context), pluginManager);
+ }
+
/**
* Gets all the installed {@link ItemListener}s.
*
@@ -173,8 +197,12 @@ public class Hudson extends Jenkins {
*/
@Deprecated
@RequirePOST
- public synchronized void doQuietDown(StaplerResponse rsp) throws IOException, ServletException {
- doQuietDown().generateResponse(null, rsp, this);
+ public synchronized void doQuietDown(StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ doQuietDown().generateResponse(null, StaplerResponse.toStaplerResponse2(rsp), this);
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
}
/**
@@ -184,7 +212,7 @@ public class Hudson extends Jenkins {
* As on 1.267, moved to "/log/rss..."
*/
@Deprecated
- public void doLogRss(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doLogRss(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
String qs = req.getQueryString();
rsp.sendRedirect2("./log/rss" + (qs == null ? "" : '?' + qs));
}
@@ -194,7 +222,7 @@ public class Hudson extends Jenkins {
* Define your own check method, instead of relying on this generic one.
*/
@Deprecated
- public void doFieldCheck(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public void doFieldCheck(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
doFieldCheck(
fixEmpty(req.getParameter("value")),
fixEmpty(req.getParameter("type")),
diff --git a/core/src/main/java/hudson/model/Item.java b/core/src/main/java/hudson/model/Item.java
index a57011579b..838f4e6f75 100644
--- a/core/src/main/java/hudson/model/Item.java
+++ b/core/src/main/java/hudson/model/Item.java
@@ -41,7 +41,7 @@ import java.util.Collection;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
import jenkins.util.io.OnMaster;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
/**
* Basic configuration unit in Hudson.
@@ -183,7 +183,7 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont
/**
* Returns the absolute URL of this item. This relies on the current
- * {@link StaplerRequest} to figure out what the host name is,
+ * {@link StaplerRequest2} to figure out what the host name is,
* so can be used only during processing client requests.
*
* @return
diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java
index faa214dee6..62a46f3952 100644
--- a/core/src/main/java/hudson/model/ItemGroupMixIn.java
+++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java
@@ -32,6 +32,9 @@ import hudson.security.AccessControlled;
import hudson.util.CopyOnWriteMap;
import hudson.util.Function1;
import hudson.util.Secret;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -42,8 +45,6 @@ import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
@@ -51,7 +52,9 @@ import jenkins.model.Jenkins;
import jenkins.security.NotReallyRoleSensitiveCallable;
import jenkins.util.xml.XMLUtils;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.springframework.security.access.AccessDeniedException;
import org.xml.sax.SAXException;
@@ -140,8 +143,10 @@ public abstract class ItemGroupMixIn {
/**
* Creates a {@link TopLevelItem} for example from the submission of the {@code /lib/hudson/newFromList/form} tag
* or throws an exception if it fails.
+ *
+ * @since TODO
*/
- public synchronized TopLevelItem createTopLevelItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
+ public synchronized TopLevelItem createTopLevelItem(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
acl.checkPermission(Item.CREATE);
TopLevelItem result;
@@ -206,10 +211,22 @@ public abstract class ItemGroupMixIn {
return result;
}
+ /**
+ * @deprecated use {@link #createTopLevelItem(StaplerRequest2, StaplerResponse2)}
+ */
+ @Deprecated
+ public synchronized TopLevelItem createTopLevelItem(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
+ try {
+ return createTopLevelItem(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
+ } catch (ServletException e) {
+ throw ServletExceptionWrapper.fromJakartaServletException(e);
+ }
+ }
+
/**
* Computes the redirection target URL for the newly created {@link TopLevelItem}.
*/
- protected String redirectAfterCreateItem(StaplerRequest req, TopLevelItem result) throws IOException {
+ protected String redirectAfterCreateItem(StaplerRequest2 req, TopLevelItem result) throws IOException {
return req.getContextPath() + '/' + result.getUrl() + "configure";
}
diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java
index 4bd28ff2e3..10637d666d 100644
--- a/core/src/main/java/hudson/model/Job.java
+++ b/core/src/main/java/hudson/model/Job.java
@@ -24,8 +24,8 @@
package hudson.model;
-import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
-import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
+import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+import static jakarta.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.CheckForNull;
@@ -69,6 +69,8 @@ import hudson.util.TextFile;
import hudson.widgets.HistoryWidget;
import hudson.widgets.HistoryWidget.Adapter;
import hudson.widgets.Widget;
+import io.jenkins.servlet.ServletExceptionWrapper;
+import jakarta.servlet.ServletException;
import java.awt.Color;
import java.awt.Paint;
import java.io.File;
@@ -85,7 +87,6 @@ import java.util.Set;
import java.util.SortedMap;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.servlet.ServletException;
import jenkins.model.BuildDiscarder;
import jenkins.model.BuildDiscarderProperty;
import jenkins.model.DirectlyModifiableTopLevelItemGroup;
@@ -98,6 +99,7 @@ import jenkins.model.RunIdMigrator;
import jenkins.model.lazy.LazyBuildMixIn;
import jenkins.scm.RunWithSCM;
import jenkins.security.HexStringConfidentialKey;
+import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.triggers.SCMTriggerItem;
import jenkins.widgets.HasWidgets;
import net.sf.json.JSONException;
@@ -122,7 +124,9 @@ import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.stapler.StaplerOverridable;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST;
@@ -854,9 +858,43 @@ public abstract class Job, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run> implements Reconfigurable
return Collections.emptyList();
}
+ /**
+ * @since TODO
+ */
+ @Override
+ public JobProperty> reconfigure(StaplerRequest2 req, JSONObject form) throws FormException {
+ if (Util.isOverridden(JobProperty.class, getClass(), "reconfigure", StaplerRequest.class, JSONObject.class)) {
+ return reconfigure(StaplerRequest.fromStaplerRequest2(req), form);
+ } else {
+ return reconfigureImpl(req, form);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #reconfigure(StaplerRequest2, JSONObject)}
+ */
+ @Deprecated
@Override
public JobProperty> reconfigure(StaplerRequest req, JSONObject form) throws FormException {
+ return reconfigureImpl(StaplerRequest.toStaplerRequest2(req), form);
+ }
+
+ private JobProperty> reconfigureImpl(StaplerRequest2 req, JSONObject form) throws FormException {
return form == null ? null : getDescriptor().newInstance(req, form);
}
diff --git a/core/src/main/java/hudson/model/JobPropertyDescriptor.java b/core/src/main/java/hudson/model/JobPropertyDescriptor.java
index 1f1c3aa7e6..eb9b990b70 100644
--- a/core/src/main/java/hudson/model/JobPropertyDescriptor.java
+++ b/core/src/main/java/hudson/model/JobPropertyDescriptor.java
@@ -24,6 +24,7 @@
package hudson.model;
+import hudson.Util;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
@@ -34,6 +35,7 @@ import jenkins.model.OptionalJobProperty;
import net.sf.json.JSONObject;
import org.jvnet.tiger_types.Types;
import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
/**
* {@link Descriptor} for {@link JobProperty}.
@@ -61,6 +63,23 @@ public abstract class JobPropertyDescriptor extends Descriptor> {
* null to avoid setting an instance of {@link JobProperty} to the target project (or just use {@link OptionalJobProperty})
*/
@Override
+ public JobProperty> newInstance(StaplerRequest2 req, JSONObject formData) throws FormException {
+ if (Util.isOverridden(JobPropertyDescriptor.class, getClass(), "newInstance", StaplerRequest.class, JSONObject.class)) {
+ return newInstance(req != null ? StaplerRequest.fromStaplerRequest2(req) : null, formData);
+ } else {
+ // JobPropertyDescriptors are bit different in that we allow them even without any user-visible configuration parameter,
+ // so replace the lack of form data by an empty one.
+ if (formData.isNullObject()) formData = new JSONObject();
+
+ return super.newInstance(req, formData);
+ }
+ }
+
+ /**
+ * @deprecated use {@link #newInstance(StaplerRequest2, JSONObject)}
+ */
+ @Deprecated
+ @Override
public JobProperty> newInstance(StaplerRequest req, JSONObject formData) throws FormException {
// JobPropertyDescriptors are bit different in that we allow them even without any user-visible configuration parameter,
// so replace the lack of form data by an empty one.
diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java
index 88661c6df6..53c51db9cc 100644
--- a/core/src/main/java/hudson/model/Label.java
+++ b/core/src/main/java/hudson/model/Label.java
@@ -71,8 +71,8 @@ import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.StaplerRequest2;
+import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@@ -548,7 +548,7 @@ public abstract class Label extends Actionable implements Comparable