<commit_before>package de.aima13.whoami.modules;

import de.aima13.whoami.Analyzable;
import de.aima13.whoami.support.DataSourceManager;
import de.aima13.whoami.support.Utilities;

import java.nio.file.Path;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by Marvin on 28.10.2014.
 */
public class Studienrichtung implements Analyzable{
	private List<Path> dropboxFiles = new ArrayList<Path>();
	private List<Path> databaseFiles = new ArrayList<Path>();
	private Studiengang[] courseList;
	private Kurskalendermap[] calenderCourseList;
	private ArrayList<CourseVisitedEntry> viewedSchedules;
	private final float DROPBOX_WEIGHTING_FACTOR = 0.15f;
	private final float SAMENESS_WEIGHTING_FACTOR = 10f;
	@Override
	public List<String> getFilter() {
		List<String> myFilters = new ArrayList<String>();

//		places.sql gehört zu Firefox
		myFilters.add("**Firefox**places.sqlite");

		//* hier weil History Datein gibt es zu viele und Chrome kann mehrere Benutzer verwalten
		myFilters.add("**Google/Chrome**History");

		myFilters.add("**/*.dropbox");
		return myFilters;
	}

	/**
	 * Setzen der für das Modul gefundenen Dateien
	 *
	 * @param files Liste der gefundenen Dateien
	 * @throws Exception Ein Fehler ist aufgetreten
	 * @author <NAME>
	 */
	@Override
	public void setFileInputs(List<Path> files) throws Exception {
		for (Path p : files){
			if (p.toString().endsWith(".dropbox")){
				dropboxFiles.add(p);
			}else if (p.toString().endsWith(".sqlite") || p.toString().contains("Google/Chrome")){
				databaseFiles.add(p);
			}else {
				// irgendwas unbrauchbares
			}
		}

	}


	@Override
	public String getHtml() {
		return null;
	}


	@Override
	public String getReportTitle() {
		return "Deine Studienrichtung";
	}


	@Override
	public String getCsvPrefix() {
		return "dhbw";
	}

	@Override
	public SortedMap<String, String> getCsvContent() {
		return null;
	}


	@Override
	public void run() {
		courseList = Utilities.loadDataFromJson("/data/studiengaenge.json", Studiengang[].class);
		calenderCourseList = Utilities.loadDataFromJson("/data/studienbezeichner.json",
				Kurskalendermap[].class);
		ArrayList<CourseVisitedEntry> viewedSchedules = getViewedCalenders();
		for (CourseVisitedEntry entry : viewedSchedules){
			//joine restlichen Informationen dran
			entry.kurzbez= this.getKursById(entry.courseID);
			entry.name = getNameFromPreAndSuffix(entry.kurzbez);
		}
		analyzePathNames(viewedSchedules);
		Collections.sort(viewedSchedules, new EntryComparator());
	}

	private void analyzePathNames(ArrayList<CourseVisitedEntry> viewedSchedules) {
		float influence=0;
		if (viewedSchedules!=null && !viewedSchedules.isEmpty()){
			influence = viewedSchedules.get(0).visitCount * DROPBOX_WEIGHTING_FACTOR;
		}

		for (CourseVisitedEntry entry : viewedSchedules){
			for (Path p : dropboxFiles){
				String [] pathParts = p.getParent().toString().split("\\\\|\\s|-");
				for (String partOfPath : pathParts){
					float samenessLevel = 0.50f;
					while (Utilities.isRoughlyEqual(partOfPath,entry.kurzbez,samenessLevel)){
						samenessLevel += 0.05f;
					}
					if (samenessLevel >= 0.75f){
						entry.visitCount += influence * SAMENESS_WEIGHTING_FACTOR * samenessLevel;
					}
				}
			}
		}
	}

	private String getNameFromPreAndSuffix(String kursbez) {
		String prefix;
		String suffix;
		Pattern p = Pattern.compile("[A-Z]*");
		Matcher m = p.matcher( kursbez );
		m.find(); prefix = m.group(); //TINF
		m.find(); // 1 wird nicht gematched weil Zahlen nicht in  [A-Z]
		m.find(); // 3 wie oben
		m.find(); suffix = m.group(); //AIBC

		for (Studiengang course : courseList){
			if(course.prefix.equals(prefix)){
				if (course.suffix!=null && Arrays.asList(course.suffix).contains(suffix)){
					return course.name;
				}
				return course.name;
			}
		}
		return "";
	}

