/* * $Id: NackaParagraphImportFileHandlerBean.java,v 1.4 2004/01/12 09:05:03 laddi Exp $ * * Copyright (C) 2003 Agura IT. All Rights Reserved. * * This software is the proprietary information of Agura IT AB. * Use is subject to license terms. * */ package se.idega.idegaweb.commune.block.importer.business; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import javax.ejb.FinderException; import javax.transaction.SystemException; import javax.transaction.UserTransaction; import se.idega.idegaweb.commune.business.CommuneUserBusiness; import com.idega.block.importer.business.ImportFileHandler; import com.idega.block.importer.data.ImportFile; import com.idega.block.school.data.SchoolClassMember; import com.idega.block.school.data.SchoolClassMemberHome; import com.idega.block.school.data.SchoolType; import com.idega.business.IBOServiceBean; import com.idega.user.data.Group; import com.idega.user.data.User; import com.idega.util.IWTimestamp; import com.idega.util.Timer; /** * Import logic for adding paragraphs to Nacka student placements. * <br> * To add this to the "Import handler" dropdown for the import function, execute the following SQL:<br> * insert into im_handler values (9, 'Nacka student paragraph importer', * 'se.idega.idegaweb.commune.block.importer.business.NackaParagraphImportFileHandlerBean', * 'Imports paragraphs for Nacka student placements.') * <br> * Note that the "9" value in the SQL might have to be adjusted in the sql, * depending on the number of records already inserted in the table. </p> * <p> * Last modified: $Date: 2004/01/12 09:05:03 $ by $Author: laddi $ * * @author Anders Lindman * @version $Revision: 1.4 $ */ public class NackaParagraphImportFileHandlerBean extends IBOServiceBean implements NackaParagraphImportFileHandler, ImportFileHandler { private CommuneUserBusiness biz = null; private SchoolClassMemberHome sClassMemberHome = null; private ImportFile file; private UserTransaction transaction; private ArrayList userValues; private ArrayList failedRecords = null; private final int COLUMN_PERSONAL_ID = 0; private final int COLUMN_PARAGRAPH = 3; /** * Default constructor. */ public NackaParagraphImportFileHandlerBean() {} /** * @see com.idega.block.importer.business.ImportFileHandler#handleRecords() */ public boolean handleRecords(){ failedRecords = new ArrayList(); transaction = this.getSessionContext().getUserTransaction(); Timer clock = new Timer(); clock.start(); try { //initialize business beans and data homes biz = (CommuneUserBusiness) this.getServiceInstance(CommuneUserBusiness.class); sClassMemberHome = (SchoolClassMemberHome) this.getIDOHome(SchoolClassMember.class); transaction.begin(); //iterate through the records and process them String item; int count = 0; boolean failed = false; while (!(item = (String) file.getNextRecord()).trim().equals("")) { count++; if(!processRecord(item, count)) { failedRecords.add(item); failed = true; break; } if ((count % 50) == 0 ) { System.out.println("NackaParagraphHandler processing RECORD [" + count + "] time: " + IWTimestamp.getTimestampRightNow().toString()); } item = null; } printFailedRecords(); clock.stop(); System.out.println("Number of records handled: " + (count - 1)); System.out.println("Time to handleRecords: " + clock.getTime() + " ms OR " + ((int)(clock.getTime()/1000)) + " s"); //success commit changes if (!failed) { transaction.commit(); } else { transaction.rollback(); } return !failed; } catch (Exception e) { e.printStackTrace(); try { transaction.rollback(); } catch (SystemException e2) { e2.printStackTrace(); } return false; } } /* * Processes one record */ private boolean processRecord(String record, int count) throws RemoteException { if (count == 1) { // Skip header return true; } userValues = file.getValuesFromRecordString(record); boolean success = storeUserInfo(); userValues = null; return success; } /** * @see com.idega.block.importer.business.ImportFileHandler#printFailedRecords() */ public void printFailedRecords() { if (failedRecords.isEmpty()) { System.out.println("All records imported successfully."); } else { System.out.println("Import failed for these records, please fix and import again:"); } Iterator iter = failedRecords.iterator(); while (iter.hasNext()) { System.out.println((String) iter.next()); } } /** * Stores one placement. */ protected boolean storeUserInfo() throws RemoteException { User user = null; String personalId = getUserProperty(this.COLUMN_PERSONAL_ID); if (personalId == null) return false; String paragraph = getUserProperty(this.COLUMN_PARAGRAPH); paragraph = paragraph == null ? "" : paragraph; // user try { user = biz.getUserHome().findByPersonalID(personalId); } catch (FinderException e) { System.out.println("User not found for PIN : " + personalId); return false; } try { Collection placements = sClassMemberHome.findByStudent(user); if (placements != null) { Iterator placementsIter = placements.iterator(); while (placementsIter.hasNext()) { SchoolClassMember placement = (SchoolClassMember) placementsIter.next(); SchoolType schoolType = placement.getSchoolClass().getSchoolType(); String stKey = ""; if (schoolType != null) { stKey = schoolType.getLocalizationKey(); } if (stKey.equals("sch_type.school_type_grundskola") || stKey.equals("sch_type.school_type_forskoleklass") || stKey.equals("sch_type.school_type_oblig_sarskola")) { if (placement.getRemovedDate() == null) { placement.setPlacementParagraph(paragraph); placement.store(); } } } } } catch (FinderException f) {} user = null; return true; } /* * Returns the property for the specified column from the current record. */ private String getUserProperty(int columnIndex){ String value = null; if (userValues!=null) { try { value = (String) userValues.get(columnIndex); } catch (RuntimeException e) { return null; } if (file.getEmptyValueString().equals(value)) { return null; } else { return value; } } else { return null; } } /** * @see com.idega.block.importer.business.ImportFileHandler#getFailedRecords() */ public void setImportFile(ImportFile file){ this.file = file; } /** * Not used * @param rootGroup The rootGroup to set */ public void setRootGroup(Group rootGroup) { } /** * @see com.idega.block.importer.business.ImportFileHandler#getFailedRecords() */ public List getFailedRecords(){ return failedRecords; } }