--- /dev/null
+/*****************************************************************************
+ * Copyright Igor Barma, Eric Brun, Alexandre Desoubeaux, Christian Martel,
+ * (2 décembre 2008)
+ *
+ * Ce logiciel est un programme informatique servant à l'évaluation des
+ * compétences.
+ *
+ * Ce logiciel est régi par la licence CeCILL soumise au droit français et
+ * respectant les principes de diffusion des logiciels libres. Vous pouvez
+ * utiliser, modifier et/ou redistribuer ce programme sous les conditions
+ * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
+ * sur le site "http://www.cecill.info".
+ *
+ * En contrepartie de l'accessibilité au code source et des droits de copie,
+ * de modification et de redistribution accordés par cette licence, il n'est
+ * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
+ * seule une responsabilité restreinte pèse sur l'auteur du programme, le
+ * titulaire des droits patrimoniaux et les concédants successifs.
+ *
+ * A cet égard l'attention de l'utilisateur est attirée sur les risques
+ * associés au chargement, à l'utilisation, à la modification et/ou au
+ * développement et à la reproduction du logiciel par l'utilisateur étant
+ * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
+ * manipuler et qui le réserve donc à des développeurs et des professionnels
+ * avertis possédant des connaissances informatiques approfondies. Les
+ * utilisateurs sont donc invités à charger et tester l'adéquation du
+ * logiciel à leurs besoins dans des conditions permettant d'assurer la
+ * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
+ * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
+ *
+ * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
+ * pris connaissance de la licence CeCILL, et que vous en avez accepté les
+ * termes.
+ *******************************************************************************/
+package com.pentila.evalcomp.client.services.examen;
+
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.Label;
+import com.googlecode.gwt.crypto.bouncycastle.util.encoders.Hex;
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.core.Ext;
+import com.gwtext.client.core.Function;
+import com.gwtext.client.util.Format;
+import com.gwtext.client.widgets.Button;
+import com.gwtext.client.widgets.Component;
+import com.gwtext.client.widgets.MessageBox;
+import com.gwtext.client.widgets.MessageBoxConfig;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.event.ButtonListenerAdapter;
+import com.gwtext.client.widgets.event.PanelListenerAdapter;
+import com.gwtext.client.widgets.layout.RowLayout;
+import com.gwtext.client.widgets.layout.RowLayoutData;
+import com.gwtextux.client.widgets.window.ToastWindow;
+import com.pentila.evalcomp.client.ConnexionServer;
+import com.pentila.evalcomp.client.i18n.Messages;
+import com.pentila.evalcomp.client.services.ServiceAbstract;
+import com.pentila.evalcomp.client.services.widget.EvalSubViewWidget;
+import com.pentila.evalcomp.client.services.widget.ExtRessourcesPanel;
+import com.pentila.evalcomp.client.services.widget.PropertyValuePanel;
+import com.pentila.evalcomp.client.services.widget.RessourcesPanel;
+import com.pentila.evalcomp.client.services.widget.TransitionPanel;
+import com.pentila.evalcomp.client.utilities.Tools;
+import com.pentila.evalcomp.domain.examen.ExamenInstance;
+import com.pentila.evalcomp.domain.examen.Question;
+import com.pentila.evalcomp.domain.examen.QuestionInstance;
+import com.pentila.evalcomp.domain.examen.Reponse;
+import com.pentila.evalcomp.domain.examen.ReponseInstance;
+import com.pentila.evalcomp.domain.instance.EvaluationSubjectInstance;
+import com.pentila.evalcomp.domain.instance.ScenarioInstance;
+import com.pentila.evalcomp.domain.service.Service;
+import com.pentila.evalcomp.domain.transit.Activity;
+import com.pentila.evalcomp.domain.transit.Todo;
+import com.qtitools.player.client.GWTLoader;
+import com.qtitools.player.client.IDecryptor;
+import com.qtitools.player.client.Player;
+import com.qtitools.player.client.controller.DeliveryEngineEventListener;
+import com.qtitools.player.client.controller.communication.DisplayOptions;
+import com.qtitools.player.client.controller.communication.FlowOptions;
+import com.qtitools.player.client.controller.communication.PageItemsDisplayMode;
+import com.qtitools.player.client.model.Item;
+import com.qtitools.player.client.model.ItemVariablesAccessor;
+
+/**
+ * The Class EvaluationService.
+ */
+public class PasserExamenService extends ServiceAbstract {
+
+
+
+
+
+ /** The eval sub view. */
+ private EvalSubViewWidget evalSubView;
+ private Long timeLeft;
+ private Label counterDown;
+ private Player player;
+ private Timer timer;
+ private Activity activity;
+ private Date loaded;
+
+
+
+
+ /**
+ * Instantiates a new evaluation service.
+ */
+ public PasserExamenService() {
+ super();
+
+ this.setTitle(Messages.getString("Examen"));
+ this.setIconCls("iconExamen32");
+ initializeInterface();
+ }
+
+ /**
+ * Configure service.
+ *
+ * @param todo
+ * the todo
+ * @param activity
+ * the activity
+ */
+ public void configureService(final Todo todo, Activity activity) {
+ super.configureService(todo, activity);
+ this.todo = todo;
+ this.activity = activity;
+ Service serv = activity.getExtActivity().getService();
+
+ //this.setTitle(Messages.getString(serv.getTitlei18n()));
+
+ ScenarioInstance si = (ScenarioInstance) todo.getScenarioInstanceAbstract();
+
+
+ this.clearZones();
+
+
+ content = new Panel();
+ content.setBorder(false);
+ content.setLayout(new RowLayout());
+ content.setAutoScroll(true);
+ center.add(content);
+
+
+
+ if (!si.getEvaluationSubjectInstance().getRessources().isEmpty()) {
+
+ east.add(new RessourcesPanel(si.getEvaluationSubjectInstance()
+ .getRessources()));
+ }
+
+
+ final Panel container = new Panel();
+ container.setBorder(false);
+
+ Boolean showCounter = true;
+ try{
+ showCounter = si.getEvaluationSubjectInstance().getExamenInstance().getExamenDef().getExamen().getAffiche_chrono();
+ }catch(Exception e){
+
+ }
+ if (showCounter){
+ counterDown = new Label();
+ counterDown.setStyleName("timeStyle");
+
+ container.add(counterDown);
+ }
+
+ north.add(new Label(Messages.getString(serv.getDescriptioni18n()) ));
+
+
+ timer = new Timer() {
+ public void run() {
+ if (counterDown != null){
+ long h = timeLeft / 3600000;
+ long min = (timeLeft % 3600000) / 60000;
+ long sec = ((timeLeft % 3600000) % 60000) / 1000;
+ counterDown.setText(Format.format("{0} {1}:{2}:{3}", Messages.getString("time_left"), Tools.getTwoDigit(h), Tools.getTwoDigit(min), Tools.getTwoDigit(sec)));
+ }
+ timeLeft = timeLeft - 1000;
+
+ if (timeLeft <= 0){
+ this.cancel();
+
+ MessageBoxConfig loadingConfig = new MessageBoxConfig() {
+ { setModal(true);
+ setMsg(Messages.getString("fin_examen"));
+
+ setWidth(300);
+ setClosable(false);
+
+ }
+ };
+ MessageBox.show(loadingConfig);
+
+ tpanel.setConfirm(false);
+ tpanel.getButtonsMap().values().iterator().next().fireEvent("click");
+ tpanel.setConfirm(true);
+
+ }
+
+
+ }
+ };
+
+
+
+ this.addListener(new PanelListenerAdapter(){
+ public void onDestroy(Component component) {
+ timer.cancel();
+ }
+ });
+
+
+ content.add(container, new RowLayoutData("30"));
+ initPlayer(si.getEvaluationSubjectInstance());
+
+
+ tpanel = new TransitionPanel(todo, activity, this, false);
+
+
+ Button b = new Button(Messages.getString("save"));
+
+ b.addListener(new ButtonListenerAdapter(){
+ public void onClick(Button button, EventObject e) {
+
+ savePlayer(null);
+
+ }
+ });
+
+ tpanel.insert(b, 0);
+ south.add(tpanel);
+
+
+
+ tpanel.showButtons();
+
+ if (evalSubView != null) {
+ evalSubView.clear();
+ }
+ evalSubView = new EvalSubViewWidget(si.getEvaluationSubjectInstance());
+ west.add(evalSubView, new RowLayoutData("50%"));
+
+ west.add(new ExtRessourcesPanel(todo, activity), new RowLayoutData("50%"));
+ west.add(new PropertyValuePanel(todo, activity), new RowLayoutData("50%"));
+ tpanel = new TransitionPanel(todo, activity, this, false);
+ south.add(tpanel);
+
+
+ finalizeLayout();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.client.services.IServiceProvider#doAfterTransit()
+ */
+ public void doAfterTransit() {
+
+
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.pentila.evalcomp.client.services.IServiceProvider#doBeforeTransit
+ * (java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+ */
+ public void doBeforeTransit(final String login, final String processID,
+ final String activityID, final String transID) {
+ Function callbackFunction = new Function(){
+
+ @Override
+ public void execute() {
+ tpanel.performActivity(login, processID, activityID, transID);
+
+ }
+
+ };
+
+ savePlayer(callbackFunction);
+
+
+ }
+
+
+
+ /**
+ * Initialize interface.
+ */
+ private void initializeInterface() {
+
+ content = new Panel();
+ content.setBorder(false);
+ content.setLayout(new RowLayout());
+ content.setAutoScroll(true);
+
+ this.setPaddings(5);
+
+ }
+
+ public void initPlayer(final EvaluationSubjectInstance esi){
+
+
+
+ String id = Ext.generateId("player");
+ Panel p = new Panel();
+ p.setId(id);
+
+ p.setSize(800, 600);
+ p.setAutoScroll(true);
+ FlowPanel f = new FlowPanel();
+ f.setWidth("100%");
+ p.add(f);
+
+
+ player = new Player(f);
+ player.setFlowOptions(new FlowOptions(false, false, PageItemsDisplayMode.ALL, false));
+ new GWTLoader(player,"examenServlet/"+esi.getExamenInstance().getId().toString()+".xml" , new IDecryptor(){
+
+ public String decrypt(String text) {
+ String ret ="";
+
+ ret = new String(Hex.decode(text));
+
+ return ret;
+
+ }
+
+ });
+
+
+ player.deliveryEngine.setDeliveryEngineEventsListener(new DeliveryEngineEventListener(){
+
+ public void onAssessmentLoaded() {
+ loaded = new Date();
+ }
+
+ public void onAssessmentStarted() {
+
+
+ Set<Long> sl = new HashSet<Long>();
+
+ Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();
+
+ ExamenInstance ei = esi.getExamenInstance();
+
+ for (QuestionInstance qi : ei.getQuestionInstances()){
+ map.put(qi.getId().toString(), new HashMap<String, String>());
+ Question q = qi.getQuestion();
+
+ for (Reponse r : q.getReponses()){
+ map.get(qi.getId().toString()).put(r.getId().toString(), "false");
+ }
+
+ for (ReponseInstance ri : qi.getReponseInstances()){
+
+ map.get(qi.getId().toString()).put(ri.getReponse().getId().toString(), "true");
+ sl.add(ri.getReponse().getId());
+ }
+ }
+
+
+ player.deliveryEngine.setStateWithOutFlow(map);
+
+
+ long loadingTime = (new Date()).getTime() - loaded.getTime();
+
+ Date now = todo.getCreationDate();
+
+ Date ds = activity.getReadyDate();
+
+ long t = now.getTime() - ds.getTime();
+
+ Long l = new Long(todo.getProcess().getPropertyByName("PROPERTY_time").getValue());
+
+ timeLeft = l - t + loadingTime;
+
+
+ // Schedule the timer to run once every second, 1000 ms.
+ timer.scheduleRepeating(1000);
+
+
+
+ }
+
+ public void onSummary() {
+
+ }
+
+ public void onTestPageSwitching() {
+
+ }
+
+ public void onTestPageSwitched() {
+
+ DisplayOptions dod = new DisplayOptions();
+ dod.setPreviewMode(true);
+ player.setDisplayOptions(dod);
+ }
+
+ });
+
+ content.add(p, new RowLayoutData("100%"));
+
+ }
+
+
+
+ private void saveReponses(Map<Long, List<Long>> reps, final Function callbackFunction){
+ AsyncCallback callback = new AsyncCallback(){
+
+ public void onFailure(Throwable arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void onSuccess(Object arg0) {
+
+ ToastWindow tw = new ToastWindow(Messages
+ .getString("notification"), Messages
+ .getString("save_done"));
+ tw.show();
+
+ if (callbackFunction != null){
+ callbackFunction.execute();
+ }
+
+ }
+
+ };
+
+
+
+ ConnexionServer.examenService.saveReponseInstances(reps, callback);
+
+ }
+
+
+ private void savePlayer(Function callbackFunction){
+
+
+ player.deliveryEngine.report();
+
+ Map<Long, List<Long>> map = new HashMap<Long, List<Long>>();
+
+ for (ItemVariablesAccessor ret : player.getItemVariablesAccessor()){
+
+ Item item = (Item) ret;
+
+ Long id = new Long(item.getIdentifier());
+ map.put(id, new ArrayList<Long>());
+
+ String reps = ret.getResponseVariableValue("RESPONSE");
+
+ if (reps != null && !reps.equals("") ){
+ String[] array = reps.split(";");
+ for (String rep : array){
+ map.get(id).add(new Long(rep));
+ }
+
+ }
+
+ }
+
+ saveReponses(map, callbackFunction);
+
+ }
+
+}