/**
 * 
 */
package com.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.Date;

/**
 * @author Ramamoorthy
 * 
 */
public class MimeType {

	/**
	 * 
	 */
	String server_dir = null;
	public MimeType()
	{
		
	}
	public MimeType(String server_dir) 
	{
		this.server_dir	= server_dir;
	}

	private byte data[];

	private String header = "";

	private String fileName = null;

	public static void main(String[] args) 
	{
		try 
		{
			MimeType obj = new MimeType();
			File file = new File("E:\\ramamoorthy\\temp");
			if (file != null) 
			{
				obj.readDir(file);
			}
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}

	private void readDir(File file) 
	{
		try 
		{
			File[] list = file.listFiles();
			for (int i = 0; i < list.length; i++) 
			{
				if (list[i].isFile()) 
				{
					String str = getMimeType(list[i].toString());
					System.out.println(list[i] + "," + str);
				}
				else
					readDir(list[i]);
			}
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}
	public String readHeader(InputStream in_stream )throws Exception
	{
		try
		{	
			//BufferedInputStream instream = new BufferedInputStream(in_stream);
			String tempDir = server_dir + File.separator  + "temp";
			File file = new File(tempDir);
			file.mkdirs();
			file = new File(tempDir + File.separator + new java.util.Date().getTime()+"");
			System.out.println(file.getPath());
			FileOutputStream fout = new FileOutputStream(file);
			BufferedOutputStream outstream = new BufferedOutputStream(fout);
			int i;
			
			while( ( i = in_stream.read() ) != -1 )
			{
				outstream.write(i);
			}
			outstream.close();
			fout.close();
			in_stream.close();
								
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return header;
	}
	/**
	 * Reads the file for getting the header
	 * 
	 * @param file_name
	 * @return file header
	 * @throws Exception
	 */
	private String readHeader(String file_name) throws Exception 
	{
		try 
		{
			data = new byte[128];
			RandomAccessFile file = new RandomAccessFile(file_name, "r");
		
			byte readChar;
			for (int i = 0; i < 127; i++) 
			{
				try 
				{
					readChar = file.readByte();

				} 
				catch (Exception e) 
				{
					e.printStackTrace();
					break;
				}
				if (readChar == '\n' && readChar == '\t') 
				{
					i--;
				}
				else 
				{
					data[i] = readChar;
				}

			}
			file.close();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		return new String(data);
	}

	/**
	 * 
	 * @param fileName
	 * @return Mime Type of the file
	 * @throws Exception
	 */
	public String getMimeType(String fileName) throws Exception 
	{
		header =  readHeader(this.fileName);
		String mime = new String("unknown");
		if(!(mime=isDocument(header) ).equals("unknown") )
		{
			return mime;
		}
		else if(!(mime=isText(header)) .equals("unknown") )
		{
			return mime;
		}
		else if (!(mime = isHtml (header)).equals ("unknown"))
		{
			return mime;
		}
		else if (!(mime = isVideo (header)).equals ("unknown"))
		{
			return mime;
		}
		else if(!(mime=isImage( header)) .equals("unknown") )
		{
			return mime;
		} 
		return mime;
	}

	/*private String isDocument(String header) 
	{

		if (header.substring(0, 5).toUpperCase().equals("%PDF-"))
			return "application/pdf";
		else if (header.substring(0, 2).toUpperCase().equals("PK"))
			return "application/zip";
		return "unknown";
	}

	private String isImage(String header) 
	{
		String mime = new String("unknown");
		if (header.substring(1, 4).equals("PNG")
				|| header.substring(1, 4).toLowerCase().equals("png")) 
		{
			mime = "image/png";
		}
		else if(header.substring(0, 3).equals ("GIF")
				|| header.substring(0, 3).toLowerCase().equals("gif"))
		{
			mime = "image/gif";
		}
		
		return mime;
	}*/
	private String isImage (String header)
	{
		String mime = new String ("unknown");
		if (header.substring (1, 4).equals ("PNG") || header.substring (1, 4).toLowerCase().equals ("png") )
		{
			mime = "image/png";
		}
		else if (header.substring (0, 2).equals ("BM") ||  header.substring (0, 2).toLowerCase().equals ("bm"))
		{
			mime = "image/bmp";
		}
		else if (header.substring (0, 3).equals ("GIF")|| header.substring (0, 3).toLowerCase().equals ("gif"))
		{
			mime = "image/gif";
		}
		else if (header.substring (6, 10).equals ("JFIF") || (header.substring (6, 10).toLowerCase().equals ("jfif") ))
		{
			mime = "image/jpeg";
		}
		else if (header.substring (6, 10).equals ("EXIF") || header.substring (6, 10).toLowerCase().equals ("exif") )
		{
			mime = "image/jpeg";
		}
		else if (header.substring (0, 2).equals ("MM")|| header.substring (0, 2).toLowerCase().equals ("mm"))
		{
			mime = "image/tiff";
		}
		else if (header.substring (0, 2).equals ("II") || header.substring (0, 2).toLowerCase().equals ("ii"))
		{
			mime = "image/tiff";
		}
		else if (header.substring (0, 2).equals ("P1") || header.substring (0, 2).toLowerCase().equals ("p1") )
		{
			mime = "image/x-portable-bitmap";
		}
		else if (header.substring (0, 2).equals ("P4")|| header.substring (0, 2).toLowerCase().equals ("p4") )
		{
			mime = "image/x-portable-bitmap";
		}
		else if (header.substring (0, 2).equals ("P2") || header.substring (0, 2).toLowerCase().equals ("p2"))
		{
			mime = "image/x-portable-greymap";
		}
		else if (header.substring (0, 2).equals ("P5") || header.substring (0, 2).toLowerCase().equals ("p5"))
		{
			mime = "image/x-portable-greymap";
		}
		return mime;
	}

	private String isVideo (String header)
	{
		String mime = new String ("unknown");
		if (header.substring (3, 4).equals ("³"))
		{
			mime = "video/mpeg";
		}
		else if (header.substring (0, 3).equals ("AVI"))
		{
			mime = "video/x-msvideo";
		}
		else if (header.substring (0, 3).equals ("ID3"))
		{
			mime = "audio/mpeg";
		}
		return mime;
	}
	private String isHtml (String header)
	{
		String mime = new String ("unknown");
		if (header.substring (0, 5).toUpperCase ().equals ("<HEAD"))
		{
			mime = "text/html";
		}
		else if (header.substring (0, 5).toUpperCase ().equals ("<TITLE"))
		{
			mime = "text/html";
		}
		else if (header.substring (0, 14).toUpperCase ().equals ("<!DOCTYPE HTML"))
		{
			mime = "text/html";
		}
		else if (header.substring (0, 5).toUpperCase ().equals ("<HTML"))
		{
			mime = "text/html";
		}
		else if (header.substring (0, 4).toUpperCase ().equals ("<H1>"))
		{
			mime = "text/html";
		}
		else if (header.substring (0, 4).toUpperCase ().equals ("<!--"))
		{
			mime = "text/html";
		}
 		return mime;
	 }

	private String isText(String header ) 
	{
		boolean flag =true;
		if( header.substring(0,5).toUpperCase().equals("<?XML") ) 
		{
			return "text/xml";
		}	
		else
		{
			byte[]Byte = header.getBytes ();
			int length = header.length ();
			for (int i = 0; i < length; i++)
			{
				if (Byte[i] >= 0 && Byte[i] <= 126)
					continue;
				else
				{
					flag = false;
					break;
				}	
			}
		}
		if (flag)
			return "text/plain";
		else
		{
			return "unknown";
        }
	}
	private String isDocument(String header)
	{
		String mime = new String("unknown");
		String data = header.substring(38, 63);
		if (data.equals ("application/vnd.sun.xml.w"))
		{
			mime = "application/vnd.sun.xml.writer";
		}
		else if (data.equals ("application/vnd.sun.xml.c"))
		{
			mime = "application/vnd.sun.xml.calc";
		}
		else if (data.equals ("application/vnd.sun.xml.i"))
		{
			mime = "application/vnd.sun.xml.impress";
		}
		else if (data.equals ("application/vnd.sun.xml.d"))
		{
			mime = "application/vnd.sun.xml.draw";
		}
		else if (header.substring (0, 5).equals ("{\\rtf"))
		{
			mime = "application/rtf";
		}
		else if (header.substring (0, 5).equals ("%PDF-"))
		{
			mime = "application/pdf";
		}
		else if (header.substring (0, 4).equals ("%!PS"))
		{	
			mime = "application/postscript";
		}
		else if (header.substring (0, 2).equals ("Ã") )
		{
			mime = "msword/doc";
		}
		return mime;
	}


}
