/* * File : SequenceReg.java * Created : 11-jul-2001 9:08 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * 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 (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.Activity; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.util.Html; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.13 */ public class SequenceReg extends Object implements java.io.Serializable{ String name; String description; List<ActivityReg> activities; ActivityReg currentActivity; long totalTime; boolean closed; protected transient Info info; /** Creates new SequenceReg */ public SequenceReg(ActivitySequenceElement ase){ name=ase.getTag(); description=ase.getDescription(); activities=new CopyOnWriteArrayList<ActivityReg>(); currentActivity=null; totalTime=0; closed=false; info=new Info(); } public String toHtmlString(edu.xtec.util.Messages msg){ Html html=new Html(3000); String fh=new Html(200).td(name, Html.LEFT, false, "ROWSPAN=\""+msg.getNumber(activities.size())+"\"").toString(); Iterator<ActivityReg> it=activities.iterator(); while(it.hasNext()){ html.append(it.next().toHtmlString(msg, fh)); fh=null; } return html.toString(); } public Info getInfo(boolean recalc){ if(recalc) info.recalc(); return info; } public class Info{ public int nActivities, nActClosed, nActSolved, nActScore, percentSolved, nActions; public long tScore, tTime; protected Info(){ clear(); } protected void clear(){ nActivities=nActClosed=nActSolved=nActScore=percentSolved=nActions=0; tScore=tTime=0L; } public void recalc(){ clear(); nActivities=activities.size(); if(nActivities>0){ Iterator<ActivityReg> it=activities.iterator(); while(it.hasNext()){ ActivityReg ar=it.next(); if(ar.closed){ nActClosed++; tTime+=ar.totalTime; nActions+=ar.numActions; if(ar.solved) nActSolved++; int r=ar.getPrecision(); if(r>=0){ tScore+=r; nActScore++; } } } if(nActClosed>0) percentSolved=(nActSolved*100)/nActClosed; if(nActScore>0) tScore/=nActScore; } } } void newActivity(Activity act){ if(!closed){ currentActivity=new ActivityReg(act); activities.add(currentActivity); } } void newAction(String type, String source, String dest, boolean ok){ if(currentActivity!=null){ currentActivity.newAction(type, source, dest, ok); } } void endActivity(int score, int numActions, boolean solved){ if(currentActivity!=null) currentActivity.endActivity(score, numActions, solved); } void endSequence(){ if(currentActivity!=null && !activities.isEmpty()){ if(!currentActivity.closed) currentActivity.closeActivity(); ActivityReg firstActivity=activities.get(0); totalTime=currentActivity.startTime+currentActivity.totalTime-firstActivity.startTime; } } @Override public String toString(){ return new StringBuilder("SEQUENCE: ").append(name).substring(0); } }