/**
 * Copyright (C) 2006-2007  NTT DATA CORPORATION
 * 
 * Version: 1.0.0 2007/04/01
 *  
 */
package net.cellcomputing.himawari.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.zip.GZIPInputStream;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public strictfp class CellCipher {
	
	private static String algo = "DES";
	private static String mode = "DES/CBC/PKCS5Padding";
	private static String key  = "dummykey";
	private static String iv   = "dummykey";
	
	private static String enc  = "UTF-8";
	
	
	/**
	 * 圧縮暗号化されたファイルに対し、複号展開ストリームを作成する
	 * 
	 * @param filename	圧縮暗号化されたファイル名
	 * @return	読み込みストリーム
	 * @throws FileNotFoundException	ファイルが存在しない
	 * @throws IOException	IOエラー
	 */
	private static InputStream open( String filename ) throws FileNotFoundException, IOException
	{
		try {
			
			Cipher cipher = Cipher.getInstance(mode);
			
			//キーの生成
			SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(enc), algo);
			
			//IVの生成
			IvParameterSpec initVec = new IvParameterSpec( iv.getBytes( enc ) );
			
			//Cipherインスタンスの初期化
			cipher.init( Cipher.DECRYPT_MODE, sksSpec, initVec );
			
			/*** 圧縮暗号化ストリーム（ここでは解凍復号化ストリーム）の作成 ***/
			
			//ファイルストリーム
			FileInputStream fis = new FileInputStream(filename);
			
			//暗号ストリーム
			CipherInputStream cis = new CipherInputStream( fis, cipher );
			
			//圧縮ストリーム
			try	{
				GZIPInputStream gis = new GZIPInputStream(cis);
				return gis;
			}
			catch( IOException e ){
				cis.close();
				return new FileInputStream(filename);
			}
			
		}catch (FileNotFoundException e){
			throw(e);
		}catch(IOException e){
			throw(e);
		} catch (NoSuchAlgorithmException e) {
			throw new IOException(e.getMessage());
		} catch (NoSuchPaddingException e) {
			throw new IOException(e.getMessage());
		} catch (InvalidKeyException e) {
			throw new IOException(e.getMessage());
		} catch (InvalidAlgorithmParameterException e) {
			throw new IOException(e.getMessage());
		}
	}
		
	/**
	 * 圧縮暗号化されたファイルに対し、複号展開ストリームを作成し、InputStreamReaderとして返す
	 * 
	 * @param filename	圧縮暗号化されたファイル名
	 * @return	InputStreamReader
	 * @throws FileNotFoundException	ファイルが存在しない
	 * @throws IOException	IOエラー
	 */
	public static InputStreamReader getReader( String filename ) throws FileNotFoundException, IOException
	{
		return new InputStreamReader( open(filename) );
	}
		
	
	/**
	 * 圧縮暗号化されたファイルに対し、複号展開ストリームを作成し、InputStreamとして返す
	 * 
	 * @param filename	圧縮暗号化されたファイル名
	 * @return	InputStream
	 * @throws FileNotFoundException	ファイルが存在しない
	 * @throws IOException	IOエラー
	 */
	public static InputStream getInputStream( String filename ) throws FileNotFoundException, IOException
	{
		return open(filename);
	}
}
