package com.idega.block.school.business;
import java.rmi.RemoteException;
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;
import java.util.Map;
import javax.ejb.FinderException;
import com.idega.block.school.data.SchoolClassMember;
import com.idega.core.location.data.Address;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.user.business.UserBusiness;
import com.idega.user.data.Gender;
import com.idega.user.data.GenderHome;
import com.idega.user.data.User;
import com.idega.util.Age;
import com.idega.util.LocaleUtil;
/**
* @author laddi
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class SchoolClassMemberComparator implements Comparator {
public static final int NAME_SORT = 1;
public static final int GENDER_SORT = 2;
public static final int ADDRESS_SORT = 3;
public static final int PERSONAL_ID_SORT = 4;
public static final int LANGUAGE_SORT = 5;
public static final int AGE_SORT = 6;
private Locale locale;
private UserBusiness business;
private Collator collator;
private Map students;
private int sortBy = NAME_SORT;
private int femaleID = -1;
private Comparator genderComparatorForUser = null;
/**
* If a special gender comparator is used (e.g. for swedish applications)
* */
static public Comparator getComparatorSortByUseGenderComparator(int sortBy, Comparator genderComparatorForUser, Locale locale, UserBusiness business, Map students) {
return new SchoolClassMemberComparator(sortBy, genderComparatorForUser, locale, business, students);
}
static public Comparator getComparatorSortBy(int sortBy, Locale locale, UserBusiness business, Map students) {
return new SchoolClassMemberComparator(sortBy, null, locale, business, students);
}
static public Comparator getComparatorSortByName(Locale locale, UserBusiness business, Map students) {
return new SchoolClassMemberComparator(NAME_SORT, null, locale, business, students);
}
private SchoolClassMemberComparator(int sortBy, Comparator genderComparator, Locale locale, UserBusiness business, Map students) {
this.sortBy = sortBy;
this.genderComparatorForUser = genderComparator;
this.locale = locale;
this.business = business;
this.students = students;
}
/**
* @see java.util.Comparator#compare(Object, Object)
*/
public int compare(Object o1, Object o2) {
this.collator = Collator.getInstance(this.locale);
int result = 0;
try {
switch (this.sortBy) {
case NAME_SORT :
if (this.locale.equals(LocaleUtil.getIcelandicLocale())) {
result = firstNameSort(o1,o2);
}
else {
result = lastNameSort(o1,o2);
}
break;
case GENDER_SORT :
result = genderSort(o1,o2);
break;
case ADDRESS_SORT :
result = addressSort(o1,o2);
break;
case LANGUAGE_SORT :
result = languageSort(o1,o2);
break;
case PERSONAL_ID_SORT :
result = personalIDSort(o1,o2);
break;
case AGE_SORT :
result = ageSort(o1,o2);
break;
}
}
catch (RemoteException re) {
result = 0;
}
return result;
}
public int lastNameSort(Object o1, Object o2) {
User p1 = (User) this.students.get(new Integer(((SchoolClassMember)o1).getClassMemberId()));
User p2 = (User) this.students.get(new Integer(((SchoolClassMember)o2).getClassMemberId()));
String one = p1.getLastName()!=null?p1.getLastName():"";
String two = p2.getLastName()!=null?p2.getLastName():"";
int result = this.collator.compare(one,two);
if (result == 0){
one = p1.getFirstName()!=null?p1.getFirstName():"";
two = p2.getFirstName()!=null?p2.getFirstName():"";
result = this.collator.compare(one,two);
}
if (result == 0){
//result = p1.getMiddleName().compareTo(p2.getMiddleName());
one = p1.getMiddleName()!=null?p1.getMiddleName():"";
two = p2.getMiddleName()!=null?p2.getMiddleName():"";
result = this.collator.compare(one,two);
}
return result;
}
public int firstNameSort(Object o1, Object o2) {
User p1 = (User) this.students.get(new Integer(((SchoolClassMember)o1).getClassMemberId()));
User p2 = (User) this.students.get(new Integer(((SchoolClassMember)o2).getClassMemberId()));
String one = p1.getFirstName()!=null?p1.getFirstName():"";
String two = p2.getFirstName()!=null?p2.getFirstName():"";
int result = this.collator.compare(one,two);
if (result == 0){
//result = p1.getMiddleName().compareTo(p2.getMiddleName());
one = p1.getMiddleName()!=null?p1.getMiddleName():"";
two = p2.getMiddleName()!=null?p2.getMiddleName():"";
result = this.collator.compare(one,two);
}
if (result == 0){
one = p1.getLastName()!=null?p1.getLastName():"";
two = p2.getLastName()!=null?p2.getLastName():"";
result = this.collator.compare(one,two);
}
return result;
}
public int genderSort(Object o1, Object o2) {
User p1 = (User) this.students.get(new Integer(((SchoolClassMember)o1).getClassMemberId()));
User p2 = (User) this.students.get(new Integer(((SchoolClassMember)o2).getClassMemberId()));
int result = 0;
if (this.genderComparatorForUser == null) {
boolean isFemale1 = isGenderIDFemale(p1.getGenderID());
boolean isFemale2 = isGenderIDFemale(p2.getGenderID());
if (isFemale1 && !isFemale2) {
result = -1;
}
if (!isFemale1 && isFemale2) {
result = 1;
}
}
else {
result = this.genderComparatorForUser.compare(p1, p2);
}
if (result == 0){
if (this.locale.equals(LocaleUtil.getIcelandicLocale())) {
result = firstNameSort(o1,o2);
}
else {
result = lastNameSort(o1,o2);
}
}
return result;
}
public int addressSort(Object o1, Object o2) throws RemoteException {
Address p1 = this.business.getUserAddress1(((SchoolClassMember)o1).getClassMemberId());
Address p2 = this.business.getUserAddress1(((SchoolClassMember)o2).getClassMemberId());
if (p1 == null || p2 == null) {
if (p1 == null && p2 != null) {
return 1;
}
else if (p1 != null && p2 == null) {
return -1;
}
return 0;
}
String one = p1.getStreetAddress()!=null?p1.getStreetAddress():"";
String two = p2.getStreetAddress()!=null?p2.getStreetAddress():"";
int result = this.collator.compare(one,two);
return result;
}
public int personalIDSort(Object o1, Object o2) {
User p1 = (User) this.students.get(new Integer((((SchoolClassMember)o1).getClassMemberId())));
User p2 = (User) this.students.get(new Integer((((SchoolClassMember)o2).getClassMemberId())));
String pID1 = p1.getPersonalID() != null ? p1.getPersonalID() : "";
String pID2 = p2.getPersonalID() != null ? p2.getPersonalID() : "";
return this.collator.compare(pID1,pID2);
}
public int languageSort(Object o1, Object o2) {
SchoolClassMember p1 = (SchoolClassMember) o1;
SchoolClassMember p2 = (SchoolClassMember) o2;
String one = p1.getLanguage()!=null?p1.getLanguage():"";
String two = p2.getLanguage()!=null?p2.getLanguage():"";
int result = this.collator.compare(one,two);
if (result == 0){
result = lastNameSort(o1,o2);
}
return result;
}
public int ageSort(Object o1, Object o2) {
User p1 = (User) this.students.get(new Integer(((SchoolClassMember)o1).getClassMemberId()));
User p2 = (User) this.students.get(new Integer(((SchoolClassMember)o2).getClassMemberId()));
Age age1 = new Age(p1.getDateOfBirth());
Age age2 = new Age(p2.getDateOfBirth());
int result = age1.getYears() - age2.getYears();
if (result == 0){
result = firstNameSort(o1, o2);
}
return result;
}
private boolean isGenderIDFemale(int genderID) {
if (this.femaleID < 0) {
try {
Gender female = ((GenderHome) IDOLookup.getHome(Gender.class)).getFemaleGender();
this.femaleID = ((Integer)female.getPrimaryKey()).intValue();
}
catch (IDOLookupException e) {
System.err.println("[SchoolClassMemberComparator] Could not look up Gender");
e.printStackTrace(System.err);
}
catch (FinderException e) {
System.err.println("[SchoolClassMemberComparator] Could not find Gender");
e.printStackTrace(System.err);
}
/* catch (RemoteException e) {
System.err.println("[SchoolClassMemberComparator] Could not access Gender");
e.printStackTrace(System.err);
}*/
}
return this.femaleID == genderID;
}
}