/* * File : JDBCReporter.java * Created : 12-jul-2001 18:56 * 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.project.JClicProject; import edu.xtec.util.Messages; import edu.xtec.util.db.ConnectionBeanProvider; import java.awt.Component; import java.util.HashMap; import java.util.List; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.13 */ public class JDBCReporter extends Reporter { protected String currentSessionId; protected int actCount; protected ActivityReg lastActivity; protected BasicJDBCBridge bridge; public static final String DRIVER="driver", URL="url", SYSTEM_USER="system_user", SYSTEM_PWD="system_pwd"; /** Creates new ODBCReporter */ public JDBCReporter() { super(); bridge=null; currentSessionId=null; lastActivity=null; actCount=0; } @Override public void end(){ super.end(); reportActivity(); if(bridge!=null){ bridge.end(); bridge=null; } } @Override public void init(HashMap properties, Component parent, Messages msg) throws Exception{ super.init(properties, parent, msg); boolean success=false; try{ bridge=null; String driver=(String)properties.get(DRIVER); String url=(String)properties.get(URL); description="JDBC "+url; String system_user=(String)properties.get(SYSTEM_USER); String system_pwd=(String)properties.get(SYSTEM_PWD); String tablePrefix=(String)properties.get(BasicJDBCBridge.TABLE_PREFIX_KEY); boolean createTables=!"false".equalsIgnoreCase((String)properties.get(BasicJDBCBridge.CREATE_TABLES_KEY)); //ConnectionBeanProvider cbp=new SingleConnectionBeanProvider(driver, url, system_user, system_pwd, true); ConnectionBeanProvider cbp=ConnectionBeanProvider.getConnectionBeanProvider(false, driver, url, system_user, system_pwd, true); bridge=new BasicJDBCBridge(cbp, createTables, tablePrefix); if(userId==null) userId=promptUserId(parent, msg); if(userId==null) success=true; } catch(Exception ex){ msg.showErrorWarning(parent, "report_err_init", description, ex, null); } if(!success){ if(bridge!=null){ bridge.end(); bridge=null; } description=description + " ("+msg.get("report_not_connected")+")"; initiated=false; } } @Override public String getProperty(String key, String defaultValue) throws Exception{ checkBridge(); return bridge.getProperty(key, defaultValue); } @Override public List<GroupData> getGroups() throws Exception{ checkBridge(); return bridge.getGroups(); } @Override public List<UserData> getUsers(String groupId) throws Exception{ checkBridge(); return bridge.getUsers(groupId); } @Override public String newGroup(GroupData gd) throws Exception{ checkBridge(); return bridge.newGroup(gd); } @Override public String newUser(UserData ud) throws Exception{ checkBridge(); return bridge.newUser(ud); } @Override public UserData getUserData(String userId) throws Exception{ checkBridge(); return bridge.getUserData(userId); } @Override public GroupData getGroupData(String groupId) throws Exception{ checkBridge(); return bridge.getGroupData(groupId); } protected void checkBridge() throws Exception{ if(bridge==null) throw new Exception("Not connected!"); } @Override public void newSession(JClicProject jcp, Component parent, Messages msg){ super.newSession(jcp, parent, msg); if(bridge==null || userId==null) return; reportActivity(); currentSessionId=null; } public void createDBSession(){ if(bridge==null || userId==null) return; try{ actCount=0; currentSessionId=bridge.addSession( userId, currentSession.timeMillis, currentSession.projectName, currentSession.code, sessionKey, sessionContext); }catch(Exception ex){ currentSessionId=null; bridge.end(); bridge=null; initiated=false; System.err.println("Error creating report of session:\n"+ex); } } protected void reportActivity(){ if(lastActivity!=null && bridge!=null){ if(!lastActivity.closed) lastActivity.closeActivity(); if(currentSessionId==null) createDBSession(); if(currentSessionId!=null){ try{ int actId; ActionReg ar; actId=bridge.addActivity( actCount++, currentSessionId, lastActivity.name, lastActivity.numActions, lastActivity.score, lastActivity.solved, lastActivity.getPrecision(), (int)(lastActivity.totalTime/1000), lastActivity.code); for(int arc=0; (ar=lastActivity.getActionReg(arc))!=null; arc++) bridge.addAction(actId, currentSessionId, arc, ar.type, ar.source, ar.dest, ar.isOk); }catch(Exception ex){ bridge.end(); bridge=null; initiated=false; System.err.println("Error reporting activity:\n"+ex); } } } if(currentSession!=null && currentSession.currentSequence!=null && currentSession.currentSequence.currentActivity!=lastActivity){ lastActivity=currentSession.currentSequence.currentActivity; } else lastActivity=null; } @Override public void newActivity(Activity act){ super.newActivity(act); reportActivity(); } }