[JENKINS-73278] Migrate core from EE 8 to EE 9 (#9672)

Co-authored-by: Kevin Guerroudj <91883215+Kevin-CB@users.noreply.github.com>
Co-authored-by: Daniel Beck <1831569+daniel-beck@users.noreply.github.com>
This commit is contained in:
Basil Crow 2024-09-03 14:59:04 -07:00 committed by GitHub
parent 4e9b6d8a3d
commit 7006cded64
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
341 changed files with 3998 additions and 1879 deletions

11
.github/renovate.json vendored
View File

@ -91,17 +91,6 @@
"org.jfree:jfreechart" "org.jfree:jfreechart"
] ]
}, },
{
"description": "Starting with 6.x, Spring requires Java 17 at a minimum.",
"matchManagers": [
"maven"
],
"allowedVersions": "<6.0.0",
"matchPackageNames": [
"org.springframework:spring-framework-bom",
"org.springframework.security:spring-security-bom"
]
},
{ {
"description": "Starting with 7.x, Guice switches from javax.* to jakarta.* bindings. See https://github.com/google/guice/wiki/Guice700", "description": "Starting with 7.x, Guice switches from javax.* to jakarta.* bindings. See https://github.com/google/guice/wiki/Guice700",
"matchManagers": [ "matchManagers": [

View File

@ -29,12 +29,9 @@
<file url="file://$PROJECT_DIR$/war/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/war/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/war/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/war/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/war/src/test/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/war/src/test/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty10/src/filter/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/websocket/jetty12-ee9/src/filter/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty10/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/websocket/jetty12-ee9/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty10/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/websocket/jetty12-ee9/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty12-ee8/src/filter/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty12-ee8/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty12-ee8/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/spi/src/filter/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/websocket/spi/src/filter/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/spi/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/websocket/spi/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/spi/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/websocket/spi/src/main/resources" charset="UTF-8" />

View File

@ -39,7 +39,7 @@ THE SOFTWARE.
<properties> <properties>
<commons-fileupload2.version>2.0.0-M2</commons-fileupload2.version> <commons-fileupload2.version>2.0.0-M2</commons-fileupload2.version>
<stapler.version>1896.v8170998149d0</stapler.version> <stapler.version>1903.v994a_db_314d58</stapler.version>
<groovy.version>2.4.21</groovy.version> <groovy.version>2.4.21</groovy.version>
</properties> </properties>
@ -62,15 +62,15 @@ THE SOFTWARE.
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId> <artifactId>spring-framework-bom</artifactId>
<version>5.3.39</version> <version>6.1.12</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency> <dependency>
<!-- https://docs.spring.io/spring-security/site/docs/5.5.4/reference/html5/#getting-maven-no-boot --> <!-- https://docs.spring.io/spring-security/reference/6.3/getting-spring-security.html#getting-maven-no-boot -->
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-bom</artifactId> <artifactId>spring-security-bom</artifactId>
<version>5.8.14</version> <version>6.3.3</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
@ -154,12 +154,12 @@ THE SOFTWARE.
<dependency> <dependency>
<groupId>jakarta.servlet</groupId> <groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId> <artifactId>jakarta.servlet-api</artifactId>
<version>4.0.4</version> <version>5.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId> <groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>1.2.7</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>jaxen</groupId> <groupId>jaxen</groupId>
@ -295,7 +295,7 @@ THE SOFTWARE.
<dependency> <dependency>
<groupId>org.jvnet.hudson</groupId> <groupId>org.jvnet.hudson</groupId>
<artifactId>commons-jelly-tags-define</artifactId> <artifactId>commons-jelly-tags-define</artifactId>
<version>1.1-jenkins-20240510</version> <version>1.1-jenkins-20240903</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jvnet.localizer</groupId> <groupId>org.jvnet.localizer</groupId>

View File

@ -217,6 +217,20 @@ THE SOFTWARE.
<!-- needed by Jelly --> <!-- needed by Jelly -->
<groupId>jakarta.servlet.jsp.jstl</groupId> <groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<exclusions>
<exclusion>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
</exclusion>
<exclusion>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>jaxen</groupId> <groupId>jaxen</groupId>
@ -288,7 +302,7 @@ THE SOFTWARE.
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-fileupload2-javax</artifactId> <artifactId>commons-fileupload2-jakarta-servlet5</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.codehaus.groovy</groupId> <groupId>org.codehaus.groovy</groupId>
@ -427,6 +441,10 @@ THE SOFTWARE.
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId> <artifactId>spring-security-web</artifactId>
<exclusions> <exclusions>
<exclusion>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
</exclusion>
<exclusion> <exclusion>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-jcl</artifactId> <artifactId>spring-jcl</artifactId>

View File

@ -145,7 +145,7 @@ public class DescriptorExtensionList<T extends Describable<T>, D extends Descrip
if (config.isNullObject()) if (config.isNullObject())
return null; // none was selected return null; // none was selected
int idx = config.getInt("value"); int idx = config.getInt("value");
return get(idx).newInstance(Stapler.getCurrentRequest(), config); return get(idx).newInstance(Stapler.getCurrentRequest2(), config);
} }
/** /**

View File

@ -12,7 +12,7 @@ import org.apache.commons.jelly.expression.ExpressionFactory;
import org.apache.commons.jelly.expression.ExpressionSupport; import org.apache.commons.jelly.expression.ExpressionSupport;
import org.apache.commons.jexl.JexlContext; import org.apache.commons.jexl.JexlContext;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
/** /**
@ -78,7 +78,7 @@ final class ExpressionFactory2 implements ExpressionFactory {
// let the security exception pass through // let the security exception pass through
throw e; throw e;
} catch (Exception e) { } catch (Exception e) {
StaplerRequest currentRequest = Stapler.getCurrentRequest(); StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
LOGGER.log(Level.WARNING, "Caught exception evaluating: " + expression + " in " + (currentRequest != null ? currentRequest.getOriginalRequestURI() : "?") + ". Reason: " + e, e); LOGGER.log(Level.WARNING, "Caught exception evaluating: " + expression + " in " + (currentRequest != null ? currentRequest.getOriginalRequestURI() : "?") + ". Reason: " + e, e);
return null; return null;
} finally { } finally {

View File

@ -3510,7 +3510,7 @@ public final class FilePath implements SerializableOnlyOverRemoting {
} }
private static void checkPermissionForValidate() { private static void checkPermissionForValidate() {
AccessControlled subject = Stapler.getCurrentRequest().findAncestorObject(AbstractProject.class); AccessControlled subject = Stapler.getCurrentRequest2().findAncestorObject(AbstractProject.class);
if (subject == null) if (subject == null)
Jenkins.get().checkPermission(Jenkins.MANAGE); Jenkins.get().checkPermission(Jenkins.MANAGE);
else else

View File

@ -95,6 +95,14 @@ import hudson.util.jna.GNUCLibrary;
import hudson.views.MyViewsTabBar; import hudson.views.MyViewsTabBar;
import hudson.views.ViewsTabBar; import hudson.views.ViewsTabBar;
import hudson.widgets.RenderOnDemandClosure; import hudson.widgets.RenderOnDemandClosure;
import io.jenkins.servlet.ServletExceptionWrapper;
import io.jenkins.servlet.http.CookieWrapper;
import io.jenkins.servlet.http.HttpServletRequestWrapper;
import io.jenkins.servlet.http.HttpServletResponseWrapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
@ -148,10 +156,6 @@ import java.util.logging.Logger;
import java.util.logging.SimpleFormatter; import java.util.logging.SimpleFormatter;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jenkins.console.ConsoleUrlProvider; import jenkins.console.ConsoleUrlProvider;
import jenkins.model.GlobalConfiguration; import jenkins.model.GlobalConfiguration;
import jenkins.model.GlobalConfigurationCategory; import jenkins.model.GlobalConfigurationCategory;
@ -176,7 +180,9 @@ import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.RawHtmlArgument; import org.kohsuke.stapler.RawHtmlArgument;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
/** /**
@ -276,8 +282,8 @@ public class Functions {
} }
public static void initPageVariables(JellyContext context) { public static void initPageVariables(JellyContext context) {
StaplerRequest currentRequest = Stapler.getCurrentRequest(); StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse()); currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse2());
String rootURL = currentRequest.getContextPath(); String rootURL = currentRequest.getContextPath();
Functions h = new Functions(); Functions h = new Functions();
@ -372,7 +378,10 @@ public class Functions {
return buf.toString(); return buf.toString();
} }
public static RunUrl decompose(StaplerRequest req) { /**
* @since TODO
*/
public static RunUrl decompose(StaplerRequest2 req) {
List<Ancestor> ancestors = req.getAncestors(); List<Ancestor> ancestors = req.getAncestors();
// find the first and last Run instances // find the first and last Run instances
@ -405,12 +414,20 @@ public class Functions {
return new RunUrl((Run) f.getObject(), head, base, rest); return new RunUrl((Run) f.getObject(), head, base, rest);
} }
/**
* @deprecated use {@link #decompose(StaplerRequest2)}
*/
@Deprecated
public static RunUrl decompose(StaplerRequest req) {
return decompose(StaplerRequest.toStaplerRequest2(req));
}
/** /**
* If we know the user's screen resolution, return it. Otherwise null. * If we know the user's screen resolution, return it. Otherwise null.
* @since 1.213 * @since 1.213
*/ */
public static Area getScreenResolution() { public static Area getScreenResolution() {
Cookie res = Functions.getCookie(Stapler.getCurrentRequest(), "screenResolution"); Cookie res = Functions.getCookie(Stapler.getCurrentRequest2(), "screenResolution");
if (res != null) if (res != null)
return Area.parse(res.getValue()); return Area.parse(res.getValue());
return null; return null;
@ -592,6 +609,9 @@ public class Functions {
return list; return list;
} }
/**
* @since TODO
*/
public static Cookie getCookie(HttpServletRequest req, String name) { public static Cookie getCookie(HttpServletRequest req, String name) {
Cookie[] cookies = req.getCookies(); Cookie[] cookies = req.getCookies();
if (cookies != null) { if (cookies != null) {
@ -604,12 +624,31 @@ public class Functions {
return null; return null;
} }
/**
* @deprecated use {@link #getCookie(HttpServletRequest, String)}
*/
@Deprecated
public static javax.servlet.http.Cookie getCookie(javax.servlet.http.HttpServletRequest req, String name) {
return CookieWrapper.fromJakartaServletHttpCookie(getCookie(HttpServletRequestWrapper.toJakartaHttpServletRequest(req), name));
}
/**
* @since TODO
*/
public static String getCookie(HttpServletRequest req, String name, String defaultValue) { public static String getCookie(HttpServletRequest req, String name, String defaultValue) {
Cookie c = getCookie(req, name); Cookie c = getCookie(req, name);
if (c == null || c.getValue() == null) return defaultValue; if (c == null || c.getValue() == null) return defaultValue;
return c.getValue(); return c.getValue();
} }
/**
* @deprecated use {@link #getCookie(HttpServletRequest, String, String)}
*/
@Deprecated
public static String getCookie(javax.servlet.http.HttpServletRequest req, String name, String defaultValue) {
return getCookie(HttpServletRequestWrapper.toJakartaHttpServletRequest(req), name, defaultValue);
}
private static final Pattern ICON_SIZE = Pattern.compile("\\d+x\\d+"); private static final Pattern ICON_SIZE = Pattern.compile("\\d+x\\d+");
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
@ -713,8 +752,10 @@ public class Functions {
* Finds the given object in the ancestor list and returns its URL. * Finds the given object in the ancestor list and returns its URL.
* This is used to determine the "current" URL assigned to the given object, * This is used to determine the "current" URL assigned to the given object,
* so that one can compute relative URLs from it. * so that one can compute relative URLs from it.
*
* @since TODO
*/ */
public static String getNearestAncestorUrl(StaplerRequest req, Object it) { public static String getNearestAncestorUrl(StaplerRequest2 req, Object it) {
List list = req.getAncestors(); List list = req.getAncestors();
for (int i = list.size() - 1; i >= 0; i--) { for (int i = list.size() - 1; i >= 0; i--) {
Ancestor anc = (Ancestor) list.get(i); Ancestor anc = (Ancestor) list.get(i);
@ -724,11 +765,19 @@ public class Functions {
return null; return null;
} }
/**
* @deprecated use {@link #getNearestAncestorUrl(StaplerRequest2, Object)}
*/
@Deprecated
public static String getNearestAncestorUrl(StaplerRequest req, Object it) {
return getNearestAncestorUrl(StaplerRequest.toStaplerRequest2(req), it);
}
/** /**
* Finds the inner-most {@link SearchableModelObject} in scope. * Finds the inner-most {@link SearchableModelObject} in scope.
*/ */
public static String getSearchURL() { public static String getSearchURL() {
List list = Stapler.getCurrentRequest().getAncestors(); List list = Stapler.getCurrentRequest2().getAncestors();
for (int i = list.size() - 1; i >= 0; i--) { for (int i = list.size() - 1; i >= 0; i--) {
Ancestor anc = (Ancestor) list.get(i); Ancestor anc = (Ancestor) list.get(i);
if (anc.getObject() instanceof SearchableModelObject) if (anc.getObject() instanceof SearchableModelObject)
@ -888,7 +937,7 @@ public class Functions {
if (object instanceof AccessControlled) if (object instanceof AccessControlled)
checkPermission((AccessControlled) object, permission); checkPermission((AccessControlled) object, permission);
else { else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors(); List<Ancestor> ancs = Stapler.getCurrentRequest2().getAncestors();
for (Ancestor anc : Iterators.reverse(ancs)) { for (Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject(); Object o = anc.getObject();
if (o instanceof AccessControlled) { if (o instanceof AccessControlled) {
@ -920,7 +969,7 @@ public class Functions {
if (object instanceof AccessControlled) if (object instanceof AccessControlled)
return ((AccessControlled) object).hasPermission(permission); return ((AccessControlled) object).hasPermission(permission);
else { else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors(); List<Ancestor> ancs = Stapler.getCurrentRequest2().getAncestors();
for (Ancestor anc : Iterators.reverse(ancs)) { for (Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject(); Object o = anc.getObject();
if (o instanceof AccessControlled) { if (o instanceof AccessControlled) {
@ -931,10 +980,13 @@ public class Functions {
} }
} }
public static void adminCheck(StaplerRequest req, StaplerResponse rsp, Object required, Permission permission) throws IOException, ServletException { /**
* @since TODO
*/
public static void adminCheck(StaplerRequest2 req, StaplerResponse2 rsp, Object required, Permission permission) throws IOException, ServletException {
// this is legacy --- all views should be eventually converted to // this is legacy --- all views should be eventually converted to
// the permission based model. // the permission based model.
if (required != null && !Hudson.adminCheck(req, rsp)) { if (required != null && !Hudson.adminCheck(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp))) {
// check failed. commit the FORBIDDEN response, then abort. // check failed. commit the FORBIDDEN response, then abort.
rsp.setStatus(HttpServletResponse.SC_FORBIDDEN); rsp.setStatus(HttpServletResponse.SC_FORBIDDEN);
rsp.getOutputStream().close(); rsp.getOutputStream().close();
@ -946,10 +998,24 @@ public class Functions {
checkPermission(permission); checkPermission(permission);
} }
/**
* @deprecated use {@link #adminCheck(StaplerRequest2, StaplerResponse2, Object, Permission)}
*/
@Deprecated
public static void adminCheck(StaplerRequest req, StaplerResponse rsp, Object required, Permission permission) throws IOException, javax.servlet.ServletException {
try {
adminCheck(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), required, permission);
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
/** /**
* Infers the hudson installation URL from the given request. * Infers the hudson installation URL from the given request.
*
* @since TODO
*/ */
public static String inferHudsonURL(StaplerRequest req) { public static String inferHudsonURL(StaplerRequest2 req) {
String rootUrl = Jenkins.get().getRootUrl(); String rootUrl = Jenkins.get().getRootUrl();
if (rootUrl != null) if (rootUrl != null)
// prefer the one explicitly configured, to work with load-balancer, frontend, etc. // prefer the one explicitly configured, to work with load-balancer, frontend, etc.
@ -963,6 +1029,14 @@ public class Functions {
return buf.toString(); return buf.toString();
} }
/**
* @deprecated use {@link #inferHudsonURL(StaplerRequest2)}
*/
@Deprecated
public static String inferHudsonURL(StaplerRequest req) {
return inferHudsonURL(StaplerRequest.toStaplerRequest2(req));
}
/** /**
* Returns the link to be displayed in the footer of the UI. * Returns the link to be displayed in the footer of the UI.
*/ */
@ -1226,7 +1300,7 @@ public class Functions {
if (object instanceof AccessControlled) if (object instanceof AccessControlled)
return hasAnyPermission((AccessControlled) object, permissions); return hasAnyPermission((AccessControlled) object, permissions);
else { else {
AccessControlled ac = Stapler.getCurrentRequest().findAncestorObject(AccessControlled.class); AccessControlled ac = Stapler.getCurrentRequest2().findAncestorObject(AccessControlled.class);
if (ac != null) { if (ac != null) {
return hasAnyPermission(ac, permissions); return hasAnyPermission(ac, permissions);
} }
@ -1264,7 +1338,7 @@ public class Functions {
if (object instanceof AccessControlled) if (object instanceof AccessControlled)
checkAnyPermission((AccessControlled) object, permissions); checkAnyPermission((AccessControlled) object, permissions);
else { else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors(); List<Ancestor> ancs = Stapler.getCurrentRequest2().getAncestors();
for (Ancestor anc : Iterators.reverse(ancs)) { for (Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject(); Object o = anc.getObject();
if (o instanceof AccessControlled) { if (o instanceof AccessControlled) {
@ -1335,7 +1409,7 @@ public class Functions {
Map<Object, String> ancestors = new HashMap<>(); Map<Object, String> ancestors = new HashMap<>();
View view = null; View view = null;
StaplerRequest request = Stapler.getCurrentRequest(); StaplerRequest2 request = Stapler.getCurrentRequest2();
for (Ancestor a : request.getAncestors()) { for (Ancestor a : request.getAncestors()) {
ancestors.put(a.getObject(), a.getRelativePath()); ancestors.put(a.getObject(), a.getRelativePath());
if (a.getObject() instanceof View) if (a.getObject() instanceof View)
@ -1681,7 +1755,7 @@ public class Functions {
if (it instanceof Descriptor) if (it instanceof Descriptor)
clazz = ((Descriptor) it).clazz; clazz = ((Descriptor) it).clazz;
String buf = Stapler.getCurrentRequest().getContextPath() + Jenkins.VIEW_RESOURCE_PATH + '/' + String buf = Stapler.getCurrentRequest2().getContextPath() + Jenkins.VIEW_RESOURCE_PATH + '/' +
clazz.getName().replace('.', '/').replace('$', '/') + clazz.getName().replace('.', '/').replace('$', '/') +
'/' + path; '/' + path;
return buf; return buf;
@ -1689,7 +1763,7 @@ public class Functions {
public static boolean hasView(Object it, String path) throws IOException { public static boolean hasView(Object it, String path) throws IOException {
if (it == null) return false; if (it == null) return false;
return Stapler.getCurrentRequest().getView(it, path) != null; return Stapler.getCurrentRequest2().getView(it, path) != null;
} }
/** /**
@ -1900,10 +1974,10 @@ public class Functions {
return null; return null;
} }
if (urlName.startsWith("/")) if (urlName.startsWith("/"))
return joinPath(Stapler.getCurrentRequest().getContextPath(), urlName); return joinPath(Stapler.getCurrentRequest2().getContextPath(), urlName);
else else
// relative URL name // relative URL name
return joinPath(Stapler.getCurrentRequest().getContextPath() + '/' + itUrl, urlName); return joinPath(Stapler.getCurrentRequest2().getContextPath() + '/' + itUrl, urlName);
} }
/** /**
@ -1966,7 +2040,7 @@ public class Functions {
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
// fall back to HTTP request // fall back to HTTP request
} }
return Stapler.getCurrentRequest().getServerName(); return Stapler.getCurrentRequest2().getServerName();
} }
/** /**
@ -2004,7 +2078,7 @@ public class Functions {
* Used in {@code task.jelly} to decide if the page should be highlighted. * Used in {@code task.jelly} to decide if the page should be highlighted.
*/ */
public boolean hyperlinkMatchesCurrentPage(String href) { public boolean hyperlinkMatchesCurrentPage(String href) {
String url = Stapler.getCurrentRequest().getRequestURL().toString(); String url = Stapler.getCurrentRequest2().getRequestURL().toString();
if (href == null || href.length() <= 1) return ".".equals(href) && url.endsWith("/"); if (href == null || href.length() <= 1) return ".".equals(href) && url.endsWith("/");
url = URLDecoder.decode(url, StandardCharsets.UTF_8); url = URLDecoder.decode(url, StandardCharsets.UTF_8);
href = URLDecoder.decode(href, StandardCharsets.UTF_8); href = URLDecoder.decode(href, StandardCharsets.UTF_8);
@ -2063,12 +2137,23 @@ public class Functions {
return CrumbIssuer.all(); return CrumbIssuer.all();
} }
public static String getCrumb(StaplerRequest req) { /**
* @since TODO
*/
public static String getCrumb(StaplerRequest2 req) {
Jenkins h = Jenkins.getInstanceOrNull(); Jenkins h = Jenkins.getInstanceOrNull();
CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null; CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null;
return issuer != null ? issuer.getCrumb(req) : ""; return issuer != null ? issuer.getCrumb(req) : "";
} }
/**
* @deprecated use {@link #getCrumb(StaplerRequest2)}
*/
@Deprecated
public static String getCrumb(StaplerRequest req) {
return getCrumb(req != null ? StaplerRequest.toStaplerRequest2(req) : null);
}
public static String getCrumbRequestField() { public static String getCrumbRequestField() {
Jenkins h = Jenkins.getInstanceOrNull(); Jenkins h = Jenkins.getInstanceOrNull();
CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null; CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null;
@ -2081,7 +2166,7 @@ public class Functions {
public static Locale getCurrentLocale() { public static Locale getCurrentLocale() {
Locale locale = null; Locale locale = null;
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req != null) if (req != null)
locale = req.getLocale(); locale = req.getLocale();
if (locale == null) if (locale == null)
@ -2094,7 +2179,7 @@ public class Functions {
* from {@link ConsoleAnnotatorFactory}s and {@link ConsoleAnnotationDescriptor}s. * from {@link ConsoleAnnotatorFactory}s and {@link ConsoleAnnotationDescriptor}s.
*/ */
public static String generateConsoleAnnotationScriptAndStylesheet() { public static String generateConsoleAnnotationScriptAndStylesheet() {
String cp = Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH; String cp = Stapler.getCurrentRequest2().getContextPath() + Jenkins.RESOURCE_PATH;
StringBuilder buf = new StringBuilder(); StringBuilder buf = new StringBuilder();
for (ConsoleAnnotatorFactory f : ConsoleAnnotatorFactory.all()) { for (ConsoleAnnotatorFactory f : ConsoleAnnotatorFactory.all()) {
String path = cp + "/extensionList/" + ConsoleAnnotatorFactory.class.getName() + "/" + f.getClass().getName(); String path = cp + "/extensionList/" + ConsoleAnnotatorFactory.class.getName() + "/" + f.getClass().getName();
@ -2147,7 +2232,7 @@ public class Functions {
} }
/* Mask from Extended Read */ /* Mask from Extended Read */
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
if (o instanceof Secret || Secret.BLANK_NONSECRET_PASSWORD_FIELDS_WITHOUT_ITEM_CONFIGURE) { if (o instanceof Secret || Secret.BLANK_NONSECRET_PASSWORD_FIELDS_WITHOUT_ITEM_CONFIGURE) {
if (req != null) { if (req != null) {
Item item = req.findAncestorObject(Item.class); Item item = req.findAncestorObject(Item.class);
@ -2243,15 +2328,17 @@ public class Functions {
@Deprecated @Deprecated
public static String createRenderOnDemandProxy(JellyContext context, String attributesToCapture) { public static String createRenderOnDemandProxy(JellyContext context, String attributesToCapture) {
return Stapler.getCurrentRequest().createJavaScriptProxy(new RenderOnDemandClosure(context, attributesToCapture)); return Stapler.getCurrentRequest2().createJavaScriptProxy(new RenderOnDemandClosure(context, attributesToCapture));
} }
/** /**
* Called from renderOnDemand.jelly to generate the parameters for the proxy object generation. * Called from renderOnDemand.jelly to generate the parameters for the proxy object generation.
*
* @since TODO
*/ */
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
public static StaplerRequest.RenderOnDemandParameters createRenderOnDemandProxyParameters(JellyContext context, String attributesToCapture) { public static StaplerRequest2.RenderOnDemandParameters createRenderOnDemandProxyParameters(JellyContext context, String attributesToCapture) {
return Stapler.getCurrentRequest().createJavaScriptProxyParameters(new RenderOnDemandClosure(context, attributesToCapture)); return Stapler.getCurrentRequest2().createJavaScriptProxyParameters(new RenderOnDemandClosure(context, attributesToCapture));
} }
public static String getCurrentDescriptorByNameUrl() { public static String getCurrentDescriptorByNameUrl() {
@ -2260,18 +2347,18 @@ public class Functions {
public static String setCurrentDescriptorByNameUrl(String value) { public static String setCurrentDescriptorByNameUrl(String value) {
String o = getCurrentDescriptorByNameUrl(); String o = getCurrentDescriptorByNameUrl();
Stapler.getCurrentRequest().setAttribute("currentDescriptorByNameUrl", value); Stapler.getCurrentRequest2().setAttribute("currentDescriptorByNameUrl", value);
return o; return o;
} }
public static void restoreCurrentDescriptorByNameUrl(String old) { public static void restoreCurrentDescriptorByNameUrl(String old) {
Stapler.getCurrentRequest().setAttribute("currentDescriptorByNameUrl", old); Stapler.getCurrentRequest2().setAttribute("currentDescriptorByNameUrl", old);
} }
public static List<String> getRequestHeaders(String name) { public static List<String> getRequestHeaders(String name) {
List<String> r = new ArrayList<>(); List<String> r = new ArrayList<>();
Enumeration e = Stapler.getCurrentRequest().getHeaders(name); Enumeration e = Stapler.getCurrentRequest2().getHeaders(name);
while (e.hasMoreElements()) { while (e.hasMoreElements()) {
r.add(e.nextElement().toString()); r.add(e.nextElement().toString());
} }
@ -2366,6 +2453,7 @@ public class Functions {
* Advertises the minimum set of HTTP headers that assist programmatic * Advertises the minimum set of HTTP headers that assist programmatic
* discovery of Jenkins. * discovery of Jenkins.
*/ */
@SuppressFBWarnings(value = "UC_USELESS_VOID_METHOD", justification = "TODO needs triage")
public static void advertiseHeaders(HttpServletResponse rsp) { public static void advertiseHeaders(HttpServletResponse rsp) {
Jenkins j = Jenkins.getInstanceOrNull(); Jenkins j = Jenkins.getInstanceOrNull();
if (j != null) { 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 @Restricted(NoExternalUse.class) // for actions.jelly and ContextMenu.add
public static boolean isContextMenuVisible(Action a) { public static boolean isContextMenuVisible(Action a) {
if (a instanceof ModelObjectWithContextMenu.ContextMenuVisibility) { if (a instanceof ModelObjectWithContextMenu.ContextMenuVisibility) {
@ -2449,7 +2545,7 @@ public class Functions {
return iconGuess; return iconGuess;
} }
StaplerRequest currentRequest = Stapler.getCurrentRequest(); StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
String rootURL = currentRequest.getContextPath(); String rootURL = currentRequest.getContextPath();
Icon iconMetadata = tryGetIcon(iconGuess); Icon iconMetadata = tryGetIcon(iconGuess);

View File

@ -26,11 +26,12 @@ package hudson;
import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import io.jenkins.servlet.ServletContextWrapper;
import jakarta.servlet.ServletContext;
import java.io.File; import java.io.File;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletContext;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
@ -49,12 +50,20 @@ public class LocalPluginManager extends PluginManager {
super(context, new File(rootDir, "plugins")); 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 * Creates a new LocalPluginManager
* @param jenkins Jenkins instance that will use the plugin manager. * @param jenkins Jenkins instance that will use the plugin manager.
*/ */
public LocalPluginManager(@NonNull Jenkins jenkins) { 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. * @param rootDir Jenkins home directory.
*/ */
public LocalPluginManager(@NonNull File rootDir) { public LocalPluginManager(@NonNull File rootDir) {
this(null, rootDir); this((ServletContext) null, rootDir);
} }
@Override @Override

View File

@ -33,25 +33,29 @@ import hudson.model.Descriptor.FormException;
import hudson.model.Saveable; import hudson.model.Saveable;
import hudson.model.listeners.ItemListener; import hudson.model.listeners.ItemListener;
import hudson.model.listeners.SaveableListener; 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.File;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Logger; 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.GlobalConfiguration;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.Loadable; import jenkins.model.Loadable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/** /**
* Base class of Hudson plugin. * 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: * You do not need to create custom subtypes:
* <ul> * <ul>
* <li>{@code config.jelly}, {@link #configure(StaplerRequest, JSONObject)}, {@link #load}, and {@link #save} * <li>{@code config.jelly}, {@link #configure(StaplerRequest2, JSONObject)}, {@link #load}, and {@link #save}
* can be replaced by {@link GlobalConfiguration} * can be replaced by {@link GlobalConfiguration}
* <li>{@link #start} and {@link #postInitialize} can be replaced by {@link Initializer} (or {@link ItemListener#onLoaded}) * <li>{@link #start} and {@link #postInitialize} can be replaced by {@link Initializer} (or {@link ItemListener#onLoaded})
* <li>{@link #stop} can be replaced by {@link Terminator} * <li>{@link #stop} can be replaced by {@link Terminator}
* <li>{@link #setServletContext} can be replaced by {@link Jenkins#servletContext} * <li>{@link #setServletContext} can be replaced by {@link Jenkins#getServletContext}
* </ul> * </ul>
* Note that every plugin gets a {@link DummyImpl} by default, * Note that every plugin gets a {@link DummyImpl} by default,
* which will still route the URL space, serve {@link #getWrapper}, and so on. * 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 * @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 @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 {
* <p> * <p>
* If you are using this method, you'll likely be interested in * If you are using this method, you'll likely be interested in
* using {@link #save()} and {@link #load()}. * 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 * @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); configure(formData);
} }
/** /**
* This method serves static resources in the plugin under {@code hudson/plugin/SHORTNAME}. * 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 path = req.getRestOfPath();
String pathUC = path.toUpperCase(Locale.ENGLISH); String pathUC = path.toUpperCase(Locale.ENGLISH);

View File

@ -66,6 +66,10 @@ import hudson.util.Retrier;
import hudson.util.Service; import hudson.util.Service;
import hudson.util.VersionNumber; import hudson.util.VersionNumber;
import hudson.util.XStream2; 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.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
@ -118,8 +122,6 @@ import java.util.jar.Manifest;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.xml.XMLConstants; import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParserFactory;
@ -134,6 +136,7 @@ import jenkins.install.InstallUtil;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.plugins.DetachedPluginsUtil; import jenkins.plugins.DetachedPluginsUtil;
import jenkins.security.CustomClassFilter; import jenkins.security.CustomClassFilter;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import jenkins.util.io.OnMaster; import jenkins.util.io.OnMaster;
import jenkins.util.xml.RestrictiveEntityResolver; 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.DiskFileItemFactory;
import org.apache.commons.fileupload2.core.FileItem; import org.apache.commons.fileupload2.core.FileItem;
import org.apache.commons.fileupload2.core.FileUploadException; import org.apache.commons.fileupload2.core.FileUploadException;
import org.apache.commons.fileupload2.javax.JavaxServletDiskFileUpload; import org.apache.commons.fileupload2.jakarta.servlet5.JakartaServletDiskFileUpload;
import org.apache.commons.fileupload2.javax.JavaxServletFileUpload; import org.apache.commons.fileupload2.jakarta.servlet5.JakartaServletFileUpload;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@ -165,7 +168,8 @@ import org.kohsuke.stapler.StaplerFallback;
import org.kohsuke.stapler.StaplerOverridable; import org.kohsuke.stapler.StaplerOverridable;
import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest; 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.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST; 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); 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 { SC_FILE {
@Override @Override
@NonNull PluginManager doCreate(@NonNull Class<? extends PluginManager> klass, @NonNull PluginManager doCreate(@NonNull Class<? extends PluginManager> klass,
@NonNull Jenkins jenkins) throws ReflectiveOperationException { @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 { FILE {
@ -363,6 +378,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
*/ */
private final PluginStrategy strategy; private final PluginStrategy strategy;
/**
* @since TODO
*/
protected PluginManager(ServletContext context, File rootDir) { protected PluginManager(ServletContext context, File rootDir) {
this.context = context; this.context = context;
@ -378,6 +396,14 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
strategy = createPluginStrategy(); 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() { public Api getApi() {
Jenkins.get().checkPermission(Jenkins.SYSTEM_READ); Jenkins.get().checkPermission(Jenkins.SYSTEM_READ);
return new Api(this); return new Api(this);
@ -655,7 +681,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
protected @NonNull Set<String> loadPluginsFromWar(@NonNull String fromPath, @CheckForNull FilenameFilter filter) { protected @NonNull Set<String> loadPluginsFromWar(@NonNull String fromPath, @CheckForNull FilenameFilter filter) {
Set<String> names = new HashSet<>(); Set<String> names = new HashSet<>();
ServletContext context = Jenkins.get().servletContext; ServletContext context = Jenkins.get().getServletContext();
Set<String> plugins = Util.fixNull(context.getResourcePaths(fromPath)); Set<String> plugins = Util.fixNull(context.getResourcePaths(fromPath));
Set<URL> copiedPlugins = new HashSet<>(); Set<URL> copiedPlugins = new HashSet<>();
Set<URL> dependencies = new HashSet<>(); Set<URL> dependencies = new HashSet<>();
@ -723,7 +749,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
String dependencySpec = manifest.getMainAttributes().getValue("Plugin-Dependencies"); String dependencySpec = manifest.getMainAttributes().getValue("Plugin-Dependencies");
if (dependencySpec != null) { if (dependencySpec != null) {
String[] dependencyTokens = dependencySpec.split(","); String[] dependencyTokens = dependencySpec.split(",");
ServletContext context = Jenkins.get().servletContext; ServletContext context = Jenkins.get().getServletContext();
for (String dependencyToken : dependencyTokens) { for (String dependencyToken : dependencyTokens) {
if (dependencyToken.endsWith(";resolution:=optional")) { if (dependencyToken.endsWith(";resolution:=optional")) {
@ -1597,7 +1623,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
} }
@RequirePOST @RequirePOST
public HttpResponse doUpdateSources(StaplerRequest req) throws IOException { public HttpResponse doUpdateSources(StaplerRequest2 req) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (req.hasParameter("remove")) { if (req.hasParameter("remove")) {
@ -1632,7 +1658,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* Performs the installation of the plugins. * Performs the installation of the plugins.
*/ */
@RequirePOST @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); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
Set<String> plugins = new LinkedHashSet<>(); Set<String> plugins = new LinkedHashSet<>();
@ -1656,12 +1682,12 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @param req The request object. * @param req The request object.
* @return A JSON response that includes a "correlationId" in the "data" element. * @return A JSON response that includes a "correlationId" in the "data" element.
* That "correlationId" can then be used in calls to * 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. * @throws IOException Error reading JSON payload fro request.
*/ */
@RequirePOST @RequirePOST
@Restricted(DoNotUse.class) // WebOnly @Restricted(DoNotUse.class) // WebOnly
public HttpResponse doInstallPlugins(StaplerRequest req) throws IOException { public HttpResponse doInstallPlugins(StaplerRequest2 req) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
String payload = IOUtils.toString(req.getInputStream(), req.getCharacterEncoding()); String payload = IOUtils.toString(req.getInputStream(), req.getCharacterEncoding());
JSONObject request = JSONObject.fromObject(payload); JSONObject request = JSONObject.fromObject(payload);
@ -1815,7 +1841,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
} }
@POST @POST
public HttpResponse doProxyConfigure(StaplerRequest req) throws IOException, ServletException { public HttpResponse doProxyConfigure(StaplerRequest2 req) throws IOException, ServletException {
Jenkins jenkins = Jenkins.get(); Jenkins jenkins = Jenkins.get();
jenkins.checkPermission(Jenkins.ADMINISTER); jenkins.checkPermission(Jenkins.ADMINISTER);
@ -1880,14 +1906,39 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* Uploads a plugin. * Uploads a plugin.
*/ */
@RequirePOST @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 { try {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
String fileName = ""; String fileName = "";
PluginCopier copier; PluginCopier copier;
File tmpDir = Files.createTempDirectory("uploadDir").toFile(); File tmpDir = Files.createTempDirectory("uploadDir").toFile();
JavaxServletFileUpload<DiskFileItem, DiskFileItemFactory> upload = new JavaxServletDiskFileUpload(DiskFileItemFactory.builder().setFile(tmpDir).get()); JakartaServletFileUpload<DiskFileItem, DiskFileItemFactory> upload = new JakartaServletDiskFileUpload(DiskFileItemFactory.builder().setFile(tmpDir).get());
List<DiskFileItem> items = upload.parseRequest(req); List<DiskFileItem> items = upload.parseRequest(req);
String string = items.get(1).getString(); String string = items.get(1).getString();
if (string != null && !string.isBlank()) { if (string != null && !string.isBlank()) {
@ -1965,7 +2016,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
} }
@Restricted(NoExternalUse.class) @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()) { if (value != null && !value.isBlank()) {
try { try {
URL url = new URL(value); URL url = new URL(value);
@ -1984,7 +2035,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
} }
@Restricted(NoExternalUse.class) @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); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
return checkUpdateSiteURL(value); 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. * or if some plugins need updates or installation.
* *
* This method runs without side-effect. I'm still requiring the ADMINISTER permission since * 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 * @since 1.483
*/ */
@RequirePOST @RequirePOST
public JSONArray doPrevalidateConfig(StaplerRequest req) throws IOException { public JSONArray doPrevalidateConfig(StaplerRequest2 req) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
JSONArray response = new JSONArray(); JSONArray response = new JSONArray();
@ -2252,7 +2303,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* @since 1.483 * @since 1.483
*/ */
@RequirePOST @RequirePOST
public HttpResponse doInstallNecessaryPlugins(StaplerRequest req) throws IOException { public HttpResponse doInstallNecessaryPlugins(StaplerRequest2 req) throws IOException {
prevalidateConfig(req.getInputStream()); prevalidateConfig(req.getInputStream());
return HttpResponses.redirectViaContextPath("pluginManager/updates/"); return HttpResponses.redirectViaContextPath("pluginManager/updates/");
} }

View File

@ -80,8 +80,8 @@ import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses; 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.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
@ -1212,7 +1212,7 @@ public class PluginWrapper implements Comparable<PluginWrapper>, ModelObject {
/** /**
* Depending on whether the user said "dismiss" or "correct", send him to the right place. * 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")) { if (req.hasParameter("correct")) {
rsp.sendRedirect(req.getContextPath() + "/pluginManager"); rsp.sendRedirect(req.getContextPath() + "/pluginManager");

View File

@ -32,7 +32,7 @@ import jenkins.model.Jenkins;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
@Extension @Restricted(NoExternalUse.class) @Extension @Restricted(NoExternalUse.class)
public class ProxyConfigurationManager extends GlobalConfiguration { public class ProxyConfigurationManager extends GlobalConfiguration {
@ -48,7 +48,7 @@ public class ProxyConfigurationManager extends GlobalConfiguration {
} }
@Override @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); ProxyConfiguration pc = req.bindJSON(ProxyConfiguration.class, json);
try { try {
saveProxyConfiguration(pc); saveProxyConfiguration(pc);

View File

@ -24,15 +24,15 @@
package hudson; 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.io.IOException;
import java.util.Enumeration; import java.util.Enumeration;
import javax.servlet.Filter; import org.kohsuke.stapler.CompatibleFilter;
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;
/** /**
* This filter allows you to modify headers set by the container or other servlets * 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 * @author Mike Wille
*/ */
public class ResponseHeaderFilter implements Filter { public class ResponseHeaderFilter implements CompatibleFilter {
private FilterConfig config; private FilterConfig config;
@Override @Override

View File

@ -125,6 +125,7 @@ import org.apache.tools.ant.types.FileSet;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/** /**
* Various utility methods that don't have more proper home. * 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. * Find the specific ancestor, or throw an exception.
* Useful for an ancestor we know is inside the URL to ease readability * Useful for an ancestor we know is inside the URL to ease readability
*
* @since TODO
*/ */
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
public static @NonNull <T> T getNearestAncestorOfTypeOrThrow(@NonNull StaplerRequest request, @NonNull Class<T> clazz) { public static @NonNull <T> T getNearestAncestorOfTypeOrThrow(@NonNull StaplerRequest2 request, @NonNull Class<T> clazz) {
T t = request.findAncestorObject(clazz); T t = request.findAncestorObject(clazz);
if (t == null) { if (t == null) {
throw new IllegalArgumentException("No ancestor of type " + clazz.getName() + " in the request"); throw new IllegalArgumentException("No ancestor of type " + clazz.getName() + " in the request");
@ -1860,6 +1863,15 @@ public class Util {
return t; return t;
} }
/**
* @deprecated use {@link #getNearestAncestorOfTypeOrThrow(StaplerRequest2, Class)}
*/
@Deprecated
@Restricted(NoExternalUse.class)
public static @NonNull <T> T getNearestAncestorOfTypeOrThrow(@NonNull StaplerRequest request, @NonNull Class<T> clazz) {
return getNearestAncestorOfTypeOrThrow(StaplerRequest.toStaplerRequest2(request), clazz);
}
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
public static void printRedirect(String contextPath, String redirectUrl, String message, PrintWriter out) { public static void printRedirect(String contextPath, String redirectUrl, String message, PrintWriter out) {
out.printf( out.printf(

View File

@ -45,6 +45,12 @@ import hudson.util.InsufficientPermissionDetected;
import hudson.util.NoHomeDir; import hudson.util.NoHomeDir;
import hudson.util.NoTempDir; import hudson.util.NoTempDir;
import hudson.util.RingBufferLogHandler; 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.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
@ -65,11 +71,6 @@ import java.util.logging.Handler;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.LogRecord; import java.util.logging.LogRecord;
import java.util.logging.Logger; 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.model.Jenkins;
import jenkins.util.JenkinsJVM; import jenkins.util.JenkinsJVM;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
@ -320,10 +321,21 @@ public class WebAppMain implements ServletContextListener {
} }
} }
/**
* @since TODO
*/
public static void installExpressionFactory(ServletContextEvent event) { public static void installExpressionFactory(ServletContextEvent event) {
JellyFacet.setExpressionFactory(event, new ExpressionFactory2()); 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. * Installs log handler to monitor all Hudson logs.
*/ */

View File

@ -26,6 +26,8 @@ package hudson.cli;
import hudson.Extension; import hudson.Extension;
import hudson.model.UnprotectedRootAction; import hudson.model.UnprotectedRootAction;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.IOException; import java.io.IOException;
@ -45,8 +47,6 @@ import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.util.FullDuplexHttpService; import jenkins.util.FullDuplexHttpService;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
@ -59,8 +59,8 @@ import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy; 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.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
/** /**
@ -97,7 +97,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
return "cli"; 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(); final Jenkins jenkins = Jenkins.get();
jenkins.checkPermission(Jenkins.READ); jenkins.checkPermission(Jenkins.READ);
@ -121,7 +121,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
/** /**
* WebSocket endpoint. * WebSocket endpoint.
*/ */
public HttpResponse doWs(StaplerRequest req) { public HttpResponse doWs(StaplerRequest2 req) {
if (!WebSockets.isSupported()) { if (!WebSockets.isSupported()) {
return HttpResponses.notFound(); return HttpResponses.notFound();
} }
@ -216,7 +216,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
@Override @Override
public Object getTarget() { public Object getTarget() {
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req.getRestOfPath().isEmpty() && "POST".equals(req.getMethod())) { if (req.getRestOfPath().isEmpty() && "POST".equals(req.getMethod())) {
// CLI connection request // CLI connection request
if ("false".equals(req.getParameter("remoting"))) { if ("false".equals(req.getParameter("remoting"))) {
@ -349,7 +349,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
} }
@Override @Override
protected FullDuplexHttpService createService(StaplerRequest req, UUID uuid) throws IOException { protected FullDuplexHttpService createService(StaplerRequest2 req, UUID uuid) throws IOException {
return new FullDuplexHttpService(uuid) { return new FullDuplexHttpService(uuid) {
@Override @Override
protected void run(InputStream upload, OutputStream download) throws IOException, InterruptedException { protected void run(InputStream upload, OutputStream download) throws IOException, InterruptedException {

View File

@ -26,11 +26,11 @@ package hudson.cli;
import hudson.Extension; import hudson.Extension;
import hudson.security.csrf.CrumbExclusion; 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 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.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.DoNotUse;

View File

@ -50,7 +50,7 @@ public class ReloadConfigurationCommand extends CLICommand {
// Or perhaps simpler to inline the thread body of doReload? // Or perhaps simpler to inline the thread body of doReload?
j.doReload(); j.doReload();
Object app; Object app;
while ((app = WebApp.get(j.servletContext).getApp()) instanceof HudsonIsLoading) { while ((app = WebApp.get(j.getServletContext()).getApp()) instanceof HudsonIsLoading) {
Thread.sleep(100); Thread.sleep(100);
} }
if (app instanceof Jenkins) { if (app instanceof Jenkins) {

View File

@ -26,8 +26,8 @@ package hudson.cli;
import hudson.Extension; import hudson.Extension;
import hudson.model.Node; import hudson.model.Node;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Argument;
/** /**

View File

@ -30,6 +30,7 @@ import static java.lang.Math.abs;
import edu.umd.cs.findbugs.annotations.CheckReturnValue; import edu.umd.cs.findbugs.annotations.CheckReturnValue;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Util;
import hudson.remoting.ObjectInputStreamEx; import hudson.remoting.ObjectInputStreamEx;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@ -50,10 +51,13 @@ import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream; import javax.crypto.CipherOutputStream;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.security.CryptoConfidentialKey; import jenkins.security.CryptoConfidentialKey;
import jenkins.security.stapler.StaplerNotDispatchable;
import org.jenkinsci.remoting.util.AnonymousClassWarnings; import org.jenkinsci.remoting.util.AnonymousClassWarnings;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.framework.io.ByteBuffer; import org.kohsuke.stapler.framework.io.ByteBuffer;
import org.kohsuke.stapler.framework.io.LargeText; import org.kohsuke.stapler.framework.io.LargeText;
@ -90,14 +94,44 @@ public class AnnotatedLargeText<T> extends LargeText {
this.context = context; 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 { 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); req.setAttribute("html", true);
doProgressText(req, rsp); doProgressText(req, rsp);
} }
/** /**
* Aliasing what I think was a wrong name in {@link LargeText} * 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 { public void doProgressiveText(StaplerRequest req, StaplerResponse rsp) throws IOException {
doProgressText(req, rsp); doProgressText(req, rsp);
} }
@ -107,16 +141,35 @@ public class AnnotatedLargeText<T> extends LargeText {
* and use this request attribute to differentiate. * and use this request attribute to differentiate.
*/ */
private boolean isHtml() { private boolean isHtml() {
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
return req != null && req.getAttribute("html") != null; return req != null && req.getAttribute("html") != null;
} }
/**
* @since TODO
*/
@Override @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) { 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"); rsp.setContentType(isHtml() ? "text/html;charset=UTF-8" : "text/plain;charset=UTF-8");
} }
private ConsoleAnnotator<T> createAnnotator(StaplerRequest req) throws IOException { private ConsoleAnnotator<T> createAnnotator(StaplerRequest2 req) throws IOException {
try { try {
String base64 = req != null ? req.getHeader("X-ConsoleAnnotator") : null; String base64 = req != null ? req.getHeader("X-ConsoleAnnotator") : null;
if (base64 != null) { if (base64 != null) {
@ -176,7 +229,7 @@ public class AnnotatedLargeText<T> extends LargeText {
@CheckReturnValue @CheckReturnValue
public long writeHtmlTo(long start, Writer w) throws IOException { public long writeHtmlTo(long start, Writer w) throws IOException {
ConsoleAnnotationOutputStream<T> caw = new ConsoleAnnotationOutputStream<>( ConsoleAnnotationOutputStream<T> caw = new ConsoleAnnotationOutputStream<>(
w, createAnnotator(Stapler.getCurrentRequest()), context, charset); w, createAnnotator(Stapler.getCurrentRequest2()), context, charset);
long r = super.writeLogTo(start, caw); long r = super.writeLogTo(start, caw);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -185,7 +238,7 @@ public class AnnotatedLargeText<T> extends LargeText {
oos.writeLong(System.currentTimeMillis()); // send timestamp to prevent a replay attack oos.writeLong(System.currentTimeMillis()); // send timestamp to prevent a replay attack
oos.writeObject(caw.getConsoleAnnotator()); oos.writeObject(caw.getConsoleAnnotator());
oos.close(); oos.close();
StaplerResponse rsp = Stapler.getCurrentResponse(); StaplerResponse2 rsp = Stapler.getCurrentResponse2();
if (rsp != null) if (rsp != null)
rsp.setHeader("X-ConsoleAnnotator", Base64.getEncoder().encodeToString(baos.toByteArray())); rsp.setHeader("X-ConsoleAnnotator", Base64.getEncoder().encodeToString(baos.toByteArray()));
return r; return r;

View File

@ -28,13 +28,13 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.DescriptorExtensionList; import hudson.DescriptorExtensionList;
import hudson.ExtensionPoint; import hudson.ExtensionPoint;
import hudson.model.Descriptor; import hudson.model.Descriptor;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
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.WebMethod;
/** /**
@ -81,12 +81,12 @@ public abstract class ConsoleAnnotationDescriptor extends Descriptor<ConsoleNote
} }
@WebMethod(name = "script.js") @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, hasResource("/script.js"), TimeUnit.DAYS.toMillis(1)); rsp.serveFile(req, hasResource("/script.js"), TimeUnit.DAYS.toMillis(1));
} }
@WebMethod(name = "style.css") @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, hasResource("/style.css"), TimeUnit.DAYS.toMillis(1)); rsp.serveFile(req, hasResource("/style.css"), TimeUnit.DAYS.toMillis(1));
} }

View File

@ -28,15 +28,15 @@ import hudson.Extension;
import hudson.ExtensionList; import hudson.ExtensionList;
import hudson.ExtensionPoint; import hudson.ExtensionPoint;
import hudson.model.Run; import hudson.model.Run;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.net.URL; import java.net.URL;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import org.jvnet.tiger_types.Types; import org.jvnet.tiger_types.Types;
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.WebMethod;
/** /**
@ -113,12 +113,12 @@ public abstract class ConsoleAnnotatorFactory<T> implements ExtensionPoint {
* Serves the JavaScript file associated with this console annotator factory. * Serves the JavaScript file associated with this console annotator factory.
*/ */
@WebMethod(name = "script.js") @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)); rsp.serveFile(req, getResource("/script.js"), TimeUnit.DAYS.toMillis(1));
} }
@WebMethod(name = "style.css") @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)); rsp.serveFile(req, getResource("/style.css"), TimeUnit.DAYS.toMillis(1));
} }

View File

@ -37,7 +37,7 @@ import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.Stapler; 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. * 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) { public ConsoleAnnotator annotate(Object context, MarkupText text, int charPos) {
String url = this.url; String url = this.url;
if (url.startsWith("/")) { if (url.startsWith("/")) {
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req != null) { if (req != null) {
// if we are serving HTTP request, we want to use app relative URL // if we are serving HTTP request, we want to use app relative URL
url = req.getContextPath() + url; url = req.getContextPath() + url;

View File

@ -65,8 +65,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpRedirect; import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses; 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.kohsuke.stapler.interceptor.RequirePOST; 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. * Depending on whether the user said "yes" or "no", send him to the right place.
*/ */
@RequirePOST @RequirePOST
public HttpResponse doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { public HttpResponse doAct(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
if (req.hasParameter("no")) { if (req.hasParameter("no")) {
disable(true); disable(true);
return HttpResponses.redirectViaContextPath("/manage"); return HttpResponses.redirectViaContextPath("/manage");
@ -324,7 +324,7 @@ public class OldDataMonitor extends AdministrativeMonitor {
* Remove those items from the data map. * Remove those items from the data map.
*/ */
@RequirePOST @RequirePOST
public HttpResponse doUpgrade(StaplerRequest req, StaplerResponse rsp) { public HttpResponse doUpgrade(StaplerRequest2 req, StaplerResponse2 rsp) {
final String thruVerParam = req.getParameter("thruVer"); final String thruVerParam = req.getParameter("thruVer");
final VersionNumber thruVer = thruVerParam.equals("all") ? null : new VersionNumber(thruVerParam); 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. * Remove those items from the data map.
*/ */
@RequirePOST @RequirePOST
public HttpResponse doDiscard(StaplerRequest req, StaplerResponse rsp) { public HttpResponse doDiscard(StaplerRequest2 req, StaplerResponse2 rsp) {
saveAndRemoveEntries(entry -> entry.getValue().max == null); saveAndRemoveEntries(entry -> entry.getValue().max == null);
return HttpResponses.forwardToPreviousPage(); return HttpResponses.forwardToPreviousPage();
@ -377,7 +377,7 @@ public class OldDataMonitor extends AdministrativeMonitor {
data.keySet().removeAll(removed); data.keySet().removeAll(removed);
} }
public HttpResponse doIndex(StaplerResponse rsp) throws IOException { public HttpResponse doIndex(StaplerResponse2 rsp) throws IOException {
return new HttpRedirect("manage"); return new HttpRedirect("manage");
} }

View File

@ -41,7 +41,7 @@ import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
/** /**
@ -68,7 +68,7 @@ public class ReverseProxySetupMonitor extends AdministrativeMonitor {
@Restricted(DoNotUse.class) // WebOnly @Restricted(DoNotUse.class) // WebOnly
@RestrictedSince("2.235") @RestrictedSince("2.235")
public HttpResponse doTest(StaplerRequest request, @QueryParameter boolean testWithContext) { public HttpResponse doTest(StaplerRequest2 request, @QueryParameter boolean testWithContext) {
String referer = request.getReferer(); String referer = request.getReferer();
Jenkins j = Jenkins.get(); Jenkins j = Jenkins.get();
String redirect; String redirect;

View File

@ -30,8 +30,8 @@ import hudson.security.Permission;
import java.io.IOException; import java.io.IOException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
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; 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. * Depending on whether the user said "yes" or "no", send him to the right place.
*/ */
@RequirePOST @RequirePOST
public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doAct(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (req.hasParameter("no")) { if (req.hasParameter("no")) {
disable(true); disable(true);

View File

@ -39,6 +39,6 @@ import jenkins.util.groovy.GroovyHookScript;
public class GroovyInitScript { public class GroovyInitScript {
@Initializer(after = JOB_CONFIG_ADAPTED) @Initializer(after = JOB_CONFIG_ADAPTED)
public static void init(Jenkins j) { 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();
} }
} }

View File

@ -2,22 +2,22 @@ package hudson.init.impl;
import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.CheckForNull;
import hudson.init.Initializer; 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.EOFException;
import java.io.IOException; import java.io.IOException;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.kohsuke.MetaInfServices; import org.kohsuke.MetaInfServices;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.Stapler; 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.UncaughtExceptionFilter; import org.kohsuke.stapler.UncaughtExceptionFilter;
import org.kohsuke.stapler.WebApp; import org.kohsuke.stapler.WebApp;
@ -30,7 +30,7 @@ public class InstallUncaughtExceptionHandler {
@Initializer @Initializer
public static void init(final Jenkins j) throws IOException { 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 { try {
Thread.setDefaultUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler()); Thread.setDefaultUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler());
LOGGER.log(Level.FINE, "Successfully installed a global UncaughtExceptionHandler."); LOGGER.log(Level.FINE, "Successfully installed a global UncaughtExceptionHandler.");
@ -53,10 +53,10 @@ public class InstallUncaughtExceptionHandler {
String id = UUID.randomUUID().toString(); String id = UUID.randomUUID().toString();
LOGGER.log(isEOFException(e) ? Level.FINE : Level.WARNING, "Caught unhandled exception with ID " + id, e); LOGGER.log(isEOFException(e) ? Level.FINE : Level.WARNING, "Caught unhandled exception with ID " + id, e);
req.setAttribute("jenkins.exception.id", id); req.setAttribute("jenkins.exception.id", id);
req.setAttribute("javax.servlet.error.exception", e); req.setAttribute("jakarta.servlet.error.exception", e);
rsp.setStatus(code); rsp.setStatus(code);
try { 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) { } catch (ServletException | IOException x) {
if (!Stapler.isSocketException(x)) { if (!Stapler.isSocketException(x)) {
throw x; throw x;
@ -75,7 +75,7 @@ public class InstallUncaughtExceptionHandler {
} }
return new HttpResponses.HttpResponseException(cause) { return new HttpResponses.HttpResponseException(cause) {
@Override @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); handleException(Jenkins.get(), cause, req, rsp, code);
} }
}; };

View File

@ -35,6 +35,7 @@ import hudson.model.ManagementLink;
import hudson.model.TaskListener; import hudson.model.TaskListener;
import hudson.util.StreamTaskListener; import hudson.util.StreamTaskListener;
import hudson.util.jna.DotNet; import hudson.util.jna.DotNet;
import jakarta.servlet.ServletException;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -43,7 +44,6 @@ import java.nio.charset.Charset;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import org.apache.commons.io.FileUtils; 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.taskdefs.Move;
import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.FileSet;
import org.kohsuke.stapler.QueryParameter; 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.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
/** /**
@ -116,7 +116,7 @@ public class WindowsInstallerLink extends ManagementLink {
* Performs installation. * Performs installation.
*/ */
@RequirePOST @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); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (installationDir != null) { 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. * 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 { try {
FileUtils.copyURLToFile(src, new File(dir, name)); FileUtils.copyURLToFile(src, new File(dir, name));
} catch (IOException e) { } catch (IOException e) {
@ -179,7 +179,7 @@ public class WindowsInstallerLink extends ManagementLink {
} }
@RequirePOST @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); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (installationDir == null) { if (installationDir == null) {
@ -250,11 +250,11 @@ public class WindowsInstallerLink extends ManagementLink {
/** /**
* Displays the error in a page. * 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); 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("message", message);
req.setAttribute("pre", true); req.setAttribute("pre", true);
rsp.forward(Jenkins.get(), "error", req); rsp.forward(Jenkins.get(), "error", req);

View File

@ -48,6 +48,7 @@ import hudson.util.FormValidation;
import hudson.util.HttpResponses; import hudson.util.HttpResponses;
import hudson.util.RingBufferLogHandler; import hudson.util.RingBufferLogHandler;
import hudson.util.XStream2; import hudson.util.XStream2;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
@ -71,7 +72,6 @@ import java.util.logging.Level;
import java.util.logging.LogManager; import java.util.logging.LogManager;
import java.util.logging.LogRecord; import java.util.logging.LogRecord;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.Loadable; import jenkins.model.Loadable;
import jenkins.security.MasterToSlaveCallable; import jenkins.security.MasterToSlaveCallable;
@ -82,8 +82,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; 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.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
@ -439,7 +439,7 @@ public class LogRecorder extends AbstractModelObject implements Loadable, Saveab
* Accepts submission from the configuration page. * Accepts submission from the configuration page.
*/ */
@POST @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); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
JSONObject src = req.getSubmittedForm(); 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. * Deletes this recorder, then go back to the parent.
*/ */
@RequirePOST @RequirePOST
public synchronized void doDoDelete(StaplerResponse rsp) throws IOException, ServletException { public synchronized void doDoDelete(StaplerResponse2 rsp) throws IOException, ServletException {
delete(); delete();
rsp.sendRedirect2(".."); rsp.sendRedirect2("..");
} }
@ -562,7 +562,7 @@ public class LogRecorder extends AbstractModelObject implements Loadable, Saveab
/** /**
* RSS feed for log entries. * 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()); LogRecorderManager.doRss(req, rsp, getLogRecords());
} }

View File

@ -38,6 +38,7 @@ import hudson.model.Failure;
import hudson.model.RSS; import hudson.model.RSS;
import hudson.util.CopyOnWriteMap; import hudson.util.CopyOnWriteMap;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.io.IOException; import java.io.IOException;
@ -53,7 +54,6 @@ import java.util.logging.Level;
import java.util.logging.LogManager; import java.util.logging.LogManager;
import java.util.logging.LogRecord; import java.util.logging.LogRecord;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration; import jenkins.model.JenkinsLocationConfiguration;
import jenkins.model.ModelObjectWithChildren; import jenkins.model.ModelObjectWithChildren;
@ -68,8 +68,8 @@ import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerProxy; 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.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
/** /**
@ -188,7 +188,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje
} }
@Override @Override
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
ContextMenu menu = new ContextMenu(); ContextMenu menu = new ContextMenu();
menu.add("all", "All Jenkins Logs"); menu.add("all", "All Jenkins Logs");
for (LogRecorder lr : recorders) { for (LogRecorder lr : recorders) {
@ -225,14 +225,14 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje
/** /**
* RSS feed for log entries. * 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); doRss(req, rsp, Jenkins.logRecords);
} }
/** /**
* Renders the given log recorders as RSS. * Renders the given log recorders as RSS.
*/ */
/*package*/ static void doRss(StaplerRequest req, StaplerResponse rsp, List<LogRecord> logs) throws IOException, ServletException { /*package*/ static void doRss(StaplerRequest2 req, StaplerResponse2 rsp, List<LogRecord> logs) throws IOException, ServletException {
// filter log records based on the log level // filter log records based on the log level
String entryType = "all"; String entryType = "all";
String level = req.getParameter("level"); String level = req.getParameter("level");

View File

@ -28,6 +28,7 @@ import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.ExtensionPoint; import hudson.ExtensionPoint;
import hudson.model.AbstractDescribableImpl; import hudson.model.AbstractDescribableImpl;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
@ -44,7 +45,8 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; 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.WebMethod;
import org.kohsuke.stapler.verb.GET; import org.kohsuke.stapler.verb.GET;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
@ -138,7 +140,7 @@ public abstract class MarkupFormatter extends AbstractDescribableImpl<MarkupForm
@GET @GET
@WebMethod(name = "previewDescription") @WebMethod(name = "previewDescription")
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
public HttpResponse previewsNowNeedPostForSecurity2153(@QueryParameter String text, StaplerRequest req) throws IOException { public HttpResponse previewsNowNeedPostForSecurity2153(@QueryParameter String text, StaplerRequest2 req) throws IOException {
LOGGER.log(Level.FINE, "Received a GET request at " + req.getRequestURL()); LOGGER.log(Level.FINE, "Received a GET request at " + req.getRequestURL());
if (PREVIEWS_ALLOW_GET) { if (PREVIEWS_ALLOW_GET) {
return doPreviewDescription(text); return doPreviewDescription(text);
@ -155,15 +157,18 @@ public abstract class MarkupFormatter extends AbstractDescribableImpl<MarkupForm
*/ */
private static HttpResponse html(int status, @NonNull String html, @NonNull Map<String, String> headers) { private static HttpResponse html(int status, @NonNull String html, @NonNull Map<String, String> headers) {
// TODO Move to Stapler's HttpResponses, (also add a corresponding 'text' method) // TODO Move to Stapler's HttpResponses, (also add a corresponding 'text' method)
return (req, rsp, node) -> { return new HttpResponse() {
rsp.setContentType("text/html;charset=UTF-8"); @Override
rsp.setStatus(status); public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
for (Map.Entry<String, String> header : headers.entrySet()) { rsp.setContentType("text/html;charset=UTF-8");
rsp.setHeader(header.getKey(), header.getValue()); rsp.setStatus(status);
for (Map.Entry<String, String> 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();
}; };
} }
} }

View File

@ -62,6 +62,8 @@ import hudson.util.AdaptedIterator;
import hudson.util.HttpResponses; import hudson.util.HttpResponses;
import hudson.util.Iterators; import hudson.util.Iterators;
import hudson.util.VariableResolver; import hudson.util.VariableResolver;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException; import java.io.InterruptedIOException;
@ -81,7 +83,6 @@ import java.util.SortedSet;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.lazy.BuildReference; import jenkins.model.lazy.BuildReference;
import jenkins.model.lazy.LazyBuildMixIn; import jenkins.model.lazy.LazyBuildMixIn;
@ -275,7 +276,7 @@ public abstract class AbstractBuild<P extends AbstractProject<P, R>, R extends A
*/ */
@Deprecated(since = "2.364") @Deprecated(since = "2.364")
public String getUpUrl() { public String getUpUrl() {
return Functions.getNearestAncestorUrl(Stapler.getCurrentRequest(), getParent()) + '/'; return Functions.getNearestAncestorUrl(Stapler.getCurrentRequest2(), getParent()) + '/';
} }
/** /**
@ -1391,8 +1392,12 @@ public abstract class AbstractBuild<P extends AbstractProject<P, R>, R extends A
*/ */
@Deprecated @Deprecated
@RequirePOST // #doStop() should be preferred, but better to be safe @RequirePOST // #doStop() should be preferred, but better to be safe
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); try {
doStop().generateResponse(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), this);
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} }
/** /**

View File

@ -25,7 +25,7 @@
package hudson.model; 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 com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
@ -47,6 +47,8 @@ import hudson.util.AtomicFileWriter;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import hudson.util.IOUtils; import hudson.util.IOUtils;
import hudson.util.Secret; import hudson.util.Secret;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
@ -59,7 +61,6 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.xml.transform.Source; import javax.xml.transform.Source;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.transform.sax.SAXSource; import javax.xml.transform.sax.SAXSource;
@ -70,6 +71,7 @@ import jenkins.model.Jenkins;
import jenkins.model.Loadable; import jenkins.model.Loadable;
import jenkins.model.queue.ItemDeletion; import jenkins.model.queue.ItemDeletion;
import jenkins.security.NotReallyRoleSensitiveCallable; import jenkins.security.NotReallyRoleSensitiveCallable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import jenkins.util.xml.XMLUtils; import jenkins.util.xml.XMLUtils;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
@ -87,7 +89,9 @@ import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod; import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -530,7 +534,7 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
@Override @Override
public final String getUrl() { public final String getUrl() {
// try to stick to the current view if possible // try to stick to the current view if possible
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
String shortUrl = getShortUrl(); String shortUrl = getShortUrl();
String uri = req == null ? null : req.getRequestURI(); String uri = req == null ? null : req.getRequestURI();
if (req != null) { if (req != null) {
@ -644,9 +648,36 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
/** /**
* Accepts the new description. * Accepts the new description.
*
* @since TODO
*/ */
@RequirePOST @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); checkPermission(CONFIGURE);
setDescription(req.getParameter("description")); 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} * Note on the funny name: for reasons of historical compatibility, this URL is {@code /doDelete}
* since it predates {@code <l:confirmationLink>}. {@code /delete} goes to a Jelly page * since it predates {@code <l:confirmationLink>}. {@code /delete} goes to a Jelly page
* which should now be unused by core but is left in case plugins are still using it. * which should now be unused by core but is left in case plugins are still using it.
*
* @since TODO
*/ */
@RequirePOST @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(); delete();
if (req == null || rsp == null) { // CLI if (req == null || rsp == null) { // CLI
return; return;
@ -681,8 +735,28 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
rsp.sendRedirect2(req.getContextPath() + '/' + url); rsp.sendRedirect2(req.getContextPath() + '/' + url);
} }
/**
* @since TODO
*/
@Override @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 { try {
delete(); delete();
rsp.setStatus(204); 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. * Accepts {@code config.xml} submission, as well as serve it.
*
* @since TODO
*/ */
@WebMethod(name = "config.xml") @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) public void doConfigDotXml(StaplerRequest req, StaplerResponse rsp)
throws IOException { throws IOException {
doConfigDotXmlImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
}
private void doConfigDotXmlImpl(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException {
if (req.getMethod().equals("GET")) { if (req.getMethod().equals("GET")) {
// read // read
rsp.setContentType("application/xml"); rsp.setContentType("application/xml");

View File

@ -29,11 +29,14 @@ import hudson.search.SearchFactory;
import hudson.search.SearchIndex; import hudson.search.SearchIndex;
import hudson.search.SearchIndexBuilder; import hudson.search.SearchIndexBuilder;
import hudson.search.SearchableModelObject; import hudson.search.SearchableModelObject;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
/** /**
@ -45,33 +48,69 @@ public abstract class AbstractModelObject implements SearchableModelObject {
/** /**
* Displays the error in a page. * 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); req.setAttribute("exception", e);
sendError(e.getMessage(), req, rsp); 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); req.setAttribute("message", message);
rsp.forward(this, "error", req); 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 * @param pre
* If true, the message is put in a PRE tag. * 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); req.setAttribute("message", message);
if (pre) if (pre)
req.setAttribute("pre", true); req.setAttribute("pre", true);
rsp.forward(this, "error", req); 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 { 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 @Deprecated
protected final void requirePOST() throws ServletException { protected final void requirePOST() throws ServletException {
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req == null) return; // invoked outside the context of servlet if (req == null) return; // invoked outside the context of servlet
String method = req.getMethod(); String method = req.getMethod();
if (!method.equalsIgnoreCase("POST")) if (!method.equalsIgnoreCase("POST"))

View File

@ -77,6 +77,8 @@ import hudson.util.AlternativeUiTextProvider;
import hudson.util.AlternativeUiTextProvider.Message; import hudson.util.AlternativeUiTextProvider.Message;
import hudson.util.DescribableList; import hudson.util.DescribableList;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -96,7 +98,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.BlockedBecauseOfBuildInProgress; import jenkins.model.BlockedBecauseOfBuildInProgress;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn; import jenkins.model.ParameterizedJobMixIn;
@ -120,7 +121,9 @@ import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
@ -769,7 +772,7 @@ public abstract class AbstractProject<P extends AbstractProject<P, R>, R extends
@Override @Override
@POST @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); super.doConfigSubmit(req, rsp);
updateTransientActions(); updateTransientActions();
@ -1726,10 +1729,14 @@ public abstract class AbstractProject<P extends AbstractProject<P, R>, R extends
// //
// //
/** @deprecated use {@link #doBuild(StaplerRequest, StaplerResponse, TimeDuration)} */ /** @deprecated use {@link #doBuild(StaplerRequest2, StaplerResponse2, TimeDuration)} */
@Deprecated @Deprecated
public void doBuild(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doBuild(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
doBuild(req, rsp, TimeDuration.fromString(req.getParameter("delay"))); 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<P extends AbstractProject<P, R>, R extends
* Inject {@link TimeDuration}. * Inject {@link TimeDuration}.
*/ */
@Deprecated @Deprecated
public int getDelay(StaplerRequest req) throws ServletException { public int getDelay(StaplerRequest req) throws javax.servlet.ServletException {
String delay = req.getParameter("delay"); String delay = req.getParameter("delay");
if (delay == null) return getQuietPeriod(); if (delay == null) return getQuietPeriod();
@ -1749,26 +1756,59 @@ public abstract class AbstractProject<P extends AbstractProject<P, R>, R extends
if (delay.endsWith("secs")) delay = delay.substring(0, delay.length() - 4); if (delay.endsWith("secs")) delay = delay.substring(0, delay.length() - 4);
return Integer.parseInt(delay); return Integer.parseInt(delay);
} catch (NumberFormatException e) { } 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 @Deprecated
public void doBuildWithParameters(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doBuildWithParameters(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
doBuildWithParameters(req, rsp, TimeDuration.fromString(req.getParameter("delay"))); 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 @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); BuildAuthorizationToken.checkPermission((Job) this, authToken, req, rsp);
schedulePolling(); schedulePolling();
rsp.sendRedirect("."); rsp.sendRedirect(".");
} }
/**
* @since TODO
*/
@Override @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); 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(); JSONObject json = req.getSubmittedForm();
makeDisabled(!json.optBoolean("enable")); makeDisabled(!json.optBoolean("enable"));
@ -1835,14 +1875,18 @@ public abstract class AbstractProject<P extends AbstractProject<P, R>, R extends
/** /**
* @deprecated * @deprecated
* As of 1.261. Use {@link #buildDescribable(StaplerRequest, List)} instead. * As of 1.261. Use {@link #buildDescribable(StaplerRequest2, List)} instead.
*/ */
@Deprecated @Deprecated
protected final <T extends Describable<T>> List<T> buildDescribable(StaplerRequest req, List<? extends Descriptor<T>> descriptors, String prefix) throws FormException, ServletException { protected final <T extends Describable<T>> List<T> buildDescribable(StaplerRequest req, List<? extends Descriptor<T>> descriptors, String prefix) throws FormException, javax.servlet.ServletException {
return buildDescribable(req, descriptors); try {
return buildDescribable(StaplerRequest.toStaplerRequest2(req), descriptors);
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} }
protected final <T extends Describable<T>> List<T> buildDescribable(StaplerRequest req, List<? extends Descriptor<T>> descriptors) protected final <T extends Describable<T>> List<T> buildDescribable(StaplerRequest2 req, List<? extends Descriptor<T>> descriptors)
throws FormException, ServletException { throws FormException, ServletException {
JSONObject data = req.getSubmittedForm(); JSONObject data = req.getSubmittedForm();
@ -1860,7 +1904,7 @@ public abstract class AbstractProject<P extends AbstractProject<P, R>, R extends
/** /**
* Serves the workspace files. * 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); checkPermission(Item.WORKSPACE);
FilePath ws = getSomeWorkspace(); FilePath ws = getSomeWorkspace();
if (ws == null || !ws.exists()) { if (ws == null || !ws.exists()) {
@ -1887,7 +1931,7 @@ public abstract class AbstractProject<P extends AbstractProject<P, R>, R extends
* Wipes out the workspace. * Wipes out the workspace.
*/ */
@RequirePOST @RequirePOST
public HttpResponse doDoWipeOutWorkspace() throws IOException, ServletException, InterruptedException { public HttpResponse doDoWipeOutWorkspace() throws IOException, InterruptedException {
checkPermission(Functions.isWipeOutPermissionEnabled() ? WIPEOUT : BUILD); checkPermission(Functions.isWipeOutPermissionEnabled() ? WIPEOUT : BUILD);
R b = getSomeBuildWithWorkspace(); R b = getSomeBuildWithWorkspace();
FilePath ws = b != null ? b.getWorkspace() : null; FilePath ws = b != null ? b.getWorkspace() : null;

View File

@ -37,8 +37,11 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import jenkins.model.ModelObjectWithContextMenu; import jenkins.model.ModelObjectWithContextMenu;
import jenkins.model.TransientActionFactory; import jenkins.model.TransientActionFactory;
import jenkins.security.stapler.StaplerNotDispatchable;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -338,7 +341,26 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
return null; 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) { 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()) { for (Action a : getAllActions()) {
if (a == null) if (a == null)
continue; // be defensive continue; // be defensive
@ -351,7 +373,29 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
return null; 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); return new ContextMenu().from(this, request, response);
} }

View File

@ -37,8 +37,8 @@ import jenkins.model.Jenkins;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerProxy; 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.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
/** /**
@ -175,7 +175,7 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen
* URL binding to disable this monitor. * URL binding to disable this monitor.
*/ */
@RequirePOST @RequirePOST
public void doDisable(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doDisable(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
disable(true); disable(true);
rsp.sendRedirect2(req.getContextPath() + "/manage"); 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 * 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 * administrative monitor appear on {@code manage.jelly} and on the globally visible
* {@link jenkins.management.AdministrativeMonitorsDecorator} to users without Administer permission. * {@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.
* </p> * </p>
* <p> * <p>
* This method only allows for a single permission to be returned. If more complex permission checks are required, * This method only allows for a single permission to be returned. If more complex permission checks are required,

View File

@ -26,7 +26,10 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension; import hudson.Extension;
import hudson.Util;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -34,12 +37,12 @@ import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; 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.interceptor.RequirePOST;
/** /**
@ -91,7 +94,7 @@ public class AllView extends View {
@RequirePOST @RequirePOST
@Override @Override
public Item doCreateItem(StaplerRequest req, StaplerResponse rsp) public Item doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException { throws IOException, ServletException {
ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup(); ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup();
if (ig instanceof ModifiableItemGroup) if (ig instanceof ModifiableItemGroup)
@ -110,7 +113,24 @@ public class AllView extends View {
} }
@Override @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 // noop
} }

View File

@ -25,6 +25,10 @@
package hudson.model; package hudson.model;
import hudson.ExtensionList; 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.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.StringReader; import java.io.StringReader;
@ -34,11 +38,10 @@ import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.security.SecureRequester; import jenkins.security.SecureRequester;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.xml.FilteredFunctionContext; import jenkins.util.xml.FilteredFunctionContext;
import org.dom4j.CharacterData; import org.dom4j.CharacterData;
import org.dom4j.Document; import org.dom4j.Document;
@ -52,7 +55,9 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.Flavor; import org.kohsuke.stapler.export.Flavor;
import org.kohsuke.stapler.export.Model; import org.kohsuke.stapler.export.Model;
@ -96,7 +101,7 @@ public class Api extends AbstractModelObject {
/** /**
* Exposes the bean as XML. * Exposes the bean as XML.
*/ */
public void doXml(StaplerRequest req, StaplerResponse rsp, public void doXml(StaplerRequest2 req, StaplerResponse2 rsp,
@QueryParameter String xpath, @QueryParameter String xpath,
@QueryParameter String wrapper, @QueryParameter String wrapper,
@QueryParameter String tree, @QueryParameter String tree,
@ -212,7 +217,7 @@ public class Api extends AbstractModelObject {
/** /**
* Generate schema. * Generate schema.
*/ */
public void doSchema(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doSchema(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
setHeaders(rsp); setHeaders(rsp);
rsp.setContentType("application/xml"); rsp.setContentType("application/xml");
StreamResult r = new StreamResult(rsp.getOutputStream()); StreamResult r = new StreamResult(rsp.getOutputStream());
@ -223,7 +228,32 @@ public class Api extends AbstractModelObject {
/** /**
* Exposes the bean as JSON. * 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)) { if (req.getParameter("jsonp") == null || permit(req)) {
setHeaders(rsp); setHeaders(rsp);
rsp.serveExposedBean(req, bean, req.getParameter("jsonp") == null ? Flavor.JSON : Flavor.JSONP); 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. * 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); setHeaders(rsp);
rsp.serveExposedBean(req, bean, Flavor.PYTHON); rsp.serveExposedBean(req, bean, Flavor.PYTHON);
} }
private boolean permit(StaplerRequest req) { private boolean permit(StaplerRequest2 req) {
for (SecureRequester r : ExtensionList.lookup(SecureRequester.class)) { for (SecureRequester r : ExtensionList.lookup(SecureRequester.class)) {
if (r.permit(req, bean)) { if (r.permit(req, bean)) {
return true; return true;
@ -250,7 +305,7 @@ public class Api extends AbstractModelObject {
} }
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
protected void setHeaders(StaplerResponse rsp) { protected void setHeaders(StaplerResponse2 rsp) {
rsp.setHeader("X-Jenkins", Jenkins.VERSION); rsp.setHeader("X-Jenkins", Jenkins.VERSION);
rsp.setHeader("X-Jenkins-Session", Jenkins.SESSION_HASH); rsp.setHeader("X-Jenkins-Session", Jenkins.SESSION_HASH);
// to be really defensive against dumb browsers not taking into consideration the content-type being set // to be really defensive against dumb browsers not taking into consideration the content-type being set

View File

@ -28,16 +28,16 @@ import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.search.Search; import hudson.search.Search;
import hudson.search.UserSearchProperty; import hudson.search.UserSearchProperty;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse; 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;
import org.kohsuke.stapler.export.Flavor; import org.kohsuke.stapler.export.Flavor;
/** /**
@ -69,7 +69,7 @@ public class AutoCompletionCandidates implements HttpResponse {
} }
@Override @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(); Search.Result r = new Search.Result();
for (String value : values) { for (String value : values) {
r.suggestions.add(new hudson.search.Search.Item(value)); r.suggestions.add(new hudson.search.Search.Item(value));

View File

@ -113,7 +113,7 @@ public enum BallColor implements StatusIcon {
@Override @Override
public String getImageOf(String size) { 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;
} }
/** /**

View File

@ -33,7 +33,7 @@ import net.sf.json.JSONObject;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* {@link ParameterDefinition} that is either 'true' or 'false'. * {@link ParameterDefinition} that is either 'true' or 'false'.
@ -79,7 +79,7 @@ public class BooleanParameterDefinition extends SimpleParameterDefinition {
} }
@Override @Override
public ParameterValue createValue(StaplerRequest req, JSONObject jo) { public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
BooleanParameterValue value = req.bindJSON(BooleanParameterValue.class, jo); BooleanParameterValue value = req.bindJSON(BooleanParameterValue.class, jo);
value.setDescription(getDescription()); value.setDescription(getDescription());
return value; return value;

View File

@ -27,11 +27,13 @@ package hudson.model;
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
import hudson.Util; import hudson.Util;
import hudson.security.ACL; import hudson.security.ACL;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
/** /**
@ -51,7 +53,10 @@ public final class BuildAuthorizationToken {
this.token = token; this.token = token;
} }
public static BuildAuthorizationToken create(StaplerRequest req) { /**
* @since TODO
*/
public static BuildAuthorizationToken create(StaplerRequest2 req) {
if (req.getParameter("pseudoRemoteTrigger") != null) { if (req.getParameter("pseudoRemoteTrigger") != null) {
String token = Util.fixEmpty(req.getParameter("authToken")); String token = Util.fixEmpty(req.getParameter("authToken"));
if (token != null) if (token != null)
@ -61,11 +66,22 @@ public final class BuildAuthorizationToken {
return null; 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) { if (token != null && token.token != null) {
//check the provided token //check the provided token
String providedToken = req.getParameter("token"); String providedToken = req.getParameter("token");
@ -86,6 +102,14 @@ public final class BuildAuthorizationToken {
throw HttpResponses.forwardToView(project, "requirePOST.jelly"); 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() { public String getToken() {
return token; return token;
} }

View File

@ -25,12 +25,15 @@
package hudson.model; package hudson.model;
import hudson.util.RunList; import hudson.util.RunList;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import net.sf.json.JSONArray; import net.sf.json.JSONArray;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; 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. * UI widget for showing the SIMILE timeline control.
@ -60,12 +63,15 @@ public class BuildTimelineWidget {
return builds.getLastBuild(); return builds.getLastBuild();
} }
public HttpResponse doData(StaplerRequest req, @QueryParameter long min, @QueryParameter long max) { public HttpResponse doData(StaplerRequest2 req, @QueryParameter long min, @QueryParameter long max) {
return (req1, rsp, node) -> { return new HttpResponse() {
JSONObject o = new JSONObject(); @Override
o.put("events", JSONArray.fromObject(new ArrayList<>())); public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
rsp.setContentType("text/javascript;charset=UTF-8"); JSONObject o = new JSONObject();
o.write(rsp.getWriter()); o.put("events", JSONArray.fromObject(new ArrayList<>()));
rsp.setContentType("text/javascript;charset=UTF-8");
o.write(rsp.getWriter());
}
}; };
} }

View File

@ -20,7 +20,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
/** /**
@ -152,7 +152,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition {
} }
@Override @Override
public ParameterValue createValue(StaplerRequest req, JSONObject jo) { public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
StringParameterValue value = req.bindJSON(StringParameterValue.class, jo); StringParameterValue value = req.bindJSON(StringParameterValue.class, jo);
value.setDescription(getDescription()); value.setDescription(getDescription());
checkValue(value, value.getValue()); 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. * 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 name = formData.getString("name");
String desc = formData.getString("description"); String desc = formData.getString("description");
String choiceText = formData.getString("choices"); String choiceText = formData.getString("choices");

View File

@ -26,7 +26,7 @@
package hudson.model; 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.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
@ -73,6 +73,7 @@ import hudson.util.NamingThreadFactory;
import hudson.util.RemotingDiagnostics; import hudson.util.RemotingDiagnostics;
import hudson.util.RemotingDiagnostics.HeapDump; import hudson.util.RemotingDiagnostics.HeapDump;
import hudson.util.RunList; import hudson.util.RunList;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -105,7 +106,6 @@ import java.util.logging.LogRecord;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.security.ImpersonatingExecutorService; import jenkins.security.ImpersonatingExecutorService;
import jenkins.security.MasterToSlaveCallable; import jenkins.security.MasterToSlaveCallable;
@ -129,8 +129,8 @@ import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy; 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.WebMethod;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -227,7 +227,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
* @since 1.607 * @since 1.607
*/ */
public void recordTermination() { public void recordTermination() {
StaplerRequest request = Stapler.getCurrentRequest(); StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request != null) { if (request != null) {
terminatedBy.add(new TerminationRequest( terminatedBy.add(new TerminationRequest(
String.format("Termination requested at %s by %s [id=%d] from HTTP request for %s", 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. * 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)} * @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. * but outside the context of serving a request.
* *
* <p> * <p>
@ -1391,12 +1391,12 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
// //
// //
@Restricted(DoNotUse.class) @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()); RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds());
} }
@Restricted(DoNotUse.class) @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()); 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 * @since 2.215
*/ */
@Restricted(DoNotUse.class) @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<Run> lastBuilds = new ArrayList<>(); final List<Run> lastBuilds = new ArrayList<>();
for (AbstractProject<?, ?> p : Jenkins.get().allItems(AbstractProject.class)) { for (AbstractProject<?, ?> p : Jenkins.get().allItems(AbstractProject.class)) {
if (p.getLastBuild() != null) { if (p.getLastBuild() != null) {
@ -1452,7 +1452,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
/** /**
* Dumps the contents of the export table. * 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 // this is a debug probe and may expose sensitive information
checkPermission(Jenkins.ADMINISTER); checkPermission(Jenkins.ADMINISTER);
@ -1488,18 +1488,18 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
* For system diagnostics. * For system diagnostics.
* Run arbitrary Groovy script. * 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"); _doScript(req, rsp, "_script.jelly");
} }
/** /**
* Run arbitrary Groovy script and return result as plain text. * 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"); _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()); 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. * Accepts the update to the node configuration.
*/ */
@POST @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); checkPermission(CONFIGURE);
String proposedName = Util.fixEmptyAndTrim(req.getSubmittedForm().getString("name")); 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. * Accepts {@code config.xml} submission, as well as serve it.
*/ */
@WebMethod(name = "config.xml") @WebMethod(name = "config.xml")
public void doConfigDotXml(StaplerRequest req, StaplerResponse rsp) public void doConfigDotXml(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException { throws IOException, ServletException {
if (req.getMethod().equals("GET")) { if (req.getMethod().equals("GET")) {
@ -1626,7 +1626,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
/** /**
* Handles incremental log. * 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); getLogText().doProgressText(req, rsp);
} }

View File

@ -41,6 +41,7 @@ import hudson.triggers.SafeTimerTask;
import hudson.util.DescribableList; import hudson.util.DescribableList;
import hudson.util.FormApply; import hudson.util.FormApply;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@ -52,7 +53,6 @@ import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.ModelObjectWithChildren; import jenkins.model.ModelObjectWithChildren;
import jenkins.model.ModelObjectWithContextMenu.ContextMenu; import jenkins.model.ModelObjectWithContextMenu.ContextMenu;
@ -61,8 +61,8 @@ import jenkins.widgets.HasWidgets;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; 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.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
@ -112,7 +112,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
} }
@Override @Override
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
ContextMenu m = new ContextMenu(); ContextMenu m = new ContextMenu();
for (Computer c : get_all()) { for (Computer c : get_all()) {
m.add(c); m.add(c);
@ -206,12 +206,12 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
return "/computers/"; 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); return Jenkins.get().getComputer(token);
} }
@RequirePOST @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); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
for (Computer c : get_all()) { 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. * TODO: ajax on the client side to wait until the update completion might be nice.
*/ */
@RequirePOST @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); Jenkins.get().checkPermission(Jenkins.MANAGE);
for (NodeMonitor nodeMonitor : NodeMonitor.getAll()) { 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. * First check point in creating a new agent.
*/ */
@RequirePOST @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 name, @QueryParameter String mode,
@QueryParameter String from) throws IOException, ServletException { @QueryParameter String from) throws IOException, ServletException {
final Jenkins app = Jenkins.get(); final Jenkins app = Jenkins.get();
@ -290,7 +290,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
* Really creates a new agent. * Really creates a new agent.
*/ */
@POST @POST
public synchronized void doDoCreateItem(StaplerRequest req, StaplerResponse rsp, public synchronized void doDoCreateItem(StaplerRequest2 req, StaplerResponse2 rsp,
@QueryParameter String name, @QueryParameter String name,
@QueryParameter String type) throws IOException, ServletException, FormException { @QueryParameter String type) throws IOException, ServletException, FormException {
final Jenkins app = Jenkins.get(); final Jenkins app = Jenkins.get();
@ -348,7 +348,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl
* Accepts submission from the configuration page. * Accepts submission from the configuration page.
*/ */
@POST @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); BulkChange bc = new BulkChange(MONITORS_OWNER);
try { try {
Jenkins.get().checkPermission(Jenkins.MANAGE); Jenkins.get().checkPermission(Jenkins.MANAGE);

View File

@ -25,7 +25,7 @@
package hudson.model; package hudson.model;
import static hudson.util.QuotedStringTokenizer.quote; 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.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
@ -45,6 +45,9 @@ import hudson.util.FormValidation.CheckMethod;
import hudson.util.ReflectionUtils; import hudson.util.ReflectionUtils;
import hudson.util.ReflectionUtils.Parameter; import hudson.util.ReflectionUtils.Parameter;
import hudson.views.ListViewColumn; import hudson.views.ListViewColumn;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import java.beans.Introspector; import java.beans.Introspector;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -71,13 +74,12 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import jenkins.model.GlobalConfiguration; import jenkins.model.GlobalConfiguration;
import jenkins.model.GlobalConfigurationCategory; import jenkins.model.GlobalConfigurationCategory;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.Loadable; import jenkins.model.Loadable;
import jenkins.security.RedactSecretJsonInErrorMessageSanitizer; import jenkins.security.RedactSecretJsonInErrorMessageSanitizer;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.io.OnMaster; import jenkins.util.io.OnMaster;
import net.sf.json.JSONArray; import net.sf.json.JSONArray;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
@ -92,7 +94,9 @@ import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebApp; import org.kohsuke.stapler.WebApp;
import org.kohsuke.stapler.jelly.JellyCompatibleFacet; import org.kohsuke.stapler.jelly.JellyCompatibleFacet;
import org.kohsuke.stapler.lang.Klass; import org.kohsuke.stapler.lang.Klass;
@ -382,7 +386,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
* @since 1.402 * @since 1.402
*/ */
public static String getCurrentDescriptorByNameUrl() { public static String getCurrentDescriptorByNameUrl() {
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
// this override allows RenderOnDemandClosure to preserve the proper value // this override allows RenderOnDemandClosure to preserve the proper value
Object url = req.getAttribute("currentDescriptorByNameUrl"); Object url = req.getAttribute("currentDescriptorByNameUrl");
@ -576,16 +580,33 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
* *
* @throws FormException * @throws FormException
* Signals a problem in the submitted form. * 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 * @since 1.145
*/ */
@Deprecated
public T newInstance(@Nullable StaplerRequest req, @NonNull JSONObject formData) throws FormException { 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 { try {
Method m = getClass().getMethod("newInstance", StaplerRequest.class); Method m = getClass().getMethod("newInstance", StaplerRequest.class);
if (!Modifier.isAbstract(m.getDeclaringClass().getModifiers())) { if (!Modifier.isAbstract(m.getDeclaringClass().getModifiers())) {
// this class overrides newInstance(StaplerRequest). // this class overrides newInstance(StaplerRequest).
// maintain the backward compatible behavior // maintain the backward compatible behavior
return verifyNewInstance(newInstance(req)); return verifyNewInstance(newInstance(StaplerRequest.fromStaplerRequest2(req)));
} else { } else {
if (req == null) { if (req == null) {
// yes, req is supposed to be always non-null, but see the note above // yes, req is supposed to be always non-null, but see the note above
@ -602,16 +623,25 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
} }
/** /**
* Replacement for {@link StaplerRequest#bindJSON(Class, JSONObject)} which honors {@link #newInstance(StaplerRequest, JSONObject)}. * Replacement for {@link StaplerRequest2#bindJSON(Class, JSONObject)} which honors {@link #newInstance(StaplerRequest2, JSONObject)}.
* This is automatically used inside {@link #newInstance(StaplerRequest, JSONObject)} so a direct call would only be necessary * 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(StaplerRequest, JSONObject)}. * in case the top level binding might use a {@link Descriptor} which overrides {@link #newInstance(StaplerRequest2, JSONObject)}.
* @since 2.342 * @since TODO
*/ */
public static <T> T bindJSON(StaplerRequest req, Class<T> type, JSONObject src) { public static <T> T bindJSON(StaplerRequest2 req, Class<T> type, JSONObject src) {
return bindJSON(req, type, src, false); return bindJSON(req, type, src, false);
} }
private static <T> T bindJSON(StaplerRequest req, Class<T> type, JSONObject src, boolean fromNewInstance) { /**
* @deprecated use {@link #bindJSON(StaplerRequest2, Class, JSONObject)}
* @since 2.342
*/
@Deprecated
public static <T> T bindJSON(StaplerRequest req, Class<T> type, JSONObject src) {
return bindJSON(StaplerRequest.toStaplerRequest2(req), type, src);
}
private static <T> T bindJSON(StaplerRequest2 req, Class<T> type, JSONObject src, boolean fromNewInstance) {
BindInterceptor oldInterceptor = req.getBindInterceptor(); BindInterceptor oldInterceptor = req.getBindInterceptor();
try { try {
NewInstanceBindInterceptor interceptor; NewInstanceBindInterceptor interceptor;
@ -631,9 +661,9 @@ public abstract class Descriptor<T extends Describable<T>> 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 * {@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. * 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. * But for nested describable objects Stapler would know nothing about {@code newInstance} without this trick.
*/ */
@ -671,7 +701,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
try { try {
final Descriptor descriptor = Jenkins.get().getDescriptor(actualType); final Descriptor descriptor = Jenkins.get().getDescriptor(actualType);
if (descriptor != null) { if (descriptor != null) {
return descriptor.newInstance(Stapler.getCurrentRequest(), json); return descriptor.newInstance(Stapler.getCurrentRequest2(), json);
} else { } else {
LOGGER.log(Level.WARNING, "Descriptor not found. Falling back to default instantiation " LOGGER.log(Level.WARNING, "Descriptor not found. Falling back to default instantiation "
+ actualType.getName() + " " + json); + actualType.getName() + " " + json);
@ -694,7 +724,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
if (isApplicable(targetTypeErasure, json)) { if (isApplicable(targetTypeErasure, json)) {
LOGGER.log(Level.FINE, "switching to newInstance {0} {1}", new Object[] {targetTypeErasure.getName(), json}); LOGGER.log(Level.FINE, "switching to newInstance {0} {1}", new Object[] {targetTypeErasure.getName(), json});
try { try {
return Jenkins.get().getDescriptor(targetTypeErasure).newInstance(Stapler.getCurrentRequest(), json); return Jenkins.get().getDescriptor(targetTypeErasure).newInstance(Stapler.getCurrentRequest2(), json);
} catch (Exception x) { } catch (Exception x) {
LOGGER.log(Level.WARNING, "falling back to default instantiation " + targetTypeErasure.getName() + " " + json, x); LOGGER.log(Level.WARNING, "falling back to default instantiation " + targetTypeErasure.getName() + " " + json, x);
} }
@ -776,13 +806,13 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
} }
try { try {
if (Stapler.getCurrentRequest().getView(c, "help" + suffix) != null) if (Stapler.getCurrentRequest2().getView(c, "help" + suffix) != null)
return page; return page;
} catch (IOException e) { } catch (IOException e) {
throw new Error(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; return null;
} }
@ -812,7 +842,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
/** /**
* @deprecated * @deprecated
* As of 1.239, use {@link #configure(StaplerRequest, JSONObject)}. * As of 1.239, use {@link #configure(StaplerRequest2, JSONObject)}.
*/ */
@Deprecated @Deprecated
public boolean configure(StaplerRequest req) throws FormException { public boolean configure(StaplerRequest req) throws FormException {
@ -829,7 +859,21 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
* See <a href="https://www.jenkins.io/doc/developer/forms/structured-form-submission/">the developer documentation</a>. * See <a href="https://www.jenkins.io/doc/developer/forms/structured-form-submission/">the developer documentation</a>.
* @return false * @return false
* to keep the client in the same config page. * 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 { public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
// compatibility // compatibility
return configure(req); return configure(req);
@ -895,7 +939,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
protected List<String> getPossibleViewNames(String baseName) { protected List<String> getPossibleViewNames(String baseName) {
List<String> names = new ArrayList<>(); List<String> 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) { if (f instanceof JellyCompatibleFacet jcf) {
for (String ext : jcf.getScriptExtensions()) for (String ext : jcf.getScriptExtensions())
names.add(baseName + ext); names.add(baseName + ext);
@ -957,7 +1001,32 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
/** /**
* Serves {@code help.html} from the resource of {@link #clazz}. * 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(); String path = req.getRestOfPath();
if (path.contains("..")) throw new ServletException("Illegal path: " + path); if (path.contains("..")) throw new ServletException("Illegal path: " + path);
@ -972,13 +1041,13 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
} }
for (Klass<?> c = getKlass(); c != null; c = c.getSuperClass()) { 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 if (rd != null) { // template based help page
rd.forward(req, rsp); rd.forward(req, rsp);
return; return;
} }
URL url = getStaticHelpUrl(Stapler.getCurrentRequest(), c, path); URL url = getStaticHelpUrl(Stapler.getCurrentRequest2(), c, path);
if (url != null) { if (url != null) {
// TODO: generalize macro expansion and perhaps even support JEXL // TODO: generalize macro expansion and perhaps even support JEXL
rsp.setContentType("text/html;charset=UTF-8"); rsp.setContentType("text/html;charset=UTF-8");
@ -992,8 +1061,11 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
rsp.sendError(SC_NOT_FOUND); rsp.sendError(SC_NOT_FOUND);
} }
/**
* @since TODO
*/
@Restricted(NoExternalUse.class) @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; String base = "help" + suffix;
URL url; URL url;
@ -1017,6 +1089,15 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
return c.getResource(base + ".html"); 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 // static methods
@ -1061,16 +1142,30 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
* List of descriptors to create instances from. * List of descriptors to create instances from.
* @return * @return
* Can be empty but never null. * Can be empty but never null.
* @since TODO
*/ */
public static <T extends Describable<T>> public static <T extends Describable<T>>
List<T> newInstancesFromHeteroList(StaplerRequest req, JSONObject formData, String key, List<T> newInstancesFromHeteroList(StaplerRequest2 req, JSONObject formData, String key,
Collection<? extends Descriptor<T>> descriptors) throws FormException { Collection<? extends Descriptor<T>> descriptors) throws FormException {
return newInstancesFromHeteroList(req, formData.get(key), descriptors); return newInstancesFromHeteroList(req, formData.get(key), descriptors);
} }
/**
* @deprecated use {@link #newInstancesFromHeteroList(StaplerRequest2, JSONObject, String, Collection)}
*/
@Deprecated
public static <T extends Describable<T>> public static <T extends Describable<T>>
List<T> newInstancesFromHeteroList(StaplerRequest req, Object formData, List<T> newInstancesFromHeteroList(StaplerRequest req, JSONObject formData, String key,
Collection<? extends Descriptor<T>> descriptors) throws FormException {
return newInstancesFromHeteroList(StaplerRequest.toStaplerRequest2(req), formData, key, descriptors);
}
/**
* @since TODO
*/
public static <T extends Describable<T>>
List<T> newInstancesFromHeteroList(StaplerRequest2 req, Object formData,
Collection<? extends Descriptor<T>> descriptors) throws FormException { Collection<? extends Descriptor<T>> descriptors) throws FormException {
List<T> items = new ArrayList<>(); List<T> items = new ArrayList<>();
@ -1086,7 +1181,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
if (kind != null) { if (kind != null) {
// Only applies when Descriptor.getId is overridden. // Only applies when Descriptor.getId is overridden.
// Note that kind is only supported here, // 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). // (since Descriptor.newInstance is not itself available to Stapler).
// If you merely override getId for some reason, but use @DataBoundConstructor on your Describable, // 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. // there is no problem; but you can only rely on newInstance being called at top level.
@ -1114,6 +1209,16 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
return items; return items;
} }
/**
* @deprecated use {@link #newInstancesFromHeteroList(StaplerRequest2, JSONObject, String, Collection)}
*/
@Deprecated
public static <T extends Describable<T>>
List<T> newInstancesFromHeteroList(StaplerRequest req, Object formData,
Collection<? extends Descriptor<T>> descriptors) throws FormException {
return newInstancesFromHeteroList(StaplerRequest.toStaplerRequest2(req), formData, descriptors);
}
/** /**
* Finds a descriptor from a collection by its ID. * Finds a descriptor from a collection by its ID.
* @param id should match {@link #getId} * @param id should match {@link #getId}
@ -1199,7 +1304,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
} }
@Override @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)) { if (FormApply.isApply(req)) {
FormApply.applyResponse("notificationBar.show(" + quote(getMessage()) + ",notificationBar.ERROR)") FormApply.applyResponse("notificationBar.show(" + quote(getMessage()) + ",notificationBar.ERROR)")
.generateResponse(req, rsp, node); .generateResponse(req, rsp, node);

View File

@ -26,8 +26,8 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;

View File

@ -27,6 +27,9 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.FilePath; import hudson.FilePath;
import hudson.Util; import hudson.Util;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -55,8 +58,6 @@ import java.util.logging.Logger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.security.MasterToSlaveCallable; import jenkins.security.MasterToSlaveCallable;
import jenkins.security.ResourceDomainConfiguration; import jenkins.security.ResourceDomainConfiguration;
@ -70,7 +71,9 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/** /**
* Has convenience methods to serve file system. * Has convenience methods to serve file system.
@ -157,7 +160,7 @@ public final class DirectoryBrowserSupport implements HttpResponse {
} }
@Override @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()) { if (!ResourceDomainConfiguration.isResourceRequest(req) && ResourceDomainConfiguration.isResourceDomainConfigured()) {
resourceToken = ResourceDomainRootAction.get().getToken(this, req); 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. * from the {@code doXYZ} method and let Stapler generate a response for you.
*/ */
@Deprecated @Deprecated
public void serveFile(StaplerRequest req, StaplerResponse rsp, FilePath root, String icon, boolean serveDirIndex) throws IOException, ServletException, InterruptedException { public void serveFile(StaplerRequest req, StaplerResponse rsp, FilePath root, String icon, boolean serveDirIndex) throws IOException, javax.servlet.ServletException, InterruptedException {
serveFile(req, rsp, root.toVirtualFile(), icon, serveDirIndex); 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 // handle form submission
String pattern = req.getParameter("pattern"); String pattern = req.getParameter("pattern");
if (pattern == null) 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(); String path = req.getRestOfPath();
if (path.isEmpty()) if (path.isEmpty())
path = "/"; path = "/";
@ -521,7 +528,7 @@ public final class DirectoryBrowserSupport implements HttpResponse {
return "../".repeat(times); 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(); OutputStream outputStream = rsp.getOutputStream();
try (ZipOutputStream zos = new ZipOutputStream(outputStream)) { try (ZipOutputStream zos = new ZipOutputStream(outputStream)) {
zos.setEncoding(Charset.defaultCharset().displayName()); // TODO JENKINS-20663 make this overridable via query parameter zos.setEncoding(Charset.defaultCharset().displayName()); // TODO JENKINS-20663 make this overridable via query parameter

View File

@ -59,7 +59,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.ServletException;
import jenkins.model.CauseOfInterruption; import jenkins.model.CauseOfInterruption;
import jenkins.model.CauseOfInterruption.UserInterruption; import jenkins.model.CauseOfInterruption.UserInterruption;
import jenkins.model.InterruptedBuildAction; import jenkins.model.InterruptedBuildAction;
@ -852,7 +851,7 @@ public class Executor extends Thread implements ModelObject {
*/ */
@RequirePOST @RequirePOST
@Deprecated @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); doStop().generateResponse(req, rsp, this);
} }

View File

@ -25,12 +25,12 @@
package hudson.model; package hudson.model;
import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.CheckForNull;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse; 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;
/** /**
* Represents an error induced by user, encountered during HTTP request processing. * 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; 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) { if (throwable != null) {
req.setAttribute("exception", throwable); req.setAttribute("exception", throwable);
} }
@ -63,7 +63,7 @@ public class Failure extends RuntimeException implements HttpResponse {
} }
@Override @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()); req.setAttribute("message", getMessage());
if (pre) if (pre)
req.setAttribute("pre", true); req.setAttribute("pre", true);

View File

@ -29,17 +29,17 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension; import hudson.Extension;
import hudson.cli.CLICommand; import hudson.cli.CLICommand;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.Objects; import java.util.Objects;
import javax.servlet.ServletException;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.apache.commons.fileupload2.core.FileItem; import org.apache.commons.fileupload2.core.FileItem;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* {@link ParameterDefinition} for doing file upload. * {@link ParameterDefinition} for doing file upload.
@ -65,7 +65,7 @@ public class FileParameterDefinition extends ParameterDefinition {
} }
@Override @Override
public FileParameterValue createValue(StaplerRequest req, JSONObject jo) { public FileParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
FileParameterValue p = req.bindJSON(FileParameterValue.class, jo); FileParameterValue p = req.bindJSON(FileParameterValue.class, jo);
p.setLocation(getName()); p.setLocation(getName());
p.setDescription(getDescription()); p.setDescription(getDescription());
@ -87,7 +87,7 @@ public class FileParameterDefinition extends ParameterDefinition {
} }
@Override @Override
public ParameterValue createValue(StaplerRequest req) { public ParameterValue createValue(StaplerRequest2 req) {
FileItem src; FileItem src;
try { try {
src = req.getFileItem2(getName()); src = req.getFileItem2(getName());

View File

@ -50,8 +50,8 @@ import org.apache.commons.io.FilenameUtils;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse2;
/** /**
* {@link ParameterValue} for {@link FileParameterDefinition}. * {@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(); AbstractBuild build = (AbstractBuild) request.findAncestor(AbstractBuild.class).getObject();
File fileParameter = getFileParameterFolderUnderBuild(build); File fileParameter = getFileParameterFolderUnderBuild(build);
return new DirectoryBrowserSupport(build, new FilePath(fileParameter), Messages.FileParameterValue_IndexTitle(), "folder.png", false); return new DirectoryBrowserSupport(build, new FilePath(fileParameter), Messages.FileParameterValue_IndexTitle(), "folder.png", false);

View File

@ -38,14 +38,16 @@ import hudson.model.listeners.ItemListener;
import hudson.slaves.ComputerListener; import hudson.slaves.ComputerListener;
import hudson.util.CopyOnWriteList; import hudson.util.CopyOnWriteList;
import hudson.util.FormValidation; 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.File;
import java.io.IOException; import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.ParseException; import java.text.ParseException;
import java.util.List; import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.jvnet.hudson.reactor.ReactorException; import org.jvnet.hudson.reactor.ReactorException;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
@ -78,14 +80,36 @@ public class Hudson extends Jenkins {
return (Hudson) Jenkins.get(); return (Hudson) Jenkins.get();
} }
/**
* @since TODO
*/
public Hudson(File root, ServletContext context) throws IOException, InterruptedException, ReactorException { public Hudson(File root, ServletContext context) throws IOException, InterruptedException, ReactorException {
this(root, context, null); 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 { public Hudson(File root, ServletContext context, PluginManager pluginManager) throws IOException, InterruptedException, ReactorException {
super(root, context, pluginManager); 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. * Gets all the installed {@link ItemListener}s.
* *
@ -173,8 +197,12 @@ public class Hudson extends Jenkins {
*/ */
@Deprecated @Deprecated
@RequirePOST @RequirePOST
public synchronized void doQuietDown(StaplerResponse rsp) throws IOException, ServletException { public synchronized void doQuietDown(StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
doQuietDown().generateResponse(null, rsp, this); 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..." * As on 1.267, moved to "/log/rss..."
*/ */
@Deprecated @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(); String qs = req.getQueryString();
rsp.sendRedirect2("./log/rss" + (qs == null ? "" : '?' + qs)); 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. * Define your own check method, instead of relying on this generic one.
*/ */
@Deprecated @Deprecated
public void doFieldCheck(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doFieldCheck(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
doFieldCheck( doFieldCheck(
fixEmpty(req.getParameter("value")), fixEmpty(req.getParameter("value")),
fixEmpty(req.getParameter("type")), fixEmpty(req.getParameter("type")),

View File

@ -41,7 +41,7 @@ import java.util.Collection;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import jenkins.util.io.OnMaster; import jenkins.util.io.OnMaster;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* Basic configuration unit in Hudson. * 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 * 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. * so can be used only during processing client requests.
* *
* @return * @return

View File

@ -32,6 +32,9 @@ import hudson.security.AccessControlled;
import hudson.util.CopyOnWriteMap; import hudson.util.CopyOnWriteMap;
import hudson.util.Function1; import hudson.util.Function1;
import hudson.util.Secret; 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.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -42,8 +45,6 @@ import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamSource;
@ -51,7 +52,9 @@ import jenkins.model.Jenkins;
import jenkins.security.NotReallyRoleSensitiveCallable; import jenkins.security.NotReallyRoleSensitiveCallable;
import jenkins.util.xml.XMLUtils; import jenkins.util.xml.XMLUtils;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
import org.xml.sax.SAXException; 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 * Creates a {@link TopLevelItem} for example from the submission of the {@code /lib/hudson/newFromList/form} tag
* or throws an exception if it fails. * 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); acl.checkPermission(Item.CREATE);
TopLevelItem result; TopLevelItem result;
@ -206,10 +211,22 @@ public abstract class ItemGroupMixIn {
return result; 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}. * 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"; return req.getContextPath() + '/' + result.getUrl() + "configure";
} }

View File

@ -24,8 +24,8 @@
package hudson.model; package hudson.model;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT; import static jakarta.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods; import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.CheckForNull;
@ -69,6 +69,8 @@ import hudson.util.TextFile;
import hudson.widgets.HistoryWidget; import hudson.widgets.HistoryWidget;
import hudson.widgets.HistoryWidget.Adapter; import hudson.widgets.HistoryWidget.Adapter;
import hudson.widgets.Widget; import hudson.widgets.Widget;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.awt.Color; import java.awt.Color;
import java.awt.Paint; import java.awt.Paint;
import java.io.File; import java.io.File;
@ -85,7 +87,6 @@ import java.util.Set;
import java.util.SortedMap; import java.util.SortedMap;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.BuildDiscarder; import jenkins.model.BuildDiscarder;
import jenkins.model.BuildDiscarderProperty; import jenkins.model.BuildDiscarderProperty;
import jenkins.model.DirectlyModifiableTopLevelItemGroup; import jenkins.model.DirectlyModifiableTopLevelItemGroup;
@ -98,6 +99,7 @@ import jenkins.model.RunIdMigrator;
import jenkins.model.lazy.LazyBuildMixIn; import jenkins.model.lazy.LazyBuildMixIn;
import jenkins.scm.RunWithSCM; import jenkins.scm.RunWithSCM;
import jenkins.security.HexStringConfidentialKey; import jenkins.security.HexStringConfidentialKey;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.triggers.SCMTriggerItem; import jenkins.triggers.SCMTriggerItem;
import jenkins.widgets.HasWidgets; import jenkins.widgets.HasWidgets;
import net.sf.json.JSONException; import net.sf.json.JSONException;
@ -122,7 +124,9 @@ import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.stapler.StaplerOverridable; import org.kohsuke.stapler.StaplerOverridable;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
@ -854,9 +858,43 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
return m.get(m.firstKey()); return m.get(m.firstKey());
} }
/**
* @since TODO
*/
@Override
public Object getDynamic(String token, StaplerRequest2 req,
StaplerResponse2 rsp) {
if (Util.isOverridden(Job.class, getClass(), "getDynamic", String.class, StaplerRequest.class, StaplerResponse.class)) {
return getDynamic(token, StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
}
try {
// try to interpret the token as build number
return getBuildByNumber(Integer.parseInt(token));
} catch (NumberFormatException e) {
// try to map that to widgets
for (Widget w : getWidgets()) {
if (w.getUrlName().equals(token))
return w;
}
// is this a permalink?
for (Permalink p : getPermalinks()) {
if (p.getId().equals(token))
return p.resolve(this);
}
return super.getDynamic(token, req, rsp);
}
}
/**
* @deprecated use {@link #getDynamic(String, StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@Override @Override
public Object getDynamic(String token, StaplerRequest req, public Object getDynamic(String token, StaplerRequest req,
StaplerResponse rsp) { StaplerResponse rsp) {
// Intentionally not factoring this out into a common implementation method because it contains a call to super.
try { try {
// try to interpret the token as build number // try to interpret the token as build number
return getBuildByNumber(Integer.parseInt(token)); return getBuildByNumber(Integer.parseInt(token));
@ -1092,7 +1130,7 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
* *
* @since 2.60 * @since 2.60
*/ */
public void doRssChangelog(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doRssChangelog(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
class FeedItem { class FeedItem {
ChangeLogSet.Entry e; ChangeLogSet.Entry e;
int idx; int idx;
@ -1168,8 +1206,29 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
} }
/**
* @since TODO
*/
@Override
public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
if (Util.isOverridden(Job.class, getClass(), "doChildrenContextMenu", StaplerRequest.class, StaplerResponse.class)) {
return doChildrenContextMenu(StaplerRequest.fromStaplerRequest2(request), StaplerResponse.fromStaplerResponse2(response));
} else {
return doChildrenContextMenuImpl(request, response);
}
}
@Override public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { /**
* @deprecated use {@link #doChildrenContextMenu(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
@Override
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
return doChildrenContextMenuImpl(StaplerRequest.toStaplerRequest2(request), StaplerResponse.toStaplerResponse2(response));
}
private ContextMenu doChildrenContextMenuImpl(StaplerRequest2 request, StaplerResponse2 response) {
// not sure what would be really useful here. This needs more thoughts. // not sure what would be really useful here. This needs more thoughts.
// for the time being, I'm starting with permalinks // for the time being, I'm starting with permalinks
ContextMenu menu = new ContextMenu(); ContextMenu menu = new ContextMenu();
@ -1327,8 +1386,8 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
* Accepts submission from the configuration page. * Accepts submission from the configuration page.
*/ */
@POST @POST
public synchronized void doConfigSubmit(StaplerRequest req, public synchronized void doConfigSubmit(StaplerRequest2 req,
StaplerResponse rsp) throws IOException, ServletException, FormException { StaplerResponse2 rsp) throws IOException, ServletException, FormException {
checkPermission(CONFIGURE); checkPermission(CONFIGURE);
description = req.getParameter("description"); description = req.getParameter("description");
@ -1373,15 +1432,32 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
/** /**
* Derived class can override this to perform additional config submission * Derived class can override this to perform additional config submission
* work. * work.
*
* @since TODO
*/ */
protected void submit(StaplerRequest req, StaplerResponse rsp) protected void submit(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException, FormException { throws IOException, ServletException, FormException {
if (Util.isOverridden(Job.class, getClass(), "submit", StaplerRequest.class, StaplerResponse.class)) {
try {
submit(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
}
}
/**
* @deprecated use {@link #submit(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
protected void submit(StaplerRequest req, StaplerResponse rsp)
throws IOException, javax.servlet.ServletException, FormException {
} }
/** /**
* Accepts and serves the job description * Accepts and serves the job description
*/ */
public void doDescription(StaplerRequest req, StaplerResponse rsp) public void doDescription(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException { throws IOException {
if (req.getMethod().equals("GET")) { if (req.getMethod().equals("GET")) {
//read //read
@ -1407,7 +1483,7 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
/** /**
* Returns the image that shows the current buildCommand status. * Returns the image that shows the current buildCommand status.
*/ */
public void doBuildStatus(StaplerRequest req, StaplerResponse rsp) public void doBuildStatus(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException { throws IOException {
rsp.sendRedirect2(req.getContextPath() + "/images/48x48/" + getBuildStatusUrl()); rsp.sendRedirect2(req.getContextPath() + "/images/48x48/" + getBuildStatusUrl());
} }
@ -1577,7 +1653,7 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
@RequirePOST @RequirePOST
public/* not synchronized. see renameTo() */void doDoRename( public/* not synchronized. see renameTo() */void doDoRename(
StaplerRequest req, StaplerResponse rsp) throws IOException, StaplerRequest req, StaplerResponse rsp) throws IOException,
ServletException { javax.servlet.ServletException {
String newName = req.getParameter("newName"); String newName = req.getParameter("newName");
doConfirmRename(newName).generateResponse(req, rsp, null); doConfirmRename(newName).generateResponse(req, rsp, null);
} }
@ -1589,12 +1665,12 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
} }
} }
public void doRssAll(StaplerRequest req, StaplerResponse rsp) public void doRssAll(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException { throws IOException, ServletException {
RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds().newBuilds()); RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds().newBuilds());
} }
public void doRssFailed(StaplerRequest req, StaplerResponse rsp) public void doRssFailed(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException { throws IOException, ServletException {
RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().failureOnly().newBuilds()); RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().failureOnly().newBuilds());
} }

View File

@ -27,6 +27,7 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.ExtensionPoint; import hudson.ExtensionPoint;
import hudson.Launcher; import hudson.Launcher;
import hudson.Util;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import hudson.model.queue.SubTask; import hudson.model.queue.SubTask;
import hudson.tasks.BuildStep; import hudson.tasks.BuildStep;
@ -41,6 +42,7 @@ import jenkins.model.Jenkins;
import jenkins.model.OptionalJobProperty; import jenkins.model.OptionalJobProperty;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
/** /**
@ -183,8 +185,28 @@ public abstract class JobProperty<J extends Job<?, ?>> implements Reconfigurable
return Collections.emptyList(); 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 @Override
public JobProperty<?> reconfigure(StaplerRequest req, JSONObject form) throws FormException { 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); return form == null ? null : getDescriptor().newInstance(req, form);
} }

View File

@ -24,6 +24,7 @@
package hudson.model; package hudson.model;
import hudson.Util;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
@ -34,6 +35,7 @@ import jenkins.model.OptionalJobProperty;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.jvnet.tiger_types.Types; import org.jvnet.tiger_types.Types;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/** /**
* {@link Descriptor} for {@link JobProperty}. * {@link Descriptor} for {@link JobProperty}.
@ -61,6 +63,23 @@ public abstract class JobPropertyDescriptor extends Descriptor<JobProperty<?>> {
* null to avoid setting an instance of {@link JobProperty} to the target project (or just use {@link OptionalJobProperty}) * null to avoid setting an instance of {@link JobProperty} to the target project (or just use {@link OptionalJobProperty})
*/ */
@Override @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 { 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, // 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. // so replace the lack of form data by an empty one.

View File

@ -71,8 +71,8 @@ import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.CommonTokenStream;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.DoNotUse;
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.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -548,7 +548,7 @@ public abstract class Label extends Actionable implements Comparable<Label>, Mod
} }
@Override @Override
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
ContextMenu menu = new ContextMenu(); ContextMenu menu = new ContextMenu();
for (Node node : getNodes()) { for (Node node : getNodes()) {
menu.add(node); menu.add(node);

View File

@ -41,6 +41,8 @@ import hudson.util.HttpResponses;
import hudson.views.ListViewColumn; import hudson.views.ListViewColumn;
import hudson.views.StatusFilter; import hudson.views.StatusFilter;
import hudson.views.ViewJobFilter; import hudson.views.ViewJobFilter;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -55,7 +57,6 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException; import java.util.regex.PatternSyntaxException;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import net.jcip.annotations.GuardedBy; import net.jcip.annotations.GuardedBy;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
@ -67,7 +68,8 @@ import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; 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.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
@ -97,7 +99,7 @@ public class ListView extends View implements DirectlyModifiableView {
/** /**
* Whether to recurse in ItemGroups * Whether to recurse in ItemGroups
*/ */
private boolean recurse; private volatile boolean recurse;
/** /**
* Compiled include pattern from the includeRegex string. * Compiled include pattern from the includeRegex string.
@ -357,7 +359,7 @@ public class ListView extends View implements DirectlyModifiableView {
} }
} }
private boolean needToAddToCurrentView(StaplerRequest req) throws ServletException { private boolean needToAddToCurrentView(StaplerRequest2 req) throws ServletException {
String json = req.getParameter("json"); String json = req.getParameter("json");
if (json != null && !json.isEmpty()) { if (json != null && !json.isEmpty()) {
// Submitted via UI // Submitted via UI
@ -371,7 +373,7 @@ public class ListView extends View implements DirectlyModifiableView {
@Override @Override
@POST @POST
public Item doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public Item doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup(); ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup();
if (ig instanceof ModifiableItemGroup) { if (ig instanceof ModifiableItemGroup) {
TopLevelItem item = ((ModifiableItemGroup<? extends TopLevelItem>) ig).doCreateItem(req, rsp); TopLevelItem item = ((ModifiableItemGroup<? extends TopLevelItem>) ig).doCreateItem(req, rsp);
@ -439,7 +441,32 @@ public class ListView extends View implements DirectlyModifiableView {
* Load view-specific properties here. * Load view-specific properties here.
*/ */
@Override @Override
protected void submit(StaplerRequest req) throws ServletException, FormException, IOException { protected void submit(StaplerRequest2 req) throws ServletException, FormException, IOException {
if (Util.isOverridden(View.class, getClass(), "submit", StaplerRequest.class)) {
try {
submit(StaplerRequest.fromStaplerRequest2(req));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
submitImpl(req);
}
}
/**
* @deprecated use {@link #submit(StaplerRequest2)}
*/
@Deprecated
@Override
protected void submit(StaplerRequest req) throws javax.servlet.ServletException, FormException, IOException {
try {
submitImpl(StaplerRequest.toStaplerRequest2(req));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
private void submitImpl(StaplerRequest2 req) throws ServletException, FormException, IOException {
JSONObject json = req.getSubmittedForm(); JSONObject json = req.getSubmittedForm();
synchronized (this) { synchronized (this) {
recurse = json.optBoolean("recurse", true); recurse = json.optBoolean("recurse", true);

View File

@ -36,8 +36,8 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerFallback; import org.kohsuke.stapler.StaplerFallback;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse2;
/** /**
* Adds the "Manage Jenkins" link to the top page. * Adds the "Manage Jenkins" link to the top page.
@ -70,7 +70,7 @@ public class ManageJenkinsAction implements RootAction, StaplerFallback, ModelOb
} }
@Override @Override
public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws JellyException, IOException { public ContextMenu doContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws JellyException, IOException {
return new ContextMenu().from(this, request, response, "index"); return new ContextMenu().from(this, request, response, "index");
} }
@ -80,7 +80,7 @@ public class ManageJenkinsAction implements RootAction, StaplerFallback, ModelOb
*/ */
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
public void addContextMenuItem(ContextMenu menu, String url, String icon, String iconXml, String text, boolean post, boolean requiresConfirmation, Badge badge, String message) { public void addContextMenuItem(ContextMenu menu, String url, String icon, String iconXml, String text, boolean post, boolean requiresConfirmation, Badge badge, String message) {
if (Stapler.getCurrentRequest().findAncestorObject(this.getClass()) != null || !Util.isSafeToRedirectTo(url)) { if (Stapler.getCurrentRequest2().findAncestorObject(this.getClass()) != null || !Util.isSafeToRedirectTo(url)) {
// Default behavior if the URL is absolute or scheme-relative, or the current object is an ancestor (i.e. would resolve correctly) // Default behavior if the URL is absolute or scheme-relative, or the current object is an ancestor (i.e. would resolve correctly)
menu.add(url, icon, iconXml, text, post, requiresConfirmation, badge, message); menu.add(url, icon, iconXml, text, post, requiresConfirmation, badge, message);
return; return;

View File

@ -24,10 +24,15 @@
package hudson.model; package hudson.model;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException; import jenkins.security.stapler.StaplerNotDispatchable;
import org.kohsuke.stapler.ReflectionUtils;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/** /**
* {@link ItemGroup} that is a general purpose container, which allows users and the rest of the program * {@link ItemGroup} that is a general purpose container, which allows users and the rest of the program
@ -45,5 +50,45 @@ public interface ModifiableItemGroup<T extends Item> extends ItemGroup<T> {
* The request format follows that of {@code &lt;n:form xmlns:n="/lib/form">}. * The request format follows that of {@code &lt;n:form xmlns:n="/lib/form">}.
* *
*/ */
T doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException; @StaplerNotDispatchable
default T doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
if (ReflectionUtils.isOverridden(
ModifiableItemGroup.class,
getClass(),
"doCreateItem",
StaplerRequest.class,
StaplerResponse.class)) {
try {
return doCreateItem(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ ModifiableItemGroup.class.getSimpleName() + ".doCreateItem methods");
}
}
/**
* @deprecated use {@link #doCreateItem(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
default T doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
if (ReflectionUtils.isOverridden(
ModifiableItemGroup.class,
getClass(),
"doCreateItem",
StaplerRequest2.class,
StaplerResponse2.class)) {
try {
return doCreateItem(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ ModifiableItemGroup.class.getSimpleName() + ".doCreateItem methods");
}
}
} }

View File

@ -26,6 +26,7 @@ package hudson.model;
import hudson.util.ChartUtil; import hudson.util.ChartUtil;
import hudson.util.NoOverlapCategoryAxis; import hudson.util.NoOverlapCategoryAxis;
import jakarta.servlet.ServletException;
import java.awt.BasicStroke; import java.awt.BasicStroke;
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;
@ -39,7 +40,6 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart; import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryAxis;
@ -53,7 +53,9 @@ import org.jfree.ui.RectangleInsets;
import org.jvnet.localizer.Localizable; import org.jvnet.localizer.Localizable;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -298,8 +300,8 @@ public class MultiStageTimeSeries implements Serializable {
* Renders this object as an image. * Renders this object as an image.
*/ */
@Override @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 {
ChartUtil.generateGraph(req, rsp, createChart(), 500, 400); ChartUtil.generateGraph(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp), createChart(), 500, 400);
} }
} }

View File

@ -26,18 +26,21 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension; import hudson.Extension;
import hudson.Util;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; 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.interceptor.RequirePOST;
/** /**
@ -64,7 +67,7 @@ public class MyView extends View {
@RequirePOST @RequirePOST
@Override @Override
public TopLevelItem doCreateItem(StaplerRequest req, StaplerResponse rsp) public TopLevelItem doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException { throws IOException, ServletException {
ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup(); ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup();
if (ig instanceof ModifiableItemGroup) { if (ig instanceof ModifiableItemGroup) {
@ -85,7 +88,24 @@ public class MyView extends View {
} }
@Override @Override
protected void submit(StaplerRequest req) throws IOException, ServletException, FormException { protected void submit(StaplerRequest2 req) throws IOException, ServletException, FormException {
if (Util.isOverridden(MyView.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 // noop
} }

View File

@ -35,13 +35,13 @@ import hudson.security.ACL;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import hudson.views.MyViewsTabBar; import hudson.views.MyViewsTabBar;
import hudson.views.ViewsTabBar; import hudson.views.ViewsTabBar;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
@ -54,8 +54,8 @@ import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerFallback; import org.kohsuke.stapler.StaplerFallback;
import org.kohsuke.stapler.StaplerProxy; 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.verb.POST; import org.kohsuke.stapler.verb.POST;
/** /**
@ -196,7 +196,7 @@ public class MyViewsProperty extends UserProperty implements ModifiableViewGroup
} }
@POST @POST
public synchronized void doCreateView(StaplerRequest req, StaplerResponse rsp) public synchronized void doCreateView(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException, ParseException, FormException { throws IOException, ServletException, ParseException, FormException {
checkPermission(View.CREATE); checkPermission(View.CREATE);
addView(View.create(req, rsp, this)); addView(View.create(req, rsp, this));
@ -276,7 +276,7 @@ public class MyViewsProperty extends UserProperty implements ModifiableViewGroup
} }
@Override @Override
public UserProperty reconfigure(StaplerRequest req, JSONObject form) throws FormException { public UserProperty reconfigure(StaplerRequest2 req, JSONObject form) throws FormException {
req.bindJSON(this, form); req.bindJSON(this, form);
return this; return this;
} }

View File

@ -79,6 +79,7 @@ import org.kohsuke.accmod.restrictions.ProtectedExternally;
import org.kohsuke.stapler.BindInterceptor; import org.kohsuke.stapler.BindInterceptor;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
@ -560,8 +561,25 @@ public abstract class Node extends AbstractModelObject implements Reconfigurable
return Jenkins.get().getAuthorizationStrategy().getACL(this); return Jenkins.get().getAuthorizationStrategy().getACL(this);
} }
@Override
public Node reconfigure(@NonNull final StaplerRequest2 req, JSONObject form) throws FormException {
if (Util.isOverridden(Node.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 @Override
public Node reconfigure(@NonNull final StaplerRequest req, JSONObject form) throws FormException { public Node reconfigure(@NonNull final StaplerRequest req, JSONObject form) throws FormException {
return reconfigureImpl(StaplerRequest.toStaplerRequest2(req), form);
}
private Node reconfigureImpl(@NonNull final StaplerRequest2 req, JSONObject form) throws FormException {
if (form == null) return null; if (form == null) return null;
final JSONObject jsonForProperties = form.optJSONObject("nodeProperties"); final JSONObject jsonForProperties = form.optJSONObject("nodeProperties");

View File

@ -6,8 +6,8 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension; import hudson.Extension;
import hudson.model.userproperty.UserPropertyCategory; import hudson.model.userproperty.UserPropertyCategory;
import hudson.util.PersistedList; import hudson.util.PersistedList;
import jakarta.servlet.http.HttpSession;
import java.io.IOException; import java.io.IOException;
import javax.servlet.http.HttpSession;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
@ -70,13 +70,13 @@ public class PaneStatusProperties extends UserProperty implements Saveable {
@Override @Override
public boolean isCollapsed(String paneId) { public boolean isCollapsed(String paneId) {
final HttpSession session = Stapler.getCurrentRequest().getSession(); final HttpSession session = Stapler.getCurrentRequest2().getSession();
return session.getAttribute(format(attribute, paneId)) != null; return session.getAttribute(format(attribute, paneId)) != null;
} }
@Override @Override
public boolean toggleCollapsed(String paneId) { public boolean toggleCollapsed(String paneId) {
final HttpSession session = Stapler.getCurrentRequest().getSession(); final HttpSession session = Stapler.getCurrentRequest2().getSession();
final String property = format(attribute, paneId); final String property = format(attribute, paneId);
final Object collapsed = session.getAttribute(property); final Object collapsed = session.getAttribute(property);
if (collapsed == null) { if (collapsed == null) {

View File

@ -41,6 +41,7 @@ import jenkins.model.Jenkins;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -59,7 +60,7 @@ import org.kohsuke.stapler.export.ExportedBean;
* <p> * <p>
* Three classes are used to model build parameters. First is the * Three classes are used to model build parameters. First is the
* {@link ParameterDescriptor}, which tells Hudson what kind of implementations are * {@link ParameterDescriptor}, which tells Hudson what kind of implementations are
* available. From {@link ParameterDescriptor#newInstance(StaplerRequest, JSONObject)}, * available. From {@link ParameterDescriptor#newInstance(StaplerRequest2, JSONObject)},
* Hudson creates {@link ParameterDefinition}s based on the job configuration. * Hudson creates {@link ParameterDefinition}s based on the job configuration.
* For example, if the user defines two string parameters "database-type" and * For example, if the user defines two string parameters "database-type" and
* "appserver-type", we'll get two {@link StringParameterDefinition} instances * "appserver-type", we'll get two {@link StringParameterDefinition} instances
@ -69,7 +70,7 @@ import org.kohsuke.stapler.export.ExportedBean;
* When a job is configured with {@link ParameterDefinition} (or more precisely, * When a job is configured with {@link ParameterDefinition} (or more precisely,
* {@link ParametersDefinitionProperty}, which in turns retains {@link ParameterDefinition}s), * {@link ParametersDefinitionProperty}, which in turns retains {@link ParameterDefinition}s),
* user would have to enter the values for the defined build parameters. * user would have to enter the values for the defined build parameters.
* The {@link #createValue(StaplerRequest, JSONObject)} method is used to convert this * The {@link #createValue(StaplerRequest2, JSONObject)} method is used to convert this
* form submission into {@link ParameterValue} objects, which are then accessible * form submission into {@link ParameterValue} objects, which are then accessible
* during a build. * during a build.
* *
@ -85,12 +86,12 @@ import org.kohsuke.stapler.export.ExportedBean;
* <h3>config.jelly</h3> * <h3>config.jelly</h3>
* {@link ParameterDefinition} class uses {@code config.jelly} to contribute a form * {@link ParameterDefinition} class uses {@code config.jelly} to contribute a form
* fragment in the job configuration screen. Values entered there are fed back to * fragment in the job configuration screen. Values entered there are fed back to
* {@link ParameterDescriptor#newInstance(StaplerRequest, JSONObject)} to create {@link ParameterDefinition}s. * {@link ParameterDescriptor#newInstance(StaplerRequest2, JSONObject)} to create {@link ParameterDefinition}s.
* *
* <h3>index.jelly</h3> * <h3>index.jelly</h3>
* The {@code index.jelly} view contributes a form fragment in the page where the user * The {@code index.jelly} view contributes a form fragment in the page where the user
* enters actual values of parameters for a build. The result of this form submission * enters actual values of parameters for a build. The result of this form submission
* is then fed to {@link ParameterDefinition#createValue(StaplerRequest, JSONObject)} to * is then fed to {@link ParameterDefinition#createValue(StaplerRequest2, JSONObject)} to
* create {@link ParameterValue}s. * create {@link ParameterValue}s.
* *
* @see StringParameterDefinition * @see StringParameterDefinition
@ -183,14 +184,37 @@ public abstract class ParameterDefinition implements
* and submits it to the server. * and submits it to the server.
*/ */
@CheckForNull @CheckForNull
public abstract ParameterValue createValue(StaplerRequest req, JSONObject jo); public /* abstract */ ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
return Util.ifOverridden(
() -> createValue(StaplerRequest.fromStaplerRequest2(req), jo),
ParameterDefinition.class,
getClass(),
"createValue",
StaplerRequest.class,
JSONObject.class);
}
/**
* @deprecated use {@link #createValue(StaplerRequest2, JSONObject)}
*/
@CheckForNull
@Deprecated
public ParameterValue createValue(StaplerRequest req, JSONObject jo) {
return Util.ifOverridden(
() -> createValue(StaplerRequest.toStaplerRequest2(req), jo),
ParameterDefinition.class,
getClass(),
"createValue",
StaplerRequest2.class,
JSONObject.class);
}
/** /**
* Create a parameter value from a GET with query string. * Create a parameter value from a GET with query string.
* If no value is available in the request, it returns a default value if possible, or null. * If no value is available in the request, it returns a default value if possible, or null.
* *
* <p> * <p>
* Unlike {@link #createValue(StaplerRequest, JSONObject)}, this method is intended to support * Unlike {@link #createValue(StaplerRequest2, JSONObject)}, this method is intended to support
* the programmatic POST-ing of the build URL. This form is less expressive (as it doesn't support * the programmatic POST-ing of the build URL. This form is less expressive (as it doesn't support
* the tree form), but it's more scriptable. * the tree form), but it's more scriptable.
* *
@ -202,8 +226,28 @@ public abstract class ParameterDefinition implements
* If the parameter is deemed required but was missing in the submission. * If the parameter is deemed required but was missing in the submission.
*/ */
@CheckForNull @CheckForNull
public abstract ParameterValue createValue(StaplerRequest req); public /* abstract */ ParameterValue createValue(StaplerRequest2 req) {
return Util.ifOverridden(
() -> createValue(StaplerRequest.fromStaplerRequest2(req)),
ParameterDefinition.class,
getClass(),
"createValue",
StaplerRequest.class);
}
/**
* @deprecated use {@link #createValue(StaplerRequest2)}
*/
@CheckForNull
@Deprecated
public ParameterValue createValue(StaplerRequest req) {
return Util.ifOverridden(
() -> createValue(StaplerRequest.toStaplerRequest2(req)),
ParameterDefinition.class,
getClass(),
"createValue",
StaplerRequest2.class);
}
/** /**
* Create a parameter value from the string given in the CLI. * Create a parameter value from the string given in the CLI.

View File

@ -43,14 +43,14 @@ import jenkins.security.stapler.StaplerAccessibleType;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
/** /**
* A value for a parameter in a build. * A value for a parameter in a build.
* *
* Created by {@link ParameterDefinition#createValue(StaplerRequest, JSONObject)} for * Created by {@link ParameterDefinition#createValue(StaplerRequest2, JSONObject)} for
* a particular build (although this 'owner' build object is passed in for every method * a particular build (although this 'owner' build object is passed in for every method
* call as a parameter so that the parameter won't have to persist it.) * call as a parameter so that the parameter won't have to persist it.)
* *
@ -240,7 +240,7 @@ public abstract class ParameterValue implements Serializable {
* @deprecated since 2008-09-20. * @deprecated since 2008-09-20.
* parameter definition may change any time. So if you find yourself * parameter definition may change any time. So if you find yourself
* in need of accessing the information from {@link ParameterDefinition}, * in need of accessing the information from {@link ParameterDefinition},
* instead copy them in {@link ParameterDefinition#createValue(StaplerRequest, JSONObject)} * instead copy them in {@link ParameterDefinition#createValue(StaplerRequest2, JSONObject)}
* into {@link ParameterValue}. * into {@link ParameterValue}.
*/ */
@Deprecated @Deprecated

View File

@ -25,8 +25,8 @@
package hudson.model; package hudson.model;
import static javax.servlet.http.HttpServletResponse.SC_CREATED; import static jakarta.servlet.http.HttpServletResponse.SC_CREATED;
import static javax.servlet.http.HttpServletResponse.SC_SEE_OTHER; import static jakarta.servlet.http.HttpServletResponse.SC_SEE_OTHER;
import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
@ -35,6 +35,8 @@ import hudson.Util;
import hudson.model.Queue.WaitingItem; import hudson.model.Queue.WaitingItem;
import hudson.model.queue.ScheduleResult; import hudson.model.queue.ScheduleResult;
import hudson.util.AlternativeUiTextProvider; import hudson.util.AlternativeUiTextProvider;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.AbstractList; import java.util.AbstractList;
import java.util.ArrayList; import java.util.ArrayList;
@ -43,7 +45,6 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.OptionalJobProperty; import jenkins.model.OptionalJobProperty;
import jenkins.model.ParameterizedJobMixIn; import jenkins.model.ParameterizedJobMixIn;
@ -56,7 +57,9 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -133,19 +136,23 @@ public class ParametersDefinitionProperty extends OptionalJobProperty<Job<?, ?>>
return (AbstractProject<?, ?>) owner; return (AbstractProject<?, ?>) owner;
} }
/** @deprecated use {@link #_doBuild(StaplerRequest, StaplerResponse, TimeDuration)} */ /** @deprecated use {@link #_doBuild(StaplerRequest2, StaplerResponse2, TimeDuration)} */
@Deprecated @Deprecated
public void _doBuild(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void _doBuild(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
_doBuild(req, rsp, TimeDuration.fromString(req.getParameter("delay"))); try {
_doBuild(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), TimeDuration.fromString(req.getParameter("delay")));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} }
/** /**
* Interprets the form submission and schedules a build for a parameterized job. * Interprets the form submission and schedules a build for a parameterized job.
* *
* <p> * <p>
* This method is supposed to be invoked from {@link ParameterizedJobMixIn#doBuild(StaplerRequest, StaplerResponse, TimeDuration)}. * This method is supposed to be invoked from {@link ParameterizedJobMixIn#doBuild(StaplerRequest2, StaplerResponse2, TimeDuration)}.
*/ */
public void _doBuild(StaplerRequest req, StaplerResponse rsp, @QueryParameter TimeDuration delay) throws IOException, ServletException { public void _doBuild(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter TimeDuration delay) throws IOException, ServletException {
if (delay == null) if (delay == null)
delay = new TimeDuration(TimeUnit.MILLISECONDS.convert(getJob().getQuietPeriod(), TimeUnit.SECONDS)); delay = new TimeDuration(TimeUnit.MILLISECONDS.convert(getJob().getQuietPeriod(), TimeUnit.SECONDS));
@ -185,13 +192,17 @@ public class ParametersDefinitionProperty extends OptionalJobProperty<Job<?, ?>>
rsp.sendRedirect("."); rsp.sendRedirect(".");
} }
/** @deprecated use {@link #buildWithParameters(StaplerRequest, StaplerResponse, TimeDuration)} */ /** @deprecated use {@link #buildWithParameters(StaplerRequest2, StaplerResponse2, TimeDuration)} */
@Deprecated @Deprecated
public void buildWithParameters(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void buildWithParameters(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
buildWithParameters(req, rsp, TimeDuration.fromString(req.getParameter("delay"))); try {
buildWithParameters(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), TimeDuration.fromString(req.getParameter("delay")));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} }
public void buildWithParameters(StaplerRequest req, StaplerResponse rsp, @CheckForNull TimeDuration delay) throws IOException, ServletException { public void buildWithParameters(StaplerRequest2 req, StaplerResponse2 rsp, @CheckForNull TimeDuration delay) throws IOException, ServletException {
List<ParameterValue> values = new ArrayList<>(); List<ParameterValue> values = new ArrayList<>();
for (ParameterDefinition d : parameterDefinitions) { for (ParameterDefinition d : parameterDefinitions) {
ParameterValue value = d.createValue(req); ParameterValue value = d.createValue(req);
@ -232,7 +243,7 @@ public class ParametersDefinitionProperty extends OptionalJobProperty<Job<?, ?>>
@Symbol("parameters") @Symbol("parameters")
public static class DescriptorImpl extends OptionalJobPropertyDescriptor { public static class DescriptorImpl extends OptionalJobPropertyDescriptor {
@Override @Override
public ParametersDefinitionProperty newInstance(StaplerRequest req, JSONObject formData) throws FormException { public ParametersDefinitionProperty newInstance(StaplerRequest2 req, JSONObject formData) throws FormException {
ParametersDefinitionProperty prop = (ParametersDefinitionProperty) super.newInstance(req, formData); ParametersDefinitionProperty prop = (ParametersDefinitionProperty) super.newInstance(req, formData);
if (prop != null && prop.parameterDefinitions.isEmpty()) { if (prop != null && prop.parameterDefinitions.isEmpty()) {
return null; return null;

View File

@ -36,7 +36,7 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* Parameter whose value is a {@link Secret} and is hidden from the UI. * Parameter whose value is a {@link Secret} and is hidden from the UI.
@ -80,7 +80,7 @@ public class PasswordParameterDefinition extends SimpleParameterDefinition {
} }
@Override @Override
public PasswordParameterValue createValue(StaplerRequest req, JSONObject jo) { public PasswordParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
PasswordParameterValue value = req.bindJSON(PasswordParameterValue.class, jo); PasswordParameterValue value = req.bindJSON(PasswordParameterValue.class, jo);
if (value.getValue().getPlainText().equals(DEFAULT_VALUE)) { if (value.getValue().getPlainText().equals(DEFAULT_VALUE)) {
value = new PasswordParameterValue(getName(), getDefaultValue()); value = new PasswordParameterValue(getName(), getDefaultValue());

View File

@ -40,6 +40,8 @@ import hudson.tasks.Publisher;
import hudson.triggers.SCMTrigger; import hudson.triggers.SCMTrigger;
import hudson.triggers.Trigger; import hudson.triggers.Trigger;
import hudson.util.DescribableList; import hudson.util.DescribableList;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
@ -49,11 +51,12 @@ import java.util.Set;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.triggers.SCMTriggerItem; import jenkins.triggers.SCMTriggerItem;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/** /**
* Buildable software project. * Buildable software project.
@ -223,10 +226,39 @@ public abstract class Project<P extends Project<P, B>, B extends Build<P, B>>
// actions // actions
// //
// //
@Override
protected void submit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException {
super.submit(req, rsp);
/**
* @since TODO
*/
@Override
protected void submit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
if (Util.isOverridden(Project.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 new javax.servlet.ServletException(e);
}
}
private void submitImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
JSONObject json = req.getSubmittedForm(); JSONObject json = req.getSubmittedForm();
getBuildWrappersList().rebuild(req, json, BuildWrappers.getFor(this)); getBuildWrappersList().rebuild(req, json, BuildWrappers.getFor(this));

View File

@ -29,9 +29,10 @@ import hudson.Extension;
import hudson.Util; import hudson.Util;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
@ -39,7 +40,8 @@ import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerFallback; import org.kohsuke.stapler.StaplerFallback;
import org.kohsuke.stapler.StaplerRequest; 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.interceptor.RequirePOST;
/** /**
@ -98,7 +100,32 @@ public class ProxyView extends View implements StaplerFallback {
} }
@Override @Override
protected void submit(StaplerRequest req) throws IOException, ServletException, FormException { protected void submit(StaplerRequest2 req) throws IOException, ServletException, FormException {
if (Util.isOverridden(ProxyView.class, getClass(), "submit", StaplerRequest.class)) {
try {
submit(StaplerRequest.fromStaplerRequest2(req));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
submitImpl(req);
}
}
/**
* @deprecated use {@link #submit(StaplerRequest2)}
*/
@Deprecated
@Override
protected void submit(StaplerRequest req) throws IOException, javax.servlet.ServletException, FormException {
try {
submitImpl(StaplerRequest.toStaplerRequest2(req));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
private void submitImpl(StaplerRequest2 req) throws ServletException, FormException {
String proxiedViewName = req.getSubmittedForm().getString("proxiedViewName"); String proxiedViewName = req.getSubmittedForm().getString("proxiedViewName");
if (Jenkins.get().getView(proxiedViewName) == null) { if (Jenkins.get().getView(proxiedViewName) == null) {
throw new FormException("Not an existing global view", "proxiedViewName"); throw new FormException("Not an existing global view", "proxiedViewName");
@ -108,7 +135,7 @@ public class ProxyView extends View implements StaplerFallback {
@RequirePOST @RequirePOST
@Override @Override
public Item doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public Item doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
return getProxiedView().doCreateItem(req, rsp); return getProxiedView().doCreateItem(req, rsp);
} }
@ -139,7 +166,7 @@ public class ProxyView extends View implements StaplerFallback {
@Override @Override
public boolean isInstantiable() { public boolean isInstantiable() {
// doesn't make sense to add a ProxyView to the global views // doesn't make sense to add a ProxyView to the global views
return !(Stapler.getCurrentRequest().findAncestorObject(ViewGroup.class) instanceof Jenkins); return !(Stapler.getCurrentRequest2().findAncestorObject(ViewGroup.class) instanceof Jenkins);
} }
} }

View File

@ -76,6 +76,8 @@ import hudson.triggers.SafeTimerTask;
import hudson.util.ConsistentHash; import hudson.util.ConsistentHash;
import hudson.util.Futures; import hudson.util.Futures;
import hudson.util.XStream2; import hudson.util.XStream2;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@ -107,8 +109,6 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.queue.AsynchronousExecution; import jenkins.model.queue.AsynchronousExecution;
import jenkins.model.queue.CompositeCauseOfBlockage; import jenkins.model.queue.CompositeCauseOfBlockage;
@ -130,7 +130,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
@ -2415,7 +2415,7 @@ public class Queue extends ResourceController implements Saveable {
} }
} }
public HttpResponse doIndex(StaplerRequest req) { public HttpResponse doIndex(StaplerRequest2 req) {
return HttpResponses.text("Queue item exists. For details check, for example, " + req.getRequestURI() + "api/json?tree=cancelled,executable[url]"); return HttpResponses.text("Queue item exists. For details check, for example, " + req.getRequestURI() + "api/json?tree=cancelled,executable[url]");
} }

View File

@ -26,13 +26,17 @@ package hudson.model;
import hudson.FeedAdapter; import hudson.FeedAdapter;
import hudson.util.RunList; import hudson.util.RunList;
import io.jenkins.servlet.ServletExceptionWrapper;
import io.jenkins.servlet.http.HttpServletResponseWrapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/** /**
* RSS related code. * RSS related code.
@ -52,8 +56,9 @@ public final class RSS {
* Entries to be listed in the RSS feed. * Entries to be listed in the RSS feed.
* @param adapter * @param adapter
* Controls how to render entries to RSS. * Controls how to render entries to RSS.
* @since TODO
*/ */
public static <E> void forwardToRss(String title, String url, Collection<? extends E> entries, FeedAdapter<E> adapter, StaplerRequest req, HttpServletResponse rsp) throws IOException, ServletException { public static <E> void forwardToRss(String title, String url, Collection<? extends E> entries, FeedAdapter<E> adapter, StaplerRequest2 req, HttpServletResponse rsp) throws IOException, ServletException {
req.setAttribute("adapter", adapter); req.setAttribute("adapter", adapter);
req.setAttribute("title", title); req.setAttribute("title", title);
req.setAttribute("url", url); req.setAttribute("url", url);
@ -72,6 +77,18 @@ public final class RSS {
req.getView(Jenkins.get(), "/hudson/" + flavor + ".jelly").forward(req, rsp); req.getView(Jenkins.get(), "/hudson/" + flavor + ".jelly").forward(req, rsp);
} }
/**
* @deprecated use {@link #forwardToRss(String, String, Collection, FeedAdapter, StaplerRequest2, HttpServletResponse)}
*/
@Deprecated
public static <E> void forwardToRss(String title, String url, Collection<? extends E> entries, FeedAdapter<E> adapter, StaplerRequest req, javax.servlet.http.HttpServletResponse rsp) throws IOException, javax.servlet.ServletException {
try {
forwardToRss(title, url, entries, adapter, StaplerRequest.toStaplerRequest2(req), HttpServletResponseWrapper.toJakartaHttpServletResponse(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
/** /**
* Sends the RSS feed to the client using a default feed adapter. * Sends the RSS feed to the client using a default feed adapter.
* *
@ -81,10 +98,23 @@ public final class RSS {
* URL of the model object that owns this feed. Relative to the context root. * URL of the model object that owns this feed. Relative to the context root.
* @param runList * @param runList
* Entries to be listed in the RSS feed. * Entries to be listed in the RSS feed.
* @since TODO
*/
public static void rss(StaplerRequest2 req, StaplerResponse2 rsp, String title, String url, RunList runList) throws IOException, ServletException {
rss(req, rsp, title, url, runList, null);
}
/**
* @deprecated use {@link #rss(StaplerRequest2, StaplerResponse2, String, String, RunList)}
* @since 2.215 * @since 2.215
*/ */
public static void rss(StaplerRequest req, StaplerResponse rsp, String title, String url, RunList runList) throws IOException, ServletException { @Deprecated
rss(req, rsp, title, url, runList, null); public static void rss(StaplerRequest req, StaplerResponse rsp, String title, String url, RunList runList) throws IOException, javax.servlet.ServletException {
try {
rss(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), title, url, runList, null);
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} }
/** /**
@ -98,10 +128,23 @@ public final class RSS {
* Entries to be listed in the RSS feed. * Entries to be listed in the RSS feed.
* @param feedAdapter * @param feedAdapter
* Controls how to render entries to RSS. * Controls how to render entries to RSS.
* @since 2.215 * @since TODO
*/ */
public static void rss(StaplerRequest req, StaplerResponse rsp, String title, String url, RunList runList, FeedAdapter<Run> feedAdapter) throws IOException, ServletException { public static void rss(StaplerRequest2 req, StaplerResponse2 rsp, String title, String url, RunList runList, FeedAdapter<Run> feedAdapter) throws IOException, ServletException {
final FeedAdapter<Run> feedAdapter_ = feedAdapter == null ? Run.FEED_ADAPTER : feedAdapter; final FeedAdapter<Run> feedAdapter_ = feedAdapter == null ? Run.FEED_ADAPTER : feedAdapter;
forwardToRss(title, url, runList, feedAdapter_, req, rsp); forwardToRss(title, url, runList, feedAdapter_, req, rsp);
} }
/**
* @deprecated use {@link #rss(StaplerRequest2, StaplerResponse2, String, String, RunList, FeedAdapter)}
* @since 2.215
*/
@Deprecated
public static void rss(StaplerRequest req, StaplerResponse rsp, String title, String url, RunList runList, FeedAdapter<Run> feedAdapter) throws IOException, javax.servlet.ServletException {
try {
rss(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), title, url, runList, feedAdapter);
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
} }

View File

@ -26,10 +26,13 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Util;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import hudson.slaves.NodeProperty; import hudson.slaves.NodeProperty;
import jenkins.security.stapler.StaplerNotDispatchable;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/** /**
* Marks modern {@link Describable}s that allow the current instances to pass information down to the next * Marks modern {@link Describable}s that allow the current instances to pass information down to the next
@ -44,7 +47,7 @@ import org.kohsuke.stapler.StaplerRequest;
* <strong>Invisible Property:</strong> * <strong>Invisible Property:</strong>
* This mechanism can be used to create an entirely invisible {@link Describable}, which is handy * This mechanism can be used to create an entirely invisible {@link Describable}, which is handy
* for {@link NodeProperty}, {@link JobProperty}, etc. To do so, define an empty config.jelly to prevent it from * for {@link NodeProperty}, {@link JobProperty}, etc. To do so, define an empty config.jelly to prevent it from
* showing up in the config UI, then implement {@link #reconfigure(StaplerRequest, JSONObject)} * showing up in the config UI, then implement {@link #reconfigure(StaplerRequest2, JSONObject)}
* and simply return {@code this}. * and simply return {@code this}.
* *
* <p> * <p>
@ -78,5 +81,29 @@ public interface ReconfigurableDescribable<T extends ReconfigurableDescribable<T
* @return * @return
* The new instance. To not to create an instance of a describable, return null. * The new instance. To not to create an instance of a describable, return null.
*/ */
@CheckForNull T reconfigure(@NonNull StaplerRequest req, @CheckForNull JSONObject form) throws FormException; @CheckForNull
@StaplerNotDispatchable
default T reconfigure(@NonNull StaplerRequest2 req, @CheckForNull JSONObject form) throws FormException {
if (Util.isOverridden(ReconfigurableDescribable.class, getClass(), "reconfigure", StaplerRequest.class, JSONObject.class)) {
return reconfigure(StaplerRequest.fromStaplerRequest2(req), form);
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ ReconfigurableDescribable.class.getSimpleName() + ".reconfigure methods");
}
}
/**
* @deprecated use {@link #reconfigure(StaplerRequest2, JSONObject)}
*/
@CheckForNull
@Deprecated
@StaplerNotDispatchable
default T reconfigure(@NonNull StaplerRequest req, @CheckForNull JSONObject form) throws FormException {
if (Util.isOverridden(ReconfigurableDescribable.class, getClass(), "reconfigure", StaplerRequest2.class, JSONObject.class)) {
return reconfigure(StaplerRequest.toStaplerRequest2(req), form);
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ ReconfigurableDescribable.class.getSimpleName() + ".reconfigure methods");
}
}
} }

View File

@ -68,6 +68,9 @@ import hudson.util.FormApply;
import hudson.util.LogTaskListener; import hudson.util.LogTaskListener;
import hudson.util.ProcessTree; import hudson.util.ProcessTree;
import hudson.util.XStream2; import hudson.util.XStream2;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
@ -106,8 +109,6 @@ import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.ArtifactManager; import jenkins.model.ArtifactManager;
import jenkins.model.ArtifactManagerConfiguration; import jenkins.model.ArtifactManagerConfiguration;
import jenkins.model.ArtifactManagerFactory; import jenkins.model.ArtifactManagerFactory;
@ -119,6 +120,7 @@ import jenkins.model.StandardArtifactManager;
import jenkins.model.lazy.BuildReference; import jenkins.model.lazy.BuildReference;
import jenkins.model.lazy.LazyBuildMixIn; import jenkins.model.lazy.LazyBuildMixIn;
import jenkins.security.MasterToSlaveCallable; import jenkins.security.MasterToSlaveCallable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import jenkins.util.VirtualFile; import jenkins.util.VirtualFile;
import jenkins.util.io.OnMaster; import jenkins.util.io.OnMaster;
@ -132,7 +134,9 @@ import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
@ -1043,7 +1047,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
// RUN may be accessed using permalinks, as "/lastSuccessful" or other, so try to retrieve this base URL // RUN may be accessed using permalinks, as "/lastSuccessful" or other, so try to retrieve this base URL
// looking for "this" in the current request ancestors // looking for "this" in the current request ancestors
// @see also {@link AbstractItem#getUrl} // @see also {@link AbstractItem#getUrl}
StaplerRequest req = Stapler.getCurrentRequest(); StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req != null) { if (req != null) {
String seed = Functions.getNearestAncestorUrl(req, this); String seed = Functions.getNearestAncestorUrl(req, this);
if (seed != null) { if (seed != null) {
@ -2157,7 +2161,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
return new String(byteArray, getCharset()); return new String(byteArray, getCharset());
} }
public void doBuildStatus(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doBuildStatus(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
rsp.sendRedirect2(req.getContextPath() + "/images/48x48/" + getBuildStatusUrl()); rsp.sendRedirect2(req.getContextPath() + "/images/48x48/" + getBuildStatusUrl());
} }
@ -2260,7 +2264,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
/** /**
* Returns the build number in the body. * Returns the build number in the body.
*/ */
public void doBuildNumber(StaplerResponse rsp) throws IOException { public void doBuildNumber(StaplerResponse2 rsp) throws IOException {
rsp.setContentType("text/plain"); rsp.setContentType("text/plain");
rsp.setCharacterEncoding("US-ASCII"); rsp.setCharacterEncoding("US-ASCII");
rsp.setStatus(HttpServletResponse.SC_OK); rsp.setStatus(HttpServletResponse.SC_OK);
@ -2270,7 +2274,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
/** /**
* Returns the build time stamp in the body. * Returns the build time stamp in the body.
*/ */
public void doBuildTimestamp(StaplerRequest req, StaplerResponse rsp, @QueryParameter String format) throws IOException { public void doBuildTimestamp(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter String format) throws IOException {
rsp.setContentType("text/plain"); rsp.setContentType("text/plain");
rsp.setCharacterEncoding("US-ASCII"); rsp.setCharacterEncoding("US-ASCII");
rsp.setStatus(HttpServletResponse.SC_OK); rsp.setStatus(HttpServletResponse.SC_OK);
@ -2282,8 +2286,27 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
/** /**
* Sends out the raw console output. * Sends out the raw console output.
*
* @since TODO
*/ */
public void doConsoleText(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
if (Util.isOverridden(Run.class, getClass(), "doConsoleText", StaplerRequest.class, StaplerResponse.class)) {
doConsoleText(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} else {
doConsoleTextImpl(req, rsp);
}
}
/**
* @deprecated use {@link #doConsoleText(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
public void doConsoleText(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doConsoleText(StaplerRequest req, StaplerResponse rsp) throws IOException {
doConsoleTextImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
}
private void doConsoleTextImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
rsp.setContentType("text/plain;charset=UTF-8"); rsp.setContentType("text/plain;charset=UTF-8");
try (InputStream input = getLogInputStream(); try (InputStream input = getLogInputStream();
OutputStream os = rsp.getOutputStream(); OutputStream os = rsp.getOutputStream();
@ -2299,7 +2322,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
*/ */
@Deprecated @Deprecated
public void doProgressiveLog(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doProgressiveLog(StaplerRequest req, StaplerResponse rsp) throws IOException {
getLogText().doProgressText(req, rsp); getLogText().doProgressText(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
} }
/** /**
@ -2320,7 +2343,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
} }
@RequirePOST @RequirePOST
public void doToggleLogKeep(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doToggleLogKeep(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
keepLog(!keepLog); keepLog(!keepLog);
rsp.forwardToPreviousPage(req); rsp.forwardToPreviousPage(req);
} }
@ -2341,9 +2364,37 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
/** /**
* Deletes the build when the button is pressed. * Deletes the build when the button is pressed.
*
* @since TODO
*/ */
@RequirePOST @RequirePOST
public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doDoDelete(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
if (Util.isOverridden(Run.class, getClass(), "doDoDelete", StaplerRequest.class, StaplerResponse.class)) {
try {
doDoDelete(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
return;
} else {
doDoDeleteImpl(req, rsp);
}
}
/**
* @deprecated use {@link #doDoDelete(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
try {
doDoDeleteImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
private void doDoDeleteImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
checkPermission(DELETE); checkPermission(DELETE);
// We should not simply delete the build if it has been explicitly // We should not simply delete the build if it has been explicitly
@ -2376,7 +2427,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
* Accepts the new description. * Accepts the new description.
*/ */
@RequirePOST @RequirePOST
public synchronized void doSubmitDescription(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public synchronized void doSubmitDescription(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
setDescription(req.getParameter("description")); setDescription(req.getParameter("description"));
rsp.sendRedirect("."); // go to the top page rsp.sendRedirect("."); // go to the top page
} }
@ -2507,7 +2558,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
} }
@POST @POST
public @NonNull HttpResponse doConfigSubmit(StaplerRequest req) throws IOException, ServletException, FormException { public @NonNull HttpResponse doConfigSubmit(StaplerRequest2 req) throws IOException, ServletException, FormException {
checkPermission(UPDATE); checkPermission(UPDATE);
try (BulkChange bc = new BulkChange(this)) { try (BulkChange bc = new BulkChange(this)) {
JSONObject json = req.getSubmittedForm(); JSONObject json = req.getSubmittedForm();
@ -2625,9 +2676,27 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
} }
} }
@Override
public Object getDynamic(String token, StaplerRequest2 req, StaplerResponse2 rsp) {
if (Util.isOverridden(Run.class, getClass(), "getDynamic", String.class, StaplerRequest.class, StaplerResponse.class)) {
return getDynamic(token, StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} else {
Object returnedResult = super.getDynamic(token, req, rsp);
return getDynamicImpl(token, returnedResult);
}
}
/**
* @deprecated use {@link #getDynamic(String, StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@Override @Override
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) { public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
Object returnedResult = super.getDynamic(token, req, rsp); Object returnedResult = super.getDynamic(token, req, rsp);
return getDynamicImpl(token, returnedResult);
}
private Object getDynamicImpl(String token, Object returnedResult) {
if (returnedResult == null) { if (returnedResult == null) {
//check transient actions too //check transient actions too
for (Action action : getTransientActions()) { for (Action action : getTransientActions()) {
@ -2669,7 +2738,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
public static class RedirectUp { public static class RedirectUp {
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doDynamic(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
// Compromise to handle both browsers (auto-redirect) and programmatic access // Compromise to handle both browsers (auto-redirect) and programmatic access
// (want accurate 404 response).. send 404 with javascript to redirect browsers. // (want accurate 404 response).. send 404 with javascript to redirect browsers.
rsp.setStatus(HttpServletResponse.SC_NOT_FOUND); rsp.setStatus(HttpServletResponse.SC_NOT_FOUND);

View File

@ -38,7 +38,7 @@ import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
public class RunParameterDefinition extends SimpleParameterDefinition { public class RunParameterDefinition extends SimpleParameterDefinition {
@ -155,7 +155,7 @@ public class RunParameterDefinition extends SimpleParameterDefinition {
} }
@Override @Override
public ParameterDefinition newInstance(StaplerRequest req, JSONObject formData) throws FormException { public ParameterDefinition newInstance(StaplerRequest2 req, JSONObject formData) throws FormException {
return req.bindJSON(RunParameterDefinition.class, formData); return req.bindJSON(RunParameterDefinition.class, formData);
} }
@ -202,7 +202,7 @@ public class RunParameterDefinition extends SimpleParameterDefinition {
} }
@Override @Override
public ParameterValue createValue(StaplerRequest req, JSONObject jo) { public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
RunParameterValue value = req.bindJSON(RunParameterValue.class, jo); RunParameterValue value = req.bindJSON(RunParameterValue.class, jo);
value.setDescription(getDescription()); value.setDescription(getDescription());
return value; return value;

View File

@ -5,7 +5,7 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.cli.CLICommand; import hudson.cli.CLICommand;
import java.io.IOException; import java.io.IOException;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* Convenient base class for {@link ParameterDefinition} whose value can be represented in a context-independent single string token. * Convenient base class for {@link ParameterDefinition} whose value can be represented in a context-independent single string token.
@ -31,7 +31,7 @@ public abstract class SimpleParameterDefinition extends ParameterDefinition {
public abstract ParameterValue createValue(String value); public abstract ParameterValue createValue(String value);
@Override @Override
public final ParameterValue createValue(StaplerRequest req) { public final ParameterValue createValue(StaplerRequest2 req) {
String[] value = req.getParameterValues(getName()); String[] value = req.getParameterValues(getName());
if (value == null) { if (value == null) {
return getDefaultParameterValue(); return getDefaultParameterValue();

View File

@ -51,6 +51,7 @@ import hudson.slaves.SlaveComputer;
import hudson.util.ClockDifference; import hudson.util.ClockDifference;
import hudson.util.DescribableList; import hudson.util.DescribableList;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
@ -69,7 +70,6 @@ import java.util.jar.JarFile;
import java.util.jar.Manifest; import java.util.jar.Manifest;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.security.MasterToSlaveCallable; import jenkins.security.MasterToSlaveCallable;
import jenkins.slaves.WorkspaceLocator; import jenkins.slaves.WorkspaceLocator;
@ -80,8 +80,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter; 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;
/** /**
* Information about a Hudson agent node. * Information about a Hudson agent node.
@ -418,7 +418,7 @@ public abstract class Slave extends Node implements Serializable {
this.fileName = fileName; this.fileName = fileName;
} }
public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doIndex(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
URLConnection con = connect(); URLConnection con = connect();
// since we end up redirecting users to jnlpJars/foo.jar/, set the content disposition // since we end up redirecting users to jnlpJars/foo.jar/, set the content disposition
// so that browsers can download them in the right file name. // so that browsers can download them in the right file name.
@ -430,7 +430,7 @@ public abstract class Slave extends Node implements Serializable {
} }
@Override @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 {
doIndex(req, rsp); doIndex(req, rsp);
} }
@ -465,7 +465,7 @@ public abstract class Slave extends Node implements Serializable {
} }
} }
URL res = Jenkins.get().servletContext.getResource("/WEB-INF/" + name); URL res = Jenkins.get().getServletContext().getResource("/WEB-INF/" + name);
if (res == null) { if (res == null) {
throw new FileNotFoundException(name); // giving up throw new FileNotFoundException(name); // giving up
} else { } else {
@ -622,7 +622,7 @@ public abstract class Slave extends Node implements Serializable {
/** /**
* Performs syntactical check on the remote FS for agents. * Performs syntactical check on the remote FS for agents.
*/ */
public FormValidation doCheckRemoteFS(@QueryParameter String value) throws IOException, ServletException { public FormValidation doCheckRemoteFS(@QueryParameter String value) throws IOException {
if (Util.fixEmptyAndTrim(value) == null) if (Util.fixEmptyAndTrim(value) == null)
return FormValidation.error(Messages.Slave_Remote_Director_Mandatory()); return FormValidation.error(Messages.Slave_Remote_Director_Mandatory());

View File

@ -29,9 +29,9 @@ public final class StockStatusIcon extends AbstractStatusIcon {
@Override @Override
public String getImageOf(String size) { public String getImageOf(String size) {
if (image.endsWith(".svg")) { if (image.endsWith(".svg")) {
return Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH + "/images/svgs/" + image; return Stapler.getCurrentRequest2().getContextPath() + Jenkins.RESOURCE_PATH + "/images/svgs/" + image;
} else { } else {
return Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH + return Stapler.getCurrentRequest2().getContextPath() + Jenkins.RESOURCE_PATH +
"/images/" + size + "/" + image; "/images/" + size + "/" + image;
} }
} }

View File

@ -36,7 +36,7 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* Parameter whose value is a string value. * Parameter whose value is a string value.
@ -147,7 +147,7 @@ public class StringParameterDefinition extends SimpleParameterDefinition {
} }
@Override @Override
public ParameterValue createValue(StaplerRequest req, JSONObject jo) { public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
StringParameterValue value = req.bindJSON(StringParameterValue.class, jo); StringParameterValue value = req.bindJSON(StringParameterValue.class, jo);
if (isTrim()) { if (isTrim()) {
value.doTrim(); value.doTrim();

View File

@ -27,12 +27,12 @@ package hudson.model;
import hudson.console.AnnotatedLargeText; import hudson.console.AnnotatedLargeText;
import hudson.security.ACL; import hudson.security.ACL;
import hudson.security.Permission; import hudson.security.Permission;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import javax.servlet.ServletException; import org.kohsuke.stapler.StaplerRequest2;
import javax.servlet.http.HttpServletResponse; import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.framework.io.LargeText; import org.kohsuke.stapler.framework.io.LargeText;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
@ -113,7 +113,7 @@ public abstract class TaskAction extends AbstractModelObject implements Action {
/** /**
* Handles incremental log output. * Handles incremental log output.
*/ */
public void doProgressiveLog(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doProgressiveLog(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
AnnotatedLargeText text = obtainLog(); AnnotatedLargeText text = obtainLog();
if (text != null) { if (text != null) {
text.doProgressText(req, rsp); text.doProgressText(req, rsp);
@ -125,7 +125,7 @@ public abstract class TaskAction extends AbstractModelObject implements Action {
/** /**
* Handles incremental log output. * Handles incremental log output.
*/ */
public void doProgressiveHtml(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doProgressiveHtml(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
AnnotatedLargeText text = obtainLog(); AnnotatedLargeText text = obtainLog();
if (text != null) { if (text != null) {
text.doProgressiveHtml(req, rsp); text.doProgressiveHtml(req, rsp);
@ -138,7 +138,7 @@ public abstract class TaskAction extends AbstractModelObject implements Action {
* Clears the error status. * Clears the error status.
*/ */
@RequirePOST @RequirePOST
public synchronized void doClearError(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public synchronized void doClearError(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
getACL().checkPermission(getPermission()); getACL().checkPermission(getPermission());
if (workerThread != null && !workerThread.isRunning()) if (workerThread != null && !workerThread.isRunning())

View File

@ -32,7 +32,7 @@ import java.util.Objects;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* {@link StringParameterDefinition} that uses textarea, instead of text box. * {@link StringParameterDefinition} that uses textarea, instead of text box.
@ -68,7 +68,7 @@ public class TextParameterDefinition extends StringParameterDefinition {
} }
@Override @Override
public ParameterValue createValue(StaplerRequest req, JSONObject jo) { public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
TextParameterValue value = req.bindJSON(TextParameterValue.class, jo); TextParameterValue value = req.bindJSON(TextParameterValue.class, jo);
value.setDescription(getDescription()); value.setDescription(getDescription());
return value; return value;

View File

@ -164,7 +164,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor<TopLevelItem> im
DefaultScriptInvoker dsi = new DefaultScriptInvoker(); DefaultScriptInvoker dsi = new DefaultScriptInvoker();
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
XMLOutput xml = dsi.createXMLOutput(sw, true); XMLOutput xml = dsi.createXMLOutput(sw, true);
dsi.invokeScript(Stapler.getCurrentRequest(), Stapler.getCurrentResponse(), s, this, xml); dsi.invokeScript(Stapler.getCurrentRequest2(), Stapler.getCurrentResponse2(), s, this, xml);
return sw.toString(); return sw.toString();
} catch (Exception e) { } catch (Exception e) {
LOGGER.log(Level.WARNING, null, e); LOGGER.log(Level.WARNING, null, e);

View File

@ -58,6 +58,7 @@ import hudson.util.NamingThreadFactory;
import hudson.util.PersistedList; import hudson.util.PersistedList;
import hudson.util.VersionNumber; import hudson.util.VersionNumber;
import hudson.util.XStream2; import hudson.util.XStream2;
import jakarta.servlet.ServletException;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -107,7 +108,6 @@ import java.util.jar.JarFile;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLHandshakeException;
import javax.servlet.ServletException;
import jenkins.MissingDependencyException; import jenkins.MissingDependencyException;
import jenkins.RestartRequiredException; import jenkins.RestartRequiredException;
import jenkins.install.InstallUtil; import jenkins.install.InstallUtil;
@ -115,6 +115,7 @@ import jenkins.management.Badge;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.Loadable; import jenkins.model.Loadable;
import jenkins.security.stapler.StaplerDispatchable; import jenkins.security.stapler.StaplerDispatchable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import jenkins.util.Timer; import jenkins.util.Timer;
import jenkins.util.io.OnMaster; import jenkins.util.io.OnMaster;
@ -129,7 +130,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest; 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.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
@ -439,7 +441,25 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* @return The current connection status. * @return The current connection status.
*/ */
@Restricted(DoNotUse.class) @Restricted(DoNotUse.class)
public HttpResponse doConnectionStatus(StaplerRequest2 request) {
if (Util.isOverridden(UpdateCenter.class, getClass(), "doConnectionStatus", StaplerRequest.class)) {
return doConnectionStatus(StaplerRequest.fromStaplerRequest2(request));
} else {
return doConnectionStatusImpl(request);
}
}
/**
* @deprecated use {@link #doConnectionStatus(StaplerRequest2)}
*/
@Deprecated
@StaplerNotDispatchable
@Restricted(DoNotUse.class)
public HttpResponse doConnectionStatus(StaplerRequest request) { public HttpResponse doConnectionStatus(StaplerRequest request) {
return doConnectionStatusImpl(StaplerRequest.toStaplerRequest2(request));
}
private HttpResponse doConnectionStatusImpl(StaplerRequest2 request) {
Jenkins.get().checkPermission(Jenkins.SYSTEM_READ); Jenkins.get().checkPermission(Jenkins.SYSTEM_READ);
try { try {
String siteId = request.getParameter("siteId"); String siteId = request.getParameter("siteId");
@ -536,12 +556,12 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* <p> * <p>
* Supports a "correlationId" request parameter if you only want to get the * Supports a "correlationId" request parameter if you only want to get the
* install status of a set of plugins requested for install through * install status of a set of plugins requested for install through
* {@link PluginManager#doInstallPlugins(org.kohsuke.stapler.StaplerRequest)}. * {@link PluginManager#doInstallPlugins(org.kohsuke.stapler.StaplerRequest2)}.
* *
* @return The current installation status of a plugin set. * @return The current installation status of a plugin set.
*/ */
@Restricted(DoNotUse.class) @Restricted(DoNotUse.class)
public HttpResponse doInstallStatus(StaplerRequest request) { public HttpResponse doInstallStatus(StaplerRequest2 request) {
try { try {
String correlationId = request.getParameter("correlationId"); String correlationId = request.getParameter("correlationId");
Map<String, Object> response = new HashMap<>(); Map<String, Object> response = new HashMap<>();
@ -754,7 +774,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Schedules a Jenkins upgrade. * Schedules a Jenkins upgrade.
*/ */
@RequirePOST @RequirePOST
public void doUpgrade(StaplerResponse rsp) throws IOException, ServletException { public void doUpgrade(StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
HudsonUpgradeJob job = new HudsonUpgradeJob(getCoreSource(), Jenkins.getAuthentication2()); HudsonUpgradeJob job = new HudsonUpgradeJob(getCoreSource(), Jenkins.getAuthentication2());
if (!Lifecycle.get().canRewriteHudsonWar()) { if (!Lifecycle.get().canRewriteHudsonWar()) {
@ -786,7 +806,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Schedules a Jenkins restart. * Schedules a Jenkins restart.
*/ */
@RequirePOST @RequirePOST
public void doSafeRestart(StaplerRequest request, StaplerResponse response) throws IOException, ServletException { public void doSafeRestart(StaplerRequest2 request, StaplerResponse2 response) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
synchronized (jobs) { synchronized (jobs) {
if (!isRestartScheduled()) { if (!isRestartScheduled()) {
@ -801,7 +821,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Cancel all scheduled jenkins restarts * Cancel all scheduled jenkins restarts
*/ */
@RequirePOST @RequirePOST
public void doCancelRestart(StaplerResponse response) throws IOException, ServletException { public void doCancelRestart(StaplerResponse2 response) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
synchronized (jobs) { synchronized (jobs) {
for (UpdateCenterJob job : jobs) { for (UpdateCenterJob job : jobs) {
@ -860,7 +880,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Performs hudson downgrade. * Performs hudson downgrade.
*/ */
@RequirePOST @RequirePOST
public void doDowngrade(StaplerResponse rsp) throws IOException, ServletException { public void doDowngrade(StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (!isDowngradable()) { if (!isDowngradable()) {
sendError("Jenkins downgrade is not possible, probably backup does not exist"); sendError("Jenkins downgrade is not possible, probably backup does not exist");
@ -877,7 +897,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Performs hudson downgrade. * Performs hudson downgrade.
*/ */
@RequirePOST @RequirePOST
public void doRestart(StaplerResponse rsp) throws IOException, ServletException { public void doRestart(StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
HudsonDowngradeJob job = new HudsonDowngradeJob(getCoreSource(), Jenkins.getAuthentication2()); HudsonDowngradeJob job = new HudsonDowngradeJob(getCoreSource(), Jenkins.getAuthentication2());
LOGGER.info("Scheduling the core downgrade"); LOGGER.info("Scheduling the core downgrade");
@ -2392,7 +2412,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Could make PluginManager#getDetachedLocation public and consume it here, but this method is * Could make PluginManager#getDetachedLocation public and consume it here, but this method is
* best-effort anyway. * best-effort anyway.
*/ */
src = Jenkins.get().servletContext.getResource(String.format("/WEB-INF/detached-plugins/%s.hpi", plugin.name)); src = Jenkins.get().getServletContext().getResource(String.format("/WEB-INF/detached-plugins/%s.hpi", plugin.name));
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
return null; return null;
} }

View File

@ -67,7 +67,7 @@ import jenkins.model.Jenkins;
import jenkins.security.FIPS140; import jenkins.security.FIPS140;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
@ -138,7 +138,7 @@ public class UsageStatistics extends PageDecorator implements PersistentDescript
JSONObject o = new JSONObject(); JSONObject o = new JSONObject();
o.put("stat", 1); o.put("stat", 1);
o.put("install", j.getLegacyInstanceId()); o.put("install", j.getLegacyInstanceId());
o.put("servletContainer", j.servletContext.getServerInfo()); o.put("servletContainer", j.getServletContext().getServerInfo());
o.put("version", Jenkins.VERSION); o.put("version", Jenkins.VERSION);
List<JSONObject> nodes = new ArrayList<>(); List<JSONObject> nodes = new ArrayList<>();
@ -212,7 +212,7 @@ public class UsageStatistics extends PageDecorator implements PersistentDescript
} }
@Override @Override
public boolean configure(StaplerRequest req, JSONObject json) throws FormException { public boolean configure(StaplerRequest2 req, JSONObject json) throws FormException {
try { try {
// for backward compatibility reasons, this configuration is stored in Jenkins // for backward compatibility reasons, this configuration is stored in Jenkins
if (DISABLED) { if (DISABLED) {

View File

@ -47,6 +47,8 @@ import hudson.security.UserMayOrMayNotExistException2;
import hudson.util.FormValidation; import hudson.util.FormValidation;
import hudson.util.RunList; import hudson.util.RunList;
import hudson.util.XStream2; import hudson.util.XStream2;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -64,8 +66,6 @@ import java.util.concurrent.ExecutionException;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.IdStrategy; import jenkins.model.IdStrategy;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.model.Loadable; import jenkins.model.Loadable;
@ -79,8 +79,8 @@ import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerProxy; 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.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
@ -485,7 +485,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
* Accepts the new description. * Accepts the new description.
*/ */
@RequirePOST @RequirePOST
public void doSubmitDescription(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doSubmitDescription(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
checkPermission(Jenkins.ADMINISTER); checkPermission(Jenkins.ADMINISTER);
description = req.getParameter("description"); description = req.getParameter("description");
@ -882,7 +882,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
* Deletes this user from Hudson. * Deletes this user from Hudson.
*/ */
@RequirePOST @RequirePOST
public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException { public void doDoDelete(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
checkPermission(Jenkins.ADMINISTER); checkPermission(Jenkins.ADMINISTER);
if (idStrategy().equals(id, Jenkins.getAuthentication2().getName())) { if (idStrategy().equals(id, Jenkins.getAuthentication2().getName())) {
rsp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Cannot delete self"); rsp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Cannot delete self");
@ -894,15 +894,15 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
rsp.sendRedirect2("../.."); rsp.sendRedirect2("../..");
} }
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().newBuilds()); RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds().newBuilds());
} }
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().regressionOnly()); RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().regressionOnly());
} }
public void doRssLatest(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doRssLatest(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
final List<Run> lastBuilds = new ArrayList<>(); final List<Run> lastBuilds = new ArrayList<>();
for (Job<?, ?> p : Jenkins.get().allItems(Job.class)) { for (Job<?, ?> p : Jenkins.get().allItems(Job.class)) {
for (Run<?, ?> b = p.getLastBuild(); b != null; b = b.getPreviousBuild()) { for (Run<?, ?> b = p.getLastBuild(); b != null; b = b.getPreviousBuild()) {
@ -1010,7 +1010,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
} }
@Override @Override
public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { public ContextMenu doContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
return new ContextMenu().from(this, request, response); return new ContextMenu().from(this, request, response);
} }

View File

@ -27,6 +27,7 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.DescriptorExtensionList; import hudson.DescriptorExtensionList;
import hudson.ExtensionPoint; import hudson.ExtensionPoint;
import hudson.Util;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import hudson.model.userproperty.UserPropertyCategory; import hudson.model.userproperty.UserPropertyCategory;
import java.util.ArrayList; import java.util.ArrayList;
@ -34,6 +35,7 @@ import java.util.List;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
/** /**
@ -101,8 +103,22 @@ public abstract class UserProperty implements ReconfigurableDescribable<UserProp
return onlyForTheCategory; return onlyForTheCategory;
} }
@Override
public UserProperty reconfigure(StaplerRequest2 req, JSONObject form) throws FormException {
if (Util.isOverridden(UserProperty.class, getClass(), "reconfigure", StaplerRequest.class, JSONObject.class)) {
return reconfigure(StaplerRequest.fromStaplerRequest2(req), form);
} else {
return reconfigureImpl(req, form);
}
}
@Deprecated
@Override @Override
public UserProperty reconfigure(StaplerRequest req, JSONObject form) throws FormException { public UserProperty reconfigure(StaplerRequest req, JSONObject form) throws FormException {
return reconfigureImpl(StaplerRequest.toStaplerRequest2(req), form);
}
private UserProperty reconfigureImpl(StaplerRequest2 req, JSONObject form) throws FormException {
return form == null ? null : getDescriptor().newInstance(req, form); return form == null ? null : getDescriptor().newInstance(req, form);
} }
} }

View File

@ -25,7 +25,7 @@
package hudson.model; package hudson.model;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import com.thoughtworks.xstream.converters.ConversionException; import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.io.StreamException; import com.thoughtworks.xstream.io.StreamException;
@ -57,6 +57,9 @@ import hudson.util.FormValidation;
import hudson.util.RunList; import hudson.util.RunList;
import hudson.util.XStream2; import hudson.util.XStream2;
import hudson.views.ListViewColumn; import hudson.views.ListViewColumn;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
@ -80,8 +83,6 @@ import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Source; import javax.xml.transform.Source;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.transform.sax.SAXSource; import javax.xml.transform.sax.SAXSource;
@ -93,6 +94,7 @@ import jenkins.model.ModelObjectWithContextMenu;
import jenkins.model.item_category.Categories; import jenkins.model.item_category.Categories;
import jenkins.model.item_category.Category; import jenkins.model.item_category.Category;
import jenkins.model.item_category.ItemCategory; import jenkins.model.item_category.ItemCategory;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.xml.XMLUtils; import jenkins.util.xml.XMLUtils;
import jenkins.widgets.HasWidgets; import jenkins.widgets.HasWidgets;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
@ -108,7 +110,9 @@ import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod; import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.ExportedBean;
@ -673,7 +677,28 @@ public abstract class View extends AbstractModelObject implements AccessControll
* Accepts the new description. * Accepts the new description.
*/ */
@RequirePOST @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(View.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 {
doSubmitDescriptionImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
}
private void doSubmitDescriptionImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
checkPermission(CONFIGURE); checkPermission(CONFIGURE);
description = req.getParameter("description"); description = req.getParameter("description");
@ -684,10 +709,10 @@ public abstract class View extends AbstractModelObject implements AccessControll
/** /**
* Accepts submission from the configuration page. * Accepts submission from the configuration page.
* *
* Subtypes should override the {@link #submit(StaplerRequest)} method. * Subtypes should override the {@link #submit(StaplerRequest2)} method.
*/ */
@POST @POST
public final synchronized void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException { public final synchronized void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
checkPermission(CONFIGURE); checkPermission(CONFIGURE);
submit(req); submit(req);
@ -710,13 +735,42 @@ public abstract class View extends AbstractModelObject implements AccessControll
* *
* Load view-specific properties here. * Load view-specific properties here.
*/ */
protected abstract void submit(StaplerRequest req) throws IOException, ServletException, FormException; protected /* abstract */ void submit(StaplerRequest2 req) throws IOException, ServletException, FormException {
if (Util.isOverridden(View.class, getClass(), "submit", StaplerRequest.class)) {
try {
submit(StaplerRequest.fromStaplerRequest2(req));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ View.class.getSimpleName() + ".submit methods");
}
}
/**
* @deprecated use {@link #submit(StaplerRequest2)}
*/
@Deprecated
protected void submit(StaplerRequest req) throws IOException, javax.servlet.ServletException, FormException {
if (Util.isOverridden(View.class, getClass(), "submit", StaplerRequest2.class)) {
try {
submit(StaplerRequest.toStaplerRequest2(req));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ View.class.getSimpleName() + ".submit methods");
}
}
/** /**
* Deletes this view. * Deletes this view.
*/ */
@RequirePOST @RequirePOST
public synchronized void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public synchronized void doDoDelete(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
checkPermission(DELETE); checkPermission(DELETE);
owner.deleteView(this); owner.deleteView(this);
@ -729,13 +783,44 @@ public abstract class View extends AbstractModelObject implements AccessControll
* Creates a new {@link Item} in this collection. * Creates a new {@link Item} in this collection.
* *
* <p> * <p>
* This method should call {@link ModifiableItemGroup#doCreateItem(StaplerRequest, StaplerResponse)} * This method should call {@link ModifiableItemGroup#doCreateItem(StaplerRequest2, StaplerResponse2)}
* and then add the newly created item to this view. * and then add the newly created item to this view.
* *
* @return * @return
* null if fails. * null if fails.
* @since TODO
*/ */
public abstract Item doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException; @RequirePOST
public /* abstract */ Item doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
if (Util.isOverridden(View.class, getClass(), "doCreateItem", StaplerRequest.class, StaplerResponse.class)) {
try {
return doCreateItem(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ View.class.getSimpleName() + ".doCreateItem methods");
}
}
/**
* @deprecated use {@link #doCreateItem(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
public Item doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
if (Util.isOverridden(View.class, getClass(), "doCreateItem", StaplerRequest2.class, StaplerResponse2.class)) {
try {
return doCreateItem(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
} else {
throw new AbstractMethodError("The class " + getClass().getName() + " must override at least one of the "
+ View.class.getSimpleName() + ".doCreateItem methods");
}
}
/** /**
* Makes sure that the given name is good as a job name. * Makes sure that the given name is good as a job name.
@ -774,7 +859,7 @@ public abstract class View extends AbstractModelObject implements AccessControll
* @return A {@link Categories} entity that is shown as JSON file. * @return A {@link Categories} entity that is shown as JSON file.
*/ */
@Restricted(DoNotUse.class) @Restricted(DoNotUse.class)
public Categories doItemCategories(StaplerRequest req, StaplerResponse rsp, @QueryParameter String iconStyle) throws IOException, ServletException { public Categories doItemCategories(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter String iconStyle) throws IOException, ServletException {
getOwner().checkPermission(Item.CREATE); getOwner().checkPermission(Item.CREATE);
rsp.addHeader("Cache-Control", "no-cache, no-store, must-revalidate"); rsp.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
@ -833,11 +918,11 @@ public abstract class View extends AbstractModelObject implements AccessControll
return categories; return categories;
} }
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().newBuilds()); RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds().newBuilds());
} }
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().newBuilds()); RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().failureOnly().newBuilds());
} }
@ -851,7 +936,7 @@ public abstract class View extends AbstractModelObject implements AccessControll
return new BuildTimelineWidget(getBuilds()); return new BuildTimelineWidget(getBuilds());
} }
public void doRssLatest(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public void doRssLatest(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
List<Run> lastBuilds = new ArrayList<>(); List<Run> lastBuilds = new ArrayList<>();
for (TopLevelItem item : getItems()) { for (TopLevelItem item : getItems()) {
if (item instanceof Job job) { if (item instanceof Job job) {
@ -866,13 +951,13 @@ public abstract class View extends AbstractModelObject implements AccessControll
* Accepts {@code config.xml} submission, as well as serve it. * Accepts {@code config.xml} submission, as well as serve it.
*/ */
@WebMethod(name = "config.xml") @WebMethod(name = "config.xml")
public HttpResponse doConfigDotXml(StaplerRequest req) throws IOException { public HttpResponse doConfigDotXml(StaplerRequest2 req) throws IOException {
if (req.getMethod().equals("GET")) { if (req.getMethod().equals("GET")) {
// read // read
checkPermission(READ); checkPermission(READ);
return new HttpResponse() { return new HttpResponse() {
@Override @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 {
rsp.setContentType("application/xml"); rsp.setContentType("application/xml");
View.this.writeXml(rsp.getOutputStream()); View.this.writeXml(rsp.getOutputStream());
} }
@ -940,7 +1025,7 @@ public abstract class View extends AbstractModelObject implements AccessControll
} }
@Override @Override
public ModelObjectWithContextMenu.ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { public ModelObjectWithContextMenu.ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
ModelObjectWithContextMenu.ContextMenu m = new ModelObjectWithContextMenu.ContextMenu(); ModelObjectWithContextMenu.ContextMenu m = new ModelObjectWithContextMenu.ContextMenu();
for (TopLevelItem i : getItems()) for (TopLevelItem i : getItems())
m.add(Functions.getRelativeLinkTo(i), Functions.getRelativeDisplayNameFrom(i, getOwner().getItemGroup())); m.add(Functions.getRelativeLinkTo(i), Functions.getRelativeDisplayNameFrom(i, getOwner().getItemGroup()));
@ -964,15 +1049,15 @@ public abstract class View extends AbstractModelObject implements AccessControll
/** /**
* Returns the {@link ViewDescriptor} instances that can be instantiated for the {@link ViewGroup} in the current * Returns the {@link ViewDescriptor} instances that can be instantiated for the {@link ViewGroup} in the current
* {@link StaplerRequest}. * {@link StaplerRequest2}.
* <p> * <p>
* <strong>NOTE: Historically this method is only ever called from a {@link StaplerRequest}</strong> * <strong>NOTE: Historically this method is only ever called from a {@link StaplerRequest2}</strong>
* @return the list of instantiable {@link ViewDescriptor} instances for the current {@link StaplerRequest} * @return the list of instantiable {@link ViewDescriptor} instances for the current {@link StaplerRequest2}
*/ */
@NonNull @NonNull
public static List<ViewDescriptor> allInstantiable() { public static List<ViewDescriptor> allInstantiable() {
List<ViewDescriptor> r = new ArrayList<>(); List<ViewDescriptor> r = new ArrayList<>();
StaplerRequest request = Stapler.getCurrentRequest(); StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request == null) { if (request == null) {
throw new IllegalStateException("This method can only be invoked from a stapler request"); throw new IllegalStateException("This method can only be invoked from a stapler request");
} }
@ -1018,7 +1103,10 @@ public abstract class View extends AbstractModelObject implements AccessControll
return Item.CREATE; return Item.CREATE;
} }
public static View create(StaplerRequest req, StaplerResponse rsp, ViewGroup owner) /**
* @since TODO
*/
public static View create(StaplerRequest2 req, StaplerResponse2 rsp, ViewGroup owner)
throws FormException, IOException, ServletException { throws FormException, IOException, ServletException {
String mode = req.getParameter("mode"); String mode = req.getParameter("mode");
@ -1070,7 +1158,20 @@ public abstract class View extends AbstractModelObject implements AccessControll
return v; return v;
} }
private static View copy(StaplerRequest req, ViewGroup owner, String name) throws IOException { /**
* @deprecated use {@link #create(StaplerRequest2, StaplerResponse2, ViewGroup)}
*/
@Deprecated
public static View create(StaplerRequest req, StaplerResponse rsp, ViewGroup owner)
throws FormException, IOException, javax.servlet.ServletException {
try {
return create(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), owner);
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
private static View copy(StaplerRequest2 req, ViewGroup owner, String name) throws IOException {
View v; View v;
String from = req.getParameter("from"); String from = req.getParameter("from");
View src = owner.getView(from); View src = owner.getView(from);

View File

@ -40,7 +40,7 @@ import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
/** /**
* {@link Descriptor} for {@link View}. * {@link Descriptor} for {@link View}.
@ -108,7 +108,7 @@ public abstract class ViewDescriptor extends Descriptor<View> {
* Possible {@link ListViewColumnDescriptor}s that can be used with this view. * Possible {@link ListViewColumnDescriptor}s that can be used with this view.
*/ */
public List<Descriptor<ListViewColumn>> getColumnsDescriptors() { public List<Descriptor<ListViewColumn>> getColumnsDescriptors() {
StaplerRequest request = Stapler.getCurrentRequest(); StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request != null) { if (request != null) {
View view = request.findAncestorObject(clazz); View view = request.findAncestorObject(clazz);
return view == null ? DescriptorVisibilityFilter.applyType(clazz, ListViewColumn.all()) return view == null ? DescriptorVisibilityFilter.applyType(clazz, ListViewColumn.all())
@ -121,7 +121,7 @@ public abstract class ViewDescriptor extends Descriptor<View> {
* Possible {@link ViewJobFilter} types that can be used with this view. * Possible {@link ViewJobFilter} types that can be used with this view.
*/ */
public List<Descriptor<ViewJobFilter>> getJobFiltersDescriptors() { public List<Descriptor<ViewJobFilter>> getJobFiltersDescriptors() {
StaplerRequest request = Stapler.getCurrentRequest(); StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request != null) { if (request != null) {
View view = request.findAncestorObject(clazz); View view = request.findAncestorObject(clazz);
return view == null ? DescriptorVisibilityFilter.applyType(clazz, ViewJobFilter.all()) return view == null ? DescriptorVisibilityFilter.applyType(clazz, ViewJobFilter.all())

View File

@ -25,7 +25,10 @@
package hudson.model; package hudson.model;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Util;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
@ -34,11 +37,12 @@ import java.util.SortedMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/** /**
* {@link Job} that monitors activities that happen outside Hudson, * {@link Job} that monitors activities that happen outside Hudson,
@ -165,8 +169,30 @@ public abstract class ViewJob<JobT extends ViewJob<JobT, RunT>, RunT extends Run
protected abstract void reload(); protected abstract void reload();
@Override @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(ViewJob.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();
}
}
/**
* @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); super.submit(req, rsp);
submitImpl();
}
private void submitImpl() {
// make sure to reload to reflect this config change. // make sure to reload to reflect this config change.
nextUpdate = 0; nextUpdate = 0;
} }

View File

@ -26,9 +26,11 @@ package hudson.model;
import hudson.DescriptorExtensionList; import hudson.DescriptorExtensionList;
import hudson.ExtensionPoint; import hudson.ExtensionPoint;
import hudson.Util;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/** /**
* Extensible property of {@link View}. * Extensible property of {@link View}.
@ -68,8 +70,22 @@ public class ViewProperty implements ReconfigurableDescribable<ViewProperty>, Ex
return Jenkins.get().getDescriptorList(ViewProperty.class); return Jenkins.get().getDescriptorList(ViewProperty.class);
} }
@Override
public ViewProperty reconfigure(StaplerRequest2 req, JSONObject form) throws Descriptor.FormException {
if (Util.isOverridden(ViewProperty.class, getClass(), "reconfigure", StaplerRequest.class, JSONObject.class)) {
return reconfigure(StaplerRequest.fromStaplerRequest2(req), form);
} else {
return reconfigureImpl(req, form);
}
}
@Deprecated
@Override @Override
public ViewProperty reconfigure(StaplerRequest req, JSONObject form) throws Descriptor.FormException { public ViewProperty reconfigure(StaplerRequest req, JSONObject form) throws Descriptor.FormException {
return reconfigureImpl(StaplerRequest.toStaplerRequest2(req), form);
}
private ViewProperty reconfigureImpl(StaplerRequest2 req, JSONObject form) throws Descriptor.FormException {
return form == null ? null : getDescriptor().newInstance(req, form); return form == null ? null : getDescriptor().newInstance(req, form);
} }
} }

View File

@ -46,6 +46,7 @@ import hudson.util.FormApply;
import hudson.util.QuotedStringTokenizer; import hudson.util.QuotedStringTokenizer;
import hudson.util.VariableResolver; import hudson.util.VariableResolver;
import hudson.util.XStream2; import hudson.util.XStream2;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -56,13 +57,12 @@ import java.util.Vector;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.util.SystemProperties; import jenkins.util.SystemProperties;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.DoNotUse;
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.Exported;
import org.kohsuke.stapler.interceptor.RequirePOST; import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
@ -221,7 +221,7 @@ public class LabelAtom extends Label implements Saveable {
* Accepts the update to the node configuration. * Accepts the update to the node configuration.
*/ */
@POST @POST
public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException { public void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, FormException {
final Jenkins app = Jenkins.get(); final Jenkins app = Jenkins.get();
app.checkPermission(Jenkins.ADMINISTER); app.checkPermission(Jenkins.ADMINISTER);
@ -249,7 +249,7 @@ public class LabelAtom extends Label implements Saveable {
*/ */
@RequirePOST @RequirePOST
@Restricted(DoNotUse.class) @Restricted(DoNotUse.class)
public synchronized void doSubmitDescription(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { public synchronized void doSubmitDescription(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER); Jenkins.get().checkPermission(Jenkins.ADMINISTER);
setDescription(req.getParameter("description")); setDescription(req.getParameter("description"));

View File

@ -32,20 +32,20 @@ import hudson.model.TransientUserActionFactory;
import hudson.model.User; import hudson.model.User;
import hudson.model.UserProperty; import hudson.model.UserProperty;
import hudson.model.UserPropertyDescriptor; import hudson.model.UserPropertyDescriptor;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.security.UserDetailsCache; import jenkins.security.UserDetailsCache;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.jenkinsci.Symbol; import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
@Restricted(NoExternalUse.class) @Restricted(NoExternalUse.class)
@ -91,7 +91,7 @@ public class UserPropertyCategoryAccountAction extends UserPropertyCategoryActio
} }
@POST @POST
public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, Descriptor.FormException { public void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, Descriptor.FormException {
User targetUser = this.getTargetUser(); User targetUser = this.getTargetUser();
targetUser.checkPermission(Jenkins.ADMINISTER); targetUser.checkPermission(Jenkins.ADMINISTER);

View File

@ -6,14 +6,14 @@ import hudson.model.User;
import hudson.model.UserProperty; import hudson.model.UserProperty;
import hudson.model.UserPropertyDescriptor; import hudson.model.UserPropertyDescriptor;
import hudson.util.FormApply; import hudson.util.FormApply;
import jakarta.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.servlet.ServletException;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.verb.POST; import org.kohsuke.stapler.verb.POST;
public abstract class UserPropertyCategoryAction { public abstract class UserPropertyCategoryAction {
@ -31,7 +31,7 @@ public abstract class UserPropertyCategoryAction {
public @NonNull abstract List<UserPropertyDescriptor> getMyCategoryDescriptors(); public @NonNull abstract List<UserPropertyDescriptor> getMyCategoryDescriptors();
@POST @POST
public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, Descriptor.FormException { public void doConfigSubmit(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, Descriptor.FormException {
this.targetUser.checkPermission(Jenkins.ADMINISTER); this.targetUser.checkPermission(Jenkins.ADMINISTER);
JSONObject json = req.getSubmittedForm(); JSONObject json = req.getSubmittedForm();

Some files were not shown because too many files have changed in this diff Show More