	private class Studiengang{
		String name;
		String prefix;
		String [] suffix;
	}
	private class Kurskalendermap{
		String kursbez;
		String id;
	}

	private class CourseVisitedEntry{
		public CourseVisitedEntry(String id, int count){
			courseID = id;
			visitCount = count;
		}
		String courseID;
		int visitCount;
		String kurzbez;
		String name;
	}
	private class EntryComparator implements Comparator<CourseVisitedEntry> {<commit_msg>Studienrichtung fast fertig<commit_after>package de.aima13.whoami.modules;

import de.aima13.whoami.Analyzable;
import de.aima13.whoami.support.DataSourceManager;
import de.aima13.whoami.support.Utilities;

import java.nio.file.Path;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by Marvin on 28.10.2014.
 */
public class Studienrichtung implements Analyzable{
	private List<Path> dropboxFiles = new ArrayList<Path>();
	private List<Path> databaseFiles = new ArrayList<Path>();
	private Studiengang[] courseList;
	private Kurskalendermap[] calenderCourseList;
	private ArrayList<CourseVisitedEntry> viewedSchedules = new ArrayList<CourseVisitedEntry>();
	private final float DROPBOX_WEIGHTING_FACTOR = 0.15f;
	private final float SAMENESS_WEIGHTING_FACTOR = 10f;
	@Override
	public List<String> getFilter() {
		List<String> myFilters = new ArrayList<String>();

//		places.sql gehört zu Firefox
		myFilters.add("**Firefox**places.sqlite");

		//* hier weil History Datein gibt es zu viele und Chrome kann mehrere Benutzer verwalten
		myFilters.add("**Google/Chrome**History");

		myFilters.add("**/*.dropbox");
		return myFilters;
	}

	/**
	 * Setzen der für das Modul gefundenen Dateien
	 *
	 * @param files Liste der gefundenen Dateien
	 * @throws Exception Ein Fehler ist aufgetreten
	 * @author <NAME>
	 */
	@Override
	public void setFileInputs(List<Path> files) throws Exception {
		for (Path p : files){
			if (p.toString().endsWith(".dropbox")){
				dropboxFiles.add(p);
			}else if (p.toString().endsWith(".sqlite") || p.toString().contains("Google/Chrome")){
				databaseFiles.add(p);
			}else {
				// irgendwas unbrauchbares
			}
		}

	}


	@Override
	public String getHtml() {
		StringBuilder html = new StringBuilder();
		String courseToken = null;
		String courseName = null;
		String lastCommentOnClass = null;
		String graduation = null;

		if (viewedSchedules.size() > 0) {
			courseToken = viewedSchedules.get(0).kurzbez;
			courseName = viewedSchedules.get(0).name;
			lastCommentOnClass = viewedSchedules.get(0).kommentar;
		}

		try {
			int graduationYear = 2000 + Integer.parseInt(courseToken.replaceAll("[A-Z]*",
					"").substring(0, 2)) + 3;
			graduation = String.valueOf(graduationYear);
		}catch (NumberFormatException e){

		}

		html.append("Du studierst also auch an der DHBW Mannheim. Gefällt dir die Rahmsoße genau " +
				"so gut wir uns? Immerhin siegt durch Autoload endlich die Faulheit!");
		if (courseToken.startsWith("T")) {
			html.append("Immerhin bist du auch an der Fakultät Technik!");
			if (courseToken.startsWith("TMT") || courseToken.startsWith("TWIW")) {
				html.append("Aber wir haben mit Mitleid, dass ihr in Eppelheim sitzt");
			}
		} else if (courseToken.startsWith("W")) {
			html.append("Wir als Techniker sind froh über jede Studentin, " +
					"die bei uns in Neuostheim ist!");
		}
		html.append("Um so besser, dass nächste Jahr hoffentlich alle in Neuostheim vereint sind");
		html.append("<br \\> Nichts desto trotz, du studierst also <b>" + courseName + "</b>");
		if (graduation == null) {
			graduation = "irgendwann";
		}
			html.append(" simmt's? Wir hoffen, dass du dir " + graduation + " auch dein " +
					"Bachelorzeugnis abholen darfst.<br \\><br \\> ");


		html.append("Am Ende möchten wir noch etwas los werden:<br \\>");
		if (lastCommentOnClass!=null){
			html.append(lastCommentOnClass);
		}else {
			html.append("Viel Erfolg weiterhin im Studium!");
		}
		return html.toString();
	}


