/**
* $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-impl/src/java/org/sakaiproject/sitestats/impl/ConvOldPrefsJobImpl.java $
* $Id: ConvOldPrefsJobImpl.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $
*
* Copyright (c) 2006-2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.sitestats.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import org.sakaiproject.db.api.SqlService;
import org.sakaiproject.sitestats.api.PrefsData;
import org.sakaiproject.sitestats.api.StatsManager;
import org.sakaiproject.sitestats.api.event.EventInfo;
import org.sakaiproject.sitestats.api.event.EventRegistryService;
import org.sakaiproject.sitestats.api.event.ToolInfo;
public class ConvOldPrefsJobImpl implements StatefulJob {
// Log
private Log LOG = LogFactory.getLog(ConvOldPrefsJobImpl.class);
// Sakai Services
private StatsManager statsManager = null;
public void setStatsManager(StatsManager statsManager) {
this.statsManager = statsManager;
}
private SqlService sqlService = null;
public void setSqlService(SqlService sqlService) {
this.sqlService = sqlService;
}
private EventRegistryService eventRegistryService = null;
public void setEventRegistryService(EventRegistryService eventRegistryService) {
this.eventRegistryService = eventRegistryService;
}
/** Convert old SST_PREFS to new SST_PREFERENCES. */
public void execute(JobExecutionContext context) throws JobExecutionException {
LOG.info("Old SiteStats Preferences table conversion started...");
if(areBothTablesPresent()){
convertPrefs();
}
LOG.info("Old SiteStats Preferences table conversion finished.");
}
private boolean convertPrefs() {
Connection c = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<String> siteIds = getSitesInSSTPrefs();
final String sitePrefSql = "select EVENT_ID from SST_PREFS where SITE_ID=? and PAGE=0 ORDER BY EVENT_ID";
try{
c = sqlService.borrowConnection();
ps = c.prepareStatement(sitePrefSql);
// Get preferences from SST_PREFS
for(String siteId : siteIds) {
try{
// get list of events for current site
List<String> eventIds = new ArrayList<String>();
ps.clearParameters();
ps.setString(1, siteId);
rs = ps.executeQuery();
while(rs.next()) {
String eventId = rs.getString(1);
eventIds.add(eventId);
//LOG.info("Site '"+siteId+"' has selected: "+eventId);
}
rs.close();
// build a new preferences object
PrefsData prefs = new PrefsData();
prefs.setToolEventsDef(eventRegistryService.getEventRegistry());
List<ToolInfo> allTools = prefs.getToolEventsDef();
for(ToolInfo ti : allTools) {
boolean toolSelected = false;
for(EventInfo ei : ti.getEvents()) {
if(eventIds.contains(ei.getEventId())) {
ei.setSelected(true);
toolSelected = true;
}else{
ei.setSelected(false);
}
}
ti.setSelected(toolSelected);
}
// persist it
statsManager.setPreferences(siteId, prefs);
// check it
// PrefsData prefsRead = statsManager.getPreferences(siteId, false);
// for(ToolInfo ti2 : prefsRead.getToolEventsDef()) {
// if(ti2.isSelected()) {
// for(EventInfo ei2 : ti2.getEvents()) {
// if(ei2.isSelected() && !eventIds.contains(ei2.getEventId())) {
// LOG.warn("Check failed: event '"+ei2.getEventId()+"' selected in new preferences but unselected in old preferences.");
// }
// if(!ei2.isSelected() && eventIds.contains(ei2.getEventId())) {
// LOG.warn("Check failed: event '"+ei2.getEventId()+"' unselected in new preferences but selected in old preferences.");
// }
// }
// }
// }
}catch(SQLException e){
LOG.error("An SQL error occurred while converting SST_PREFS data for site: "+siteId, e);
return false;
}
}
}catch(SQLException e){
LOG.error("An SQL error occurred while converting SST_PREFS data to SST_PREFERENCES table.", e);
}finally{
if(rs != null){
try{ rs.close(); }catch(SQLException e){ /* ignore */ }
}
if(ps != null){
try{ ps.close(); }catch(SQLException e){ /* ignore */ }
}
if(c != null){
sqlService.returnConnection(c);
}
}
return true;
}
private List<String> getSitesInSSTPrefs() {
List<String> siteIds = new ArrayList<String>();
Connection c = null;
Statement s = null;
ResultSet rs = null;
try{
c = sqlService.borrowConnection();
// Get sites
try{
s = c.createStatement();
rs = s.executeQuery("select distinct SITE_ID from SST_PREFS");
while(rs.next()) {
siteIds.add(rs.getString(1));
}
}catch(SQLException e){
LOG.error("Unable to get list of sites from SST_PREFS.", e);
}finally{
if(rs != null){
try{ rs.close(); }catch(SQLException e){ /* ignore */ }
}
if(s != null){
try{ s.close(); }catch(SQLException e){ /* ignore */ }
}
}
}catch(SQLException e){
LOG.error("An SQL error occurred while getting list of sites from SST_PREFS.", e);
}finally{
if(c != null){
sqlService.returnConnection(c);
}
}
return siteIds;
}
private boolean areBothTablesPresent() {
boolean present = false;
Connection c = null;
Statement s = null;
ResultSet rs = null;
try{
c = sqlService.borrowConnection();
// Check for SST_PREFS
try{
s = c.createStatement();
rs = s.executeQuery("select count(*) from SST_PREFS");
present = true;
}catch(SQLException e){
LOG.error("Table SST_PREFS doesn't exist! Nothing to do, aborting.");
present = false;
}finally{
if(rs != null){
try{ rs.close(); }catch(SQLException e){ /* ignore */ }
}
if(s != null){
try{ s.close(); }catch(SQLException e){ /* ignore */ }
}
}
// Check for SST_PREFERENCES
try{
s = c.createStatement();
rs = s.executeQuery("select count(*) from SST_PREFERENCES");
if(present) {
present = true;
}
}catch(SQLException e){
LOG.error("Table SST_PREFERENCES doesn't exist! Create it before running this conversion script.");
present = false;
}finally{
if(rs != null){
try{ rs.close(); }catch(SQLException e){ /* ignore */ }
}
if(s != null){
try{ s.close(); }catch(SQLException e){ /* ignore */ }
}
}
}catch(SQLException e){
LOG.error("An SQL error occurred while checking for SST_PREFS and SST_PREFERENCES existence.", e);
}finally{
if(c != null){
sqlService.returnConnection(c);
}
}
return present;
}
}