content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.camel.quarkus.component.avro.rpc.spi;
  
  import java.io.BufferedReader;
  import java.io.ByteArrayInputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.UnsupportedEncodingException;
  import java.security.Principal;
  import java.util.Collection;
  import java.util.Enumeration;
  import java.util.Locale;
  import java.util.Map;
  
  import jakarta.servlet.AsyncContext;
  import jakarta.servlet.DispatcherType;
  import jakarta.servlet.ReadListener;
  import jakarta.servlet.RequestDispatcher;
  import jakarta.servlet.ServletContext;
  import jakarta.servlet.ServletException;
  import jakarta.servlet.ServletInputStream;
  import jakarta.servlet.ServletRequest;
  import jakarta.servlet.ServletResponse;
  import jakarta.servlet.http.Cookie;
  import jakarta.servlet.http.HttpServletRequest;
  import jakarta.servlet.http.HttpServletResponse;
  import jakarta.servlet.http.HttpSession;
  import jakarta.servlet.http.HttpUpgradeHandler;
  import jakarta.servlet.http.Part;
  
  /**
   * Empty implementation of {@link jakarta.servlet.http.HttpServletRequest}.
   * Serves as a wrapper to be used for {@link org.apache.avro.ipc.ResponderServlet}
   */
  public class HttpServletRequestFromBytes implements HttpServletRequest {
  
      private final byte[] buffer;
      private final String method;
  
      public HttpServletRequestFromBytes(byte[] bytes, String method) {
          this.buffer = bytes;
          this.method = method;
      }
  
      @Override
      public ServletInputStream getInputStream() throws IOException {
          return new ServletInputStreamFromInputStream(new ByteArrayInputStream(buffer));
      }
  
      @Override
      public String getMethod() {
          return method;
      }
  
      // --------------------- following methods are not implemented and not used ----------------------------
  
      @Override
      public String getAuthType() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Cookie[] getCookies() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public long getDateHeader(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getHeader(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Enumeration<String> getHeaders(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Enumeration<String> getHeaderNames() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public int getIntHeader(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getPathInfo() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getPathTranslated() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getContextPath() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getQueryString() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getRemoteUser() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isUserInRole(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Principal getUserPrincipal() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getRequestedSessionId() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getRequestURI() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public StringBuffer getRequestURL() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getServletPath() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public HttpSession getSession(boolean b) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public HttpSession getSession() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String changeSessionId() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isRequestedSessionIdValid() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isRequestedSessionIdFromCookie() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isRequestedSessionIdFromURL() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isRequestedSessionIdFromUrl() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public void login(String s, String s1) throws ServletException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public void logout() throws ServletException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Collection<Part> getParts() throws IOException, ServletException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Part getPart(String s) throws IOException, ServletException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public <T extends HttpUpgradeHandler> T upgrade(Class<T> aClass) throws IOException, ServletException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Object getAttribute(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Enumeration<String> getAttributeNames() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getCharacterEncoding() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public void setCharacterEncoding(String s) throws UnsupportedEncodingException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public int getContentLength() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public long getContentLengthLong() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getContentType() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getParameter(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Enumeration<String> getParameterNames() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String[] getParameterValues(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Map<String, String[]> getParameterMap() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getProtocol() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getScheme() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getServerName() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public int getServerPort() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public BufferedReader getReader() throws IOException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getRemoteAddr() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getRemoteHost() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public void setAttribute(String s, Object o) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public void removeAttribute(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Locale getLocale() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public Enumeration<Locale> getLocales() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isSecure() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public RequestDispatcher getRequestDispatcher(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getRealPath(String s) {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public int getRemotePort() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getLocalName() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public String getLocalAddr() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public int getLocalPort() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public ServletContext getServletContext() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public AsyncContext startAsync() throws IllegalStateException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse)
              throws IllegalStateException {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isAsyncStarted() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public boolean isAsyncSupported() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public AsyncContext getAsyncContext() {
          throw new UnsupportedOperationException();
      }
  
      @Override
      public DispatcherType getDispatcherType() {
          throw new UnsupportedOperationException();
      }
  
      private class ServletInputStreamFromInputStream extends ServletInputStream {
  
          final InputStream is;
  
          public ServletInputStreamFromInputStream(InputStream is) {
              this.is = is;
          }
  
          @Override
          public boolean isFinished() {
              try {
                  return is.available() != 0;
              } catch (IOException e) {
                  throw new RuntimeException(e);
              }
          }
  
          @Override
          public boolean isReady() {
              return true;
          }
  
          @Override
          public void setReadListener(ReadListener readListener) {
  
          }
  
          @Override
          public int read() throws IOException {
              return is.read();
          }
      }
  }
  