/*=============================================================================#
 # Copyright (c) 2018, 2019 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.rhelp.core.http;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;


@NonNullByDefault
public class SimpleResourceHandler implements ResourceHandler {
	
	
	private final MimeTypes defaultMimeTypes;
	private @Nullable MimeTypes specialMimeTypes;
	
	private @Nullable String cacheControl;
	
	
	public SimpleResourceHandler(final MimeTypes mimeTypes) {
		this.defaultMimeTypes= mimeTypes;
	}
	
	
	@Override
	public void setSpecialMimeTypes(final MimeTypes types) {
		this.specialMimeTypes= types;
	}
	
	private @Nullable String getMimeType(final String fileName) {
		String type= null;
		if (this.specialMimeTypes != null) {
			type= this.specialMimeTypes.getMimeType(fileName);
		}
		if (type == null) {
			type= this.defaultMimeTypes.getMimeType(fileName);
		}
		return type;
	}
	
	@Override
	public void setCacheControl(final String value) {
		this.cacheControl= value;
	}
	
	@Override
	public void doGet(final Path file,
			final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
		try (final InputStream in= Files.newInputStream(file)) {
			in.available();
			final byte[] buffer= new byte[1024];
			
			{	final String mimeType= getMimeType(file.getFileName().toString());
				if (mimeType != null) {
					resp.setContentType(mimeType);
				}
			}
			{	final String cacheControl= this.cacheControl;
				if (cacheControl != null) {
					resp.setHeader("Cache-Control", cacheControl); //$NON-NLS-1$
				}
			}
			
			final ServletOutputStream outputStream= resp.getOutputStream();
			int n= 0;
			while ((n= in.read(buffer, 0, 1024)) >= 0) {
				outputStream.write(buffer, 0, n);
			}
			outputStream.close();
		}
	}
	
}
