/*******************************************************************************
 * Copyright (c) 2009, 2018 Cloudsmith Inc and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Cloudsmith Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.equinox.p2.testserver.servlets;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URI;
import java.net.URLConnection;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * The FileMolester will keep a certain amount of the file from the beginning,
 * and return garbage/gibberish for the rest of the file's content. The garbage
 * is produced by shifting every byte 1 bit to the left.
 *
 * The idea for keeping some percentage is to support keeping xml headers /
 * doctype etc.
 */
public class FileMolester extends BasicResourceDelivery {

	int keepLength;

	/**
	 * Create a file molester that turns content into gibberish.
	 *
	 * @param theAlias   the path this servlet is registered under
	 * @param thePath    the path to use as root for the alias
	 * @param keepLength - how many bytes in the beginning that will be unmolested
	 */
	public FileMolester(String theAlias, URI thePath, int keepLength) {
		super(theAlias, thePath);
		if (keepLength < 0)
			throw new IllegalArgumentException("keepLength must be >= 0 - was:" + Integer.valueOf(keepLength)); //$NON-NLS-1$
		this.keepLength = keepLength;
	}

	private static final long serialVersionUID = 1L;

	@Override
	protected void deliver(URLConnection conn, InputStream in, String filename, HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		// molest all files
		doMolest(conn, in, filename, response);
	}

	protected void doMolest(URLConnection conn, InputStream in, String filename, HttpServletResponse response)
			throws IOException {
		int contentlength = conn.getContentLength();
		if (contentlength >= 0) {
			response.setContentLength(contentlength);

			String mimeType = computeMimeType(filename, conn);
			response.setContentType(mimeType);

			// We want to use a writer if we are sending text
			if (mimeType.startsWith("text/")) //$NON-NLS-1$
			{
				PrintWriter writer = response.getWriter();

				writer.flush(); /* write the headers and unbuffer the output */

				BufferedReader reader = new BufferedReader(new InputStreamReader(in));

				char buffer[] = new char[4096];
				int read;
				int written = 0;
				while ((read = reader.read(buffer, 0, buffer.length)) != -1) {
					if (written + read > keepLength)
						molest(buffer, written, read);
					writer.write(buffer, 0, read);
					written += read;
				}
			} else {
				ServletOutputStream out = response.getOutputStream();

				out.flush(); /* write the headers and unbuffer the output */

				byte buffer[] = new byte[4096];
				int read;
				int written = 0;
				while ((read = in.read(buffer, 0, buffer.length)) != -1) {
					if (written + read > keepLength)
						molest(buffer, written, read);
					out.write(buffer, 0, read);
					written += read;
				}
			}
		}
	}

	/** Molest a char buffer */
	private void molest(char[] buffer, int written, int read) {
		int start = keepLength - written;
		if (start > read)
			return;
		for (int i = start < 0 ? 0 : start; i < read; i++)
			buffer[i] = (char) (buffer[i] << 1);
	}

	/** Molest a byte buffer */
	private void molest(byte[] buffer, int written, int read) {
		int start = keepLength - written;
		if (start > read)
			return;
		for (int i = start < 0 ? 0 : start; i < read; i++)
			buffer[i] = (byte) (buffer[i] << 1);
	}
}
