package Scheduler;
import java.util.HashMap;
import java.util.Vector;
public class Conflict implements Comparable<Conflict> {
protected final static long versionID = 2009021100015L;//file version
Schedule item;
String comb;
String cont;
String count;
Vector<String> primary;
HashMap<String, Vector<String>> number;
HashMap<String, Vector<String>> links;
HashMap<String, String> minUse;
HashMap<Section, Section> conflicted;
HashMap<Section, ConflictType> conflictedTypes;
public Conflict(){
primary = new Vector<String>();
number = new HashMap<String, Vector<String>>();
links = new HashMap<String, Vector<String>>();
minUse = new HashMap<String, String>();
conflicted = new HashMap<Section, Section>();
conflictedTypes = new HashMap<Section, ConflictType>();
}
public void setSchedule(Schedule sched){
item = sched;
}
public void setScheduleCombonationDesc(String desc){
comb = desc;
}
public void addConflict(Section missing, Section in, ConflictType type){
conflicted.put(missing, in);
conflictedTypes.put(missing, type);
}
public boolean hasConflict(Section missing){
if(conflicted.get(missing) != null){
return true;
}
return false;
}
public void setScheduleContents(String desc){
cont = desc;
}
public void setCountMessage(String err){
count = err;
}
public void addPrimary(String pri){
primary.add(pri);
}
public void addPrimary(Section missing, Section in){
addPrimary("Missing primary course " + missing.getDescription() + " because it conflicts with " + in.getDescription());
addConflict(missing, in, ConflictType.primary);
}
public String getPrimaryError(Section missing){
for(String one: primary){
if(one.contains("Missing primary course " + missing.getDescription())){
return one;
}
}
return new String("");
}
public void addNumberError(String course, String err){
Vector<String> numbers = number.remove(course);
if(numbers == null){
numbers = new Vector<String>();
}
numbers.add(err);
number.put(course, numbers);
}
public String[] getNumberError(Section missing){
String outer[] = new String[2];
for(String key: number.keySet()){
if(key.contains(missing.getPerceivedCourse())){
outer[0] = new String(key);
break;
}
}
Vector<String> errs = number.get(outer[0]);
//outer += " " + errs.get(0);
outer[1] = errs.get(0);
for(int pos = 1; pos < errs.size(); pos++){
outer[1] += ", " + errs.get(pos);
}
return outer;
}
public void addNumberError(Section missing, Section in, int num){
addNumberError(missing.getPerceivedCourse() + " is not present " + num + " times", "Conflicts with " + in.getDescription());
addConflict(missing, in, ConflictType.number);
}
public void addLinkError(String link, String err){
Vector<String> conflict = links.remove(link);
if(conflict == null){
conflict = new Vector<String>();
}
conflict.add(err);
links.put(link, conflict);
}
public void addLinkError(String link, Vector<String> err){
Vector<String> conflict = links.remove(link);
if(conflict == null){
conflict = err;
}
else{
for(String once: err){
conflict.add(once);
}
}
links.put(link, conflict);
}
public void addLinkError(String link, Vector<Section[]> comp, Void unused){
Vector<String> conflict = links.remove(link);
if(conflict == null){
conflict = new Vector<String>();
}
for(Section[] secs: comp){
addConflict(secs[0], secs[1], ConflictType.link);
conflict.add("without " + secs[0].getCourseID() + " because " + secs[0].getDescription() + " conflicts with " + secs[1].getDescription());
}
links.put(link, conflict);
}
public String[] getLinkError(Section missing){
String outer[] = new String[2];
for(String key: links.keySet()){
if(key.contains(missing.getCourseID())){
outer[0] = new String(key);
break;
}
}
Vector<String> errs = links.get(outer[0]);
//outer += " " + errs.get(0);
outer[1] = errs.get(0);
for(int pos = 1; pos < errs.size(); pos++){
outer[1] += ", " + errs.get(pos);
}
return outer;
}
public void addMinUseError(Section missing, Section in){
minUse.put(missing.getDescription(), "Conflicts with " + in.getDescription());
addConflict(missing, in, ConflictType.minUse);
}
@Override
public String toString(){
int errors = numOfErrors();
return numOfErrors() + " Error" + (errors != 1 ? "s (" : " (") + item + ")";
}
private int numOfErrors(){
int errors = 0;
if(count != null ){
errors++;
}
for(@SuppressWarnings("unused")String key: minUse.keySet()){
errors++;
}
errors += primary.size();
for(String key: number.keySet()){
Vector<String> one = number.get(key);
if(one != null){
errors += one.size();
}
}
for(String key: links.keySet()){
Vector<String> one = links.get(key);
if(one != null){
errors += one.size();
}
}
return (errors > 1) ? errors : 1;
}
public String toTerminalString(){
String toReturn = new String();
toReturn += comb + "\n" + cont + "\n" + (count == null ? "" : count + "\n");
for(String pri: primary){
toReturn += pri + "\n";
}
for(String key: number.keySet()){
toReturn += key + ":\n";
for(String num: number.get(key)){
toReturn += "\t\t\t\t" + num + "\n";
}
}
for(String key: links.keySet()){
toReturn += key + ":\n";
for(String miss: links.get(key)){
toReturn += "\t\t\t\t" + miss + "\n";
}
}
return toReturn;
}
public String toDisplayString(){
String toReturn = new String();
toReturn += "<html>" + comb + "<br>" + cont + "<br>" + (count == null ? "" : count + "<br>");
for(String pri: primary){
toReturn += pri + "<br>";
}
for(String key: number.keySet()){
toReturn += key + ":<br>";
for(String num: number.get(key)){
toReturn += " " + num + "<br>";
}
}
for(String key: links.keySet()){
toReturn += key + ":<br>";
for(String miss: links.get(key)){
toReturn += " " + miss + "<br>";
}
}
return toReturn;
}
@Override
public int compareTo(Conflict o) {
int val = Compare.equal.value();
if(hasClosedCourse() && !o.hasClosedCourse()){
return Compare.more.value();
}
else if(!hasClosedCourse() && o.hasClosedCourse()){
return Compare.less.value();
}
val = new Integer(numOfErrors()).compareTo(new Integer(o.numOfErrors()));
if(val == Compare.equal.value()){
return -item.toString().compareTo(o.item.toString());
}
return val;
}
public String toTipString(){
String toReturn = new String("<html>");
boolean first = true;
for(Section one: item.getClassesObj()){
if(one.isClosed()){
toReturn += (!first ? "<br>" : "") + "<font color=\"maroon\">" + one.getDescription() + "</font>";
}
else{
toReturn += (!first ? "<br>" : "") + one.getDescription();
}
first = false;
}
for(Section one: conflicted.keySet()){
if(one.isClosed()){
toReturn += (!first ? "<br>" : "") + "<strong><font color=\"maroon\">" + one.getDescription() + " [" + conflictedTypes.get(one)+ "]</font></strong>";
}
else{
toReturn += (!first ? "<br>" : "") + "<strong>" + one.getDescription() + " [" + conflictedTypes.get(one) + "]</strong>";
}
first = false;
}
if(count != null){
toReturn += "<br><strong>" + count + "</strong>";
}
toReturn += "</html>";
return toReturn;
}
public boolean hasClosedCourse(){
for(Section one: item.getClassesObj()){
if(one.isClosed()){
return true;
}
}
for(Section key: conflicted.keySet()){
if(key.isClosed()){
return true;
}
}
return false;
}
public enum ConflictType{
primary ("Primary Course"),
link ("Link Member"),
number ("Selected Number"),
minUse ("Minimum Number");
private String text;
ConflictType(String text){
this.text = text;
}
@Override
public String toString(){
return text;
}
}
public static long getVersionID() {
return versionID;
}
}