From: Thorsten B. <t_b...@us...> - 2006-08-25 11:53:53
|
Update of /cvsroot/elateportal/elatePortal/taskmodel-core/src/de/thorstenberger/taskmodel/impl In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv7746/taskmodel-core/src/de/thorstenberger/taskmodel/impl Modified Files: TaskManagerImpl.java TaskletContainerImpl.java Added Files: UserInfoImpl.java ReportBuilderImpl.java Log Message: support for Excel reports Index: TaskManagerImpl.java =================================================================== RCS file: /cvsroot/elateportal/elatePortal/taskmodel-core/src/de/thorstenberger/taskmodel/impl/TaskManagerImpl.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- TaskManagerImpl.java 30 Mar 2006 00:26:45 -0000 1.1 +++ TaskManagerImpl.java 25 Aug 2006 11:53:49 -0000 1.2 @@ -24,6 +24,7 @@ import java.util.List; import de.thorstenberger.taskmodel.CategoryFilter; +import de.thorstenberger.taskmodel.ReportBuilder; import de.thorstenberger.taskmodel.TaskCategory; import de.thorstenberger.taskmodel.TaskDef; import de.thorstenberger.taskmodel.TaskFactory; @@ -40,6 +41,7 @@ private TaskFactory taskFactory; private TaskletContainer taskletContainer; + private ReportBuilder reportBuilder; /** * @@ -48,7 +50,6 @@ // this.typeMapping = typeMapping; this.taskFactory = taskFactory; this.taskletContainer = taskletContainer; - } /** @@ -110,5 +111,14 @@ return taskFactory.getCategories( categoryFilter ); } + /* (non-Javadoc) + * @see de.thorstenberger.taskmodel.TaskManager#getReportBuilder() + */ + public ReportBuilder getReportBuilder() { + if( reportBuilder == null ) + reportBuilder = new ReportBuilderImpl( this, taskFactory ); + return reportBuilder; + } + } Index: TaskletContainerImpl.java =================================================================== RCS file: /cvsroot/elateportal/elatePortal/taskmodel-core/src/de/thorstenberger/taskmodel/impl/TaskletContainerImpl.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- TaskletContainerImpl.java 8 Aug 2006 00:14:57 -0000 1.5 +++ TaskletContainerImpl.java 25 Aug 2006 11:53:49 -0000 1.6 @@ -103,7 +103,7 @@ } - private List<Tasklet> getTasklets( long taskId ) throws TaskApiException{ + private List<Tasklet> getTaskletsHelper( long taskId ) throws TaskApiException{ List<String> userIds = taskFactory.getUserIdsOfAvailableTasklets( taskId ); List<Tasklet> ret = new ArrayList<Tasklet>(); @@ -113,14 +113,22 @@ return ret; } -// private List<Tasklet> getTaskletsAssignedToCorrector( long taskId, String correctorLogin) + + /* (non-Javadoc) + * @see de.thorstenberger.taskmodel.TaskletContainer#getTasklets(long) + */ + public synchronized List<Tasklet> getTasklets(long taskId) throws TaskApiException { + return getTaskletsHelper( taskId ); + } + + // private List<Tasklet> getTaskletsAssignedToCorrector( long taskId, String correctorLogin) /* (non-Javadoc) * @see de.thorstenberger.taskmodel.TaskletContainer#calculateStatistics(long) */ public TaskStatistics calculateStatistics(long taskId) throws TaskApiException { - List<Tasklet> tasklets = getTasklets( taskId ); + List<Tasklet> tasklets = getTaskletsHelper( taskId ); int numOfSolutions = 0; int numOfCorrectedSolutions = 0; @@ -152,7 +160,7 @@ */ public synchronized void assignRandomTaskletToCorrector(long taskId, String correctorId) throws TaskApiException { - List<Tasklet> tasklets = getTasklets( taskId ); + List<Tasklet> tasklets = getTaskletsHelper( taskId ); List<Tasklet> assignableTasklets = new ArrayList<Tasklet>(); for( Tasklet tasklet : tasklets ){ --- NEW FILE: UserInfoImpl.java --- /* Copyright (C) 2006 Thorsten Berger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** * */ package de.thorstenberger.taskmodel.impl; import de.thorstenberger.taskmodel.UserInfo; /** * @author Thorsten Berger * */ public class UserInfoImpl implements UserInfo { private String login; private String firstName; private String name; private String eMail; /** * @return Returns the eMail. */ public String getEMail() { return eMail; } /** * @param mail The eMail to set. */ public void setEMail(String mail) { eMail = mail; } /** * @return Returns the firstName. */ public String getFirstName() { return firstName; } /** * @param firstName The firstName to set. */ public void setFirstName(String firstName) { this.firstName = firstName; } /** * @return Returns the login. */ public String getLogin() { return login; } /** * @param login The login to set. */ public void setLogin(String login) { this.login = login; } /** * @return Returns the name. */ public String getName() { return name; } /** * @param name The name to set. */ public void setName(String name) { this.name = name; } } --- NEW FILE: ReportBuilderImpl.java --- /* Copyright (C) 2006 Thorsten Berger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** * */ package de.thorstenberger.taskmodel.impl; import java.io.IOException; import java.io.OutputStream; import java.text.DateFormat; import java.util.Date; import java.util.Hashtable; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import de.thorstenberger.taskmodel.ReportBuilder; import de.thorstenberger.taskmodel.TaskApiException; import de.thorstenberger.taskmodel.TaskDef; import de.thorstenberger.taskmodel.TaskFactory; import de.thorstenberger.taskmodel.TaskManager; import de.thorstenberger.taskmodel.Tasklet; import de.thorstenberger.taskmodel.UserInfo; import de.thorstenberger.taskmodel.complex.ComplexTasklet; import de.thorstenberger.taskmodel.complex.TaskDef_Complex; import de.thorstenberger.taskmodel.complex.complextaskdef.Category; import de.thorstenberger.taskmodel.complex.complextaskhandling.Page; import de.thorstenberger.taskmodel.complex.complextaskhandling.SubTasklet; import de.thorstenberger.taskmodel.complex.complextaskhandling.Try; /** * @author Thorsten Berger * */ public class ReportBuilderImpl implements ReportBuilder { private TaskManager taskManager; private TaskFactory taskFactory; Log log = LogFactory.getLog( ReportBuilderImpl.class ); /** * @param taskletContainer */ public ReportBuilderImpl( TaskManager taskManager, TaskFactory taskFactory ) { this.taskManager = taskManager; this.taskFactory = taskFactory; } /* (non-Javadoc) * @see de.thorstenberger.taskmodel.ReportBuilder#createExcelBinary(long, java.io.OutputStream) */ public void createExcelBinary(long taskId, OutputStream out) throws TaskApiException{ HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); TaskDef taskDef = taskManager.getTaskDef( taskId ); short r = 0; short c = 0; HSSFRow row = sheet.createRow( r++ ); row.createCell( c++ ).setCellValue( "Login" ); row.createCell( c++ ).setCellValue( "Vorname" ); row.createCell( c++ ).setCellValue( "Name" ); row.createCell( c++ ).setCellValue( "Status" ); row.createCell( c++ ).setCellValue( "Punkte" ); row.createCell( c++ ).setCellValue( "Korrektor" ); row.createCell( c++ ).setCellValue( "Korrektoren-History" ); // add some more columns, if complex task; e.g. points per category if( taskDef instanceof TaskDef_Complex ){ row.createCell( c++ ).setCellValue( "Startzeit" ); TaskDef_Complex ctd = (TaskDef_Complex) taskDef; List<Category> categories = ctd.getComplexTaskDefRoot().getCategoriesList(); for( Category category : categories ) row.createCell( c++ ).setCellValue( category.getTitle() + " (" + category.getId() + ")" ); } List<Tasklet> tasklets = taskManager.getTaskletContainer().getTasklets( taskId ); for( Tasklet tasklet : tasklets ){ if( tasklet.getStatus().equals( Tasklet.INITIALIZED ) ) continue; row = sheet.createRow( r++ ); c = 0; UserInfo userInfo = taskFactory.getUserInfo( tasklet.getUserId() ); row.createCell( c++ ).setCellValue( userInfo.getLogin() ); row.createCell( c++ ).setCellValue( userInfo.getFirstName() ); row.createCell( c++ ).setCellValue( userInfo.getName() ); row.createCell( c++ ).setCellValue( tasklet.getStatus() ); row.createCell( c++ ).setCellValue( tasklet.getTaskletCorrection().getPoints() != null ? "" + tasklet.getTaskletCorrection().getPoints() : "-" ); row.createCell( c++ ).setCellValue( tasklet.getTaskletCorrection().getCorrector() != null ? tasklet.getTaskletCorrection().getCorrector() : "-" ); row.createCell( c++ ).setCellValue( tasklet.getTaskletCorrection().getCorrectorHistory().toString() ); // add the additional cols for complex tasks if( taskDef instanceof TaskDef_Complex ){ TaskDef_Complex ctd = (TaskDef_Complex) taskDef; ComplexTasklet ct = (ComplexTasklet)tasklet; row.createCell( c++ ).setCellValue( getStringFromMillis( ct.getSolutionOfLatestTry().getStartTime() ) ); List<Category> categories = ctd.getComplexTaskDefRoot().getCategoriesList(); // points per category Map<String, Float> pointsInCatMap = new Hashtable<String, Float>(); // init every category with 0 points for( Category category : categories ) pointsInCatMap.put( category.getId(), 0f ); Try studentsLastTry; try { studentsLastTry = ct.getSolutionOfLatestTry(); } catch (IllegalStateException e) { log.error( "Error generating excel stream: ", e ); throw new TaskApiException( e ); } List<Page> pages = studentsLastTry.getPages(); for( Page page : pages ){ Float points = pointsInCatMap.get( page.getCategoryRefId() ); // continue if marked as uncorrected earlier if( points == null ) continue; boolean markCategoryAsUncorrected = false; List<SubTasklet> subTasklets = page.getSubTasklets(); for( SubTasklet subTasklet : subTasklets ){ try { points += subTasklet.getPoints(); } catch (IllegalStateException e) { markCategoryAsUncorrected = true; break; } } if( markCategoryAsUncorrected ) pointsInCatMap.remove( page.getCategoryRefId() ); else pointsInCatMap.put( page.getCategoryRefId(), points ); } for( Category category : categories ){ Float points = pointsInCatMap.get( category.getId() ); row.createCell( c++ ).setCellValue( points != null ? "" + points : "-" ); } } } try { wb.write( out ); out.flush(); } catch (IOException e) { log.error( "Error writing excel stream!", e ); throw new TaskApiException( e ); }finally{ try { out.close(); } catch (IOException e) { throw new TaskApiException( e ); } } } private static String getStringFromMillis( long timestamp ){ DateFormat df = DateFormat. getDateTimeInstance( ); return df.format( new Date( timestamp ) ); } } |