package se.idega.idegaweb.commune.block.importer.business;
import com.idega.block.importer.data.ImportFile;
import com.idega.block.school.business.SchoolBusiness;
import com.idega.block.school.data.*;
import com.idega.business.IBOServiceBean;
import com.idega.data.IDOLookup;
import com.idega.user.data.*;
import java.rmi.RemoteException;
import java.util.*;
import javax.ejb.*;
import javax.transaction.*;
import se.idega.idegaweb.commune.business.CommuneUserBusiness;
import se.idega.idegaweb.commune.school.business.SchoolCommuneBusiness;
import se.idega.idegaweb.commune.school.data.*;
import se.idega.util.PIDChecker;
/**
* Reads records in a format specified in {@link
* se.idega.idegaweb.commune.block.importer.business.NackaStudentTimeImportFileHandler}.
* <p>
* Last modified: $Date: 2004/02/20 16:36:50 $ by $Author: tryggvil $
*
* @author <a href="http://www.staffannoteberg.com">Staffan N�teberg</a>
* @version $Revision: 1.8 $
* @see com.idega.block.importer.data.ImportFile
* @see com.idega.block.importer.business.ImportFileHandler
* @see com.idega.block.school.data.SchoolTime
*/
public class NackaStudentTimeImportFileHandlerBean extends IBOServiceBean
implements NackaStudentTimeImportFileHandler {
final private static int SSN_COL = 0;
final private static int SCHOOL_COL = 1;
final private static int HOURS_COL = 2;
private ImportFile importFile = null;
public Group rootGroup = null;
final private List failedRecords = new ArrayList ();
public void setImportFile (final ImportFile importFile) {
this.importFile = importFile;
}
public void setRootGroup (final Group rootGroup) {
this.rootGroup = rootGroup;
}
/**
* Reads records in a format specified in {@link se.idega.idegaweb.commune.block.importer.business.NackaStudentTimeImportFileHandler}.
* Relies on the fact that {@link #setImportFile} has been invoked correctly
* prior to invocation of this method.
*/
public boolean handleRecords () {
log ("Importing records: " + getClass ().getName ());
boolean readSuccess = true;
failedRecords.clear ();
final SessionContext sessionContext = getSessionContext();
final UserTransaction transaction = sessionContext.getUserTransaction();
final Set unknownSchools = new HashSet ();
try {
transaction.begin();
// get all home and business objects needed in traversal below
final CommuneUserBusiness communeUserBusiness
= (CommuneUserBusiness) getServiceInstance
(CommuneUserBusiness.class);
final UserHome userHome = communeUserBusiness.getUserHome ();
final SchoolBusiness schoolBusiness = (SchoolBusiness)
getServiceInstance (SchoolBusiness.class);
final SchoolHome schoolHome = schoolBusiness.getSchoolHome ();
final PIDChecker pidChecker = PIDChecker.getInstance ();
final SchoolTimeHome schoolTimeHome
= (SchoolTimeHome) IDOLookup.getHome (SchoolTime.class);
final SchoolSeason schoolSeason = getPreviousSeason ();
final Date now = new Date ();
// traverse all records
for (String record = (String) importFile.getNextRecord ();
record != null && record.trim ().length () > 0;
record = (String) importFile.getNextRecord ()) {
final List fields
= importFile.getValuesFromRecordString (record);
if (fields.size () >= 3 && fields.get (HOURS_COL) != null
&& Character.isDigit
(fields.get (HOURS_COL).toString ().charAt (0))) {
// this is an acceptable record
// 1. find or create user
final String ssn
= getDigitString ((String) fields.get (SSN_COL));
User user = null;
try {
user = userHome.findByPersonalID (ssn);
} catch (FinderException finderException) {
if (ssn.length () == 12 && pidChecker.isValid (ssn)) {
user = communeUserBusiness .createSpecialCitizenByPersonalIDIfDoesNotExist(ssn, "", "", ssn);
}
logWarning
("NackaStudentTimeImportFileHandlerget: created"
+ " new special citizen with ssn " + ssn);
}
// 2. find school
final String schoolName = (String) fields.get (SCHOOL_COL);
School school = findBySchool (schoolName, schoolHome);
if (school == null) {
final String aliasedName
= getIWApplicationContext().getIWMainApplication()
.getBundle("se.idega.idegaweb.commune")
.getProperty (schoolName + "_alias");
if (aliasedName != null) {
school = findBySchool (aliasedName, schoolHome);
}
}
if (school == null) {
logWarning (record + " - Unknown school");
failedRecords.add (record + " - Unknown school");
unknownSchools.add (schoolName);
readSuccess = false;
}
// 3. get number of hours spent per week
final int hours = getIntInBeginningOfString
((String) fields.get (HOURS_COL));
// 4. store in db
if (user != null) {
final SchoolTime schoolTime = schoolTimeHome.create ();
schoolTime.setUser (user);
if (school != null) { schoolTime.setSchool (school); }
schoolTime.setHours (hours);
schoolTime.setSeason (schoolSeason);
schoolTime.setRegistrationTime (now);
schoolTime.store ();
}
}
}
} catch (final Exception e) {
// something really unexpected occured - rollback everything
e.printStackTrace ();
readSuccess = false;
} finally {
try {
if (readSuccess) {
transaction.commit ();
} else {
logWarning (getClass ().getName ()
+ " import failed:");
for (Iterator i = failedRecords.iterator ();
i.hasNext ();) {
final String message = (String) i.next ();
logWarning ("> " + message);
}
logWarning ("Unknown Schools:");
for (Iterator i = unknownSchools.iterator ();
i.hasNext ();) {
final String message = (String) i.next ();
logWarning ("> " + message);
}
transaction.rollback ();
}
} catch (Exception e) {
e.printStackTrace ();
readSuccess = false;
}
}
return readSuccess;
}
public List getFailedRecords () {
return failedRecords;
}
private static int getIntInBeginningOfString (final String rawString) {
final StringBuffer digits = new StringBuffer ();
for (int i = 0; i < rawString.length ()
&& Character.isDigit (rawString.charAt (i)); i++) {
digits.append (rawString.charAt (i));
}
return Integer.parseInt (digits.toString ());
}
private static String getDigitString (final String rawString) {
final StringBuffer digits = new StringBuffer ();
for (int i = 0; i < rawString.length (); i++) {
if (Character.isDigit (rawString.charAt (i))) {
digits.append (rawString.charAt (i));
}
}
return digits.toString ();
}
private School findBySchool (final String schoolName,
final SchoolHome schoolHome) {
School result = null;
try {
result = schoolHome.findBySchoolName (schoolName);
} catch (FinderException finderException) {
// nothing, just return null
}
return result;
}
private SchoolSeason getPreviousSeason () throws RemoteException,
FinderException {
final SchoolCommuneBusiness schoolCommuneBusiness
= (SchoolCommuneBusiness) getServiceInstance
(SchoolCommuneBusiness.class);
final int currentSeasonId
= schoolCommuneBusiness.getCurrentSchoolSeasonID ();
final int previousSeasonId
= schoolCommuneBusiness.getPreviousSchoolSeasonID
(currentSeasonId);
final SchoolSeasonHome schoolSeasonHome
= (SchoolSeasonHome) getIDOHome (SchoolSeason.class);
final SchoolSeason previousSeason = schoolSeasonHome.findByPrimaryKey
(new Integer (previousSeasonId));
return previousSeason;
}
}