// Path: src/main/java/com/hjh/files/sync/common/RemoteFile.java
// public interface RemoteFile {
// 	
// 	public String name();
// 	
// 	public String path();
// 	
// 	public long length();
// 	
// 	public long lastModify();
// 	
// 	public boolean isFolder();
// 
// }
// 
// Path: src/main/java/com/hjh/files/sync/common/util/MD5.java
// public class MD5 {
// 	
// 	public static String md5(File file)throws IOException{
// 		
// 		InputStream input = new FileInputStream(file);
// 		try{
// 			return md5(input);
// 		}finally{
// 			input.close();
// 		}
// 		
// 	}
// 
// 	public static String md5(InputStream input) throws IOException {
// 		try {
// 			MessageDigest md = MessageDigest.getInstance("MD5");
// 			byte[] cache = new byte[1024];
// 			int len;
// 			while ((len = input.read(cache)) >= 0) {
// 				md.update(cache, 0, len);
// 			}
// 			cache = null;
// 			return toString(md);
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		} finally {
// 			input.close();
// 		}
// 	}
// 
// 	public static String md5(String plainText) {
// 		try {
// 			MessageDigest md = MessageDigest.getInstance("MD5");
// 			md.update(plainText.getBytes());
// 			return toString(md);
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	private static String toString(MessageDigest md) {
// 		byte b[] = md.digest();
// 		int i;
// 		StringBuffer buf = new StringBuffer("");
// 		for (int offset = 0; offset < b.length; offset++) {
// 			i = b[offset];
// 			if (i < 0)
// 				i += 256;
// 			if (i < 16)
// 				buf.append("0");
// 			buf.append(Integer.toHexString(i));
// 		}
// 		return buf.toString();
// 	}
// 
// }


import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.http.util.Asserts;
import com.hjh.files.sync.common.RemoteFile;
import com.hjh.files.sync.common.util.MD5;
package com.hjh.files.sync.client;




public class FileInfoRecorder {

	private File root;

	public FileInfoRecorder(ClientFolder folder) {
		root = new File(new File(new File(folder.getWorkspace()), ".info"), folder.getName());
		if (!root.isDirectory()) {
			Asserts.check(root.mkdirs(), "can not create folder:" + root.getAbsolutePath());
		}
	}

	private String toString(RemoteFile file) {
		return String.format("%s--%s--%d--%d--%s", file.name(), file.path(), file.lastModify(), file.length(),
				file.isFolder() ? "1" : "0");
	}

	private File getStoreFile(String key) {
		File folder = new File(root, key.substring(0, 2));
		if (!folder.exists()) {
			Asserts.check(folder.mkdir(), "can not create folder:" + folder.getAbsolutePath());
		}
		return new File(folder, key);
	}

	public boolean isSame(RemoteFile file) throws IOException {
		String key = MD5.md5(file.path());
		File info = getStoreFile(key);
		if (info.isFile()) {
			return FileUtils.readFileToString(info, "utf-8").equals(toString(file));
		}
		return false;
	}

	public void record(RemoteFile file) throws IOException {
// Path: src/main/java/com/hjh/files/sync/common/RemoteFile.java
// public interface RemoteFile {
// 	
// 	public String name();
// 	
// 	public String path();
// 	
// 	public long length();
// 	
// 	public long lastModify();
// 	
// 	public boolean isFolder();
// 
// }
// 
// Path: src/main/java/com/hjh/files/sync/common/util/MD5.java
// public class MD5 {
// 	
// 	public static String md5(File file)throws IOException{
// 		
// 		InputStream input = new FileInputStream(file);
// 		try{
// 			return md5(input);
// 		}finally{
// 			input.close();
// 		}
// 		
// 	}
// 
// 	public static String md5(InputStream input) throws IOException {
// 		try {
// 			MessageDigest md = MessageDigest.getInstance("MD5");
// 			byte[] cache = new byte[1024];
// 			int len;
// 			while ((len = input.read(cache)) >= 0) {
// 				md.update(cache, 0, len);
// 			}
// 			cache = null;
// 			return toString(md);
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		} finally {
// 			input.close();
// 		}
// 	}
// 
// 	public static String md5(String plainText) {
// 		try {
// 			MessageDigest md = MessageDigest.getInstance("MD5");
// 			md.update(plainText.getBytes());
// 			return toString(md);
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	private static String toString(MessageDigest md) {
// 		byte b[] = md.digest();
// 		int i;
// 		StringBuffer buf = new StringBuffer("");
// 		for (int offset = 0; offset < b.length; offset++) {
// 			i = b[offset];
// 			if (i < 0)
// 				i += 256;
// 			if (i < 16)
// 				buf.append("0");
// 			buf.append(Integer.toHexString(i));
// 		}
// 		return buf.toString();
// 	}
// 
// }


// Path: src/main/java/com/hjh/files/sync/client/FileInfoRecorder.java
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.http.util.Asserts;
import com.hjh.files.sync.common.RemoteFile;
import com.hjh.files.sync.common.util.MD5;

package com.hjh.files.sync.client;




public class FileInfoRecorder {

	private File root;

	public FileInfoRecorder(ClientFolder folder) {
		root = new File(new File(new File(folder.getWorkspace()), ".info"), folder.getName());
		if (!root.isDirectory()) {
			Asserts.check(root.mkdirs(), "can not create folder:" + root.getAbsolutePath());
		}
	}

	private String toString(RemoteFile file) {
		return String.format("%s--%s--%d--%d--%s", file.name(), file.path(), file.lastModify(), file.length(),
				file.isFolder() ? "1" : "0");
	}

	private File getStoreFile(String key) {
		File folder = new File(root, key.substring(0, 2));
		if (!folder.exists()) {
			Asserts.check(folder.mkdir(), "can not create folder:" + folder.getAbsolutePath());
		}
		return new File(folder, key);
	}

	public boolean isSame(RemoteFile file) throws IOException {
		String key = MD5.md5(file.path());
		File info = getStoreFile(key);
		if (info.isFile()) {
			return FileUtils.readFileToString(info, "utf-8").equals(toString(file));
		}
		return false;
	}

	public void record(RemoteFile file) throws IOException {
		String key = MD5.md5(file.path());