[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"
]
},
{
"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",
"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/resources" 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/jetty10/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-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/jetty12-ee9/src/filter/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty12-ee9/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/websocket/jetty12-ee9/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/main/java" 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>
<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>
</properties>
@ -62,15 +62,15 @@ THE SOFTWARE.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>5.3.39</version>
<version>6.1.12</version>
<type>pom</type>
<scope>import</scope>
</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>
<artifactId>spring-security-bom</artifactId>
<version>5.8.14</version>
<version>6.3.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@ -154,12 +154,12 @@ THE SOFTWARE.
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>4.0.4</version>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>1.2.7</version>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
@ -295,7 +295,7 @@ THE SOFTWARE.
<dependency>
<groupId>org.jvnet.hudson</groupId>
<artifactId>commons-jelly-tags-define</artifactId>
<version>1.1-jenkins-20240510</version>
<version>1.1-jenkins-20240903</version>
</dependency>
<dependency>
<groupId>org.jvnet.localizer</groupId>

View File

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

View File

@ -145,7 +145,7 @@ public class DescriptorExtensionList<T extends Describable<T>, D extends Descrip
if (config.isNullObject())
return null; // none was selected
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.jexl.JexlContext;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.springframework.security.access.AccessDeniedException;
/**
@ -78,7 +78,7 @@ final class ExpressionFactory2 implements ExpressionFactory {
// let the security exception pass through
throw 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);
return null;
} finally {

View File

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

View File

@ -95,6 +95,14 @@ import hudson.util.jna.GNUCLibrary;
import hudson.views.MyViewsTabBar;
import hudson.views.ViewsTabBar;
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.IOException;
import java.io.PrintStream;
@ -148,10 +156,6 @@ import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.regex.Pattern;
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.model.GlobalConfiguration;
import jenkins.model.GlobalConfigurationCategory;
@ -176,7 +180,9 @@ import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.RawHtmlArgument;
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.springframework.security.access.AccessDeniedException;
/**
@ -276,8 +282,8 @@ public class Functions {
}
public static void initPageVariables(JellyContext context) {
StaplerRequest currentRequest = Stapler.getCurrentRequest();
currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse());
StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse2());
String rootURL = currentRequest.getContextPath();
Functions h = new Functions();
@ -372,7 +378,10 @@ public class Functions {
return buf.toString();
}
public static RunUrl decompose(StaplerRequest req) {
/**
* @since TODO
*/
public static RunUrl decompose(StaplerRequest2 req) {
List<Ancestor> ancestors = req.getAncestors();
// find the first and last Run instances
@ -405,12 +414,20 @@ public class Functions {
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.
* @since 1.213
*/
public static Area getScreenResolution() {
Cookie res = Functions.getCookie(Stapler.getCurrentRequest(), "screenResolution");
Cookie res = Functions.getCookie(Stapler.getCurrentRequest2(), "screenResolution");
if (res != null)
return Area.parse(res.getValue());
return null;
@ -592,6 +609,9 @@ public class Functions {
return list;
}
/**
* @since TODO
*/
public static Cookie getCookie(HttpServletRequest req, String name) {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
@ -604,12 +624,31 @@ public class Functions {
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) {
Cookie c = getCookie(req, name);
if (c == null || c.getValue() == null) return defaultValue;
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+");
@Restricted(NoExternalUse.class)
@ -713,8 +752,10 @@ public class Functions {
* 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,
* 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();
for (int i = list.size() - 1; i >= 0; i--) {
Ancestor anc = (Ancestor) list.get(i);
@ -724,11 +765,19 @@ public class Functions {
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.
*/
public static String getSearchURL() {
List list = Stapler.getCurrentRequest().getAncestors();
List list = Stapler.getCurrentRequest2().getAncestors();
for (int i = list.size() - 1; i >= 0; i--) {
Ancestor anc = (Ancestor) list.get(i);
if (anc.getObject() instanceof SearchableModelObject)
@ -888,7 +937,7 @@ public class Functions {
if (object instanceof AccessControlled)
checkPermission((AccessControlled) object, permission);
else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors();
List<Ancestor> ancs = Stapler.getCurrentRequest2().getAncestors();
for (Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject();
if (o instanceof AccessControlled) {
@ -920,7 +969,7 @@ public class Functions {
if (object instanceof AccessControlled)
return ((AccessControlled) object).hasPermission(permission);
else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors();
List<Ancestor> ancs = Stapler.getCurrentRequest2().getAncestors();
for (Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject();
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
// 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.
rsp.setStatus(HttpServletResponse.SC_FORBIDDEN);
rsp.getOutputStream().close();
@ -946,10 +998,24 @@ public class Functions {
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.
*
* @since TODO
*/
public static String inferHudsonURL(StaplerRequest req) {
public static String inferHudsonURL(StaplerRequest2 req) {
String rootUrl = Jenkins.get().getRootUrl();
if (rootUrl != null)
// prefer the one explicitly configured, to work with load-balancer, frontend, etc.
@ -963,6 +1029,14 @@ public class Functions {
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.
*/
@ -1226,7 +1300,7 @@ public class Functions {
if (object instanceof AccessControlled)
return hasAnyPermission((AccessControlled) object, permissions);
else {
AccessControlled ac = Stapler.getCurrentRequest().findAncestorObject(AccessControlled.class);
AccessControlled ac = Stapler.getCurrentRequest2().findAncestorObject(AccessControlled.class);
if (ac != null) {
return hasAnyPermission(ac, permissions);
}
@ -1264,7 +1338,7 @@ public class Functions {
if (object instanceof AccessControlled)
checkAnyPermission((AccessControlled) object, permissions);
else {
List<Ancestor> ancs = Stapler.getCurrentRequest().getAncestors();
List<Ancestor> ancs = Stapler.getCurrentRequest2().getAncestors();
for (Ancestor anc : Iterators.reverse(ancs)) {
Object o = anc.getObject();
if (o instanceof AccessControlled) {
@ -1335,7 +1409,7 @@ public class Functions {
Map<Object, String> ancestors = new HashMap<>();
View view = null;
StaplerRequest request = Stapler.getCurrentRequest();
StaplerRequest2 request = Stapler.getCurrentRequest2();
for (Ancestor a : request.getAncestors()) {
ancestors.put(a.getObject(), a.getRelativePath());
if (a.getObject() instanceof View)
@ -1681,7 +1755,7 @@ public class Functions {
if (it instanceof Descriptor)
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('$', '/') +
'/' + path;
return buf;
@ -1689,7 +1763,7 @@ public class Functions {
public static boolean hasView(Object it, String path) throws IOException {
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;
}
if (urlName.startsWith("/"))
return joinPath(Stapler.getCurrentRequest().getContextPath(), urlName);
return joinPath(Stapler.getCurrentRequest2().getContextPath(), urlName);
else
// 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) {
// 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.
*/
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("/");
url = URLDecoder.decode(url, StandardCharsets.UTF_8);
href = URLDecoder.decode(href, StandardCharsets.UTF_8);
@ -2063,12 +2137,23 @@ public class Functions {
return CrumbIssuer.all();
}
public static String getCrumb(StaplerRequest req) {
/**
* @since TODO
*/
public static String getCrumb(StaplerRequest2 req) {
Jenkins h = Jenkins.getInstanceOrNull();
CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null;
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() {
Jenkins h = Jenkins.getInstanceOrNull();
CrumbIssuer issuer = h != null ? h.getCrumbIssuer() : null;
@ -2081,7 +2166,7 @@ public class Functions {
public static Locale getCurrentLocale() {
Locale locale = null;
StaplerRequest req = Stapler.getCurrentRequest();
StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req != null)
locale = req.getLocale();
if (locale == null)
@ -2094,7 +2179,7 @@ public class Functions {
* from {@link ConsoleAnnotatorFactory}s and {@link ConsoleAnnotationDescriptor}s.
*/
public static String generateConsoleAnnotationScriptAndStylesheet() {
String cp = Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH;
String cp = Stapler.getCurrentRequest2().getContextPath() + Jenkins.RESOURCE_PATH;
StringBuilder buf = new StringBuilder();
for (ConsoleAnnotatorFactory f : ConsoleAnnotatorFactory.all()) {
String path = cp + "/extensionList/" + ConsoleAnnotatorFactory.class.getName() + "/" + f.getClass().getName();
@ -2147,7 +2232,7 @@ public class Functions {
}
/* 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 (req != null) {
Item item = req.findAncestorObject(Item.class);
@ -2243,15 +2328,17 @@ public class Functions {
@Deprecated
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.
*
* @since TODO
*/
@Restricted(NoExternalUse.class)
public static StaplerRequest.RenderOnDemandParameters createRenderOnDemandProxyParameters(JellyContext context, String attributesToCapture) {
return Stapler.getCurrentRequest().createJavaScriptProxyParameters(new RenderOnDemandClosure(context, attributesToCapture));
public static StaplerRequest2.RenderOnDemandParameters createRenderOnDemandProxyParameters(JellyContext context, String attributesToCapture) {
return Stapler.getCurrentRequest2().createJavaScriptProxyParameters(new RenderOnDemandClosure(context, attributesToCapture));
}
public static String getCurrentDescriptorByNameUrl() {
@ -2260,18 +2347,18 @@ public class Functions {
public static String setCurrentDescriptorByNameUrl(String value) {
String o = getCurrentDescriptorByNameUrl();
Stapler.getCurrentRequest().setAttribute("currentDescriptorByNameUrl", value);
Stapler.getCurrentRequest2().setAttribute("currentDescriptorByNameUrl", value);
return o;
}
public static void restoreCurrentDescriptorByNameUrl(String old) {
Stapler.getCurrentRequest().setAttribute("currentDescriptorByNameUrl", old);
Stapler.getCurrentRequest2().setAttribute("currentDescriptorByNameUrl", old);
}
public static List<String> getRequestHeaders(String name) {
List<String> r = new ArrayList<>();
Enumeration e = Stapler.getCurrentRequest().getHeaders(name);
Enumeration e = Stapler.getCurrentRequest2().getHeaders(name);
while (e.hasMoreElements()) {
r.add(e.nextElement().toString());
}
@ -2366,6 +2453,7 @@ public class Functions {
* Advertises the minimum set of HTTP headers that assist programmatic
* discovery of Jenkins.
*/
@SuppressFBWarnings(value = "UC_USELESS_VOID_METHOD", justification = "TODO needs triage")
public static void advertiseHeaders(HttpServletResponse rsp) {
Jenkins j = Jenkins.getInstanceOrNull();
if (j != null) {
@ -2375,6 +2463,14 @@ public class Functions {
}
}
/**
* @deprecated use {@link #advertiseHeaders(HttpServletResponse)}
*/
@Deprecated
public static void advertiseHeaders(javax.servlet.http.HttpServletResponse rsp) {
advertiseHeaders(HttpServletResponseWrapper.toJakartaHttpServletResponse(rsp));
}
@Restricted(NoExternalUse.class) // for actions.jelly and ContextMenu.add
public static boolean isContextMenuVisible(Action a) {
if (a instanceof ModelObjectWithContextMenu.ContextMenuVisibility) {
@ -2449,7 +2545,7 @@ public class Functions {
return iconGuess;
}
StaplerRequest currentRequest = Stapler.getCurrentRequest();
StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
String rootURL = currentRequest.getContextPath();
Icon iconMetadata = tryGetIcon(iconGuess);

View File

@ -26,11 +26,12 @@ package hudson;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import io.jenkins.servlet.ServletContextWrapper;
import jakarta.servlet.ServletContext;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
@ -49,12 +50,20 @@ public class LocalPluginManager extends PluginManager {
super(context, new File(rootDir, "plugins"));
}
/**
* @deprecated use {@link #LocalPluginManager(ServletContext, File)}
*/
@Deprecated
public LocalPluginManager(@CheckForNull javax.servlet.ServletContext context, @NonNull File rootDir) {
this(context != null ? ServletContextWrapper.toJakartaServletContext(context) : null, rootDir);
}
/**
* Creates a new LocalPluginManager
* @param jenkins Jenkins instance that will use the plugin manager.
*/
public LocalPluginManager(@NonNull Jenkins jenkins) {
this(jenkins.servletContext, jenkins.getRootDir());
this(jenkins.getServletContext(), jenkins.getRootDir());
}
/**
@ -62,7 +71,7 @@ public class LocalPluginManager extends PluginManager {
* @param rootDir Jenkins home directory.
*/
public LocalPluginManager(@NonNull File rootDir) {
this(null, rootDir);
this((ServletContext) null, rootDir);
}
@Override

View File

@ -33,25 +33,29 @@ import hudson.model.Descriptor.FormException;
import hudson.model.Saveable;
import hudson.model.listeners.ItemListener;
import hudson.model.listeners.SaveableListener;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.GlobalConfiguration;
import jenkins.model.Jenkins;
import jenkins.model.Loadable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties;
import net.sf.json.JSONObject;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/**
* Base class of Hudson plugin.
@ -92,11 +96,11 @@ public abstract class Plugin implements Loadable, Saveable, StaplerProxy {
/**
* You do not need to create custom subtypes:
* <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}
* <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 #setServletContext} can be replaced by {@link Jenkins#servletContext}
* <li>{@link #setServletContext} can be replaced by {@link Jenkins#getServletContext}
* </ul>
* Note that every plugin gets a {@link DummyImpl} by default,
* which will still route the URL space, serve {@link #getWrapper}, and so on.
@ -189,10 +193,10 @@ public abstract class Plugin implements Loadable, Saveable, StaplerProxy {
/**
* @since 1.233
* @deprecated as of 1.305 override {@link #configure(StaplerRequest,JSONObject)} instead
* @deprecated as of 1.305 override {@link #configure(StaplerRequest2,JSONObject)} instead
*/
@Deprecated
public void configure(JSONObject formData) throws IOException, ServletException, FormException {
public void configure(JSONObject formData) throws IOException, javax.servlet.ServletException, FormException {
}
/**
@ -220,16 +224,60 @@ public abstract class Plugin implements Loadable, Saveable, StaplerProxy {
* <p>
* If you are using this method, you'll likely be interested in
* using {@link #save()} and {@link #load()}.
* @since TODO
*/
public void configure(StaplerRequest2 req, JSONObject formData) throws IOException, ServletException, FormException {
try {
if (Util.isOverridden(Plugin.class, getClass(), "configure", StaplerRequest.class, JSONObject.class)) {
configure(StaplerRequest.fromStaplerRequest2(req), formData);
} else {
configure(formData);
}
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
}
/**
* @deprecated use {@link #configure(StaplerRequest2, JSONObject)}
* @since 1.305
*/
public void configure(StaplerRequest req, JSONObject formData) throws IOException, ServletException, FormException {
@Deprecated
public void configure(StaplerRequest req, JSONObject formData) throws IOException, javax.servlet.ServletException, FormException {
configure(formData);
}
/**
* This method serves static resources in the plugin under {@code hudson/plugin/SHORTNAME}.
*
* @since TODO
*/
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public void doDynamic(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
if (Util.isOverridden(Plugin.class, getClass(), "doDynamic", StaplerRequest.class, StaplerResponse.class)) {
try {
doDynamic(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
doDynamicImpl(req, rsp);
}
}
/**
* @deprecated use {@link #doDynamic(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
try {
doDynamicImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
private void doDynamicImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
String path = req.getRestOfPath();
String pathUC = path.toUpperCase(Locale.ENGLISH);

View File

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

View File

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

View File

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

View File

@ -24,15 +24,15 @@
package hudson;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.kohsuke.stapler.CompatibleFilter;
/**
* This filter allows you to modify headers set by the container or other servlets
@ -77,7 +77,7 @@ import javax.servlet.http.HttpServletResponse;
*
* @author Mike Wille
*/
public class ResponseHeaderFilter implements Filter {
public class ResponseHeaderFilter implements CompatibleFilter {
private FilterConfig config;
@Override

View File

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

View File

@ -45,6 +45,12 @@ import hudson.util.InsufficientPermissionDetected;
import hudson.util.NoHomeDir;
import hudson.util.NoTempDir;
import hudson.util.RingBufferLogHandler;
import io.jenkins.servlet.ServletContextEventWrapper;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.SessionTrackingMode;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
@ -65,11 +71,6 @@ import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletResponse;
import javax.servlet.SessionTrackingMode;
import jenkins.model.Jenkins;
import jenkins.util.JenkinsJVM;
import jenkins.util.SystemProperties;
@ -320,10 +321,21 @@ public class WebAppMain implements ServletContextListener {
}
}
/**
* @since TODO
*/
public static void installExpressionFactory(ServletContextEvent event) {
JellyFacet.setExpressionFactory(event, new ExpressionFactory2());
}
/**
* @deprecated use {@link #installExpressionFactory(ServletContextEvent)}
*/
@Deprecated
public static void installExpressionFactory(javax.servlet.ServletContextEvent event) {
installExpressionFactory(ServletContextEventWrapper.toJakartaServletContextEvent(event));
}
/**
* Installs log handler to monitor all Hudson logs.
*/

View File

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

View File

@ -26,11 +26,11 @@ package hudson.cli;
import hudson.Extension;
import hudson.security.csrf.CrumbExclusion;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse;

View File

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

View File

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

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

View File

@ -28,13 +28,13 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.DescriptorExtensionList;
import hudson.ExtensionPoint;
import hudson.model.Descriptor;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
/**
@ -81,12 +81,12 @@ public abstract class ConsoleAnnotationDescriptor extends Descriptor<ConsoleNote
}
@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));
}
@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));
}

View File

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

View File

@ -37,7 +37,7 @@ import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/**
* Turns a text into a hyperlink by specifying the URL separately.
@ -62,7 +62,7 @@ public class HyperlinkNote extends ConsoleNote {
public ConsoleAnnotator annotate(Object context, MarkupText text, int charPos) {
String url = this.url;
if (url.startsWith("/")) {
StaplerRequest req = Stapler.getCurrentRequest();
StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req != null) {
// if we are serving HTTP request, we want to use app relative URL
url = req.getContextPath() + url;

View File

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

View File

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

View File

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

View File

@ -39,6 +39,6 @@ import jenkins.util.groovy.GroovyHookScript;
public class GroovyInitScript {
@Initializer(after = JOB_CONFIG_ADAPTED)
public static void init(Jenkins j) {
new GroovyHookScript("init", j.servletContext, j.getRootDir(), j.getPluginManager().uberClassLoader).run();
new GroovyHookScript("init", j.getServletContext(), j.getRootDir(), j.getPluginManager().uberClassLoader).run();
}
}

View File

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

View File

@ -35,6 +35,7 @@ import hudson.model.ManagementLink;
import hudson.model.TaskListener;
import hudson.util.StreamTaskListener;
import hudson.util.jna.DotNet;
import jakarta.servlet.ServletException;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@ -43,7 +44,6 @@ import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
import org.apache.commons.io.FileUtils;
@ -52,8 +52,8 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Move;
import org.apache.tools.ant.types.FileSet;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@ -116,7 +116,7 @@ public class WindowsInstallerLink extends ManagementLink {
* Performs installation.
*/
@RequirePOST
public void doDoInstall(StaplerRequest req, StaplerResponse rsp, @QueryParameter("dir") String _dir) throws IOException, ServletException {
public void doDoInstall(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter("dir") String _dir) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (installationDir != null) {
@ -168,7 +168,7 @@ public class WindowsInstallerLink extends ManagementLink {
/**
* Copies a single resource into the target folder, by the given name, and handle errors gracefully.
*/
private void copy(StaplerRequest req, StaplerResponse rsp, File dir, URL src, String name) throws ServletException, IOException {
private void copy(StaplerRequest2 req, StaplerResponse2 rsp, File dir, URL src, String name) throws ServletException, IOException {
try {
FileUtils.copyURLToFile(src, new File(dir, name));
} catch (IOException e) {
@ -179,7 +179,7 @@ public class WindowsInstallerLink extends ManagementLink {
}
@RequirePOST
public void doRestart(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public void doRestart(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (installationDir == null) {
@ -250,11 +250,11 @@ public class WindowsInstallerLink extends ManagementLink {
/**
* Displays the error in a page.
*/
protected final void sendError(Exception e, StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
protected final void sendError(Exception e, StaplerRequest2 req, StaplerResponse2 rsp) throws ServletException, IOException {
sendError(e.getMessage(), req, rsp);
}
protected final void sendError(String message, StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
protected final void sendError(String message, StaplerRequest2 req, StaplerResponse2 rsp) throws ServletException, IOException {
req.setAttribute("message", message);
req.setAttribute("pre", true);
rsp.forward(Jenkins.get(), "error", req);

View File

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

View File

@ -38,6 +38,7 @@ import hudson.model.Failure;
import hudson.model.RSS;
import hudson.util.CopyOnWriteMap;
import hudson.util.FormValidation;
import jakarta.servlet.ServletException;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
@ -53,7 +54,6 @@ import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration;
import jenkins.model.ModelObjectWithChildren;
@ -68,8 +68,8 @@ import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@ -188,7 +188,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje
}
@Override
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
ContextMenu menu = new ContextMenu();
menu.add("all", "All Jenkins Logs");
for (LogRecorder lr : recorders) {
@ -225,14 +225,14 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje
/**
* RSS feed for log entries.
*/
public void doRss(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public void doRss(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
doRss(req, rsp, Jenkins.logRecords);
}
/**
* Renders the given log recorders as RSS.
*/
/*package*/ static void doRss(StaplerRequest req, StaplerResponse rsp, List<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
String entryType = "all";
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 hudson.ExtensionPoint;
import hudson.model.AbstractDescribableImpl;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
@ -44,7 +45,8 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.verb.GET;
import org.kohsuke.stapler.verb.POST;
@ -138,7 +140,7 @@ public abstract class MarkupFormatter extends AbstractDescribableImpl<MarkupForm
@GET
@WebMethod(name = "previewDescription")
@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());
if (PREVIEWS_ALLOW_GET) {
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) {
// TODO Move to Stapler's HttpResponses, (also add a corresponding 'text' method)
return (req, rsp, node) -> {
rsp.setContentType("text/html;charset=UTF-8");
rsp.setStatus(status);
for (Map.Entry<String, String> header : headers.entrySet()) {
rsp.setHeader(header.getKey(), header.getValue());
return new HttpResponse() {
@Override
public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
rsp.setContentType("text/html;charset=UTF-8");
rsp.setStatus(status);
for (Map.Entry<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.Iterators;
import hudson.util.VariableResolver;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
@ -81,7 +83,6 @@ import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.model.lazy.BuildReference;
import jenkins.model.lazy.LazyBuildMixIn;
@ -275,7 +276,7 @@ public abstract class AbstractBuild<P extends AbstractProject<P, R>, R extends A
*/
@Deprecated(since = "2.364")
public String getUpUrl() {
return Functions.getNearestAncestorUrl(Stapler.getCurrentRequest(), getParent()) + '/';
return Functions.getNearestAncestorUrl(Stapler.getCurrentRequest2(), getParent()) + '/';
}
/**
@ -1391,8 +1392,12 @@ public abstract class AbstractBuild<P extends AbstractProject<P, R>, R extends A
*/
@Deprecated
@RequirePOST // #doStop() should be preferred, but better to be safe
public void doStop(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
doStop().generateResponse(req, rsp, this);
public void doStop(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
try {
doStop().generateResponse(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp), this);
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
/**

View File

@ -25,7 +25,7 @@
package hudson.model;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.NonNull;
@ -47,6 +47,8 @@ import hudson.util.AtomicFileWriter;
import hudson.util.FormValidation;
import hudson.util.IOUtils;
import hudson.util.Secret;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
@ -59,7 +61,6 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.sax.SAXSource;
@ -70,6 +71,7 @@ import jenkins.model.Jenkins;
import jenkins.model.Loadable;
import jenkins.model.queue.ItemDeletion;
import jenkins.security.NotReallyRoleSensitiveCallable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties;
import jenkins.util.xml.XMLUtils;
import org.apache.tools.ant.Project;
@ -87,7 +89,9 @@ import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@ -530,7 +534,7 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
@Override
public final String getUrl() {
// try to stick to the current view if possible
StaplerRequest req = Stapler.getCurrentRequest();
StaplerRequest2 req = Stapler.getCurrentRequest2();
String shortUrl = getShortUrl();
String uri = req == null ? null : req.getRequestURI();
if (req != null) {
@ -644,9 +648,36 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
/**
* Accepts the new description.
*
* @since TODO
*/
@RequirePOST
public synchronized void doSubmitDescription(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public synchronized void doSubmitDescription(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
if (Util.isOverridden(AbstractItem.class, getClass(), "doSubmitDescription", StaplerRequest.class, StaplerResponse.class)) {
try {
doSubmitDescription(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
doSubmitDescriptionImpl(req, rsp);
}
}
/**
* @deprecated use {@link #doSubmitDescription(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
public synchronized void doSubmitDescription(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
try {
doSubmitDescriptionImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
private void doSubmitDescriptionImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
checkPermission(CONFIGURE);
setDescription(req.getParameter("description"));
@ -658,9 +689,32 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
* Note on the funny name: for reasons of historical compatibility, this URL is {@code /doDelete}
* since it predates {@code <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.
*
* @since TODO
*/
@RequirePOST
public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException {
public void doDoDelete(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException, InterruptedException {
if (Util.isOverridden(AbstractItem.class, getClass(), "doDoDelete", StaplerRequest.class, StaplerResponse.class)) {
try {
doDoDelete(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
doDoDeleteImpl(req, rsp);
}
}
/**
* @deprecated use {@link #doDoDelete(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException, InterruptedException {
doDoDeleteImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
}
private void doDoDeleteImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, InterruptedException {
delete();
if (req == null || rsp == null) { // CLI
return;
@ -681,8 +735,28 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
rsp.sendRedirect2(req.getContextPath() + '/' + url);
}
/**
* @since TODO
*/
@Override
public void delete(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public void delete(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
deleteImpl(rsp);
}
/**
* @deprecated use {@link #delete(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@Override
public void delete(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
try {
deleteImpl(StaplerResponse.toStaplerResponse2(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
private void deleteImpl(StaplerResponse2 rsp) throws IOException, ServletException {
try {
delete();
rsp.setStatus(204);
@ -755,10 +829,31 @@ public abstract class AbstractItem extends Actionable implements Loadable, Item,
/**
* Accepts {@code config.xml} submission, as well as serve it.
*
* @since TODO
*/
@WebMethod(name = "config.xml")
public void doConfigDotXml(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException {
if (Util.isOverridden(AbstractItem.class, getClass(), "doConfigDotXml", StaplerRequest.class, StaplerResponse.class)) {
doConfigDotXml(StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} else {
doConfigDotXmlImpl(req, rsp);
}
}
/**
* @deprecated use {@link #doConfigDotXml(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
public void doConfigDotXml(StaplerRequest req, StaplerResponse rsp)
throws IOException {
doConfigDotXmlImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
}
private void doConfigDotXmlImpl(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException {
if (req.getMethod().equals("GET")) {
// read
rsp.setContentType("application/xml");

View File

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

View File

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

View File

@ -37,8 +37,11 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.ModelObjectWithContextMenu;
import jenkins.model.TransientActionFactory;
import jenkins.security.stapler.StaplerNotDispatchable;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@ -338,7 +341,26 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
return null;
}
/**
* @since TODO
*/
public Object getDynamic(String token, StaplerRequest2 req, StaplerResponse2 rsp) {
if (Util.isOverridden(Actionable.class, getClass(), "getDynamic", String.class, StaplerRequest.class, StaplerResponse.class)) {
return getDynamic(token, StaplerRequest.fromStaplerRequest2(req), StaplerResponse.fromStaplerResponse2(rsp));
} else {
return getDynamicImpl(token, req, rsp);
}
}
/**
* @deprecated use {@link #getDynamic(String, StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
return getDynamicImpl(token, StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
}
private Object getDynamicImpl(String token, StaplerRequest2 req, StaplerResponse2 rsp) {
for (Action a : getAllActions()) {
if (a == null)
continue; // be defensive
@ -351,7 +373,29 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj
return null;
}
@Override public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
/**
* @since TODO
*/
@Override
public ContextMenu doContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
if (Util.isOverridden(Actionable.class, getClass(), "doContextMenu", StaplerRequest.class, StaplerResponse.class)) {
return doContextMenu(StaplerRequest.fromStaplerRequest2(request), StaplerResponse.fromStaplerResponse2(response));
} else {
return doContextMenuImpl(request, response);
}
}
/**
* @deprecated use {@link #doContextMenu(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
@StaplerNotDispatchable
@Override
public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
return doContextMenuImpl(StaplerRequest.toStaplerRequest2(request), StaplerResponse.toStaplerResponse2(response));
}
private ContextMenu doContextMenuImpl(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
return new ContextMenu().from(this, request, response);
}

View File

@ -37,8 +37,8 @@ import jenkins.model.Jenkins;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@ -175,7 +175,7 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen
* URL binding to disable this monitor.
*/
@RequirePOST
public void doDisable(StaplerRequest req, StaplerResponse rsp) throws IOException {
public void doDisable(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
disable(true);
rsp.sendRedirect2(req.getContextPath() + "/manage");
@ -188,7 +188,7 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen
* Changing this permission check to return {@link Jenkins#SYSTEM_READ} will make the active
* administrative monitor appear on {@code manage.jelly} and on the globally visible
* {@link jenkins.management.AdministrativeMonitorsDecorator} to users without Administer permission.
* {@link #doDisable(StaplerRequest, StaplerResponse)} will still always require Administer permission.
* {@link #doDisable(StaplerRequest2, StaplerResponse2)} will still always require Administer permission.
* </p>
* <p>
* 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 hudson.Extension;
import hudson.Util;
import hudson.model.Descriptor.FormException;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
@ -34,12 +37,12 @@ import java.util.Locale;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.util.SystemProperties;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@ -91,7 +94,7 @@ public class AllView extends View {
@RequirePOST
@Override
public Item doCreateItem(StaplerRequest req, StaplerResponse rsp)
public Item doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException {
ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup();
if (ig instanceof ModifiableItemGroup)
@ -110,7 +113,24 @@ public class AllView extends View {
}
@Override
protected void submit(StaplerRequest req) throws IOException, ServletException, FormException {
protected void submit(StaplerRequest2 req) throws IOException, ServletException, FormException {
if (Util.isOverridden(AllView.class, getClass(), "submit", StaplerRequest.class)) {
try {
submit(StaplerRequest.fromStaplerRequest2(req));
} catch (javax.servlet.ServletException e) {
throw ServletExceptionWrapper.toJakartaServletException(e);
}
} else {
// noop
}
}
/**
* @deprecated use {@link #submit(StaplerRequest2)}
*/
@Deprecated
@Override
protected void submit(StaplerRequest req) throws IOException, javax.servlet.ServletException, FormException {
// noop
}

View File

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

View File

@ -28,16 +28,16 @@ import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.search.Search;
import hudson.search.UserSearchProperty;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Flavor;
/**
@ -69,7 +69,7 @@ public class AutoCompletionCandidates implements HttpResponse {
}
@Override
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object o) throws IOException, ServletException {
public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object o) throws IOException, ServletException {
Search.Result r = new Search.Result();
for (String value : values) {
r.suggestions.add(new hudson.search.Search.Item(value));

View File

@ -113,7 +113,7 @@ public enum BallColor implements StatusIcon {
@Override
public String getImageOf(String size) {
return Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH + "/images/" + size + '/' + image;
return Stapler.getCurrentRequest2().getContextPath() + Jenkins.RESOURCE_PATH + "/images/" + size + '/' + image;
}
/**

View File

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

View File

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

View File

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

View File

@ -20,7 +20,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported;
/**
@ -152,7 +152,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition {
}
@Override
public ParameterValue createValue(StaplerRequest req, JSONObject jo) {
public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
StringParameterValue value = req.bindJSON(StringParameterValue.class, jo);
value.setDescription(getDescription());
checkValue(value, value.getValue());
@ -218,7 +218,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition {
/*
* We need this for JENKINS-26143 -- reflective creation cannot handle setChoices(Object). See that method for context.
*/
public ParameterDefinition newInstance(@Nullable StaplerRequest req, @NonNull JSONObject formData) throws FormException {
public ParameterDefinition newInstance(@Nullable StaplerRequest2 req, @NonNull JSONObject formData) throws FormException {
String name = formData.getString("name");
String desc = formData.getString("description");
String choiceText = formData.getString("choices");

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -25,12 +25,12 @@
package hudson.model;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import jakarta.servlet.ServletException;
import java.io.IOException;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
/**
* Represents an error induced by user, encountered during HTTP request processing.
@ -55,7 +55,7 @@ public class Failure extends RuntimeException implements HttpResponse {
this.pre = pre;
}
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node, @CheckForNull Throwable throwable) throws IOException, ServletException {
public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node, @CheckForNull Throwable throwable) throws IOException, ServletException {
if (throwable != null) {
req.setAttribute("exception", throwable);
}
@ -63,7 +63,7 @@ public class Failure extends RuntimeException implements HttpResponse {
}
@Override
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
req.setAttribute("message", getMessage());
if (pre)
req.setAttribute("pre", true);

View File

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

View File

@ -50,8 +50,8 @@ import org.apache.commons.io.FilenameUtils;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
/**
* {@link ParameterValue} for {@link FileParameterDefinition}.
@ -235,9 +235,9 @@ public class FileParameterValue extends ParameterValue {
}
/**
* Serve this file parameter in response to a {@link StaplerRequest}.
* Serve this file parameter in response to a {@link StaplerRequest2}.
*/
public DirectoryBrowserSupport doDynamic(StaplerRequest request, StaplerResponse response) {
public DirectoryBrowserSupport doDynamic(StaplerRequest2 request, StaplerResponse2 response) {
AbstractBuild build = (AbstractBuild) request.findAncestor(AbstractBuild.class).getObject();
File fileParameter = getFileParameterFolderUnderBuild(build);
return new DirectoryBrowserSupport(build, new FilePath(fileParameter), Messages.FileParameterValue_IndexTitle(), "folder.png", false);

View File

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

View File

@ -41,7 +41,7 @@ import java.util.Collection;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
import jenkins.util.io.OnMaster;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/**
* Basic configuration unit in Hudson.
@ -183,7 +183,7 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont
/**
* Returns the absolute URL of this item. This relies on the current
* {@link StaplerRequest} to figure out what the host name is,
* {@link StaplerRequest2} to figure out what the host name is,
* so can be used only during processing client requests.
*
* @return

View File

@ -32,6 +32,9 @@ import hudson.security.AccessControlled;
import hudson.util.CopyOnWriteMap;
import hudson.util.Function1;
import hudson.util.Secret;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@ -42,8 +45,6 @@ import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
@ -51,7 +52,9 @@ import jenkins.model.Jenkins;
import jenkins.security.NotReallyRoleSensitiveCallable;
import jenkins.util.xml.XMLUtils;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.springframework.security.access.AccessDeniedException;
import org.xml.sax.SAXException;
@ -140,8 +143,10 @@ public abstract class ItemGroupMixIn {
/**
* Creates a {@link TopLevelItem} for example from the submission of the {@code /lib/hudson/newFromList/form} tag
* or throws an exception if it fails.
*
* @since TODO
*/
public synchronized TopLevelItem createTopLevelItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public synchronized TopLevelItem createTopLevelItem(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
acl.checkPermission(Item.CREATE);
TopLevelItem result;
@ -206,10 +211,22 @@ public abstract class ItemGroupMixIn {
return result;
}
/**
* @deprecated use {@link #createTopLevelItem(StaplerRequest2, StaplerResponse2)}
*/
@Deprecated
public synchronized TopLevelItem createTopLevelItem(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException {
try {
return createTopLevelItem(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
} catch (ServletException e) {
throw ServletExceptionWrapper.fromJakartaServletException(e);
}
}
/**
* Computes the redirection target URL for the newly created {@link TopLevelItem}.
*/
protected String redirectAfterCreateItem(StaplerRequest req, TopLevelItem result) throws IOException {
protected String redirectAfterCreateItem(StaplerRequest2 req, TopLevelItem result) throws IOException {
return req.getContextPath() + '/' + result.getUrl() + "configure";
}

View File

@ -24,8 +24,8 @@
package hudson.model;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static jakarta.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import edu.umd.cs.findbugs.annotations.CheckForNull;
@ -69,6 +69,8 @@ import hudson.util.TextFile;
import hudson.widgets.HistoryWidget;
import hudson.widgets.HistoryWidget.Adapter;
import hudson.widgets.Widget;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.awt.Color;
import java.awt.Paint;
import java.io.File;
@ -85,7 +87,6 @@ import java.util.Set;
import java.util.SortedMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.BuildDiscarder;
import jenkins.model.BuildDiscarderProperty;
import jenkins.model.DirectlyModifiableTopLevelItemGroup;
@ -98,6 +99,7 @@ import jenkins.model.RunIdMigrator;
import jenkins.model.lazy.LazyBuildMixIn;
import jenkins.scm.RunWithSCM;
import jenkins.security.HexStringConfidentialKey;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.triggers.SCMTriggerItem;
import jenkins.widgets.HasWidgets;
import net.sf.json.JSONException;
@ -122,7 +124,9 @@ import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.stapler.StaplerOverridable;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST;
@ -854,9 +858,43 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
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
public Object getDynamic(String token, StaplerRequest req,
StaplerResponse rsp) {
// Intentionally not factoring this out into a common implementation method because it contains a call to super.
try {
// try to interpret the token as build number
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
*/
public void doRssChangelog(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public void doRssChangelog(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
class FeedItem {
ChangeLogSet.Entry e;
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.
// for the time being, I'm starting with permalinks
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.
*/
@POST
public synchronized void doConfigSubmit(StaplerRequest req,
StaplerResponse rsp) throws IOException, ServletException, FormException {
public synchronized void doConfigSubmit(StaplerRequest2 req,
StaplerResponse2 rsp) throws IOException, ServletException, FormException {
checkPermission(CONFIGURE);
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
* work.
*
* @since TODO
*/
protected void submit(StaplerRequest req, StaplerResponse rsp)
protected void submit(StaplerRequest2 req, StaplerResponse2 rsp)
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
*/
public void doDescription(StaplerRequest req, StaplerResponse rsp)
public void doDescription(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException {
if (req.getMethod().equals("GET")) {
//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.
*/
public void doBuildStatus(StaplerRequest req, StaplerResponse rsp)
public void doBuildStatus(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException {
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
public/* not synchronized. see renameTo() */void doDoRename(
StaplerRequest req, StaplerResponse rsp) throws IOException,
ServletException {
javax.servlet.ServletException {
String newName = req.getParameter("newName");
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 {
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 {
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 hudson.ExtensionPoint;
import hudson.Launcher;
import hudson.Util;
import hudson.model.Descriptor.FormException;
import hudson.model.queue.SubTask;
import hudson.tasks.BuildStep;
@ -41,6 +42,7 @@ import jenkins.model.Jenkins;
import jenkins.model.OptionalJobProperty;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.ExportedBean;
/**
@ -183,8 +185,28 @@ public abstract class JobProperty<J extends Job<?, ?>> implements Reconfigurable
return Collections.emptyList();
}
/**
* @since TODO
*/
@Override
public JobProperty<?> reconfigure(StaplerRequest2 req, JSONObject form) throws FormException {
if (Util.isOverridden(JobProperty.class, getClass(), "reconfigure", StaplerRequest.class, JSONObject.class)) {
return reconfigure(StaplerRequest.fromStaplerRequest2(req), form);
} else {
return reconfigureImpl(req, form);
}
}
/**
* @deprecated use {@link #reconfigure(StaplerRequest2, JSONObject)}
*/
@Deprecated
@Override
public JobProperty<?> reconfigure(StaplerRequest req, JSONObject form) throws FormException {
return reconfigureImpl(StaplerRequest.toStaplerRequest2(req), form);
}
private JobProperty<?> reconfigureImpl(StaplerRequest2 req, JSONObject form) throws FormException {
return form == null ? null : getDescriptor().newInstance(req, form);
}

View File

@ -24,6 +24,7 @@
package hudson.model;
import hudson.Util;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
@ -34,6 +35,7 @@ import jenkins.model.OptionalJobProperty;
import net.sf.json.JSONObject;
import org.jvnet.tiger_types.Types;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/**
* {@link Descriptor} for {@link JobProperty}.
@ -61,6 +63,23 @@ public abstract class JobPropertyDescriptor extends Descriptor<JobProperty<?>> {
* null to avoid setting an instance of {@link JobProperty} to the target project (or just use {@link OptionalJobProperty})
*/
@Override
public JobProperty<?> newInstance(StaplerRequest2 req, JSONObject formData) throws FormException {
if (Util.isOverridden(JobPropertyDescriptor.class, getClass(), "newInstance", StaplerRequest.class, JSONObject.class)) {
return newInstance(req != null ? StaplerRequest.fromStaplerRequest2(req) : null, formData);
} else {
// JobPropertyDescriptors are bit different in that we allow them even without any user-visible configuration parameter,
// so replace the lack of form data by an empty one.
if (formData.isNullObject()) formData = new JSONObject();
return super.newInstance(req, formData);
}
}
/**
* @deprecated use {@link #newInstance(StaplerRequest2, JSONObject)}
*/
@Deprecated
@Override
public JobProperty<?> newInstance(StaplerRequest req, JSONObject formData) throws FormException {
// JobPropertyDescriptors are bit different in that we allow them even without any user-visible configuration parameter,
// so replace the lack of form data by an empty one.

View File

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

View File

@ -41,6 +41,8 @@ import hudson.util.HttpResponses;
import hudson.views.ListViewColumn;
import hudson.views.StatusFilter;
import hudson.views.ViewJobFilter;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
@ -55,7 +57,6 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import net.jcip.annotations.GuardedBy;
import net.sf.json.JSONObject;
@ -67,7 +68,8 @@ import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
import org.kohsuke.stapler.verb.POST;
import org.springframework.security.access.AccessDeniedException;
@ -97,7 +99,7 @@ public class ListView extends View implements DirectlyModifiableView {
/**
* Whether to recurse in ItemGroups
*/
private boolean recurse;
private volatile boolean recurse;
/**
* 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");
if (json != null && !json.isEmpty()) {
// Submitted via UI
@ -371,7 +373,7 @@ public class ListView extends View implements DirectlyModifiableView {
@Override
@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();
if (ig instanceof ModifiableItemGroup) {
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.
*/
@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();
synchronized (this) {
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.stapler.Stapler;
import org.kohsuke.stapler.StaplerFallback;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
/**
* Adds the "Manage Jenkins" link to the top page.
@ -70,7 +70,7 @@ public class ManageJenkinsAction implements RootAction, StaplerFallback, ModelOb
}
@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");
}
@ -80,7 +80,7 @@ public class ManageJenkinsAction implements RootAction, StaplerFallback, ModelOb
*/
@Restricted(NoExternalUse.class)
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)
menu.add(url, icon, iconXml, text, post, requiresConfirmation, badge, message);
return;

View File

@ -24,10 +24,15 @@
package hudson.model;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
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.StaplerRequest2;
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
@ -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">}.
*
*/
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.NoOverlapCategoryAxis;
import jakarta.servlet.ServletException;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
@ -39,7 +40,6 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
@ -53,7 +53,9 @@ import org.jfree.ui.RectangleInsets;
import org.jvnet.localizer.Localizable;
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.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@ -298,8 +300,8 @@ public class MultiStageTimeSeries implements Serializable {
* Renders this object as an image.
*/
@Override
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
ChartUtil.generateGraph(req, rsp, createChart(), 500, 400);
public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
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 hudson.Extension;
import hudson.Util;
import hudson.model.Descriptor.FormException;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.interceptor.RequirePOST;
/**
@ -64,7 +67,7 @@ public class MyView extends View {
@RequirePOST
@Override
public TopLevelItem doCreateItem(StaplerRequest req, StaplerResponse rsp)
public TopLevelItem doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp)
throws IOException, ServletException {
ItemGroup<? extends TopLevelItem> ig = getOwner().getItemGroup();
if (ig instanceof ModifiableItemGroup) {
@ -85,7 +88,24 @@ public class MyView extends View {
}
@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
}

View File

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

View File

@ -79,6 +79,7 @@ import org.kohsuke.accmod.restrictions.ProtectedExternally;
import org.kohsuke.stapler.BindInterceptor;
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.ExportedBean;
import org.springframework.security.core.Authentication;
@ -560,8 +561,25 @@ public abstract class Node extends AbstractModelObject implements Reconfigurable
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
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;
final JSONObject jsonForProperties = form.optJSONObject("nodeProperties");

View File

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

View File

@ -41,6 +41,7 @@ import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@ -59,7 +60,7 @@ import org.kohsuke.stapler.export.ExportedBean;
* <p>
* Three classes are used to model build parameters. First is the
* {@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.
* For example, if the user defines two string parameters "database-type" and
* "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,
* {@link ParametersDefinitionProperty}, which in turns retains {@link ParameterDefinition}s),
* 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
* during a build.
*
@ -85,12 +86,12 @@ import org.kohsuke.stapler.export.ExportedBean;
* <h3>config.jelly</h3>
* {@link ParameterDefinition} class uses {@code config.jelly} to contribute a form
* 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>
* 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
* is then fed to {@link ParameterDefinition#createValue(StaplerRequest, JSONObject)} to
* is then fed to {@link ParameterDefinition#createValue(StaplerRequest2, JSONObject)} to
* create {@link ParameterValue}s.
*
* @see StringParameterDefinition
@ -183,14 +184,37 @@ public abstract class ParameterDefinition implements
* and submits it to the server.
*/
@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.
* If no value is available in the request, it returns a default value if possible, or null.
*
* <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 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.
*/
@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.

View File

@ -43,14 +43,14 @@ import jenkins.security.stapler.StaplerAccessibleType;
import net.sf.json.JSONObject;
import org.kohsuke.accmod.Restricted;
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.ExportedBean;
/**
* 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
* 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.
* parameter definition may change any time. So if you find yourself
* 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}.
*/
@Deprecated

View File

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

View File

@ -36,7 +36,7 @@ import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.accmod.restrictions.NoExternalUse;
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.
@ -80,7 +80,7 @@ public class PasswordParameterDefinition extends SimpleParameterDefinition {
}
@Override
public PasswordParameterValue createValue(StaplerRequest req, JSONObject jo) {
public PasswordParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
PasswordParameterValue value = req.bindJSON(PasswordParameterValue.class, jo);
if (value.getValue().getPlainText().equals(DEFAULT_VALUE)) {
value = new PasswordParameterValue(getName(), getDefaultValue());

View File

@ -40,6 +40,8 @@ import hudson.tasks.Publisher;
import hudson.triggers.SCMTrigger;
import hudson.triggers.Trigger;
import hudson.util.DescribableList;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
@ -49,11 +51,12 @@ import java.util.Set;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.triggers.SCMTriggerItem;
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;
/**
* Buildable software project.
@ -223,10 +226,39 @@ public abstract class Project<P extends Project<P, B>, B extends Build<P, B>>
// 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();
getBuildWrappersList().rebuild(req, json, BuildWrappers.getFor(this));

View File

@ -29,9 +29,10 @@ import hudson.Extension;
import hudson.Util;
import hudson.model.Descriptor.FormException;
import hudson.util.FormValidation;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.Collection;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
@ -39,7 +40,8 @@ import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerFallback;
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;
/**
@ -98,7 +100,32 @@ public class ProxyView extends View implements StaplerFallback {
}
@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");
if (Jenkins.get().getView(proxiedViewName) == null) {
throw new FormException("Not an existing global view", "proxiedViewName");
@ -108,7 +135,7 @@ public class ProxyView extends View implements StaplerFallback {
@RequirePOST
@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);
}
@ -139,7 +166,7 @@ public class ProxyView extends View implements StaplerFallback {
@Override
public boolean isInstantiable() {
// 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.Futures;
import hudson.util.XStream2;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
@ -107,8 +109,6 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins;
import jenkins.model.queue.AsynchronousExecution;
import jenkins.model.queue.CompositeCauseOfBlockage;
@ -130,7 +130,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
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]");
}

View File

@ -26,13 +26,17 @@ package hudson.model;
import hudson.FeedAdapter;
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.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.Jenkins;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/**
* RSS related code.
@ -52,8 +56,9 @@ public final class RSS {
* Entries to be listed in the RSS feed.
* @param adapter
* 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("title", title);
req.setAttribute("url", url);
@ -72,6 +77,18 @@ public final class RSS {
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.
*
@ -81,10 +98,23 @@ public final class RSS {
* URL of the model object that owns this feed. Relative to the context root.
* @param runList
* 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
*/
public static void rss(StaplerRequest req, StaplerResponse rsp, String title, String url, RunList runList) throws IOException, ServletException {
rss(req, rsp, title, url, runList, null);
@Deprecated
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.
* @param feedAdapter
* 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;
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.NonNull;
import hudson.Util;
import hudson.model.Descriptor.FormException;
import hudson.slaves.NodeProperty;
import jenkins.security.stapler.StaplerNotDispatchable;
import net.sf.json.JSONObject;
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
@ -44,7 +47,7 @@ import org.kohsuke.stapler.StaplerRequest;
* <strong>Invisible Property:</strong>
* 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
* 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}.
*
* <p>
@ -78,5 +81,29 @@ public interface ReconfigurableDescribable<T extends ReconfigurableDescribable<T
* @return
* 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.ProcessTree;
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.ByteArrayInputStream;
import java.io.File;
@ -106,8 +109,6 @@ import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import jenkins.model.ArtifactManager;
import jenkins.model.ArtifactManagerConfiguration;
import jenkins.model.ArtifactManagerFactory;
@ -119,6 +120,7 @@ import jenkins.model.StandardArtifactManager;
import jenkins.model.lazy.BuildReference;
import jenkins.model.lazy.LazyBuildMixIn;
import jenkins.security.MasterToSlaveCallable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties;
import jenkins.util.VirtualFile;
import jenkins.util.io.OnMaster;
@ -132,7 +134,9 @@ import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
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
// looking for "this" in the current request ancestors
// @see also {@link AbstractItem#getUrl}
StaplerRequest req = Stapler.getCurrentRequest();
StaplerRequest2 req = Stapler.getCurrentRequest2();
if (req != null) {
String seed = Functions.getNearestAncestorUrl(req, this);
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());
}
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());
}
@ -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.
*/
public void doBuildNumber(StaplerResponse rsp) throws IOException {
public void doBuildNumber(StaplerResponse2 rsp) throws IOException {
rsp.setContentType("text/plain");
rsp.setCharacterEncoding("US-ASCII");
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.
*/
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.setCharacterEncoding("US-ASCII");
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.
*
* @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 {
doConsoleTextImpl(StaplerRequest.toStaplerRequest2(req), StaplerResponse.toStaplerResponse2(rsp));
}
private void doConsoleTextImpl(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
rsp.setContentType("text/plain;charset=UTF-8");
try (InputStream input = getLogInputStream();
OutputStream os = rsp.getOutputStream();
@ -2299,7 +2322,7 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
*/
@Deprecated
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
public void doToggleLogKeep(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
public void doToggleLogKeep(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException {
keepLog(!keepLog);
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.
*
* @since TODO
*/
@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);
// 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.
*/
@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"));
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
public @NonNull HttpResponse doConfigSubmit(StaplerRequest req) throws IOException, ServletException, FormException {
public @NonNull HttpResponse doConfigSubmit(StaplerRequest2 req) throws IOException, ServletException, FormException {
checkPermission(UPDATE);
try (BulkChange bc = new BulkChange(this)) {
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
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
Object returnedResult = super.getDynamic(token, req, rsp);
return getDynamicImpl(token, returnedResult);
}
private Object getDynamicImpl(String token, Object returnedResult) {
if (returnedResult == null) {
//check transient actions too
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 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
// (want accurate 404 response).. send 404 with javascript to redirect browsers.
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.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.Exported;
public class RunParameterDefinition extends SimpleParameterDefinition {
@ -155,7 +155,7 @@ public class RunParameterDefinition extends SimpleParameterDefinition {
}
@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);
}
@ -202,7 +202,7 @@ public class RunParameterDefinition extends SimpleParameterDefinition {
}
@Override
public ParameterValue createValue(StaplerRequest req, JSONObject jo) {
public ParameterValue createValue(StaplerRequest2 req, JSONObject jo) {
RunParameterValue value = req.bindJSON(RunParameterValue.class, jo);
value.setDescription(getDescription());
return value;

View File

@ -5,7 +5,7 @@ import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.cli.CLICommand;
import java.io.IOException;
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.
@ -31,7 +31,7 @@ public abstract class SimpleParameterDefinition extends ParameterDefinition {
public abstract ParameterValue createValue(String value);
@Override
public final ParameterValue createValue(StaplerRequest req) {
public final ParameterValue createValue(StaplerRequest2 req) {
String[] value = req.getParameterValues(getName());
if (value == null) {
return getDefaultParameterValue();

View File

@ -51,6 +51,7 @@ import hudson.slaves.SlaveComputer;
import hudson.util.ClockDifference;
import hudson.util.DescribableList;
import hudson.util.FormValidation;
import jakarta.servlet.ServletException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@ -69,7 +70,6 @@ import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.security.MasterToSlaveCallable;
import jenkins.slaves.WorkspaceLocator;
@ -80,8 +80,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
/**
* Information about a Hudson agent node.
@ -418,7 +418,7 @@ public abstract class Slave extends Node implements Serializable {
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();
// 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.
@ -430,7 +430,7 @@ public abstract class Slave extends Node implements Serializable {
}
@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);
}
@ -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) {
throw new FileNotFoundException(name); // giving up
} else {
@ -622,7 +622,7 @@ public abstract class Slave extends Node implements Serializable {
/**
* 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)
return FormValidation.error(Messages.Slave_Remote_Director_Mandatory());

View File

@ -29,9 +29,9 @@ public final class StockStatusIcon extends AbstractStatusIcon {
@Override
public String getImageOf(String size) {
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 {
return Stapler.getCurrentRequest().getContextPath() + Jenkins.RESOURCE_PATH +
return Stapler.getCurrentRequest2().getContextPath() + Jenkins.RESOURCE_PATH +
"/images/" + size + "/" + image;
}
}

View File

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

View File

@ -27,12 +27,12 @@ package hudson.model;
import hudson.console.AnnotatedLargeText;
import hudson.security.ACL;
import hudson.security.Permission;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.ref.WeakReference;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.framework.io.LargeText;
import org.kohsuke.stapler.interceptor.RequirePOST;
@ -113,7 +113,7 @@ public abstract class TaskAction extends AbstractModelObject implements Action {
/**
* 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();
if (text != null) {
text.doProgressText(req, rsp);
@ -125,7 +125,7 @@ public abstract class TaskAction extends AbstractModelObject implements Action {
/**
* 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();
if (text != null) {
text.doProgressiveHtml(req, rsp);
@ -138,7 +138,7 @@ public abstract class TaskAction extends AbstractModelObject implements Action {
* Clears the error status.
*/
@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());
if (workerThread != null && !workerThread.isRunning())

View File

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

View File

@ -164,7 +164,7 @@ public abstract class TopLevelItemDescriptor extends Descriptor<TopLevelItem> im
DefaultScriptInvoker dsi = new DefaultScriptInvoker();
StringWriter sw = new StringWriter();
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();
} catch (Exception e) {
LOGGER.log(Level.WARNING, null, e);

View File

@ -58,6 +58,7 @@ import hudson.util.NamingThreadFactory;
import hudson.util.PersistedList;
import hudson.util.VersionNumber;
import hudson.util.XStream2;
import jakarta.servlet.ServletException;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
@ -107,7 +108,6 @@ import java.util.jar.JarFile;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLHandshakeException;
import javax.servlet.ServletException;
import jenkins.MissingDependencyException;
import jenkins.RestartRequiredException;
import jenkins.install.InstallUtil;
@ -115,6 +115,7 @@ import jenkins.management.Badge;
import jenkins.model.Jenkins;
import jenkins.model.Loadable;
import jenkins.security.stapler.StaplerDispatchable;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.SystemProperties;
import jenkins.util.Timer;
import jenkins.util.io.OnMaster;
@ -129,7 +130,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerProxy;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.kohsuke.stapler.interceptor.RequirePOST;
@ -439,7 +441,25 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* @return The current connection status.
*/
@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) {
return doConnectionStatusImpl(StaplerRequest.toStaplerRequest2(request));
}
private HttpResponse doConnectionStatusImpl(StaplerRequest2 request) {
Jenkins.get().checkPermission(Jenkins.SYSTEM_READ);
try {
String siteId = request.getParameter("siteId");
@ -536,12 +556,12 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* <p>
* Supports a "correlationId" request parameter if you only want to get the
* 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.
*/
@Restricted(DoNotUse.class)
public HttpResponse doInstallStatus(StaplerRequest request) {
public HttpResponse doInstallStatus(StaplerRequest2 request) {
try {
String correlationId = request.getParameter("correlationId");
Map<String, Object> response = new HashMap<>();
@ -754,7 +774,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Schedules a Jenkins upgrade.
*/
@RequirePOST
public void doUpgrade(StaplerResponse rsp) throws IOException, ServletException {
public void doUpgrade(StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
HudsonUpgradeJob job = new HudsonUpgradeJob(getCoreSource(), Jenkins.getAuthentication2());
if (!Lifecycle.get().canRewriteHudsonWar()) {
@ -786,7 +806,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Schedules a Jenkins restart.
*/
@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);
synchronized (jobs) {
if (!isRestartScheduled()) {
@ -801,7 +821,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Cancel all scheduled jenkins restarts
*/
@RequirePOST
public void doCancelRestart(StaplerResponse response) throws IOException, ServletException {
public void doCancelRestart(StaplerResponse2 response) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
synchronized (jobs) {
for (UpdateCenterJob job : jobs) {
@ -860,7 +880,7 @@ public class UpdateCenter extends AbstractModelObject implements Loadable, Savea
* Performs hudson downgrade.
*/
@RequirePOST
public void doDowngrade(StaplerResponse rsp) throws IOException, ServletException {
public void doDowngrade(StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
if (!isDowngradable()) {
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.
*/
@RequirePOST
public void doRestart(StaplerResponse rsp) throws IOException, ServletException {
public void doRestart(StaplerResponse2 rsp) throws IOException, ServletException {
Jenkins.get().checkPermission(Jenkins.ADMINISTER);
HudsonDowngradeJob job = new HudsonDowngradeJob(getCoreSource(), Jenkins.getAuthentication2());
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
* 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) {
return null;
}

View File

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

View File

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

View File

@ -27,6 +27,7 @@ package hudson.model;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.DescriptorExtensionList;
import hudson.ExtensionPoint;
import hudson.Util;
import hudson.model.Descriptor.FormException;
import hudson.model.userproperty.UserPropertyCategory;
import java.util.ArrayList;
@ -34,6 +35,7 @@ import java.util.List;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.export.ExportedBean;
/**
@ -101,8 +103,22 @@ public abstract class UserProperty implements ReconfigurableDescribable<UserProp
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
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);
}
}

View File

@ -25,7 +25,7 @@
package hudson.model;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.io.StreamException;
@ -57,6 +57,9 @@ import hudson.util.FormValidation;
import hudson.util.RunList;
import hudson.util.XStream2;
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.ByteArrayInputStream;
import java.io.IOException;
@ -80,8 +83,6 @@ import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
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.Category;
import jenkins.model.item_category.ItemCategory;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.xml.XMLUtils;
import jenkins.widgets.HasWidgets;
import net.sf.json.JSONObject;
@ -108,7 +110,9 @@ import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.WebMethod;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@ -673,7 +677,28 @@ public abstract class View extends AbstractModelObject implements AccessControll
* Accepts the new description.
*/
@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);
description = req.getParameter("description");
@ -684,10 +709,10 @@ public abstract class View extends AbstractModelObject implements AccessControll
/**
* Accepts submission from the configuration page.
*
* Subtypes should override the {@link #submit(StaplerRequest)} method.
* Subtypes should override the {@link #submit(StaplerRequest2)} method.
*/
@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);
submit(req);
@ -710,13 +735,42 @@ public abstract class View extends AbstractModelObject implements AccessControll
*
* 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.
*/
@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);
owner.deleteView(this);
@ -729,13 +783,44 @@ public abstract class View extends AbstractModelObject implements AccessControll
* Creates a new {@link Item} in this collection.
*
* <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.
*
* @return
* 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.
@ -774,7 +859,7 @@ public abstract class View extends AbstractModelObject implements AccessControll
* @return A {@link Categories} entity that is shown as JSON file.
*/
@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);
rsp.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
@ -833,11 +918,11 @@ public abstract class View extends AbstractModelObject implements AccessControll
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());
}
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());
}
@ -851,7 +936,7 @@ public abstract class View extends AbstractModelObject implements AccessControll
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<>();
for (TopLevelItem item : getItems()) {
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.
*/
@WebMethod(name = "config.xml")
public HttpResponse doConfigDotXml(StaplerRequest req) throws IOException {
public HttpResponse doConfigDotXml(StaplerRequest2 req) throws IOException {
if (req.getMethod().equals("GET")) {
// read
checkPermission(READ);
return new HttpResponse() {
@Override
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException {
rsp.setContentType("application/xml");
View.this.writeXml(rsp.getOutputStream());
}
@ -940,7 +1025,7 @@ public abstract class View extends AbstractModelObject implements AccessControll
}
@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();
for (TopLevelItem i : getItems())
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
* {@link StaplerRequest}.
* {@link StaplerRequest2}.
* <p>
* <strong>NOTE: Historically this method is only ever called from a {@link StaplerRequest}</strong>
* @return the list of instantiable {@link ViewDescriptor} instances for the current {@link StaplerRequest}
* <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 StaplerRequest2}
*/
@NonNull
public static List<ViewDescriptor> allInstantiable() {
List<ViewDescriptor> r = new ArrayList<>();
StaplerRequest request = Stapler.getCurrentRequest();
StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request == null) {
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;
}
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 {
String mode = req.getParameter("mode");
@ -1070,7 +1158,20 @@ public abstract class View extends AbstractModelObject implements AccessControll
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;
String from = req.getParameter("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.QueryParameter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/**
* {@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.
*/
public List<Descriptor<ListViewColumn>> getColumnsDescriptors() {
StaplerRequest request = Stapler.getCurrentRequest();
StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request != null) {
View view = request.findAncestorObject(clazz);
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.
*/
public List<Descriptor<ViewJobFilter>> getJobFiltersDescriptors() {
StaplerRequest request = Stapler.getCurrentRequest();
StaplerRequest2 request = Stapler.getCurrentRequest2();
if (request != null) {
View view = request.findAncestorObject(clazz);
return view == null ? DescriptorVisibilityFilter.applyType(clazz, ViewJobFilter.all())

View File

@ -25,7 +25,10 @@
package hudson.model;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Util;
import hudson.model.Descriptor.FormException;
import io.jenkins.servlet.ServletExceptionWrapper;
import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashSet;
@ -34,11 +37,12 @@ import java.util.SortedMap;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerResponse2;
/**
* {@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();
@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);
submitImpl();
}
private void submitImpl() {
// make sure to reload to reflect this config change.
nextUpdate = 0;
}

View File

@ -26,9 +26,11 @@ package hudson.model;
import hudson.DescriptorExtensionList;
import hudson.ExtensionPoint;
import hudson.Util;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerRequest2;
/**
* Extensible property of {@link View}.
@ -68,8 +70,22 @@ public class ViewProperty implements ReconfigurableDescribable<ViewProperty>, Ex
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
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);
}
}

View File

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

View File

@ -32,20 +32,20 @@ import hudson.model.TransientUserActionFactory;
import hudson.model.User;
import hudson.model.UserProperty;
import hudson.model.UserPropertyDescriptor;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.servlet.ServletException;
import jenkins.model.Jenkins;
import jenkins.security.UserDetailsCache;
import net.sf.json.JSONObject;
import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.StaplerRequest2;
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.verb.POST;
@Restricted(NoExternalUse.class)
@ -91,7 +91,7 @@ public class UserPropertyCategoryAccountAction extends UserPropertyCategoryActio
}
@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();
targetUser.checkPermission(Jenkins.ADMINISTER);

View File

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

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