MockHttpServletResponse.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2025 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.openspcoop2.protocol.modipa.utils;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

/**
 * Classe per simulare una risposta servlet http
 * 
 * 
 * @author Tommaso Burlon (tommaso.burlon@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class MockHttpServletResponse implements HttpServletResponse {

	private String contentType;
	private Long contentLength;
	private Map<String, List<String>> headers = new HashMap<>();
	private int status;
	private Integer bufferSize = 10;
	private String characterEncoding = null;
	private MockServletOutputStream outputStream = new MockServletOutputStream();
	private boolean committed = false;
	private Locale locale = null;
	
	private List<Cookie> cookies = new ArrayList<>();
	
	@Override
	public void flushBuffer() throws IOException {
		this.committed = true;
	}

	@Override
	public int getBufferSize() {
		return this.bufferSize;
	}

	@Override
	public String getCharacterEncoding() {
		return this.characterEncoding;
	}

	@Override
	public String getContentType() {
		return this.contentType;
	}

	@Override
	public Locale getLocale() {
		return this.locale;
	}

	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		return this.outputStream;
	}

	@Override
	public PrintWriter getWriter() throws IOException {
		return new PrintWriter(this.outputStream);
	}

	@Override
	public boolean isCommitted() {
		return this.committed;
	}

	@Override
	public void reset() {
		this.resetBuffer();
		this.headers.clear();
		this.status = 0;
	}

	@Override
	public void resetBuffer() {
		this.outputStream = new MockServletOutputStream();
	}

	@Override
	public void setBufferSize(int arg0) {
		this.bufferSize = arg0;
	}

	@Override
	public void setCharacterEncoding(String arg0) {
		this.characterEncoding = arg0;

	}

	@Override
	public void setContentLength(int arg0) {
		this.contentLength = Long.valueOf(arg0);

	}

	@Override
	public void setContentLengthLong(long arg0) {
		this.contentLength = arg0;

	}

	@Override
	public void setContentType(String arg0) {
		this.contentType = arg0;

	}
	
	public Long getContentLength() {
		return this.contentLength;
	}

	@Override
	public void setLocale(Locale arg0) {
		this.locale = arg0;
	}

	@Override
	public void addCookie(Cookie arg0) {
		this.cookies.add(arg0);
	}

	@Override
	public void addDateHeader(String arg0, long arg1) {
		this.headers.getOrDefault(arg0, new ArrayList<>()).add(String.valueOf(arg1));
	}

	@Override
	public void addHeader(String arg0, String arg1) {
		this.headers.getOrDefault(arg0, new ArrayList<>()).add(arg1);
	}

	@Override
	public void addIntHeader(String arg0, int arg1) {
		this.headers.getOrDefault(arg0, new ArrayList<>()).add(String.valueOf(arg1));

	}

	@Override
	public boolean containsHeader(String arg0) {
		return this.headers.containsKey(arg0);
	}

	@Override
	public String encodeRedirectURL(String arg0) {
		return arg0;
	}

	/**
	 * @deprecated
	 */
	@Override
	@SuppressWarnings("deprecation")
	@Deprecated(since="3.3")
	public String encodeRedirectUrl(String arg0) {
		return arg0;
	}

	@Override
	public String encodeURL(String arg0) {
		return arg0;
	}

	/**
	 * @deprecated
	 */
	@Override
	@SuppressWarnings("deprecation")
	@Deprecated(since="3.3")
	public String encodeUrl(String arg0) {
		return arg0;
	}

	@Override
	public String getHeader(String arg0) {
		return String.join(",", this.headers.getOrDefault(arg0, List.of()));
	}

	@Override
	public Collection<String> getHeaderNames() {
		return this.headers.keySet();
	}

	@Override
	public Collection<String> getHeaders(String arg0) {
		return this.headers.getOrDefault(arg0, List.of());
	}

	@Override
	public int getStatus() {
		return this.status;
	}

	@Override
	public void sendError(int code) throws IOException {
		this.status = code;
	}

	@Override
	public void sendError(int code, String arg1) throws IOException {
		this.status = code;
	}

	@Override
	public void sendRedirect(String arg0) throws IOException {
		// ignore
	}

	@Override
	public void setDateHeader(String arg0, long arg1) {
		this.headers.getOrDefault(arg0, new ArrayList<>()).clear();
		this.headers.getOrDefault(arg0, new ArrayList<>()).add(String.valueOf(arg1));
	}

	@Override
	public void setHeader(String arg0, String arg1) {
		List<String> list = new ArrayList<>();
		list.addAll(List.of(arg1.split(",")));
		this.headers.put(arg1, list);
	}

	@Override
	public void setIntHeader(String arg0, int arg1) {
		this.headers.put(arg0, List.of(String.valueOf(arg1)));

	}

	@Override
	public void setStatus(int arg0) {
		this.status = arg0;
	}

	@SuppressWarnings("deprecation")
	@Override
	public void setStatus(int arg0, String arg1) {
		this.status = arg0;
	}

}