package se.idega.idegaweb.commune.adulteducation.business; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Collection; import java.util.Iterator; import java.util.Locale; 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.presentation.CommuneBlock; import com.idega.block.school.data.SchoolClass; import com.idega.block.school.data.SchoolClassMember; import com.idega.business.IBOLookup; import com.idega.business.IBOLookupException; import com.idega.business.IBORuntimeException; import com.idega.core.contact.data.Phone; import com.idega.core.location.data.Address; import com.idega.core.location.data.PostalCode; 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.data.User; import com.idega.util.IWTimestamp; import com.idega.util.PersonalIDFormatter; import com.idega.util.text.Name; import com.lowagie.text.BadElementException; import com.lowagie.text.Cell; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Font; import com.lowagie.text.PageSize; import com.lowagie.text.Phrase; import com.lowagie.text.Rectangle; import com.lowagie.text.Table; import com.lowagie.text.pdf.PdfWriter; /** * 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 GroupFileWriter implements MediaWritable { private MemoryFileBuffer buffer = null; private Locale locale; private CommuneUserBusiness userBusiness; private SchoolClass schoolClass; private IWResourceBundle iwrb; public final static String prmPrintType = "print_type"; public final static String XLS = "xls"; public final static String PDF = "pdf"; public GroupFileWriter() { } public void init(HttpServletRequest req, IWContext iwc) { try { locale = iwc.getApplicationSettings().getApplicationLocale(); iwrb = iwc.getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER).getResourceBundle(locale); schoolClass = getSession(iwc).getSchoolClass(); userBusiness = getUserBusiness(iwc); String type = req.getParameter(prmPrintType); if (type.equals(PDF)) { buffer = writePDF(iwc, schoolClass); } else if (type.equals(XLS)) { buffer = writeXLS(iwc, schoolClass); } } catch (Exception e) { e.printStackTrace(); } } public String getMimeType() { if (buffer != null) return buffer.getMimeType(); return "application/pdf"; } 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"); } public MemoryFileBuffer writeXLS(IWContext iwc, SchoolClass schoolClass) throws Exception { MemoryFileBuffer buffer = new MemoryFileBuffer(); MemoryOutputStream mos = new MemoryOutputStream(buffer); Collection students = getBusiness(iwc).getSchoolBusiness().getSchoolClassMemberHome().findAllBySchoolClass(schoolClass); if (!students.isEmpty()) { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(schoolClass.getName()); 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)); HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontHeightInPoints((short)12); HSSFCellStyle style = wb.createCellStyle(); style.setFont(font); int cellRow = 0; HSSFRow row = sheet.createRow(cellRow++); HSSFCell cell = row.createCell((short)0); cell.setCellValue(iwrb.getLocalizedString("name","Name")); cell.setCellStyle(style); cell = row.createCell((short)1); cell.setCellValue(iwrb.getLocalizedString("personal_id","Personal ID")); cell.setCellStyle(style); cell = row.createCell((short)2); cell.setCellValue(iwrb.getLocalizedString("address","Address")); cell.setCellStyle(style); cell = row.createCell((short)3); cell.setCellValue(iwrb.getLocalizedString("postal_code","Postal code")); cell.setCellStyle(style); cell = row.createCell((short)4); cell.setCellValue(iwrb.getLocalizedString("phone","Phone")); cell.setCellStyle(style); cell = row.createCell((short)5); cell.setCellValue(iwrb.getLocalizedString("start_date","Start date")); cell.setCellStyle(style); cell = row.createCell((short)6); cell.setCellValue(iwrb.getLocalizedString("end_date","End date")); cell.setCellStyle(style); User student; Address address; PostalCode postalCode = null; Phone phone; SchoolClassMember studentMember; Iterator iter = students.iterator(); while (iter.hasNext()) { row = sheet.createRow(cellRow++); studentMember = (SchoolClassMember) iter.next(); student = studentMember.getStudent(); address = userBusiness.getUsersMainAddress(student); if (address != null) postalCode = address.getPostalCode(); phone = userBusiness.getChildHomePhone(student); IWTimestamp start = new IWTimestamp(studentMember.getRegisterDate()); IWTimestamp end = studentMember.getRemovedDate() != null ? new IWTimestamp(studentMember.getRemovedDate()) : null; Name name = new Name(student.getFirstName(), student.getMiddleName(), student.getLastName()); row.createCell((short)0).setCellValue(name.getName(locale, true)); row.createCell((short)1).setCellValue(PersonalIDFormatter.format(student.getPersonalID(), locale)); if (address != null) { row.createCell((short)2).setCellValue(address.getStreetAddress()); if (postalCode != null) row.createCell((short)3).setCellValue(postalCode.getPostalAddress()); } if (phone != null) row.createCell((short)4).setCellValue(phone.getNumber()); row.createCell((short)5).setCellValue(start.getLocaleDate(locale, IWTimestamp.SHORT)); if (end != null) row.createCell((short)6).setCellValue(end.getLocaleDate(locale, IWTimestamp.SHORT)); } wb.write(mos); } buffer.setMimeType("application/x-msexcel"); return buffer; } public MemoryFileBuffer writePDF(IWContext iwc, SchoolClass schoolClass) throws Exception { MemoryFileBuffer buffer = new MemoryFileBuffer(); MemoryOutputStream mos = new MemoryOutputStream(buffer); Collection students = getBusiness(iwc).getSchoolBusiness().getSchoolClassMemberHome().findAllBySchoolClass(schoolClass); if (!students.isEmpty()) { Document document = new Document(PageSize.A4, 50, 50, 50, 50); PdfWriter writer = PdfWriter.getInstance(document, mos); document.addTitle(schoolClass.getName()); document.addAuthor("Idega Reports"); document.addSubject(schoolClass.getName()); document.open(); User student; Address address; PostalCode postalCode = null; Phone phone; SchoolClassMember studentMember; Cell cell; String[] headers = {iwrb.getLocalizedString("name","Name"), iwrb.getLocalizedString("personal_id","Personal ID"), iwrb.getLocalizedString("address","Address"), iwrb.getLocalizedString("postal_code","Postal code"), iwrb.getLocalizedString("phone","Phone")}; int[] sizes = { 30, 14, 24, 20, 12 }; Table datatable = getTable(headers, sizes); Iterator iter = students.iterator(); while (iter.hasNext()) { studentMember = (SchoolClassMember) iter.next(); student = studentMember.getStudent(); address = userBusiness.getUsersMainAddress(student); if (address != null) postalCode = address.getPostalCode(); phone = userBusiness.getChildHomePhone(student); Name name = new Name(student.getFirstName(), student.getMiddleName(), student.getLastName()); cell = new Cell(new Phrase(name.getName(locale, true), new Font(Font.HELVETICA, 9, Font.NORMAL))); cell.setBorder(Rectangle.NO_BORDER); datatable.addCell(cell); cell = new Cell(new Phrase(PersonalIDFormatter.format(student.getPersonalID(), locale), new Font(Font.HELVETICA, 9, Font.NORMAL))); cell.setBorder(Rectangle.NO_BORDER); datatable.addCell(cell); String streetAddress = ""; if (address != null) streetAddress = address.getStreetAddress(); cell = new Cell(new Phrase(streetAddress, new Font(Font.HELVETICA, 9, Font.NORMAL))); cell.setBorder(Rectangle.NO_BORDER); datatable.addCell(cell); String postalAddress = ""; if (address != null && postalCode != null) postalAddress = postalCode.getPostalAddress(); cell = new Cell(new Phrase(postalAddress, new Font(Font.HELVETICA, 9, Font.NORMAL))); cell.setBorder(Rectangle.NO_BORDER); datatable.addCell(cell); String phoneNumber = ""; if (phone != null) phoneNumber = phone.getNumber(); cell = new Cell(new Phrase(phoneNumber, new Font(Font.HELVETICA, 9, Font.NORMAL))); cell.setBorder(Rectangle.NO_BORDER); datatable.addCell(cell); if (!writer.fitsPage(datatable)) { datatable.deleteLastRow(); document.add(datatable); document.newPage(); datatable = getTable(headers, sizes); } } document.add(datatable); document.close(); writer.setPdfVersion(PdfWriter.VERSION_1_2); } buffer.setMimeType("application/pdf"); return buffer; } private Table getTable(String[] headers, int[] sizes) throws BadElementException, DocumentException { Table datatable = new Table(headers.length); datatable.setPadding(0.0f); datatable.setSpacing(0.0f); datatable.setBorder(Rectangle.NO_BORDER); datatable.setWidth(100); if (sizes != null) datatable.setWidths(sizes); for (int i = 0; i < headers.length; i++) { Cell cell = new Cell(new Phrase(headers[i], new Font(Font.HELVETICA, 12, Font.BOLD))); cell.setBorder(Rectangle.BOTTOM); datatable.addCell(cell); } datatable.setDefaultCellBorderWidth(0); datatable.setDefaultCellBorder(Rectangle.NO_BORDER); datatable.setDefaultRowspan(1); return datatable; } private AdultEducationBusiness getBusiness(IWApplicationContext iwac) { try { return (AdultEducationBusiness) IBOLookup.getServiceInstance(iwac, AdultEducationBusiness.class); } catch (IBOLookupException ile) { throw new IBORuntimeException(ile); } } private CommuneUserBusiness getUserBusiness(IWApplicationContext iwac) { try { return (CommuneUserBusiness) IBOLookup.getServiceInstance(iwac, CommuneUserBusiness.class); } catch (IBOLookupException ile) { throw new IBORuntimeException(ile); } } private AdultEducationSession getSession(IWUserContext iwuc) { try { return (AdultEducationSession) IBOLookup.getSessionInstance(iwuc, AdultEducationSession.class); } catch (IBOLookupException ile) { throw new IBORuntimeException(ile); } } }