	@Override
	public String getReportTitle() {
		return "Deine Studienrichtung";
	}


	@Override
	public String getCsvPrefix() {
		return "dhbw";
	}

	@Override
	public SortedMap<String, String> getCsvContent() {
		TreeMap<String, String> csvOutput = new TreeMap<String, String>();
		if (!viewedSchedules.isEmpty()){
			csvOutput.put("Kurs",viewedSchedules.get(0).toString());
		}
		return csvOutput;
	}


	@Override
	public void run() {
		courseList = Utilities.loadDataFromJson("/data/studiengaenge.json", Studiengang[].class);
		calenderCourseList = Utilities.loadDataFromJson("/data/studienbezeichner.json",
				Kurskalendermap[].class);
		viewedSchedules = getViewedCalenders();
		for (CourseVisitedEntry entry : viewedSchedules){
			//joine restlichen Informationen dran
			entry.kurzbez= this.getKursById(entry.courseID);
			addNameAndComment(entry);
		}
		analyzePathNames(viewedSchedules);
		Collections.sort(viewedSchedules, new EntryComparator());
	}

	private void analyzePathNames(ArrayList<CourseVisitedEntry> viewedSchedules) {
		float influence=0;
		if (viewedSchedules!=null && !viewedSchedules.isEmpty()){
			influence = viewedSchedules.get(0).visitCount * DROPBOX_WEIGHTING_FACTOR;
		}

		for (CourseVisitedEntry entry : viewedSchedules){
			for (Path p : dropboxFiles){
				String [] pathParts = p.getParent().toString().split("\\\\|\\s|-");
				for (String partOfPath : pathParts){
					float samenessLevel = 0.50f;
					while (Utilities.isRoughlyEqual(partOfPath,entry.kurzbez,samenessLevel)){
						samenessLevel += 0.05f;
					}
					if (samenessLevel >= 0.75f){
						entry.visitCount += influence * SAMENESS_WEIGHTING_FACTOR * samenessLevel;
					}
				}
			}
		}
	}

	private void addNameAndComment(CourseVisitedEntry entry) {
		String prefix;
		String suffix;
		Pattern p = Pattern.compile("[A-Z]*");
		Matcher m = p.matcher( entry.kurzbez );
		m.find(); prefix = m.group(); //TINF
		m.find(); // 1 wird nicht gematched weil Zahlen nicht in  [A-Z]
		m.find(); // 3 wie oben
		m.find(); suffix = m.group(); //AIBC

		for (Studiengang course : courseList){
			if(course.prefix.equals(prefix)){
				if (course.suffix!=null && Arrays.asList(course.suffix).contains(suffix)){
					entry.name = course.name;
					entry.kommentar = course.comment;
				}else{
					entry.name = course.name;
					entry.kommentar = course.comment;
				}

			}
		}
	}

	private class Studiengang{
		String name;
		String prefix;
		String [] suffix;
		String comment;
	}

	private class Kurskalendermap{
		String kursbez;
		String id;
	}

	private class CourseVisitedEntry{
		public CourseVisitedEntry(String id, int count){
			courseID = id;
			visitCount = count;
		}
		String courseID;
		int visitCount;
		String kurzbez;
		String name;
		String kommentar;

	}
	private class EntryComparator implements Comparator<CourseVisitedEntry> {
{'fraction_non_alphanumeric': 0.12542685740655285, 'fraction_numerical': 0.007383479464697739, 'mean_word_length': 4.202112337974076, 'pattern_counts': {'":': 0, '<': 39, '<?xml version=': 0, '>': 42, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2399977', 'n_tokens_mistral': 4130, 'n_tokens_neox': 3619, 'n_words': 823}