./codecover/src/org/codecover/eclipse/utils/recommendationgenerator/LineNumberDeterminator.java

package org.codecover.eclipse.utils.recommendationgenerator;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;

public class LineNumberDeterminator {

	private static IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();

	private static Map offsetLineNumberMap = new HashMap();
	
	
	private static Map> lineBreakPositionMap = new HashMap>();
	
	public static int getLineNumber(IResource resource, int offset) {
		System.out.println("getLineNumbers "+resource.getName()+ " " +offset);
		Position p = new Position(resource, offset);
		if (offsetLineNumberMap.containsKey(p)) {
			return offsetLineNumberMap.get(p);
		}
		
		IFile iFile = wsRoot.getFile(resource.getFullPath());
		String portableString = iFile.getLocation().toPortableString();

		
		File file = new File(portableString);
		FileInputStream fis;
		try {
			fis = new FileInputStream(file);
			int n = 0;
			int line = 1;
			while ((n = fis.read()) != -1) {
				char c = (char) n;
				System.out.println(c);
				if (c == Character.LINE_SEPARATOR) {
					line++;
				}
			}
			fis.close();
			offsetLineNumberMap.put(p, line);
			return line;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return -1;
	}
	
	public static List getLineNumbers(IResource resource, int offsetStart, int offsetEnd) {
		long a = new Date().getTime();
		List ret = new ArrayList();
		
		List lineBreakPositions;
		if (lineBreakPositionMap.containsKey(resource)) {
			lineBreakPositions = lineBreakPositionMap.get(resource);
		} else {
			lineBreakPositions = new ArrayList();
			IFile iFile = wsRoot.getFile(resource.getFullPath());
			String portableString = iFile.getLocation().toPortableString();
			File file = new File(portableString);
			FileInputStream fis;
			try {
				fis = new FileInputStream(file);
				int n = 0;
				int count = 0;
				while ((n = fis.read()) != -1) {
					count++;
					if (n == 10) {
						lineBreakPositions.add(count);
					}
				}
				fis.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			lineBreakPositionMap.put(resource, lineBreakPositions);
		}
		
		int beginline = 1;
		int endline = 1;
		for (Integer lineBreakPosition : lineBreakPositions) {
			if (lineBreakPosition < offsetStart) {
				beginline++;
			}
			if (lineBreakPosition < offsetEnd) {
				endline++;
			}
		}
		for (int i = beginline ; i <= endline ; i++) {
			ret.add(i);
		}
		
		return ret;
	}
	
	
	
	
	
	
	
	
	
	private static class Position {
		public Position(IResource resource, int offset) {
			super();
			this.resource = resource;
			this.offset = offset;
		}
		IResource resource;
		int offset;
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + offset;
			result = prime * result + ((resource == null) ? 0 : resource.hashCode());
			return result;
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj) {
				return true;
			}
			if (obj == null) {
				return false;
			}
			if (!(obj instanceof Position)) {
				return false;
			}
			Position other = (Position) obj;
			if (offset != other.offset) {
				return false;
			}
			if (resource == null) {
				if (other.resource != null) {
					return false;
				}
			} else if (!resource.equals(other.resource)) {
				return false;
			}
			return true;
		}
	}
}