001package com.esri.arcgis.enterprise.interceptor.server;
002
003import com.esri.arcgis.enterprise.interceptor.IInterceptorResponse;
004import jakarta.servlet.ServletOutputStream;
005import jakarta.servlet.http.HttpServletResponse;
006
007import java.io.IOException;
008import java.io.PrintWriter;
009import java.lang.invoke.MethodHandle;
010import java.lang.invoke.MethodHandles;
011import java.lang.invoke.MethodType;
012import java.util.Collection;
013
014public class ServerServicesInterceptorResponseWrapper implements IInterceptorResponse {
015    private static final String APP_INTERCEPTOR_RESPONSE = "InterceptorResponse";
016    private IInterceptorResponse interceptorResponse;
017    private HttpServletResponse httpServletResponse;
018
019    public ServerServicesInterceptorResponseWrapper(IInterceptorResponse interceptorResponse) {
020        this.interceptorResponse = interceptorResponse;
021        this.setHttpServletResponse();
022    }
023
024    private void setHttpServletResponse() {
025        try {
026            IInterceptorResponse response = getAppInterceptorResponse();
027            if (response != null) {
028                // Extract
029                while (!response.getClass().getSimpleName().equals(APP_INTERCEPTOR_RESPONSE)) {
030                    ServerServicesInterceptorResponseWrapper wrapper = (ServerServicesInterceptorResponseWrapper) response;
031                    response = wrapper.getAppInterceptorResponse();
032                }
033                MethodHandles.Lookup lookup = MethodHandles.lookup();
034                MethodType methodType = MethodType.methodType(HttpServletResponse.class);
035                MethodHandle methodHandle = lookup.findVirtual(response.getClass(), "getHttpServletResponse", methodType);
036                this.httpServletResponse = (HttpServletResponse) methodHandle.invoke(response);
037            }
038        } catch (Throwable e) {
039            throw new RuntimeException(e);
040        }
041    }
042
043    @Override
044    public void sendError(int sc, String msg) throws IOException {
045        httpServletResponse.sendError(sc, msg);
046    }
047
048    @Override
049    public void sendError(int sc) throws IOException {
050        httpServletResponse.sendError(sc);
051    }
052
053    @Override
054    public void setHeader(String name, String value) {
055        httpServletResponse.setHeader(name, value);
056    }
057
058    @Override
059    public void addHeader(String name, String value) {
060        httpServletResponse.addHeader(name, value);
061    }
062
063    @Override
064    public void setStatus(int sc) {
065        httpServletResponse.setStatus(sc);
066    }
067
068    @Override
069    public String getHeader(String name) {
070        return httpServletResponse.getHeader(name);
071    }
072
073    @Override
074    public Collection<String> getHeaders(String name) {
075        return httpServletResponse.getHeaders(name);
076    }
077
078    @Override
079    public Collection<String> getHeaderNames() {
080        return httpServletResponse.getHeaderNames();
081    }
082
083    @Override
084    public ServletOutputStream getOutputStream() throws IOException {
085        return httpServletResponse.getOutputStream();
086    }
087
088    @Override
089    public PrintWriter getWriter() throws IOException {
090        return httpServletResponse.getWriter();
091    }
092
093    @Override
094    public void flushBuffer() throws IOException {
095        httpServletResponse.flushBuffer();
096    }
097
098    @Override
099    public void reset() {
100        httpServletResponse.reset();
101    }
102
103    @Override
104    public void setCharacterEncoding(String var1) {
105        httpServletResponse.setCharacterEncoding(var1);
106    }
107
108    @Override
109    public String getCharacterEncoding() {
110        return httpServletResponse.getCharacterEncoding();
111    }
112
113    @Override
114    public boolean isCommitted() {
115        return httpServletResponse.isCommitted();
116    }
117
118    @Override
119    public String getContentType() {
120        return httpServletResponse.getContentType();
121    }
122
123    public IInterceptorResponse getAppInterceptorResponse() {
124        return interceptorResponse;
125    }
126
127}