package authoritymanager.server;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadImpl extends HttpServlet  {
	private static final long serialVersionUID = 8305367618713715640L;
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("text/plain");
		System.out.println("Inside File Upload Servlet...............>>>>>>>>>>");
		try
		{
			getFileItem(request);
			response.getWriter().write(new String("Uploading Completed...."));
		}
		catch(Exception e)
		{
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
	}

	private FileItem getFileItem(final HttpServletRequest request)
	{
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		// Create a progress listener, if want to use
		ProgressListener progressListener = new ProgressListener() {
			private long megaBytes = -1;
			int i = -1;

			public void update(long pBytesRead, long pContentLength, int pItems) {
				if(i != pItems) {
					i = pItems;
					System.out.println("Setting TotalSize " + pContentLength);
					System.out.println("We are currently reading item " + pItems);
				}
				long mBytes = pBytesRead / 10000;
				if(megaBytes == mBytes) {
					return;
				}
				megaBytes = mBytes;
				if(pContentLength == -1) {
					System.out.println("So far, " + pBytesRead + " bytes have been read.");
				}
				else {
					System.out.println("Read, " + pBytesRead + " of " + pContentLength + " bytes.");
				}
			}
		};
		upload.setProgressListener(progressListener);

		try {
			List items = upload.parseRequest(request);
			System.out.println("List Items, size --->" + items.size());
			Iterator it = items.iterator();
			while(it.hasNext())
			{
				FileItem item = (FileItem) it.next();
				if(item.isFormField())
				{
					System.out.println("File String->" + item.getString());
				}
				else
				{
					System.out.println(String.format("File Name-> %s, Size-> %s, Content Type->%s, Isformfield-> %s, inMemory-> %s",
                                                   item.getFieldName(), item.getSize(), item.getContentType(), item.isFormField(), item.isInMemory()));
					this.processUpload(item);
				}
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
			System.out.println(e.toString());
			return null;
		}
		return null;
	}

	private void processUpload(FileItem uploadItem)
	{
		try
		{
			System.out.println("Hura") ;
			InputStream input = uploadItem.getInputStream();
			byte[] fileContents = uploadItem.get();
			// TODO: add code to process file contents here.
			// Process a file upload
			/*
			 * if (writeToFile) {
			 * File uploadedFile = new File(...);
			 * item.write(uploadedFile);
			 * }
			 * else
			 * {
			 * InputStream uploadedStream =
			 * item.getInputStream();
			 * uploadedStream.close();
			 * }
			 */
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

}
