Fix delegation in LifecyclePrintWriter

Closes gh-36885
This commit is contained in:
rstoyanchev
2026-06-22 13:12:50 +01:00
parent 12f9a5c2a5
commit 167afd91be
@@ -453,221 +453,172 @@ public class StandardServletAsyncWebRequest extends ServletWebRequest implements
@Override
public void flush() {
invokeWithLock(this.delegate::flush);
}
private void invokeWithLock(Runnable runnable) {
int level = this.asyncWebRequest.tryObtainLock();
if (level > -1) {
try {
this.delegate.flush();
runnable.run();
}
finally {
releaseLock(level);
if (level > 0) {
this.asyncWebRequest.stateLock.unlock();
}
}
}
}
@Override
public void close() {
int level = this.asyncWebRequest.tryObtainLock();
if (level > -1) {
try {
this.delegate.close();
}
finally {
releaseLock(level);
}
}
}
@Override
public boolean checkError() {
return this.delegate.checkError();
invokeWithLock(this.delegate::close);
}
@Override
public void write(int c) {
int level = this.asyncWebRequest.tryObtainLock();
if (level > -1) {
try {
this.delegate.write(c);
}
finally {
releaseLock(level);
}
}
invokeWithLock(() -> this.delegate.write(c));
}
@Override
public void write(char[] buf, int off, int len) {
int level = this.asyncWebRequest.tryObtainLock();
if (level > -1) {
try {
this.delegate.write(buf, off, len);
}
finally {
releaseLock(level);
}
}
invokeWithLock(() -> this.delegate.write(buf, off, len));
}
@Override
public void write(char[] buf) {
this.delegate.write(buf);
write(buf, 0, buf.length);
}
@Override
public void write(String s, int off, int len) {
int level = this.asyncWebRequest.tryObtainLock();
if (level > -1) {
try {
this.delegate.write(s, off, len);
}
finally {
releaseLock(level);
}
}
invokeWithLock(() -> this.delegate.write(s, off, len));
}
@Override
public void write(String s) {
this.delegate.write(s);
}
private void releaseLock(int level) {
if (level > 0) {
this.asyncWebRequest.stateLock.unlock();
}
write(s, 0, s.length());
}
// Plain delegates
@Override
public void print(boolean b) {
this.delegate.print(b);
write(String.valueOf(b));
}
@Override
public void print(char c) {
this.delegate.print(c);
write(c);
}
@Override
public void print(int i) {
this.delegate.print(i);
write(String.valueOf(i));
}
@Override
public void print(long l) {
this.delegate.print(l);
write(String.valueOf(l));
}
@Override
public void print(float f) {
this.delegate.print(f);
write(String.valueOf(f));
}
@Override
public void print(double d) {
this.delegate.print(d);
write(String.valueOf(d));
}
@Override
public void print(char[] s) {
this.delegate.print(s);
write(s);
}
@Override
public void print(String s) {
this.delegate.print(s);
write(String.valueOf(s));
}
@Override
public void print(Object obj) {
this.delegate.print(obj);
write(String.valueOf(obj));
}
@Override
public void println() {
this.delegate.println();
invokeWithLock(this.delegate::println);
}
@Override
public void println(boolean x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(char x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(int x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(long x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(float x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(double x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(char[] x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(String x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public void println(Object x) {
this.delegate.println(x);
invokeWithLock(() -> this.delegate.println(x));
}
@Override
public PrintWriter printf(String format, Object... args) {
return this.delegate.printf(format, args);
return format(format, args);
}
@Override
public PrintWriter printf(Locale l, String format, Object... args) {
return this.delegate.printf(l, format, args);
return format(format, args);
}
@Override
public PrintWriter format(String format, Object... args) {
return this.delegate.format(format, args);
invokeWithLock(() -> this.delegate.format(format, args));
return this;
}
@Override
public PrintWriter format(Locale l, String format, Object... args) {
return this.delegate.format(l, format, args);
invokeWithLock(() -> this.delegate.format(format, args));
return this;
}
@Override
public PrintWriter append(CharSequence csq) {
return this.delegate.append(csq);
}
@Override
public PrintWriter append(CharSequence csq, int start, int end) {
return this.delegate.append(csq, start, end);
}
@Override
public PrintWriter append(char c) {
return this.delegate.append(c);
}
}