/* * $Id: StudentAddressLabelsWriter.java,v 1.11.2.1 2006/09/12 10:34:30 palli 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.school.business; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import javax.ejb.FinderException; 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.business.Constants; import se.idega.idegaweb.commune.presentation.CommuneBlock; import com.idega.block.school.business.SchoolBusiness; import com.idega.block.school.data.SchoolClass; import com.idega.block.school.data.SchoolClassMember; import com.idega.business.IBOLookup; import com.idega.core.file.data.ICFile; import com.idega.core.file.data.ICFileBMPBean; import com.idega.core.file.data.ICFileHome; import com.idega.data.IDOLookupException; import com.idega.idegaweb.IWApplicationContext; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWMainApplication; import com.idega.idegaweb.IWResourceBundle; import com.idega.io.MemoryFileBuffer; import com.idega.io.MemoryInputStream; import com.idega.io.MemoryOutputStream; import com.lowagie.text.Document; import com.lowagie.text.Font; import com.lowagie.text.PageSize; import com.lowagie.text.Phrase; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfWriter; /** * This MediaWritable class generates a PDF stream with student address labels. * <p> * Last modified: $Date: 2006/09/12 10:34:30 $ by $Author: palli $ * * @author Anders Lindman * @version $Revision: 1.11.2.1 $ * @see com.idega.io.MediaWritable */ public class StudentAddressLabelsWriter { private final static String REPORT_FOLDER_NAME = "Export Files"; private final static int NR_OF_COLUMNS = 3; private final static int NR_OF_ROWS = 8; private final static int NR_OF_ADDRESSES_PER_PAGE = NR_OF_COLUMNS * NR_OF_ROWS; private final static int ADDRESS_TABLE_WIDTH = 195; private final static int ADDRESS_TABLE_HEIGHT = 101; private final static int LEFT_MARGIN = 35; private final static int TOP_START = 802; private final static String KP = "sal."; private final static String KEY_TO_CUSTODIAN_FOR = KP + "to_custodian_for"; private SchoolCommuneBusiness business; private CommuneUserBusiness userBusiness; private Font font = null; private String filename = null; private static final String MIME_PDF = "application/pdf"; private static final String MIME_XLS = "application/vnd.ms-excel"; /** * Creates the student address labels PDF file. */ public ICFile createFile(String[] schoolClassIds, IWMainApplication iwma) throws Exception { getSchoolCommuneBusiness(iwma.getIWApplicationContext()); getCommuneUserBusiness(iwma.getIWApplicationContext()); Collection receivers = getReceivers(schoolClassIds); MemoryFileBuffer buffer = getPDFBuffer(iwma.getIWApplicationContext(),receivers); return createFile(iwma.getIWApplicationContext(),buffer); } /** * Creates a address label PDF file for a collection of MailReceiver objects * @param mailReceivers * @return * @throws Exception */ public ICFile createPDFFile(IWApplicationContext iwac,Collection mailReceivers,String fileName) throws Exception{ this.filename = fileName; return createFile(iwac,getPDFBuffer(iwac,mailReceivers)); } public ICFile createXLSFile(IWApplicationContext iwac,Collection mailReceivers,String fileName)throws Exception{ this.filename = fileName; return createFile(iwac,getXLSBuffer(iwac,mailReceivers)); } private ICFile createFile(IWApplicationContext iwac,MemoryFileBuffer buffer)throws Exception{ ICFile reportFolder = null; ICFileHome fileHome = null; try { fileHome = (ICFileHome) com.idega.data.IDOLookup.getHome(ICFile.class); reportFolder = fileHome.findByFileName(REPORT_FOLDER_NAME); } catch (FinderException e) { try { ICFile root = fileHome.findByFileName(ICFileBMPBean.IC_ROOT_FOLDER_NAME); reportFolder = fileHome.create(); reportFolder.setName(REPORT_FOLDER_NAME); reportFolder.setMimeType("application/vnd.iw-folder"); reportFolder.store(); root.addChild(reportFolder); } catch (Exception e2) { System.out.println(e2); return null; } } catch (IDOLookupException e) { System.out.println(e); return null; } ICFile exportFile = null; try { MemoryInputStream mis = new MemoryInputStream(buffer); try { exportFile = fileHome.findByFileName(filename); if (exportFile != null) { exportFile.remove(); } } catch (FinderException e) {} exportFile = fileHome.create(); IWBundle iwb = iwac.getIWMainApplication().getBundle(Constants.IW_BUNDLE_IDENTIFIER); if(iwb.getProperty("LabelWriter.dumpFileToCacheFolder")!=null){ String folder = iwac.getIWMainApplication().getRealPath(iwac.getIWMainApplication().getCacheDirectoryURI()+"/prints"); java.io.File tfile = com.idega.util.FileUtil.getFileAndCreateIfNotExists(folder,filename); java.io.FileOutputStream fos = new java.io.FileOutputStream(tfile); java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); while (mis.available() > 0) { baos.write(mis.read()); } baos.writeTo(fos); baos.flush(); baos.close(); mis.reset(); } exportFile.setFileValue(mis); exportFile.setMimeType(buffer.getMimeType()); exportFile.setName(filename); exportFile.setFileSize(buffer.length()); exportFile.store(); reportFolder.addChild(exportFile); } catch (Exception e) { System.out.println(e); throw e; } return exportFile; } private Collection getReceivers(String[] schoolClassIds) throws RemoteException, FinderException { ArrayList receivers = new ArrayList(); Collection students; SchoolClass schoolClass = null; SchoolClassMember student; MailReceiver receiver; Integer classID; SchoolBusiness schoolBuiz = business.getSchoolBusiness(); for (int i = 0; i < schoolClassIds.length; i++) { schoolClass = business.getSchoolBusiness().findSchoolClass(new Integer(schoolClassIds[i])); classID = Integer.valueOf(schoolClassIds[i]); students = schoolBuiz.findStudentsInClass(classID.intValue()); Iterator iter = students.iterator(); while (iter.hasNext()) { student = (SchoolClassMember) iter.next(); receiver = new MailReceiver(null,userBusiness,new Integer(student.getClassMemberId())); receivers.add(receiver); } } if (schoolClassIds.length > 0 && schoolClassIds[0] != null) { try { schoolClass = business.getSchoolBusiness().findSchoolClass(new Integer(schoolClassIds[0])); } catch (NumberFormatException e) { } catch (RemoteException e) { } } if (schoolClass != null) { filename = "student_address_labels_"+schoolClass.getSchoolId()+".pdf"; } else { filename = "student_address_labels_all.pdf"; } return receivers; } /** * Creates PDF address labels for the specified school classes. */ protected MemoryFileBuffer getPDFBuffer(IWApplicationContext iwac,Collection receivers) throws Exception { business = getSchoolCommuneBusiness(iwac); userBusiness = getCommuneUserBusiness(iwac); IWResourceBundle iwrb = iwac.getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER).getResourceBundle( iwac.getApplicationSettings().getApplicationLocale()); MemoryFileBuffer buffer = new MemoryFileBuffer(); MemoryOutputStream mos = new MemoryOutputStream(buffer); Document document = new Document(PageSize.A4, 50, 50, 50, 50); PdfWriter writer = PdfWriter.getInstance(document, mos); document.addTitle("Student address labels"); document.addAuthor("Idega Reports"); document.addSubject("Student address labels"); document.open(); font = new Font(Font.HELVETICA, 9, Font.BOLD); int studentCount = 0; Iterator iter = receivers.iterator(); while (iter.hasNext()) { if (studentCount > 0 && studentCount % NR_OF_ADDRESSES_PER_PAGE == 0) { document.newPage(); } addAddress(writer, iwrb, (MailReceiver)iter.next(), studentCount++); } if (studentCount == 0) { throw new Exception("No students."); } document.close(); writer.setPdfVersion(PdfWriter.VERSION_1_2); buffer.setMimeType(MIME_PDF); return buffer; } /** * Adds a student address to the specified document. */ protected void addAddress(PdfWriter writer, IWResourceBundle iwrb, MailReceiver student, int studentCount) { //User student = member.getStudent(); //Address address = userBusiness.getUsersMainAddress(student); //PostalCode postalCode = address != null ? address.getPostalCode() : null; //String name = student.getFirstName() + " " + student.getLastName(); //String streetAddress = address != null ? address.getStreetAddress() : ""; //String postalAddress = ""; //if (address != null && postalCode != null) { // String zip = postalCode.getPostalCode(); // if (zip.length() > 4) { // zip = zip.substring(0, 3) + " " + zip.substring(3, 5); // } // postalAddress = zip + " " + postalCode.getName(); //} PdfPTable table = new PdfPTable(1); table.setTotalWidth(ADDRESS_TABLE_WIDTH); table.getDefaultCell().setPadding(3); PdfPCell cell; cell = new PdfPCell(new Phrase(iwrb.getLocalizedString(KEY_TO_CUSTODIAN_FOR, "To custodian for") + ":", font)); cell.setBorder(Rectangle.NO_BORDER); table.addCell(cell); cell = new PdfPCell(new Phrase(student.getStudentName(), font)); cell.setBorder(Rectangle.NO_BORDER); table.addCell(cell); cell = new PdfPCell(new Phrase(student.getStreetAddress(), font)); cell.setBorder(Rectangle.NO_BORDER); table.addCell(cell); cell = new PdfPCell(new Phrase(student.getPostalAddress(), font)); cell.setBorder(Rectangle.NO_BORDER); table.addCell(cell); int row = (studentCount / NR_OF_COLUMNS) % NR_OF_ROWS; int column = studentCount % NR_OF_COLUMNS; table.writeSelectedRows(0, -1, LEFT_MARGIN + column * ADDRESS_TABLE_WIDTH, TOP_START - row * ADDRESS_TABLE_HEIGHT, writer.getDirectContent()); } protected MemoryFileBuffer getXLSBuffer(IWApplicationContext iwac,Collection receivers) throws Exception { business = getSchoolCommuneBusiness(iwac); userBusiness = getCommuneUserBusiness(iwac); IWResourceBundle iwrb = iwac.getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER).getResourceBundle( iwac.getApplicationSettings().getApplicationLocale()); MemoryFileBuffer buffer = new MemoryFileBuffer(); MemoryOutputStream mos = new MemoryOutputStream(buffer); HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); short colWidth = (short) (30 * 256); sheet.setColumnWidth((short)0, colWidth); sheet.setColumnWidth((short)1, colWidth); sheet.setColumnWidth((short)2, colWidth); String header = iwrb.getLocalizedString(KEY_TO_CUSTODIAN_FOR, "To custodian for") + ":"; MailReceiver receiver; HSSFRow row; Iterator iter = receivers.iterator(); int rowCount = 0; int col = 0; while (iter.hasNext()) { receiver = (MailReceiver) iter.next(); row = sheet.getRow(rowCount); if(row==null) row = sheet.createRow(rowCount); row.createCell((short)col).setCellValue(header); row = sheet.getRow(rowCount+1); if(row==null) row = sheet.createRow(rowCount+1); row.createCell((short)col).setCellValue(receiver.getStudentName()); row = sheet.getRow(rowCount+2); if(row==null) row = sheet.createRow(rowCount+2); row.createCell((short)col).setCellValue(receiver.getStreetAddress()); row = sheet.getRow(rowCount+3); if(row==null) row = sheet.createRow(rowCount+3); row.createCell((short)col).setCellValue(receiver.getPostalAddress()); col++; if(col==NR_OF_COLUMNS){ col = 0; rowCount+=5; } } wb.write(mos); buffer.setMimeType(MIME_XLS); return buffer; } protected SchoolCommuneBusiness getSchoolCommuneBusiness(IWApplicationContext iwc) throws RemoteException { if(business==null) business = (SchoolCommuneBusiness) IBOLookup.getServiceInstance(iwc, SchoolCommuneBusiness.class); return business; } protected CommuneUserBusiness getCommuneUserBusiness(IWApplicationContext iwc) throws RemoteException { if(userBusiness==null) userBusiness= (CommuneUserBusiness) IBOLookup.getServiceInstance(iwc, CommuneUserBusiness.class); return userBusiness; } }