package se.idega.idegaweb.commune.school.music.business;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import se.idega.idegaweb.commune.business.CommuneUserBusiness;
import se.idega.idegaweb.commune.care.business.CareBusiness;
import se.idega.idegaweb.commune.school.music.presentation.MusicSchoolBlock;
import se.idega.util.SchoolClassMemberComparatorForSweden;
import com.idega.block.school.business.SchoolBusiness;
import com.idega.block.school.data.SchoolClassMember;
import com.idega.block.school.data.SchoolStudyPath;
import com.idega.block.school.data.SchoolYear;
import com.idega.business.IBOLookup;
import com.idega.core.contact.data.Email;
import com.idega.core.contact.data.Phone;
import com.idega.core.location.data.Address;
import com.idega.core.location.data.PostalCode;
import com.idega.data.IDOEntity;
import com.idega.data.IDORelationshipException;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.idegaweb.IWResourceBundle;
import com.idega.idegaweb.IWUserContext;
import com.idega.io.MediaWritable;
import com.idega.io.MemoryFileBuffer;
import com.idega.io.MemoryInputStream;
import com.idega.io.MemoryOutputStream;
import com.idega.presentation.IWContext;
import com.idega.user.business.NoEmailFoundException;
import com.idega.user.business.NoPhoneFoundException;
import com.idega.user.data.User;
import com.idega.util.PersonalIDFormatter;
/**
* Title:
* Description:
* Copyright: Copyright (c) 2001
* Company: idega multimedia
* @author <a href="mailto:aron@idega.is">aron@idega.is</a>
* @version 1.0
*/
public class MusicSchoolGroupWriter implements MediaWritable {
protected MemoryFileBuffer buffer = null;
protected CareBusiness careBusiness;
protected CommuneUserBusiness userBusiness;
protected Locale locale;
protected IWResourceBundle iwrb;
protected String schoolName;
public MusicSchoolGroupWriter() {
// empty
}
public void init(HttpServletRequest req, IWContext iwc) {
try {
locale = iwc.getApplicationSettings().getApplicationLocale();
careBusiness = getCareBusiness(iwc);
userBusiness = getUserBusiness(iwc);
iwrb = iwc.getIWMainApplication().getBundle(MusicSchoolBlock.IW_BUNDLE_IDENTIFIER).getResourceBundle(locale);
schoolName = getSession(iwc).getProvider().getSchoolName();
List students = new ArrayList(getSchoolBusiness(iwc).getSchoolClassMemberHome().findBySchoolAndSeasonAndYearAndStudyPath(getSession(iwc).getProvider(), getSession(iwc).getSeason(), getSession(iwc).getDepartment(), getSession(iwc).getInstrument()));
Map studentMap = careBusiness.getStudentList(students);
Collections.sort(students, SchoolClassMemberComparatorForSweden.getComparatorSortByName(iwc.getCurrentLocale(), userBusiness, studentMap));
buffer = writeXLS(students, iwc);
}
catch (Exception e) {
e.printStackTrace();
}
}
public String getMimeType() {
if (buffer != null)
return buffer.getMimeType();
return "application/x-msexcel";
}
public void writeTo(OutputStream out) throws IOException {
if (buffer != null) {
MemoryInputStream mis = new MemoryInputStream(buffer);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while (mis.available() > 0) {
baos.write(mis.read());
}
baos.writeTo(out);
}
else
System.err.println("buffer is null");
}
protected User getUser(IDOEntity entity) {
return ((SchoolClassMember) entity).getStudent();
}
protected SchoolYear getDepartment(IDOEntity entity) {
return ((SchoolClassMember) entity).getSchoolYear();
}
protected Collection getInstruments(IDOEntity entity) {
try {
return ((SchoolClassMember) entity).getStudyPaths();
}
catch (IDORelationshipException ire) {
return new ArrayList();
}
}
protected boolean showEntry(IWContext iwc, IDOEntity entity, User student) {
if (iwc != null && entity != null && student != null) {
return true;
}
return false;
}
public MemoryFileBuffer writeXLS(Collection students, IWContext iwc) throws RemoteException {
MemoryFileBuffer buffer = new MemoryFileBuffer();
MemoryOutputStream mos = new MemoryOutputStream(buffer);
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(schoolName);
sheet.setColumnWidth((short)0, (short) (30 * 256));
sheet.setColumnWidth((short)1, (short) (14 * 256));
sheet.setColumnWidth((short)2, (short) (30 * 256));
sheet.setColumnWidth((short)3, (short) (14 * 256));
sheet.setColumnWidth((short)4, (short) (14 * 256));
sheet.setColumnWidth((short)5, (short) (14 * 256));
sheet.setColumnWidth((short)6, (short) (14 * 256));
sheet.setColumnWidth((short)7, (short) (24 * 256));
sheet.setColumnWidth((short)8, (short) (30 * 256));
sheet.setColumnWidth((short)9, (short) (18 * 256));
sheet.setColumnWidth((short)10, (short) (14 * 256));
sheet.setColumnWidth((short)11, (short) (30 * 256));
sheet.setColumnWidth((short)12, (short) (24 * 256));
sheet.setColumnWidth((short)13, (short) (14 * 256));
sheet.setColumnWidth((short)14, (short) (14 * 256));
sheet.setColumnWidth((short)15, (short) (14 * 256));
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontHeightInPoints((short)12);
HSSFCellStyle style = wb.createCellStyle();
style.setFont(font);
int cellRow = 0;
int cellColumn = 0;
HSSFRow row = sheet.createRow(cellRow++);
HSSFCell cell = row.createCell((short)0);
cell.setCellValue(schoolName);
cell.setCellStyle(style);
cell = row.createCell((short)1);
row = sheet.createRow(cellRow++);
row = sheet.createRow(cellRow++);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("name","Name"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("personal_id","Personal ID"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("address","Address"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("zip_code","Postal code"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("zip_area","Area"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("home_phone","Home phone"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("mobile_phone","Mobile phone"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("email","E-mail"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("instruments","Instruments"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("department","Department"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue("");
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("custodian","Custodian"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("custodian_personal_id","Custodian personal ID"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("custodian_email","E-mail"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("custodian_home_phone","Home phone"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("custodian_work_phone","Work phone"));
cell.setCellStyle(style);
cell = row.createCell((short) cellColumn++);
cell.setCellValue(iwrb.getLocalizedString("custodian_mobile_phone","Mobile phone"));
cell.setCellStyle(style);
if (!students.isEmpty()) {
User student;
Address address;
PostalCode postalCode = null;
Phone homePhone;
Phone mobilePhone;
Email email;
IDOEntity entity;
SchoolYear department;
Collection instruments;
Phone custodianHomePhone;
Phone custodianWorkPhone;
Phone custodianMobilePhone;
Email custodianEmail;
Iterator iter = students.iterator();
while (iter.hasNext()) {
cellColumn = 0;
entity = (IDOEntity) iter.next();
student = getUser(entity);
if (!showEntry(iwc, entity, student)) {
continue;
}
row = sheet.createRow(cellRow++);
address = userBusiness.getUsersMainAddress(student);
if (address != null)
postalCode = address.getPostalCode();
homePhone = userBusiness.getChildHomePhone(student);
try {
mobilePhone = userBusiness.getUsersMobilePhone(student);
}
catch (NoPhoneFoundException npfe) {
mobilePhone = null;
}
try {
email = userBusiness.getUsersMainEmail(student);
}
catch (NoEmailFoundException nefe) {
email = null;
}
User custodian = userBusiness.getCustodianForChild(student);
if (custodian != null) {
try {
custodianHomePhone = userBusiness.getUsersHomePhone(custodian);
}
catch (NoPhoneFoundException npfe) {
custodianHomePhone = null;
}
try {
custodianWorkPhone = userBusiness.getUsersWorkPhone(custodian);
}
catch (NoPhoneFoundException npfe) {
custodianWorkPhone = null;
}
try {
custodianMobilePhone = userBusiness.getUsersMobilePhone(custodian);
}
catch (NoPhoneFoundException npfe) {
custodianMobilePhone = null;
}
try {
custodianEmail = userBusiness.getUsersMainEmail(custodian);
}
catch (NoEmailFoundException nefe) {
custodianEmail = null;
}
}
else {
custodianHomePhone = null;
custodianWorkPhone = null;
custodianMobilePhone = null;
custodianEmail = null;
}
instruments = getInstruments(entity);
department = getDepartment(entity);
row.createCell((short)cellColumn++).setCellValue(student.getName());
row.createCell((short)cellColumn++).setCellValue(PersonalIDFormatter.format(student.getPersonalID(), locale));
if (address != null) {
row.createCell((short)cellColumn++).setCellValue(address.getStreetAddress());
if (postalCode != null) {
row.createCell((short)cellColumn++).setCellValue(postalCode.getPostalCode());
row.createCell((short)cellColumn++).setCellValue(postalCode.getName());
}
else {
cellColumn += 2;
}
}
else {
cellColumn += 3;
}
if (homePhone != null) {
row.createCell((short)cellColumn).setCellValue(homePhone.getNumber());
}
cellColumn++;
if (mobilePhone != null) {
row.createCell((short)cellColumn).setCellValue(mobilePhone.getNumber());
}
cellColumn++;
if (email != null) {
row.createCell((short)cellColumn).setCellValue(email.getEmailAddress());
}
cellColumn++;
Iterator iterator = instruments.iterator();
StringBuffer instrumentText = new StringBuffer();
while (iterator.hasNext()) {
SchoolStudyPath instrument = (SchoolStudyPath) iterator.next();
instrumentText.append(iwrb.getLocalizedString(instrument.getLocalizedKey(), instrument.getDescription()));
if (iterator.hasNext()) {
instrumentText.append(", ");
}
}
row.createCell((short)cellColumn++).setCellValue(instrumentText.toString());
if (department != null) {
row.createCell((short)cellColumn).setCellValue(iwrb.getLocalizedString(department.getLocalizedKey(), department.getSchoolYearName()));
}
cellColumn++;
row.createCell((short)cellColumn++).setCellValue("");
if (custodian != null) {
row.createCell((short)cellColumn++).setCellValue(custodian.getName());
row.createCell((short)cellColumn).setCellValue(PersonalIDFormatter.format(custodian.getPersonalID(), locale));
}
else {
cellColumn++;
}
cellColumn++;
if (custodianEmail != null) {
row.createCell((short)cellColumn).setCellValue(custodianEmail.getEmailAddress());
}
cellColumn++;
if (custodianHomePhone != null) {
row.createCell((short)cellColumn).setCellValue(custodianHomePhone.getNumber());
}
cellColumn++;
if (custodianWorkPhone != null) {
row.createCell((short)cellColumn).setCellValue(custodianWorkPhone.getNumber());
}
cellColumn++;
if (custodianMobilePhone != null) {
row.createCell((short)cellColumn).setCellValue(custodianMobilePhone.getNumber());
}
cellColumn++;
}
}
try {
wb.write(mos);
}
catch (IOException ie) {
ie.printStackTrace();
}
buffer.setMimeType("application/x-msexcel");
return buffer;
}
protected MusicSchoolBusiness getBusiness(IWApplicationContext iwc) throws RemoteException {
return (MusicSchoolBusiness) IBOLookup.getServiceInstance(iwc, MusicSchoolBusiness.class);
}
protected MusicSchoolSession getSession(IWUserContext iwc) throws RemoteException {
return (MusicSchoolSession) IBOLookup.getSessionInstance(iwc, MusicSchoolSession.class);
}
protected CareBusiness getCareBusiness(IWApplicationContext iwc) throws RemoteException {
return (CareBusiness) IBOLookup.getServiceInstance(iwc, CareBusiness.class);
}
protected CommuneUserBusiness getUserBusiness(IWApplicationContext iwc) throws RemoteException {
return (CommuneUserBusiness) IBOLookup.getServiceInstance(iwc, CommuneUserBusiness.class);
}
protected SchoolBusiness getSchoolBusiness(IWApplicationContext iwc) throws RemoteException {
return (SchoolBusiness) IBOLookup.getServiceInstance(iwc, SchoolBusiness.class);
}
}