/** * File ./src/main/java/de/lemo/dms/connectors/clix2010/ClixImporter.java * Lemo-Data-Management-Server for learning analytics. * Copyright (C) 2013 * Leonard Kappe, Andreas Pursian, Sebastian Schwarzrock, Boris Wenzlaff * * 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 3 of the License, or * 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, see <http://www.gnu.org/licenses/>. **/ /** * File ./main/java/de/lemo/dms/connectors/clix2010/ClixImporter.java * Date 2013-01-24 * Project Lemo Learning Analytics */ package de.lemo.dms.connectors.clix2010; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Property; import org.hibernate.criterion.Restrictions; import de.lemo.dms.connectors.Encoder; import de.lemo.dms.connectors.IConnector; import de.lemo.dms.connectors.CriteriaHelper; import de.lemo.dms.connectors.TextHelper; import de.lemo.dms.connectors.clix2010.mapping.BiTrackContentImpressions; import de.lemo.dms.connectors.clix2010.mapping.ChatProtocol; import de.lemo.dms.connectors.clix2010.mapping.EComponent; import de.lemo.dms.connectors.clix2010.mapping.EComponentType; import de.lemo.dms.connectors.clix2010.mapping.EComposing; import de.lemo.dms.connectors.clix2010.mapping.ExerciseGroup; import de.lemo.dms.connectors.clix2010.mapping.ExercisePersonalised; import de.lemo.dms.connectors.clix2010.mapping.ForumEntry; import de.lemo.dms.connectors.clix2010.mapping.ForumEntryState; import de.lemo.dms.connectors.clix2010.mapping.LearningLog; import de.lemo.dms.connectors.clix2010.mapping.Person; import de.lemo.dms.connectors.clix2010.mapping.PersonComponentAssignment; import de.lemo.dms.connectors.clix2010.mapping.PlatformGroup; import de.lemo.dms.connectors.clix2010.mapping.PlatformGroupSpecification; import de.lemo.dms.connectors.clix2010.mapping.Portfolio; import de.lemo.dms.connectors.clix2010.mapping.PortfolioLog; import de.lemo.dms.connectors.clix2010.mapping.ScormSessionTimes; import de.lemo.dms.connectors.clix2010.mapping.TGroupFullSpecification; import de.lemo.dms.connectors.clix2010.mapping.TQtiContent; import de.lemo.dms.connectors.clix2010.mapping.TQtiContentComposing; import de.lemo.dms.connectors.clix2010.mapping.TQtiContentStructure; import de.lemo.dms.connectors.clix2010.mapping.TQtiEvalAssessment; import de.lemo.dms.connectors.clix2010.mapping.TQtiTestItemD; import de.lemo.dms.connectors.clix2010.mapping.TQtiTestPlayer; import de.lemo.dms.connectors.clix2010.mapping.TQtiTestPlayerResp; import de.lemo.dms.connectors.clix2010.mapping.TeamExerciseGroup; import de.lemo.dms.connectors.clix2010.mapping.WikiEntry; import de.lemo.dms.connectors.clix2010.clixHelper.TimeConverter; import de.lemo.dms.core.Clock; import de.lemo.dms.core.config.ServerConfiguration; import de.lemo.dms.db.DBConfigObject; import de.lemo.dms.db.IDBHandler; import de.lemo.dms.db.mapping.AssignmentLogMining; import de.lemo.dms.db.mapping.AssignmentMining; import de.lemo.dms.db.mapping.ChatLogMining; import de.lemo.dms.db.mapping.ChatMining; import de.lemo.dms.db.mapping.ConfigMining; import de.lemo.dms.db.mapping.CourseAssignmentMining; import de.lemo.dms.db.mapping.CourseChatMining; import de.lemo.dms.db.mapping.CourseForumMining; import de.lemo.dms.db.mapping.CourseGroupMining; import de.lemo.dms.db.mapping.CourseLogMining; import de.lemo.dms.db.mapping.CourseMining; import de.lemo.dms.db.mapping.CourseQuizMining; import de.lemo.dms.db.mapping.CourseResourceMining; import de.lemo.dms.db.mapping.CourseScormMining; import de.lemo.dms.db.mapping.CourseUserMining; import de.lemo.dms.db.mapping.CourseWikiMining; import de.lemo.dms.db.mapping.ForumLogMining; import de.lemo.dms.db.mapping.ForumMining; import de.lemo.dms.db.mapping.GroupMining; import de.lemo.dms.db.mapping.GroupUserMining; import de.lemo.dms.db.mapping.LevelMining; import de.lemo.dms.db.mapping.PlatformMining; import de.lemo.dms.db.mapping.QuestionLogMining; import de.lemo.dms.db.mapping.QuestionMining; import de.lemo.dms.db.mapping.QuizLogMining; import de.lemo.dms.db.mapping.QuizMining; import de.lemo.dms.db.mapping.QuizQuestionMining; import de.lemo.dms.db.mapping.QuizUserMining; import de.lemo.dms.db.mapping.ResourceLogMining; import de.lemo.dms.db.mapping.ResourceMining; import de.lemo.dms.db.mapping.RoleMining; import de.lemo.dms.db.mapping.ScormLogMining; import de.lemo.dms.db.mapping.ScormMining; import de.lemo.dms.db.mapping.UserMining; import de.lemo.dms.db.mapping.WikiLogMining; import de.lemo.dms.db.mapping.WikiMining; import de.lemo.dms.db.mapping.abstractions.ILogMining; /** * Class for data-retrieval from Clix platforms. * * @author s.schwarzrock */ public class ClixImporter { private static final int MAGIC_THOU = 1000; private Long maxLog = 0L; /** The resource log max. */ private Long resourceLogMax = 0L; /** The chat log max. */ private Long chatLogMax = 0L; /** The assignment log max. */ private Long assignmentLogMax = 0L; /** The course log max. */ private Long courseLogMax = 0L; /** The forum log max. */ private Long forumLogMax = 0L; /** The question log max. */ private Long questionLogMax = 0L; /** The quiz log max. */ private Long quizLogMax = 0L; /** The scorm log max. */ private Long scormLogMax = 0L; /** The wiki log max. */ private Long wikiLogMax = 0L; /** The bi track content impressions. */ private List<BiTrackContentImpressions> biTrackContentImpressions; /** The chat protocol. */ private List<ChatProtocol> chatProtocol; /** The chat protocol. */ private List<LearningLog> learningLog; /** The exercise group. */ private List<ExerciseGroup> exerciseGroup; /** The TQtiContentComposing. */ private List<TQtiContentComposing> tQtiContentComposing; /** The e component. */ private Map<Long, EComponent> eComponentMap; /** The e component type. */ private List<EComponentType> eComponentType; /** The e component type. */ private List<TQtiTestPlayer> tQtiTestPlayer; /** The e composing. */ private List<EComposing> eComposing; /** The exercise personalised. */ private List<ExercisePersonalised> exercisePersonalised; /** The tQti TestPlayer Responses. */ private List<TQtiTestPlayerResp> tQtiTestPlayerResp; /** The forum entry. */ private List<ForumEntry> forumEntry; /** The forum entry state. */ private List<ForumEntryState> forumEntryState; /** The person. */ private List<Person> person; /** The person component assignment. */ private List<PersonComponentAssignment> personComponentAssignment; /** The platform group. */ private List<PlatformGroup> platformGroup; /** The platform group specification. */ private List<PlatformGroupSpecification> platformGroupSpecification; /** The portfolio. */ private List<Portfolio> portfolio; /** The portfolio log. */ private List<PortfolioLog> portfolioLog; /** The scorm session times. */ private List<ScormSessionTimes> scormSessionTimes; /** The team exercise group. */ private List<TeamExerciseGroup> teamExerciseGroup; /** The t group full specification. */ private List<TGroupFullSpecification> tGroupFullSpecification; /** The t qti content. */ private List<TQtiContent> tQtiContent; /** The t qti content structure. */ private List<TQtiContentStructure> tQtiContentStructure; /** The t qti test item d structure. */ private List<TQtiTestItemD> tQtiTestItemD; /** The t qti eval assessment. */ private List<TQtiEvalAssessment> tQtiEvalAssessment; /** The wiki entry. */ private List<WikiEntry> wikiEntry; /** The e composing map. */ private Map<Long, EComposing> eComposingMap; /** The course_mining. */ private Map<Long, CourseMining> courseMining; /** The platform_mining. */ private Map<Long, PlatformMining> platformMining; /** The quiz_mining. */ private Map<Long, QuizMining> quizMining; /** The assignment_mining. */ private Map<Long, AssignmentMining> assignmentMining; /** The scorm_mining. */ private Map<Long, ScormMining> scormMining; /** The forum_mining. */ private Map<Long, ForumMining> forumMining; /** The resource_mining. */ private Map<Long, ResourceMining> resourceMining; /** The user_mining. */ private Map<Long, UserMining> userMining; /** The wiki_mining. */ private Map<Long, WikiMining> wikiMining; /** The group_mining. */ private Map<Long, GroupMining> groupMining; /** The question_mining. */ private Map<Long, QuestionMining> questionMining; /** The role_mining. */ private Map<Long, RoleMining> roleMining; /** The chat_mining. */ private Map<Long, ChatMining> chatMining; /** The level_mining. */ private Map<Long, LevelMining> oldLevelMining; /** The quiz_question_mining. */ private Map<Long, QuizQuestionMining> quizQuestionMining; /** The course_quiz_mining. */ private Map<Long, CourseQuizMining> courseQuizMining; /** The course_chat_mining. */ private Map<Long, CourseChatMining> courseChatMining; /** The course_user_mining. */ private Map<Long, CourseUserMining> courseUserMining; /** The course_assignment_mining. */ private Map<Long, CourseAssignmentMining> courseAssignmentMining; /** The course_scorm_mining. */ private Map<Long, CourseScormMining> courseScormMining; /** The course_forum_mining. */ private Map<Long, CourseForumMining> courseForumMining; /** The course_group_mining. */ private Map<Long, CourseGroupMining> courseGroupMining; /** The course_resource_mining. */ private Map<Long, CourseResourceMining> courseResourceMining; /** The course_wiki_mining. */ private Map<Long, CourseWikiMining> courseWikiMining; /** The group_user_mining. */ private Map<Long, GroupUserMining> groupUserMining; /** The quiz_user_mining. */ private Map<Long, QuizUserMining> quizUserMining; // Maps of mining-objects that have been found in a previous extraction process /** The old_course_mining. */ private Map<Long, CourseMining> oldCourseMining; /** The old_quiz_mining. */ private Map<Long, QuizMining> oldQuizMining; /** The old_assignment_mining. */ private Map<Long, AssignmentMining> oldAssignmentMining; /** The old_scorm_mining. */ private Map<Long, ScormMining> oldScormMining; /** The old_forum_mining. */ private Map<Long, ForumMining> oldForumMining; /** The old_resource_mining. */ private Map<Long, ResourceMining> oldResourceMining; /** The old_user_mining. */ private Map<Long, UserMining> oldUserMining; /** The old_wiki_mining. */ private Map<Long, WikiMining> oldWikiMining; /** The old_group_mining. */ private Map<Long, GroupMining> oldGroupMining; /** The old_question_mining. */ private Map<Long, QuestionMining> oldQuestionMining; /** The old_role_mining. */ private Map<Long, RoleMining> oldRoleMining; /** The old_chat_mining. */ private Map<Long, ChatMining> oldChatMining; private final Logger logger = Logger.getLogger(this.getClass()); private final IConnector connector; /** Database-handler **/ private IDBHandler dbHandler; public ClixImporter(final IConnector connector) { this.connector = connector; } /** * Performs a extraction process for an entire Clix2010 database. * * @param dbConfig config-object for database connection * @param courses List of course-ids for course-data that shall be imported. * If empty a all courses are imported. */ public void getClixData(final DBConfigObject dbConfig, List<Long> courses, List<String> logins) { final Clock c = new Clock(); final Long starttime = System.currentTimeMillis() / MAGIC_THOU; this.dbHandler = ServerConfiguration.getInstance().getMiningDbHandler(); this.platformMining = new HashMap<Long, PlatformMining>(); // Do Import long startTime = this.initialize(); this.logger.info("\n" + c.getAndReset() + " (initializing)" + "\n"); this.loadData(dbConfig, courses, logins, startTime); this.logger.info(c.getAndReset() + " (loading data)" ); this.saveData(); this.logger.info(c.getAndReset() + " (saving data)" ); // Create and save config-object final Long endtime = System.currentTimeMillis() / MAGIC_THOU; final ConfigMining config = new ConfigMining(); config.setLastModifiedLong(System.currentTimeMillis()); config.setElapsedTime((endtime) - (starttime)); config.setDatabaseModel("1.3"); config.setPlatform(this.connector.getPlatformId()); //To stop rounding errors config.setLatestTimestamp(this.maxLog); final Session miningSession = this.dbHandler.getMiningSession(); this.dbHandler.saveToDB(miningSession, config); dbHandler.closeSession(miningSession); } /** * Performs a data-extraction for a Clix2010 database for all objects that * are newer than the given time stamp. Performs import in 7 day intervalls. * * @param dbConfig Config-object for database connection * @param startTime The start time * @param courses List of course-ids for course-data that shall be imported. * If empty a all courses are imported. */ public void updateClixData(final DBConfigObject dbConfig, Long startTime, List<Long> courses, List<String> logins) { final Long currentSysTime = System.currentTimeMillis() / MAGIC_THOU; Long upperLimit = 0L; this.dbHandler = ServerConfiguration.getInstance().getMiningDbHandler(); this.platformMining = new HashMap<Long, PlatformMining>(); while (startTime <= currentSysTime) { // increase upper limit successively upperLimit = startTime + 604800L; this.initialize(); // Do Update this.loadData(dbConfig, startTime, upperLimit, courses, logins); this.saveData(); startTime = upperLimit; } final Long endtime = System.currentTimeMillis() / MAGIC_THOU; final ConfigMining config = new ConfigMining(); config.setLastModifiedLong(System.currentTimeMillis()); config.setElapsedTime((endtime) - (currentSysTime)); config.setDatabaseModel("1.3"); config.setPlatform(this.connector.getPlatformId()); config.setLatestTimestamp(this.maxLog); final Session session = this.dbHandler.getMiningSession(); this.dbHandler.saveToDB(session, config); this.dbHandler.closeSession(session); } /** * Generates and saves all objects. */ private void saveData() { try { final List<Collection<?>> updates = new ArrayList<Collection<?>>(); if (this.userMining == null) { updates.add(this.platformMining.values()); this.courseMining = this.generateCourseMining(); updates.add(this.courseMining.values()); this.quizMining = this.generateQuizMining(); updates.add(this.quizMining.values()); this.assignmentMining = this.generateAssignmentMining(); updates.add(this.assignmentMining.values()); this.scormMining = this.generateScormMining(); updates.add(this.scormMining.values()); this.forumMining = this.generateForumMining(); updates.add(this.forumMining.values()); this.resourceMining = this.generateResourceMining(); updates.add(this.resourceMining.values()); this.wikiMining = this.generateWikiMining(); updates.add(this.wikiMining.values()); this.userMining = this.generateUserMining(); updates.add(this.userMining.values()); this.groupMining = this.generateGroupMining(); updates.add(this.groupMining.values()); this.questionMining = this.generateQuestionMining(); updates.add(this.questionMining.values()); this.roleMining = this.generateRoleMining(); updates.add(this.roleMining.values()); this.chatMining = this.generateChatMining(); updates.add(this.chatMining.values()); this.logger.info(">>AssociationObjects<<"); this.courseUserMining = this.generateCourseUserMining(); updates.add(this.courseUserMining.values()); this.quizQuestionMining = this.generateQuizQuestionMining(); updates.add(this.quizQuestionMining.values()); this.courseQuizMining = this.generateCourseQuizMining(); updates.add(this.courseQuizMining.values()); this.courseChatMining = generateCourseChatMining(); updates.add(this.courseChatMining.values()); // this.courseAssignmentMining = this.generateCourseAssignmentMining(); updates.add(this.courseAssignmentMining.values()); this.courseScormMining = this.generateCourseScormMining(); updates.add(this.courseScormMining.values()); this.courseForumMining = this.generateCourseForumMining(); updates.add(this.courseForumMining.values()); this.courseGroupMining = this.generateCourseGroupMining(); updates.add(this.courseGroupMining.values()); this.courseWikiMining = this.generateCourseWikiMining(); updates.add(this.courseWikiMining.values()); this.courseResourceMining = this.generateCourseResourceMining(); updates.add(this.courseResourceMining.values()); this.groupUserMining = this.generateGroupUserMining(); updates.add(this.groupUserMining.values()); this.quizUserMining = this.generateQuizUserMining(); updates.add(this.quizUserMining.values()); } this.logger.info(">>LogObjects<<"); updates.add(this.courseAssignmentMining.values()); updates.add(this.generateAssignmentLogMining().values()); updates.add(this.generateCourseLogMining().values()); updates.add(this.generateForumLogMining().values()); updates.add(this.generateQuizLogMining().values()); updates.add(this.generateQuestionLogMining().values()); updates.add(this.generateScormLogMining().values()); updates.add(this.generateResourceLogMining().values()); updates.add(this.generateWikiLogMining().values()); updates.add(generateILogMining()); updates.add(this.generateChatLogMining().values()); Long objects = 0L; for (final Collection<?> collection : updates) { objects += collection.size(); } if (objects > 0) { final Session session = this.dbHandler.getMiningSession(); this.logger.info("Writing to DB"); dbHandler.saveCollectionToDB(session, updates); } else { this.logger.info("No new objects found."); } updates.clear(); this.clearSourceData(); } catch (final Exception e) { logger.error(this + e.getMessage()); } } /** * Clears all data-tables. */ public void clearSourceData() { this.biTrackContentImpressions.clear(); this.chatProtocol.clear(); this.exerciseGroup.clear(); this.eComponentMap.clear(); this.eComponentType.clear(); this.eComposing.clear(); this.exercisePersonalised.clear(); this.forumEntry.clear(); this.forumEntryState.clear(); this.person.clear(); this.personComponentAssignment.clear(); this.platformGroup.clear(); this.platformGroupSpecification.clear(); this.portfolio.clear(); this.portfolioLog.clear(); this.scormSessionTimes.clear(); this.teamExerciseGroup.clear(); this.tGroupFullSpecification.clear(); this.tQtiContent.clear(); this.tQtiEvalAssessment.clear(); this.wikiEntry.clear(); } /** * Looks, if there are already values in the Mining database and loads them, if necessary. * */ @SuppressWarnings("unchecked") private Long initialize() { Long readingtimestamp; try { // accessing DB by creating a session and a transaction using HibernateUtil final Session session = this.dbHandler.getMiningSession(); ArrayList<?> l; readingtimestamp = (Long) session.createQuery("Select max(latestTimestamp) from ConfigMining where platform=" + this.connector.getPlatformId()).uniqueResult(); if(readingtimestamp == null) { readingtimestamp = 0L; this.oldAssignmentMining = new HashMap<Long, AssignmentMining>(); this.oldChatMining = new HashMap<Long, ChatMining>(); this.oldCourseMining = new HashMap<Long, CourseMining>(); this.oldForumMining = new HashMap<Long, ForumMining>(); this.oldGroupMining = new HashMap<Long, GroupMining>(); this.oldLevelMining = new HashMap<Long, LevelMining>(); this.oldQuestionMining = new HashMap<Long, QuestionMining>(); this.oldQuizMining = new HashMap<Long, QuizMining>(); this.oldResourceMining = new HashMap<Long, ResourceMining>(); this.oldRoleMining = new HashMap<Long, RoleMining>(); this.oldScormMining = new HashMap<Long, ScormMining>(); this.oldUserMining = new HashMap<Long, UserMining>(); this.oldWikiMining = new HashMap<Long, WikiMining>(); this.resourceLogMax = 0L; this.chatLogMax = 0L; this.assignmentLogMax = 0L; this.courseLogMax = 0L; this.forumLogMax = 0L; this.questionLogMax = 0L; this.quizLogMax = 0L; this.scormLogMax = 0L; this.wikiLogMax = 0L; } else { Query logCount = session.createQuery("select max(log.id) from ResourceLogMining log"); this.resourceLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.resourceLogMax == null) { this.resourceLogMax = 0L; } logCount = session.createQuery("select max(log.id) from ChatLogMining log"); this.chatLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.chatLogMax == null) { this.chatLogMax = 0L; } logCount = session.createQuery("select max(log.id) from AssignmentLogMining log"); this.assignmentLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.assignmentLogMax == null) { this.assignmentLogMax = 0L; } logCount = session.createQuery("select max(log.id) from CourseLogMining log"); this.courseLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.courseLogMax == null) { this.courseLogMax = 0L; } logCount = session.createQuery("select max(log.id) from ForumLogMining log"); this.forumLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.forumLogMax == null) { this.forumLogMax = 0L; } logCount = session.createQuery("select max(log.id) from QuestionLogMining log"); this.questionLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.questionLogMax == null) { this.questionLogMax = 0L; } logCount = session.createQuery("select max(log.id) from QuizLogMining log"); this.quizLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.quizLogMax == null) { this.quizLogMax = 0L; } logCount = session.createQuery("select max(log.id) from ScormLogMining log"); this.scormLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.scormLogMax == null) { this.scormLogMax = 0L; } logCount = session.createQuery("select max(log.id) from WikiLogMining log"); this.wikiLogMax = ((ArrayList<Long>) logCount.list()).get(0); if (this.wikiLogMax == null) { this.wikiLogMax = 0L; } final Query oldCourse = session.createQuery("from CourseMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<CourseMining>) oldCourse.list(); this.oldCourseMining = new HashMap<Long, CourseMining>(); for (int i = 0; i < l.size(); i++) { this.oldCourseMining.put(Long.valueOf(((CourseMining) l.get(i)).getId()), (CourseMining) l.get(i)); } this.logger.info("Read " + this.oldCourseMining.size() + " old CourseMinings."); final Query oldQuiz = session.createQuery("from QuizMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<QuizMining>) oldQuiz.list(); this.oldQuizMining = new HashMap<Long, QuizMining>(); for (int i = 0; i < l.size(); i++) { this.oldQuizMining.put(Long.valueOf(((QuizMining) l.get(i)).getId()), (QuizMining) l.get(i)); } this.logger.info("Read " + this.oldQuizMining.size() + " old QuizMinings."); final Query oldAssignment = session.createQuery("from AssignmentMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<AssignmentMining>) oldAssignment.list(); this.oldAssignmentMining = new HashMap<Long, AssignmentMining>(); for (int i = 0; i < l.size(); i++) { this.oldAssignmentMining.put(Long.valueOf(((AssignmentMining) l.get(i)).getId()), (AssignmentMining) l.get(i)); } this.logger.info("Read " + this.oldAssignmentMining.size() + " old AssignmentMinings."); final Query oldScorm = session.createQuery("from ScormMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<ScormMining>) oldScorm.list(); this.oldScormMining = new HashMap<Long, ScormMining>(); for (int i = 0; i < l.size(); i++) { this.oldScormMining.put(Long.valueOf(((ScormMining) l.get(i)).getId()), (ScormMining) l.get(i)); } this.logger.info("Read " + this.oldScormMining.size() + " old ScormMinings."); final Query oldForum = session.createQuery("from ForumMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<ForumMining>) oldForum.list(); this.oldForumMining = new HashMap<Long, ForumMining>(); for (int i = 0; i < l.size(); i++) { this.oldForumMining.put(Long.valueOf(((ForumMining) l.get(i)).getId()), (ForumMining) l.get(i)); } this.logger.info("Read " + this.oldForumMining.size() + " old ForumMinings."); final Query oldResource = session.createQuery("from ResourceMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<ResourceMining>) oldResource.list(); this.oldResourceMining = new HashMap<Long, ResourceMining>(); for (int i = 0; i < l.size(); i++) { this.oldResourceMining .put(Long.valueOf(((ResourceMining) l.get(i)).getId()), (ResourceMining) l.get(i)); } this.logger.info("Read " + this.oldResourceMining.size() + " old ForumMinings."); final Query oldUser = session.createQuery("from UserMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<UserMining>) oldUser.list(); this.oldUserMining = new HashMap<Long, UserMining>(); for (int i = 0; i < l.size(); i++) { this.oldUserMining.put(Long.valueOf(((UserMining) l.get(i)).getId()), (UserMining) l.get(i)); } this.logger.info("Read " + this.oldUserMining.size() + " old UserMinings."); final Query oldWiki = session.createQuery("from WikiMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<WikiMining>) oldWiki.list(); this.oldWikiMining = new HashMap<Long, WikiMining>(); for (int i = 0; i < l.size(); i++) { this.oldWikiMining.put(Long.valueOf(((WikiMining) l.get(i)).getId()), (WikiMining) l.get(i)); } this.logger.info("Read " + this.oldWikiMining.size() + " old WikiMinings."); final Query oldGroup = session.createQuery("from GroupMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<GroupMining>) oldGroup.list(); this.oldGroupMining = new HashMap<Long, GroupMining>(); for (int i = 0; i < l.size(); i++) { this.oldGroupMining.put(Long.valueOf(((GroupMining) l.get(i)).getId()), (GroupMining) l.get(i)); } this.logger.info("Read " + this.oldGroupMining.size() + " old GroupMinings."); final Query oldQuestion = session.createQuery("from QuestionMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<QuestionMining>) oldQuestion.list(); this.oldQuestionMining = new HashMap<Long, QuestionMining>(); for (int i = 0; i < l.size(); i++) { this.oldQuestionMining .put(Long.valueOf(((QuestionMining) l.get(i)).getId()), (QuestionMining) l.get(i)); } this.logger.info("Read " + this.oldQuestionMining.size() + " old QuestionMinings."); final Query oldRole = session.createQuery("from RoleMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<RoleMining>) oldRole.list(); this.oldRoleMining = new HashMap<Long, RoleMining>(); for (int i = 0; i < l.size(); i++) { this.oldRoleMining.put(Long.valueOf(((RoleMining) l.get(i)).getId()), (RoleMining) l.get(i)); } this.logger.info("Read " + this.oldRoleMining.size() + " old RoleMinings."); final Query oldLevel = session.createQuery("from LevelMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<LevelMining>) oldLevel.list(); this.oldLevelMining = new HashMap<Long, LevelMining>(); for (int i = 0; i < l.size(); i++) { this.oldLevelMining.put(Long.valueOf(((LevelMining) l.get(i)).getId()), (LevelMining) l.get(i)); } this.logger.info("Read " + this.oldLevelMining.size() + " old LevelMinings."); final Query oldChat = session.createQuery("from ChatMining x where x.platform=" + this.connector.getPlatformId() + " order by x.id asc"); l = (ArrayList<ChatMining>) oldChat.list(); this.oldChatMining = new HashMap<Long, ChatMining>(); for (int i = 0; i < l.size(); i++) { this.oldChatMining.put(Long.valueOf(((ChatMining) l.get(i)).getId()), (ChatMining) l.get(i)); } this.logger.info("Read " + this.oldChatMining.size() + " old ChatMinings."); } } catch (final Exception e) { logger.error(this + e.getMessage()); return null; } return readingtimestamp; } /** * Loads all necessary tables from the Clix2010 database. */ @SuppressWarnings("unchecked") private void loadData(final DBConfigObject dbConfig, List<Long> courses, List<String> logins, long startTime) { // accessing DB by creating a session and a transaction using HibernateUtil final Session session = ClixHibernateUtil.getSessionFactory(dbConfig).openSession(); boolean hasCR = false; if(courses != null && courses.size() > 0) hasCR = true; boolean empty = false; if(logins != null && !logins.isEmpty()) { List<Long> newCourses = new ArrayList<Long>(); Criteria criteria = session.createCriteria(Person.class, "obj"); criteria.add(CriteriaHelper.in("obj.login", logins)); List<Long> usId = new ArrayList<Long>(); for(Person p : (List<Person>) criteria.list()) usId.add(p.getId()); if(!usId.isEmpty()) { criteria = session.createCriteria(PersonComponentAssignment.class, "obj"); criteria.add(CriteriaHelper.in("obj.person", usId)); for(PersonComponentAssignment pca : (List<PersonComponentAssignment>) criteria.list()) newCourses.add(pca.getComponent()); courses.addAll(newCourses); hasCR = true; logger.info(newCourses.toString()); } } this.logger.info("Starting data extraction."); // The Clix database uses date representation of the type varchar, so the unix-timestamp has to be converted // to a string String startStr = TimeConverter.getStringRepresentation(startTime); //Get QTiTestPlayerResp tables this.tQtiTestPlayerResp = new ArrayList<TQtiTestPlayerResp>(); Criteria criteria = session.createCriteria(TQtiTestPlayerResp.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.container", courses)); } criteria.add(Restrictions.gt("obj.evaluationDate", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.tQtiTestPlayerResp = criteria.list(); logger.info("TQtiTestPlayerResp tables: " + this.tQtiTestPlayerResp.size()); //Get QTiTestPlayer tables this.tQtiTestPlayer = new ArrayList<TQtiTestPlayer>(); criteria = session.createCriteria(TQtiTestPlayer.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.container", courses)); } criteria.add(Restrictions.gt("obj.created", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.tQtiTestPlayer = criteria.list(); logger.info("TQtiTestPlayer tables: " + this.tQtiTestPlayer.size()); //Get EComposing tables this.eComposing = new ArrayList<EComposing>(); criteria = session.createCriteria(EComposing.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.composing", courses)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.eComposing = criteria.list(); this.eComposingMap = new HashMap<Long, EComposing>(); for (int i = 0; i < this.eComposing.size(); i++) { this.eComposingMap.put(this.eComposing.get(i).getComponent(), this.eComposing.get(i)); } logger.info("EComposing tables: " + this.eComposing.size()); //Get ExerciseGroup tables this.exerciseGroup = new ArrayList<ExerciseGroup>(); criteria = session.createCriteria(ExerciseGroup.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.associatedCourse", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.exerciseGroup = criteria.list(); this.logger.info("ExerciseGroup tables: " + this.exerciseGroup.size()); //Get ExercisePersonalised tables this.exercisePersonalised = new ArrayList<ExercisePersonalised>(); criteria = session.createCriteria(ExercisePersonalised.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(ExerciseGroup eg : this.exerciseGroup) ids.add(eg.getId()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.community", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.exercisePersonalised = criteria.list(); else this.exercisePersonalised = new ArrayList<ExercisePersonalised>(); this.logger.info("ExercisePersonalised tables: " + this.exercisePersonalised.size()); Set<Long> tmpComp = new HashSet<Long>(); //Get EComponent tables criteria = session.createCriteria(EComponent.class, "obj"); if(hasCR) { tmpComp.addAll(this.eComposingMap.keySet()); tmpComp.addAll(courses); for(ExercisePersonalised eP : this.exercisePersonalised) tmpComp.add(eP.getExercise()); if(!(empty = tmpComp.isEmpty())) { criteria.add(CriteriaHelper.in("obj.id", new ArrayList<Long>(tmpComp))); //criteria.add(CriteriaHelper.in("obj.id", tmpComp)); } } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); final List<EComponent> tmp; if(!(hasCR && empty)) tmp = criteria.list(); else tmp = new ArrayList<EComponent>(); this.eComponentMap = new HashMap<Long, EComponent>(); for (final EComponent c : tmp) { this.eComponentMap.put(c.getId(), c); } tmp.clear(); this.logger.info("EComponent tables: " + this.eComponentMap.values().size()); //Get TQtiContentStructure tables criteria = session.createCriteria(TQtiContentStructure.class, "obj"); if(hasCR) { ArrayList<Long> newKeys = new ArrayList<Long>(this.eComposingMap.keySet()); HashSet<Long> allKeys = new HashSet<Long>(); while(!newKeys.isEmpty()) { criteria = session.createCriteria(TQtiContentStructure.class, "obj"); criteria.add(CriteriaHelper.in("obj.container", newKeys)); List<TQtiContentStructure> t = criteria.list(); newKeys.clear(); for(TQtiContentStructure tqs : t ) { newKeys.add(tqs.getContent()); allKeys.add(tqs.getContainer()); } allKeys.addAll(newKeys); } criteria = session.createCriteria(TQtiContentStructure.class, "obj"); if(!(empty = allKeys.isEmpty())) criteria.add(CriteriaHelper.in("obj.container", allKeys)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiContentStructure = criteria.list(); else this.tQtiContentStructure = new ArrayList<TQtiContentStructure>(); this.logger.info("TQtiContentStructure tables: " + this.tQtiContentStructure.size()); //Get TQtiContentComposing tables criteria = session.createCriteria(TQtiContentComposing.class, "obj"); if(hasCR) { HashSet<Long> tmp1 = new HashSet<Long>(); for(TQtiContentStructure tqs : this.tQtiContentStructure) tmp1.add(tqs.getContent()); if(!(empty = tmp1.isEmpty())) criteria.add(CriteriaHelper.in("obj.container", tmp1)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiContentComposing = criteria.list(); else this.tQtiContentComposing = new ArrayList<TQtiContentComposing>(); logger.info("TQtiContentComposing tables: " + this.tQtiContentComposing.size()); //Get TQtiContent tables criteria = session.createCriteria(TQtiContent.class, "obj"); if(hasCR) { HashSet<Long> ids = new HashSet<Long>(); for(TQtiContentStructure tqs : this.tQtiContentStructure) { ids.add(tqs.getContainer()); ids.add(tqs.getContent()); } for(TQtiContentComposing tqs : this.tQtiContentComposing) { ids.add(tqs.getContainer()); ids.add(tqs.getContent()); } if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiContent = criteria.list(); else this.tQtiContent = new ArrayList<TQtiContent>(); this.logger.info("TQtiContent tables: " + this.tQtiContent.size()); //Get ChatProtocol tables criteria = session.createCriteria(ChatProtocol.class, "obj"); if(hasCR) { HashSet<Long> tmp1 = new HashSet<Long>(this.eComposingMap.keySet()); if(!(empty = tmp1.isEmpty())) criteria.add(CriteriaHelper.in("obj.chatroom", tmp1)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.chatProtocol = criteria.list(); else this.chatProtocol = new ArrayList<ChatProtocol>(); logger.info("ChatProtocol tables: " + this.chatProtocol.size()); //Get EComponentType tables criteria = session.createCriteria(EComponentType.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(EComponent eg : this.eComponentMap.values()) { ids.add(eg.getType()); } //if(!(empty = ids.isEmpty())) //criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.eComponentType = criteria.list(); this.logger.info("EComponentType tables: " + this.eComponentType.size()); //Get ForumEntry tables criteria = session.createCriteria(ForumEntry.class, "obj"); if(hasCR) { if(!(empty = this.eComposingMap.isEmpty())) { criteria.add(CriteriaHelper.in("obj.forum", this.eComposingMap.keySet())); } } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!empty) { this.forumEntry = criteria.list(); } else this.forumEntry = new ArrayList<ForumEntry>(); this.logger.info("ForumEntry tables: " + this.forumEntry.size()); //Get ForumEntryState tables /*criteria = session.createCriteria(ForumEntryState.class, "obj"); if(hasCR) { if(!(empty = this.eComposingMap.isEmpty())) { criteria.add(CriteriaHelper.in("obj.forum", this.eComposingMap.keySet())); } } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!hasCR || !empty) { this.forumEntryState = criteria.list(); } else*/ this.forumEntryState = new ArrayList<ForumEntryState>(); this.logger.info("ForumEntryState tables: " + this.forumEntryState.size()); //Get LearningLog tables criteria = session.createCriteria(LearningLog.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.course", courses)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.learningLog = criteria.list(); this.logger.info("LearningLog tables: " + this.learningLog.size()); //Get Portfolio tables criteria = session.createCriteria(Portfolio.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.portfolio = criteria.list(); this.logger.info("Portfolio tables: " + this.portfolio.size()); //Get PortfolioLog tables criteria = session.createCriteria(PortfolioLog.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.portfolioLog = criteria.list(); this.logger.info("PortfolioLog tables: " + this.portfolioLog.size()); //Get PersonComponentAssignment tables criteria = session.createCriteria(PersonComponentAssignment.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.personComponentAssignment = criteria.list(); this.logger.info("PersonComponentAssignment tables: " + this.personComponentAssignment.size()); //Get Person tables criteria = session.createCriteria(Person.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(Portfolio eg : this.portfolio) ids.add(eg.getPerson()); for(ExercisePersonalised eP : this.exercisePersonalised) ids.add(eP.getUser()); for(PersonComponentAssignment eP : this.personComponentAssignment) ids.add(eP.getPerson()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.person = criteria.list(); else this.person = new ArrayList<Person>(); this.logger.info("Person tables: " + this.person.size()); //Get PlatformGroupSpecification tables /*criteria = session.createCriteria(PlatformGroupSpecification.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(Person eg : this.person) ids.add(eg.getId()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.person", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.platformGroupSpecification = criteria.list(); else*/ this.platformGroupSpecification = new ArrayList<PlatformGroupSpecification>(); this.logger.info("PlatformGroupSpecification tables: " + this.platformGroupSpecification.size()); //Get PlatformGroup tables criteria = session.createCriteria(PlatformGroup.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(PlatformGroupSpecification eg : this.platformGroupSpecification) ids.add(eg.getGroup()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.platformGroup = criteria.list(); else this.platformGroup = new ArrayList<PlatformGroup>(); this.logger.info("PlatformGroup tables: " + this.platformGroup.size()); //Get ScormSessionTimes tables criteria = session.createCriteria(ScormSessionTimes.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.scormSessionTimes = criteria.list(); this.logger.info("ScormSessionTimes tables: " + this.scormSessionTimes.size()); //Get TeamExerciseGroup tables criteria = session.createCriteria(TeamExerciseGroup.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.teamExerciseGroup = criteria.list(); this.logger.info("TeamExerciseGroup tables: " + this.teamExerciseGroup.size()); //Get TQtiTestItemD tables criteria = session.createCriteria(TQtiTestItemD.class, "obj"); if(hasCR) { HashSet<Long> ids = new HashSet<Long>(); for(TQtiContent tc : this.tQtiContent) { ids.add(tc.getId()); } if(!(empty = ids.isEmpty())) { criteria.add(CriteriaHelper.in("obj.content", ids)); } } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiTestItemD = criteria.list(); else this.tQtiTestItemD = new ArrayList<TQtiTestItemD>(); this.logger.info("TQtiTestItemD tables: " + this.tQtiTestItemD.size()); //Get TGroupFullSpecification tables criteria = session.createCriteria(TGroupFullSpecification.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(TeamExerciseGroup eg : this.teamExerciseGroup) ids.add(eg.getId()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.group", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tGroupFullSpecification = criteria.list(); else this.tGroupFullSpecification = new ArrayList<TGroupFullSpecification>(); this.logger.info("TGroupFullSpecification tables: " + this.tGroupFullSpecification.size()); //Get TQtiEvalAssessment tables criteria = session.createCriteria(TQtiEvalAssessment.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.gt("obj.lastInvocation", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.tQtiEvalAssessment = criteria.list(); this.logger.info("TQtiEvalAssessment tables: " + this.tQtiEvalAssessment.size()); //Get WikiEntry tables criteria = session.createCriteria(WikiEntry.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.gt("obj.lastUpdated", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.wikiEntry = criteria.list(); this.logger.info("WikiEntry tables: " + this.wikiEntry.size()); startStr = startStr.substring(0, startStr.indexOf(' ')); //Get BiTrackContentImpressions tables criteria = session.createCriteria(BiTrackContentImpressions.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.container", courses)); } criteria.add(Restrictions.gt("obj.dayOfAccess", startStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.biTrackContentImpressions = criteria.list(); logger.info("BiTrackContentImpressions tables: " + this.biTrackContentImpressions.size()); session.clear(); session.close(); } /** * Loads all tables needed for the data-extraction from the Clix database. * * @param start * the start * @param end * the end */ @SuppressWarnings("unchecked") private void loadData(final DBConfigObject dbConfig, final Long start, final Long end, List<Long> courses, List<String> logins) { // accessing DB by creating a session and a transaction using HibernateUtil final Session session = ClixHibernateUtil.getSessionFactory(dbConfig).openSession(); boolean hasCR = false; if(courses != null && courses.size() > 0) hasCR = true; boolean empty = true; if(logins != null && !logins.isEmpty()) { List<Long> newCourses = new ArrayList<Long>(); Criteria criteria = session.createCriteria(Person.class, "obj"); criteria.add(CriteriaHelper.in("obj.login", logins)); List<Long> usId = new ArrayList<Long>(); for(Person p : (List<Person>) criteria.list()) usId.add(p.getId()); if(!usId.isEmpty()) { criteria = session.createCriteria(PersonComponentAssignment.class, "obj"); criteria.add(CriteriaHelper.in("obj.person", usId)); for(PersonComponentAssignment pca : (List<PersonComponentAssignment>) criteria.list()) newCourses.add(pca.getComponent()); courses.addAll(newCourses); hasCR = true; } } this.logger.info("Starting data extraction."); Criteria criteria; // The Clix database uses date representation of the type varchar, so the unix-timestamp has to be converted // to a string String startStr = TimeConverter.getStringRepresentation(start); String endStr = TimeConverter.getStringRepresentation(end); // Read the tables that don't refer to log-entries once if (this.userMining == null) { //Get EComposing tables criteria = session.createCriteria(EComposing.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.composing", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.eComposing = criteria.list(); this.eComposingMap = new HashMap<Long, EComposing>(); for (int i = 0; i < this.eComposing.size(); i++) { this.eComposingMap.put(this.eComposing.get(i).getComponent(), this.eComposing.get(i)); } logger.info("EComposing tables: " + this.eComposing.size()); criteria = session.createCriteria(Portfolio.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.portfolio = criteria.list(); this.logger.info("Portfolio tables: " + this.portfolio.size()); //Get PersonComponentAssignment tables criteria = session.createCriteria(PersonComponentAssignment.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.personComponentAssignment = criteria.list(); this.logger.info("PersonComponentAssignment tables: " + this.personComponentAssignment.size()); //Get ExerciseGroup tables criteria = session.createCriteria(ExerciseGroup.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.associatedCourse", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.exerciseGroup = criteria.list(); this.logger.info("ExerciseGroup tables: " + this.exerciseGroup.size()); //Get ExercisePersonalised tables criteria = session.createCriteria(ExercisePersonalised.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(ExerciseGroup eg : this.exerciseGroup) ids.add(eg.getId()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.community", ids)); } criteria.add(Restrictions.between("obj.uploadDate", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.exercisePersonalised = criteria.list(); else this.exercisePersonalised = new ArrayList<ExercisePersonalised>(); this.logger.info("ExercisePersonalised tables: " + this.exercisePersonalised.size()); //Get EComponent tables Set<Long> tmpComp = new HashSet<Long>(); criteria = session.createCriteria(EComponent.class, "obj"); if(hasCR) { tmpComp.addAll(this.eComposingMap.keySet()); tmpComp.addAll(courses); for(ExercisePersonalised eP : this.exercisePersonalised) tmpComp.add(eP.getExercise()); if(!(empty = tmpComp.isEmpty())) criteria.add(CriteriaHelper.in("obj.id", tmpComp)); } criteria.addOrder(Property.forName("obj.id").asc()); final List<EComponent> tmp; if(!(hasCR && empty)) tmp = criteria.list(); else tmp = new ArrayList<EComponent>(); this.eComponentMap = new HashMap<Long, EComponent>(); for (final EComponent c : tmp) { this.eComponentMap.put(c.getId(), c); } tmp.clear(); this.logger.info("EComponent tables: " + this.eComponentMap.values().size()); //Get EComponentType tables criteria = session.createCriteria(EComponentType.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(EComponent eg : this.eComponentMap.values()) { ids.add(eg.getType()); } //if(!(empty = ids.isEmpty())) //criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); this.eComponentType = criteria.list(); this.logger.info("EComponentType tables: " + this.eComponentType.size()); //Get TQtiContentStructure tables criteria = session.createCriteria(TQtiContentStructure.class, "obj"); if(hasCR) { ArrayList<Long> newKeys = new ArrayList<Long>(this.eComposingMap.keySet()); HashSet<Long> allKeys = new HashSet<Long>(); while(!newKeys.isEmpty()) { criteria = session.createCriteria(TQtiContentStructure.class, "obj"); criteria.add(CriteriaHelper.in("obj.container", newKeys)); List<TQtiContentStructure> t = criteria.list(); newKeys.clear(); for(TQtiContentStructure tqs : t ) { newKeys.add(tqs.getContent()); allKeys.add(tqs.getContainer()); } allKeys.addAll(newKeys); } criteria = session.createCriteria(TQtiContentStructure.class, "obj"); if(!(empty = allKeys.isEmpty())) criteria.add(CriteriaHelper.in("obj.container", allKeys)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiContentStructure = criteria.list(); else this.tQtiContentStructure = new ArrayList<TQtiContentStructure>(); this.logger.info("TQtiContentStructure tables: " + this.tQtiContentStructure.size()); //Get TQtiContentComposing tables criteria = session.createCriteria(TQtiContentComposing.class, "obj"); if(hasCR) { HashSet<Long> tmp1 = new HashSet<Long>(); for(TQtiContentStructure tqs : this.tQtiContentStructure) tmp1.add(tqs.getContent()); if(!(empty = tmp1.isEmpty())) criteria.add(CriteriaHelper.in("obj.container", tmp1)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiContentComposing = criteria.list(); else this.tQtiContentComposing = new ArrayList<TQtiContentComposing>(); logger.info("TQtiContentComposing tables: " + this.tQtiContentComposing.size()); //Get Person tables criteria = session.createCriteria(Person.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(Portfolio eg : this.portfolio) ids.add(eg.getPerson()); for(ExercisePersonalised eP : this.exercisePersonalised) ids.add(eP.getUser()); for(PersonComponentAssignment eP : this.personComponentAssignment) ids.add(eP.getPerson()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.person = criteria.list(); else this.person = new ArrayList<Person>(); this.logger.info("Person tables: " + this.person.size()); //Get PlatformGroupSpecification tables /*criteria = session.createCriteria(PlatformGroupSpecification.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(Person eg : this.person) ids.add(eg.getId()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.person", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!hasCR || !empty) this.platformGroupSpecification = criteria.list(); else*/ this.platformGroupSpecification = new ArrayList<PlatformGroupSpecification>(); this.logger.info("PlatformGroupSpecification tables: " + this.platformGroupSpecification.size()); //Get PlatformGroup tables criteria = session.createCriteria(PlatformGroup.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(PlatformGroupSpecification eg : this.platformGroupSpecification) ids.add(eg.getGroup()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.platformGroup = criteria.list(); else this.platformGroup = new ArrayList<PlatformGroup>(); this.logger.info("PlatformGroup tables: " + this.platformGroup.size()); //Get TQtiContent tables criteria = session.createCriteria(TQtiContent.class, "obj"); if(hasCR) { HashSet<Long> ids = new HashSet<Long>(); for(TQtiContentStructure tqs : this.tQtiContentStructure) { ids.add(tqs.getContainer()); ids.add(tqs.getContent()); } for(TQtiContentComposing tqs : this.tQtiContentComposing) { ids.add(tqs.getContainer()); ids.add(tqs.getContent()); } if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.id", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiContent = criteria.list(); else this.tQtiContent = new ArrayList<TQtiContent>(); this.logger.info("TQtiContent tables: " + this.tQtiContent.size()); } //Get TQtiTestItemD tables criteria = session.createCriteria(TQtiTestItemD.class, "obj"); if(hasCR) { HashSet<Long> ids = new HashSet<Long>(); for(TQtiContent tc : this.tQtiContent) { ids.add(tc.getId()); } if(!(empty = ids.isEmpty())) { criteria.add(CriteriaHelper.in("obj.content", ids)); } } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tQtiTestItemD = criteria.list(); else this.tQtiTestItemD = new ArrayList<TQtiTestItemD>(); this.logger.info("TQtiTestItemD tables: " + this.tQtiTestItemD.size()); //Get TeamExerciseGroup tables criteria = session.createCriteria(TeamExerciseGroup.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.teamExerciseGroup = criteria.list(); this.logger.info("TeamExerciseGroup tables: " + this.teamExerciseGroup.size()); //Get TGroupFullSpecification tables criteria = session.createCriteria(TGroupFullSpecification.class, "obj"); if(hasCR) { Set<Long> ids = new HashSet<Long>(); for(TeamExerciseGroup eg : this.teamExerciseGroup) ids.add(eg.getId()); if(!(empty = ids.isEmpty())) criteria.add(CriteriaHelper.in("obj.group", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.tGroupFullSpecification = criteria.list(); else this.tGroupFullSpecification = new ArrayList<TGroupFullSpecification>(); this.logger.info("TGroupFullSpecification tables: " + this.tGroupFullSpecification.size()); // Read log-data successively, using the time stamps //Get QTiTestPlayerResp tables criteria = session.createCriteria(TQtiTestPlayerResp.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.container", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.tQtiTestPlayerResp = criteria.list(); logger.info("TQtiTestPlayerResp tables: " + this.tQtiTestPlayerResp.size()); //Get LearningLog tables criteria = session.createCriteria(LearningLog.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.course", courses)); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.learningLog = criteria.list(); this.logger.info("LearningLog tables: " + this.learningLog.size()); //Get Portfolio tables criteria = session.createCriteria(Portfolio.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.portfolio = criteria.list(); this.logger.info("Portfolio tables: " + this.portfolio.size()); //Get PortfolioLog tables criteria = session.createCriteria(PortfolioLog.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.portfolioLog = criteria.list(); this.logger.info("PortfolioLog tables: " + this.portfolioLog.size()); //Get ChatProtocol tables criteria = session.createCriteria(ChatProtocol.class, "obj"); if(hasCR) { HashSet<Long> tmp1 = new HashSet<Long>(this.eComposingMap.keySet()); if(!(empty = tmp1.isEmpty())) criteria.add(CriteriaHelper.in("obj.chatroom", tmp1)); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.chatProtocol = criteria.list(); else this.chatProtocol = new ArrayList<ChatProtocol>(); this.logger.info("ChatProtocol tables: " + this.chatProtocol.size()); //Get ForumEntry tables criteria = session.createCriteria(ForumEntry.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.forum", this.eComposingMap.keySet())); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.forumEntry = criteria.list(); this.logger.info("ForumEntry tables: " + this.forumEntry.size()); //Get ForumEntryState tables criteria = session.createCriteria(ForumEntryState.class, "obj"); if(hasCR) { if(!this.eComposingMap.isEmpty()) criteria.add(CriteriaHelper.in("obj.forum", this.eComposingMap.keySet())); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); if(!this.eComposingMap.isEmpty()) this.forumEntryState = criteria.list(); else this.forumEntryState = new ArrayList<ForumEntryState>(); this.logger.info("ForumEntryState tables: " + this.forumEntryState.size()); //Get TQtiEvalAssessment tables criteria = session.createCriteria(TQtiEvalAssessment.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.between("obj.lastInvocation", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.tQtiEvalAssessment = criteria.list(); this.logger.info("TQtiEvalAssessment tables: " + this.tQtiEvalAssessment.size()); //Get ScormSessionTimes tables criteria = session.createCriteria(ScormSessionTimes.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.scormSessionTimes = criteria.list(); this.logger.info("ScormSessionTimes tables: " + this.scormSessionTimes.size()); //Get WikiEntry tables criteria = session.createCriteria(WikiEntry.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.component", courses)); } criteria.add(Restrictions.between("obj.lastUpdated", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.wikiEntry = criteria.list(); this.logger.info("WikiEntry tables: " + this.wikiEntry.size()); //Get QTiTestPlayer tables criteria = session.createCriteria(TQtiTestPlayer.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.container", courses)); } criteria.add(Restrictions.between("obj.created", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.tQtiTestPlayer = criteria.list(); logger.info("TQtiTestPlayer tables: " + this.tQtiTestPlayer.size()); // The date-strings have to be modified, because the date format of the table BiTrackContentImpressions is // different startStr = startStr.substring(0, startStr.indexOf(' ')); endStr = endStr.substring(0, endStr.indexOf(' ')); //Get BiTrackContentImpressions tables criteria = session.createCriteria(BiTrackContentImpressions.class, "obj"); if(hasCR) { criteria.add(CriteriaHelper.in("obj.container", courses)); } criteria.add(Restrictions.between("obj.dayOfAccess", startStr, endStr)); criteria.addOrder(Property.forName("obj.id").asc()); this.biTrackContentImpressions = criteria.list(); this.logger.info("BiTrackContentImpressions tables: " + this.biTrackContentImpressions.size()); session.clear(); session.close(); } // Generators for "" objects /** * Generates ChatMining-objects from the given data. * * @return HashMap with ChatMining-objects */ private Map<Long, ChatMining> generateChatMining() { final HashMap<Long, ChatMining> chats = new HashMap<Long, ChatMining>(); final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); for (final EComponentType loadedItem : this.eComponentType) { //if (loadedItem.getCharacteristicId() == 8L) { eCTypes.put(loadedItem.getId(), loadedItem); //} } try { for (final EComponent loadedItem : this.eComponentMap.values()) { EComponentType ect = eCTypes.get(loadedItem.getType()); if (ect != null && (ect.getUploadDir().toLowerCase().contains("chat")) ) { final ChatMining item = new ChatMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); item.setDescription(loadedItem.getDescription()); item.setChatTime(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setPlatform(this.connector.getPlatformId()); chats.put(item.getId(), item); } } this.logger.info("Generated " + chats.size() + " ChatMining"); } catch (final Exception e) { logger.error(this + e.getMessage()); } return chats; } /** * Generates ResourceMining-objects from the given data. * * @return HashMap with ResourceMining-objects */ private Map<Long, ResourceMining> generateResourceMining() { final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); final HashMap<Long, ResourceMining> resources = new HashMap<Long, ResourceMining>(); try { for (final EComponentType loadedItem : this.eComponentType) { // if ((loadedItem.getCharacteristicId() == 1L) || (loadedItem.getCharacteristicId() == 11L)) { eCTypes.put(loadedItem.getId(), loadedItem); // } } for (final EComponent loadedItem : this.eComponentMap.values()) { final ResourceMining item = new ResourceMining(); EComponentType ect = eCTypes.get(loadedItem.getType()); if (ect != null && (ect.getUploadDir().toLowerCase().contains("reading") || ect.getUploadDir().toLowerCase().contains("wbt") || ect.getUploadDir().toLowerCase().contains("picture") || ect.getUploadDir().toLowerCase().contains("htmlsite") || ect.getUploadDir().toLowerCase().contains("video") || ect.getUploadDir().toLowerCase().contains("linklist"))) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreationDate())); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setPlatform(this.connector.getPlatformId()); if (eCTypes.get(loadedItem.getType()).getCharacteristicId() != null) { if (eCTypes.get(loadedItem.getType()).getCharacteristicId() == 1L) { item.setType("Medium"); } else { item.setType("Folder"); } } resources.put(item.getId(), item); } } this.logger.info("Generated " + resources.size() + " ResourceMining."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return resources; } /** * Generates CourseMining-objects from the given data. * * @return HashMap with CourseMining-objects */ private Map<Long, CourseMining> generateCourseMining() { final HashMap<Long, CourseMining> courses = new HashMap<Long, CourseMining>(); try { final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); for (final EComponentType loadedItem : this.eComponentType) { //if ((loadedItem.getCharacteristicId() == 4L) || (loadedItem.getCharacteristicId() == 5L) // || (loadedItem.getCharacteristicId() == 3L)) { eCTypes.put(loadedItem.getId(), loadedItem); //} } for (final EComponent loadedItem : this.eComponentMap.values()) { EComponentType ect = eCTypes.get(loadedItem.getType()); final CourseMining item = new CourseMining(); if (ect != null && ect.getUploadDir().toLowerCase().contains("course")) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); item.setStartDate(TimeConverter.getTimestamp(loadedItem.getStartDate())); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreationDate())); item.setPlatform(this.connector.getPlatformId()); courses.put(item.getId(), item); } } this.logger.info("Generated " + courses.size() + " CourseMining."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courses; } /** * Generates UserMining-objects from the given data. * * @return HashMap with UserMining-objects */ private Map<Long, UserMining> generateUserMining() { final HashMap<Long, UserMining> users = new HashMap<Long, UserMining>(); try { for (final Person loadedItem : this.person) { final UserMining item = new UserMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); item.setLastLogin(TimeConverter.getTimestamp(loadedItem.getLastLoginTime())); item.setFirstAccess(TimeConverter.getTimestamp(loadedItem.getFirstLoginTime())); if(TimeConverter.getTimestamp(loadedItem.getLastUpdated()) > maxLog) maxLog = TimeConverter.getTimestamp(loadedItem.getLastUpdated()); if (loadedItem.getGender() == 1) { item.setGender(2); } else if (loadedItem.getGender() == 2) { item.setGender(1); } else { item.setGender(0); } item.setLogin(Encoder.createMD5(loadedItem.getLogin())); users.put(item.getId(), item); } this.logger.info("Generated " + users.size() + " UserMining."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return users; } /** * Generates AssignmentMining-objects from the given data. * * @return HashMap with AssignmentMining-objects */ private Map<Long, AssignmentMining> generateAssignmentMining() { final HashMap<Long, AssignmentMining> assignments = new HashMap<Long, AssignmentMining>(); try { final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); for (final EComponentType loadedItem : this.eComponentType) { //if (loadedItem.getCharacteristicId() == 8L) { eCTypes.put(loadedItem.getId(), loadedItem); //} } for (final EComponent loadedItem : this.eComponentMap.values()) { EComponentType ect = eCTypes.get(loadedItem.getType()); final AssignmentMining item = new AssignmentMining(); if (ect != null && (ect.getUploadDir().toLowerCase().contains("teamlearning") || ect.getCharacteristicId() == 8L) ) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); if (loadedItem.getStartDate() != null) { item.setTimeOpen(TimeConverter.getTimestamp(loadedItem.getStartDate())); } item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreationDate())); item.setPlatform(this.connector.getPlatformId()); assignments.put(item.getId(), item); } } this.logger.info("Generated " + assignments.size() + " AssignmentMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return assignments; } /** * Generates QuizMining-objects from the given data. * * @return HashMap with QuizMining-objects */ private Map<Long, QuizMining> generateQuizMining() { final HashMap<Long, QuizMining> quizzes = new HashMap<Long, QuizMining>(); try { final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); final HashMap<Long, EComposing> eCompo = new HashMap<Long, EComposing>(); final HashMap<Long, TQtiContent> tQtis = new HashMap<Long, TQtiContent>(); for (final TQtiContent loadedItem : this.tQtiContent) { tQtis.put(loadedItem.getId(), loadedItem); } for (final EComponentType loadedItem : this.eComponentType) { // if (loadedItem.getCharacteristicId() == 14L) { eCTypes.put(loadedItem.getId(), loadedItem); // } } for (final EComposing loadedItem : this.eComposing) { eCompo.put(loadedItem.getComposing(), loadedItem); } for (final EComponent loadedItem : this.eComponentMap.values()) { final QuizMining item = new QuizMining(); EComponentType ec = eCTypes.get(loadedItem.getType()); if (ec != null && ec.getUploadDir().toLowerCase().contains("qti")) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); item.setTimeOpen(TimeConverter.getTimestamp(loadedItem.getStartDate())); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreationDate())); item.setPlatform(this.connector.getPlatformId()); if(tQtis.containsKey(loadedItem.getId())) item.setMaxGrade(tQtis.get(loadedItem.getId()).getScore()); else item.setMaxGrade(0d); if (eCompo.get(loadedItem.getId()) != null) { item.setTimeClose(TimeConverter.getTimestamp(eCompo.get(loadedItem.getId()).getEndDate())); } quizzes.put(item.getId(), item); } } this.logger.info("Generated " + quizzes.size() + " QuizMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return quizzes; } /** * Generates ForumMining-objects from the given data. * * @return HashMap with ForumMining-objects */ private Map<Long, ForumMining> generateForumMining() { final HashMap<Long, ForumMining> forums = new HashMap<Long, ForumMining>(); try { final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); for (final EComponentType loadedItem : this.eComponentType) { if (loadedItem.getCharacteristicId() == 2L) { eCTypes.put(loadedItem.getId(), loadedItem); } } for (final EComponent loadedItem : this.eComponentMap.values()) { final ForumMining item = new ForumMining(); if ((eCTypes.get(loadedItem.getType()) != null) && eCTypes.get(loadedItem.getType()).getUploadDir().toLowerCase().contains("forum")) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); item.setSummary(loadedItem.getDescription()); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreationDate())); item.setPlatform(this.connector.getPlatformId()); forums.put(item.getId(), item); } } this.logger.info("Generated " + forums.size() + " ForumMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return forums; } /** * Generates RoleMining-objects from the given data. * * @return HashMap with RoleMining-objects */ private Map<Long, RoleMining> generateRoleMining() { this.roleMining = new HashMap<Long, RoleMining>(); try { /* for (final PlatformGroup loadedItem : this.platformGroup) { final RoleMining item = new RoleMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); switch (Integer.valueOf(loadedItem.getTypeId() + "")) { case 1: { item.setName("Standard"); item.setShortname("Standard"); item.setSortOrder(1L); item.setType(1); break; } case 2: item.setName("Admininstrator"); item.setShortname("Administrator"); item.setSortOrder(0L); item.setType(0); break; default: item.setName("Portal (extern)"); item.setShortname("Portal"); item.setSortOrder(2L); item.setType(2); break; } roles.put(item.getId(), item); } */ if(this.oldRoleMining.size() == 0) { final RoleMining r = new RoleMining(); r.setId(0L); r.setDescription("Admin"); r.setName("Admininstrator"); r.setName("Admininstrator"); r.setShortname("Administrator"); r.setSortOrder(0L); r.setType(0); r.setPlatform(this.connector.getPlatformId()); roleMining.put(r.getId(), r); final RoleMining r1 = new RoleMining(); r1.setId(1L); r1.setDescription("Teacher"); r1.setName("Teacher"); r1.setName("Teacher"); r1.setShortname("Teacher"); r1.setSortOrder(1L); r1.setType(1); r1.setPlatform(this.connector.getPlatformId()); roleMining.put(r1.getId(), r1); final RoleMining r2 = new RoleMining(); r2.setId(2L); r2.setDescription("Student"); r2.setName("Student"); r2.setName("Student"); r2.setShortname("Student"); r2.setSortOrder(2L); r2.setType(2); r2.setPlatform(this.connector.getPlatformId()); roleMining.put(r2.getId(), r2); } this.logger.info("Generated " + roleMining.size() + " RoleMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return roleMining; } /** * Generates GroupMining-objects from the given data. * * @return HashMap with GroupMining-objects */ private Map<Long, GroupMining> generateGroupMining() { final HashMap<Long, GroupMining> groups = new HashMap<Long, GroupMining>(); try { for (final PlatformGroup loadedItem : this.platformGroup) { final GroupMining item = new GroupMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreated())); item.setPlatform(this.connector.getPlatformId()); groups.put(item.getId(), item); } this.logger.info("Generated " + groups.size() + " GroupMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return groups; } /** * Generates WikiMining-objects from the given data. * * @return HashMap with WikiMining-objects */ private Map<Long, WikiMining> generateWikiMining() { final HashMap<Long, WikiMining> wikis = new HashMap<Long, WikiMining>(); try { final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); for (final EComponentType loadedItem : this.eComponentType) { if (loadedItem.getCharacteristicId() == 2L) { eCTypes.put(loadedItem.getId(), loadedItem); } } for (final EComponent loadedItem : this.eComponentMap.values()) { final WikiMining item = new WikiMining(); if ((eCTypes.get(loadedItem.getType()) != null) && eCTypes.get(loadedItem.getType()).getUploadDir().toLowerCase().contains("wiki") ) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); item.setSummary(loadedItem.getDescription()); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreationDate())); item.setPlatform(this.connector.getPlatformId()); wikis.put(item.getId(), item); } } this.logger.info("Generated " + wikis.size() + " WikiMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return wikis; } /** * Generates DepartmentMining-objects from the given data. * * @return HashMap with DepartmentMining-objects */ /** * Generates DegreeMining-objects from the given data * * @return HashMap with DegreeMining-objects */ /* * logger.error(this + e.getMessage()); * } * return degrees; * } */ /** * Generates QuestionMining-objects from the given data * * @return HashMap with QuestionMining-objects */ private Map<Long, QuestionMining> generateQuestionMining() { final HashMap<Long, QuestionMining> questions = new HashMap<Long, QuestionMining>(); try { /* final HashMap<Long, T2Task> t2t = new HashMap<Long, T2Task>(); for (final T2Task loadedItem : this.t2Task) { t2t.put(loadedItem.getTopicId(), loadedItem); }*/ final HashMap<Long, TQtiTestItemD> testItems = new HashMap<Long, TQtiTestItemD>(); for (final TQtiTestItemD loadedItem : this.tQtiTestItemD) { testItems.put(loadedItem.getContent(), loadedItem); } HashSet<Long> ids = new HashSet<Long>(); for (final TQtiContentComposing tqc : this.tQtiContentComposing) { ids.add(tqc.getContent()); } for (final TQtiContent loadedItem : this.tQtiContent) { if(ids.contains(loadedItem.getId())) { final QuestionMining item = new QuestionMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); if (testItems.get(loadedItem.getId()) != null) { item.setText(testItems.get(loadedItem.getId()).getQuestion()); item.setType(testItems.get(loadedItem.getId()).getQuestionType() + ""); } item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreated())); item.setPlatform(this.connector.getPlatformId()); questions.put(item.getId(), item); } } this.logger.info("Generated " + questions.size() + " QuestionMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return questions; } /** * Generates ScormMining-objects from the given data. * * @return HashMap with ScormMining-objects */ private Map<Long, ScormMining> generateScormMining() { final HashMap<Long, ScormMining> scorms = new HashMap<Long, ScormMining>(); try { final HashMap<Long, EComponentType> eCTypes = new HashMap<Long, EComponentType>(); final HashMap<Long, EComposing> eCompo = new HashMap<Long, EComposing>(); for (final EComponentType loadedItem : this.eComponentType) { //if ((loadedItem.getCharacteristicId() == 10L) || (loadedItem.getCharacteristicId() == 1L)) { eCTypes.put(loadedItem.getId(), loadedItem); // } } for (final EComposing loadedItem : this.eComposing) { eCompo.put(loadedItem.getComposing(), loadedItem); } for (final EComponent loadedItem : this.eComponentMap.values()) { EComponentType ect = eCTypes.get(loadedItem.getType()); final ScormMining item = new ScormMining(); if (ect != null && (ect.getUploadDir().toLowerCase().contains("scorm"))) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setTitle(loadedItem.getName()); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); item.setTimeCreated(TimeConverter.getTimestamp(loadedItem.getCreationDate())); item.setPlatform(this.connector.getPlatformId()); if (eCompo.get(loadedItem.getId()) != null) { item.setTimeOpen(TimeConverter.getTimestamp(eCompo.get(loadedItem.getId()).getStartDate())); item.setTimeClose(TimeConverter.getTimestamp(eCompo.get(loadedItem.getId()).getEndDate())); } scorms.put(item.getId(), item); } } this.logger.info("Generated " + scorms.size() + " ScormMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return scorms; } // Generators for relationships /** * Generates QuizQuestionMining-objects from the given data. * * @return HashMap with QuizQuestionMining-objects */ private Map<Long, QuizQuestionMining> generateQuizQuestionMining() { final HashMap<Long, QuizQuestionMining> quizQuestions = new HashMap<Long, QuizQuestionMining>(); try { for (final TQtiContentStructure loadedItem : this.tQtiContentStructure) { for( final TQtiContentComposing loadedItem2 : this.tQtiContentComposing) { final QuizQuestionMining item = new QuizQuestionMining(); item.setQuiz(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getContainer()), this.quizMining, this.oldQuizMining); if(loadedItem2.getContainer().equals(loadedItem.getContent())) { item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem2.getId().hashCode())); item.setQuestion(Long.valueOf(this.connector.getPrefix() + "" + loadedItem2.getContent()), this.questionMining, this.oldQuestionMining); } item.setPlatform(this.connector.getPlatformId()); if ((item.getQuestion() != null) && (item.getQuiz() != null)) { quizQuestions.put(item.getId(), item); } } } this.logger.info("Generated " + quizQuestions.size() + " QuizQuestionMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return quizQuestions; } /** * Generates CourseScormMining-objects from the given data. * * @return HashMap with CourseScormMining-objects */ private Map<Long, CourseScormMining> generateCourseScormMining() { final HashMap<Long, CourseScormMining> courseScorms = new HashMap<Long, CourseScormMining>(); try { for (final EComposing loadedItem : this.eComposing) { long id = 0; if (loadedItem.getComponent() >= 0) { id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); } if ((this.scormMining.get(id) != null) || (this.oldScormMining.get(id) != null)) { final CourseScormMining item = new CourseScormMining(); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComposing()), this.courseMining, this.oldCourseMining); item.setScorm(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.scormMining, this.oldScormMining); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getScorm() != null)) { courseScorms.put(item.getId(), item); } } } this.logger.info("Generated " + courseScorms.size() + " CourseScormMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseScorms; } /** * Generates CourseAssignmentMining-objects from the given data. * * @return HashMap with CourseAssignmentMining-objects */ private Map<Long, CourseAssignmentMining> generateCourseAssignmentMining() { final HashMap<Long, CourseAssignmentMining> courseAssignments = new HashMap<Long, CourseAssignmentMining>(); try { for (final EComposing loadedItem : this.eComposing) { long id = 0; if (loadedItem.getComponent() >= 0) { id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); } id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); if ((this.assignmentMining.get(id) != null) || (this.oldAssignmentMining.get(id) != null)) { final CourseAssignmentMining item = new CourseAssignmentMining(); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComposing()), this.courseMining, this.oldCourseMining); item.setAssignment(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.assignmentMining, this.oldAssignmentMining); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getAssignment() != null)) { courseAssignments.put(item.getId(), item); } } } this.logger.info("Generated " + courseAssignments.size() + " CourseAssignmentMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseAssignments; } /** * Generates CourseChatMining-objects from the given data. * * @return HashMap with CourseChatMining-objects */ private Map<Long, CourseChatMining> generateCourseChatMining() { final HashMap<Long, CourseChatMining> courseChats = new HashMap<Long, CourseChatMining>(); try { for (final EComposing loadedItem : this.eComposing) { long id = 0; if (loadedItem.getComponent() >= 0) { id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); } id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); if ((this.chatMining.get(id) != null) || (this.oldChatMining.get(id) != null)) { final CourseChatMining item = new CourseChatMining(); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComposing()), this.courseMining, this.oldCourseMining); item.setChat(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.chatMining, this.oldChatMining); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getChat() != null)) { courseChats.put(item.getId(), item); } } } this.logger.info("Generated " + courseChats.size() + " CourseAssignmentMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseChats; } /** * Generates CourseResourceMining-objects from the given data. * * @return HashMap with CourseResourceMining-objects */ private Map<Long, CourseResourceMining> generateCourseResourceMining() { final HashMap<Long, CourseResourceMining> courseResources = new HashMap<Long, CourseResourceMining>(); try { for (final EComposing loadedItem : this.eComposing) { long id = 0; if (loadedItem.getComponent() >= 0) { id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); } if ((this.resourceMining.get(id) != null) || (this.oldResourceMining.get(id) != null)) { final CourseResourceMining item = new CourseResourceMining(); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComposing()), this.courseMining, this.oldCourseMining); item.setResource(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.resourceMining, this.oldResourceMining); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); if ((item.getResource() != null) && (item.getCourse() != null)) { courseResources.put(item.getId(), item); } } } this.logger.info("Generated " + courseResources.size() + " CourseResourceMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseResources; } /** * Generates CourseQuizMining-objects from the given data. * * @return HashMap with CourseQuizMining-objects */ private Map<Long, CourseQuizMining> generateCourseQuizMining() { final HashMap<Long, CourseQuizMining> courseQuizzes = new HashMap<Long, CourseQuizMining>(); try { for (final EComposing loadedItem : this.eComposing) { long id = 0; if (loadedItem.getComponent() >= 0) { id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); } if ((this.quizMining.get(id) != null) || (this.oldQuizMining.get(id) != null)) { final CourseQuizMining item = new CourseQuizMining(); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComposing()), this.courseMining, this.oldCourseMining); item.setQuiz(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.quizMining, this.oldQuizMining); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getQuiz() != null)) { courseQuizzes.put(item.getId(), item); } } } this.logger.info("Generated " + courseQuizzes.size() + " CourseQuizMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseQuizzes; } /** * Generates QuizUserMining-objects from the given data. * * @return HashMap with QuizUserMining-objects */ private Map<Long, QuizUserMining> generateQuizUserMining() { final HashMap<Long, QuizUserMining> quizUsers = new HashMap<Long, QuizUserMining>(); try { for (final TQtiEvalAssessment loadedItem : this.tQtiEvalAssessment) { final QuizUserMining item = new QuizUserMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.courseMining, this.oldCourseMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getCandidate()), this.userMining, this.oldUserMining); item.setQuiz(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getAssessment()), this.quizMining, this.oldQuizMining); item.setFinalGrade(loadedItem.getEvaluatedScore()); item.setTimeModified(TimeConverter.getTimestamp(loadedItem.getLastInvocation())); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getQuiz() != null) && (item.getUser() != null)) { quizUsers.put(item.getId(), item); } } this.logger.info("Generated " + quizUsers.size() + " QuizUserMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return quizUsers; } /** * Generates CourseWikiMining-objects from the given data. * * @return HashMap with CourseWikiMining-objects */ private Map<Long, CourseWikiMining> generateCourseWikiMining() { final HashMap<Long, CourseWikiMining> courseWikis = new HashMap<Long, CourseWikiMining>(); try { for (final EComposing loadedItem : this.eComposing) { long id = 0; if (loadedItem.getComponent() >= 0) { id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()); } if ((this.wikiMining.get(id) != null) || (this.oldWikiMining.get(id) != null)) { final CourseWikiMining item = new CourseWikiMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComposing()), this.courseMining, this.oldCourseMining); item.setWiki(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.wikiMining, this.oldWikiMining); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getWiki() != null)) { courseWikis.put(item.getId(), item); } } } this.logger.info("Generated " + courseWikis.size() + " CourseWikiMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseWikis; } /** * Generates GroupUserMining-objects from the given data * * @return HashMap with GroupUserMining-objects */ private Map<Long, GroupUserMining> generateGroupUserMining() { final HashMap<Long, GroupUserMining> groupUsers = new HashMap<Long, GroupUserMining>(); try { for (final PlatformGroupSpecification loadedItem : this.platformGroupSpecification) { final GroupUserMining item = new GroupUserMining(); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getPerson()), this.userMining, this.oldUserMining); item.setGroup(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getGroup()), this.groupMining, this.oldGroupMining); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId().hashCode())); item.setPlatform(this.connector.getPlatformId()); if ((item.getUser() != null) && (item.getGroup() != null)) { groupUsers.put(item.getId(), item); } } for (TGroupFullSpecification loadedItem : this.tGroupFullSpecification) { GroupUserMining item = new GroupUserMining(); item.setGroup(Long.valueOf(connector.getPrefix() + "" + loadedItem.getGroup()), groupMining, oldGroupMining); item.setUser(Long.valueOf(connector.getPrefix() + "" + loadedItem.getPerson()), userMining, oldUserMining); if (item.getGroup() != null && item.getUser() != null) { long id = Long.valueOf(connector.getPrefix() + "" + loadedItem.getGroup() + "" + loadedItem.getPerson()); item.setId(id); if (groupUsers.get(id) == null) { groupUsers.put(id, item); } } if ((item.getUser() != null) && (item.getGroup() != null)) { groupUsers.put(item.getId(), item); } } this.logger.info("Generated " + groupUsers.size() + " GroupUserMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return groupUsers; } /** * Generates CourseGroupMining-objects from the given data. * * @return HashMap with CourseGroupMining-objects */ private Map<Long, CourseGroupMining> generateCourseGroupMining() { final HashMap<Long, CourseGroupMining> courseGroups = new HashMap<Long, CourseGroupMining>(); try { for (final TeamExerciseGroup loadedItem : this.teamExerciseGroup) { final CourseGroupMining item = new CourseGroupMining(); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.courseMining, this.oldCourseMining); item.setGroup(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId()), this.groupMining, this.oldGroupMining); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getGroup() != null)) { courseGroups.put(item.getId(), item); } } this.logger.info("Generated " + courseGroups.size() + " CourseGroupMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseGroups; } private Map<Long, CourseUserMining> generateCourseUserMining() { final HashMap<Long, CourseUserMining> courseUser = new HashMap<Long, CourseUserMining>(); try { RoleMining teacher = null; RoleMining student = null; for (RoleMining r : roleMining.values()) { if (r.getType() == 1) { teacher = r; } else if (r.getType() == 2) { student = r; } if (teacher != null && student != null) { break; } } if(teacher == null) { for (RoleMining r : oldRoleMining.values()) { if (r.getType() == 1) { teacher = r; } else if (r.getType() == 2) { student = r; } if (teacher != null && student != null) { break; } } } /** Students **/ for (Portfolio loadedItem : this.portfolio) { if (loadedItem.getCourse() == 0) { CourseUserMining item = new CourseUserMining(); item.setId(Long.valueOf(connector.getPrefix() + "0" + loadedItem.getId())); item.setCourse(Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()), courseMining, oldCourseMining); item.setUser(Long.valueOf(connector.getPrefix() + "" + loadedItem.getPerson()), userMining, oldUserMining); item.setRole(student.getId(), roleMining, oldRoleMining); item.setPlatform(connector.getPlatformId()); item.setEnrolend(TimeConverter.getTimestamp(loadedItem.getEndDate())); item.setEnrolstart(TimeConverter.getTimestamp(loadedItem.getStartDate())); if (item.getCourse() != null && item.getUser() != null) { courseUser.put(item.getId(), item); } } } /** Teachers **/ for (PersonComponentAssignment loadedItem : this.personComponentAssignment) { CourseUserMining item = new CourseUserMining(); item.setId(Long.valueOf(connector.getPrefix() + "1" + loadedItem.getLongId())); item.setCourse(Long.valueOf(connector.getPrefix() + "" + loadedItem.getComponent()), courseMining, oldCourseMining); item.setUser(Long.valueOf(connector.getPrefix() + "" + loadedItem.getPerson()), userMining, oldUserMining); item.setRole(teacher.getId(), roleMining, oldRoleMining); item.setPlatform(connector.getPlatformId()); if (item.getCourse() != null && item.getUser() != null) { courseUser.put(item.getId(), item); } } this.logger.info("Generated " + courseUser.size() + " CourseUserMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); logger.error(this + e.getMessage()); } return courseUser; } /** * Generates CourseForumMining-objects from the given data. * * @return HashMap with CourseForumMining-objects */ private Map<Long, CourseForumMining> generateCourseForumMining() { final HashMap<Long, CourseForumMining> courseForum = new HashMap<Long, CourseForumMining>(); try { for (final EComposing loadedItem : this.eComposing) { long id = 0; if (loadedItem.getComponent() >= 0) { id = Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()); } if ((this.forumMining.get(id) != null) || (this.oldForumMining.get(id) != null)) { final CourseForumMining item = new CourseForumMining(); item.setId(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getId())); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComposing()), this.courseMining, this.oldCourseMining); item.setForum(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.forumMining, this.oldForumMining); item.setPlatform(this.connector.getPlatformId()); if ((item.getCourse() != null) && (item.getForum() != null)) { courseForum.put(item.getId(), item); } } } this.logger.info("Generated " + courseForum.size() + " CourseForumMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseForum; } // Generators for logs /** * Generates ForumLogMining-objects from the given data. * * @return HashMap with ForumLogMining-objects */ private Map<Long, ForumLogMining> generateForumLogMining() { final HashMap<Long, ForumLogMining> forumLogs = new HashMap<Long, ForumLogMining>(); try { final HashMap<Long, EComposing> ecMap = new HashMap<Long, EComposing>(); for (final EComposing item : this.eComposing) { ecMap.put(item.getComponent(), item); } for (final ForumEntry loadedItem : this.forumEntry) { final ForumLogMining item = new ForumLogMining(); item.setId(forumLogs.size() + this.forumLogMax + 1); item.setForum(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getForum()), this.forumMining, this.oldForumMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getLastUpdater()), this.userMining, this.oldUserMining); String sub = loadedItem.getTitle(); while(sub.startsWith("AW: ")) { sub = sub.substring(4); } item.setSubject(sub); item.setMessage(TextHelper.replaceString(loadedItem.getContent())); item.setAction("Post"); item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setPlatform(this.connector.getPlatformId()); item.setDuration(0L); if (ecMap.get(loadedItem.getForum()) != null) { item.setCourse( Long.valueOf(this.connector.getPrefix() + "" + ecMap.get(loadedItem.getForum()).getComposing()), this.courseMining, this.oldCourseMining); } if ((item.getUser() != null) && (item.getForum() != null)) { forumLogs.put(item.getId(), item); } } for (final ForumEntryState loadedItem : this.forumEntryState) { final ForumLogMining item = new ForumLogMining(); item.setId(forumLogs.size() + this.forumLogMax + 1); item.setForum(loadedItem.getForum(), this.forumMining, this.oldForumMining); item.setUser(loadedItem.getUser(), this.userMining, this.oldUserMining); item.setAction("View"); if (forumLogs.get(loadedItem.getEntry()) != null) { String sub = forumLogs.get(loadedItem.getEntry()).getSubject(); while(sub.startsWith("AW:")) { sub = sub.substring(3); } item.setSubject(sub); } item.setMessage(""); item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); if (ecMap.get(loadedItem.getForum()) != null) { item.setCourse(ecMap.get(loadedItem.getForum()).getComposing(), this.courseMining, this.oldCourseMining); } if ((item.getUser() != null) && (item.getForum() != null)) { forumLogs.put(item.getId(), item); } } this.logger.info("Generated " + forumLogs.size() + " ForumLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return forumLogs; } /** * Generates WikiLogMining-objects from the given data. * * @return HashMap with WikiLogMining-objects */ private Map<Long, WikiLogMining> generateWikiLogMining() { final HashMap<Long, WikiLogMining> wikiLogs = new HashMap<Long, WikiLogMining>(); try { for (final WikiEntry loadedItem : this.wikiEntry) { final WikiLogMining item = new WikiLogMining(); item.setId(wikiLogs.size() + this.wikiLogMax + 1); item.setWiki(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.wikiMining, this.oldWikiMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getCreator()), this.userMining, this.oldUserMining); if ((item.getWiki() != null) && (this.eComposingMap.get(item.getWiki().getId()) != null)) { item.setCourse( Long.valueOf(this.connector.getPrefix() + "" + this.eComposingMap.get(item.getWiki().getId()).getComposing()), this.courseMining, this.oldCourseMining); } item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setPlatform(this.connector.getPlatformId()); item.setDuration(0L); if ((item.getUser() != null) && (item.getWiki() != null)) { wikiLogs.put(item.getId(), item); } } this.logger.info("Generated " + wikiLogs.size() + " WikiLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return wikiLogs; } /** * Generates CourseLogMining-objects from the given data. * * @return HashMap with CourseLogMining-objects */ private Map<Long, CourseLogMining> generateCourseLogMining() { final HashMap<Long, CourseLogMining> courseLogs = new HashMap<Long, CourseLogMining>(); try { for (final PortfolioLog loadedItem : this.portfolioLog) { final CourseLogMining item = new CourseLogMining(); item.setId(courseLogs.size() + this.courseLogMax + 1); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.courseMining, this.oldCourseMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getPerson()), this.userMining, this.oldUserMining); item.setAction(loadedItem.getTypeOfModification() + ""); item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setPlatform(this.connector.getPlatformId()); item.setDuration(0L); if ((item.getCourse() != null) && (item.getUser() != null)) { courseLogs.put(item.getId(), item); } } this.logger.info("Generated " + courseLogs.size() + " CourseLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return courseLogs; } /** * Generates QuestionLogMining-objects from the given data. * * @return HashMap with QuestionLogMining-objects */ private Map<Long, QuestionLogMining> generateQuestionLogMining() { final HashMap<Long, QuestionLogMining> questionLogs = new HashMap<Long, QuestionLogMining>(); try { for (final TQtiTestPlayerResp loadedItem : this.tQtiTestPlayerResp) { final QuestionLogMining item = new QuestionLogMining(); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getCandidate()), this.userMining, this.oldUserMining); item.setQuiz(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getContent()), this.quizMining, this.oldQuizMining); item.setQuestion(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getTestItem()), this.questionMining, this.oldQuestionMining); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getContainer()), this.courseMining, this.oldCourseMining); item.setFinalGrade(loadedItem.getEvaluatedScore()); item.setRawGrade(loadedItem.getEvaluatedScore()); item.setPenalty(0d); item.setType("QTI"); item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getEvaluationDate())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setPlatform(this.connector.getPlatformId()); item.setDuration(0L); item.setAnswers(loadedItem.getText()); item.setId(questionLogs.size() + this.questionLogMax + 1); if(loadedItem.getProcessStatus() == 0L) item.setAction("view"); if(loadedItem.getProcessStatus() == 1L) item.setAction("close"); if ((item.getQuestion() != null) && (item.getQuiz() != null) && (item.getUser() != null) && (item.getCourse() != null)) { questionLogs.put(item.getId(), item); } } this.logger.info("Generated " + questionLogs.size() + " QuestionLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return questionLogs; } /** * Generates QuizLogMining-objects from the given data. * * @return HashMap with QuizLogMining-objects */ private Map<Long, QuizLogMining> generateQuizLogMining() { final HashMap<Long, QuizLogMining> quizLogs = new HashMap<Long, QuizLogMining>(); try { for (final TQtiTestPlayer loadedItem : this.tQtiTestPlayer) { final QuizLogMining item = new QuizLogMining(); item.setId(quizLogs.size() + this.quizLogMax + 1); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getContainer()), this.courseMining, this.oldCourseMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getCandidate()), this.userMining, this.oldUserMining); item.setQuiz(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getContent()), this.quizMining, this.oldQuizMining); item.setGrade(loadedItem.getEvaluatedScore()); item.setPlatform(this.connector.getPlatformId()); item.setDuration(0L); int status = loadedItem.getRuntimeStatus().intValue(); if(loadedItem.getRuntimeStatus() == null) status = -1; switch(status) { case 0: item.setAction("attempt"); break; case 1: item.setAction("saved"); break; case 2: item.setAction("commited"); break; case 3: item.setAction("graded"); break; default: item.setAction("unknown"); break; } item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getCreated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } if ((item.getCourse() != null) && (item.getQuiz() != null) && (item.getUser() != null)) { quizLogs.put(item.getId(), item); } } this.logger.info("Generated " + quizLogs.size() + " QuizLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return quizLogs; } /** * Generates AssignmentLogMining-objects from the given data. * * @return HashMap with AssignmentLogMining-objects */ private Map<Long, AssignmentLogMining> generateAssignmentLogMining() { final HashMap<Long, AssignmentLogMining> assignmentLogs = new HashMap<Long, AssignmentLogMining>(); try { // This HashMap is helpful for finding the course_id that is associated with the AssignmentLog final HashMap<Long, Long> eg = new HashMap<Long, Long>(); for (final ExerciseGroup loadedItem : this.exerciseGroup) { if (loadedItem.getAssociatedCourse() != 0L) { eg.put(loadedItem.getId(), loadedItem.getAssociatedCourse()); } } for (final ExercisePersonalised loadedItem : this.exercisePersonalised) { final AssignmentLogMining item = new AssignmentLogMining(); item.setAssignment(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getExercise()), this.assignmentMining, this.oldAssignmentMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getUser()), this.userMining, this.oldUserMining); item.setGrade(Double.valueOf(loadedItem.getPoints())); item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getUploadDate())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setPlatform(this.connector.getPlatformId()); // Get the course_id via the exercisegroup_id if (eg.get(loadedItem.getCommunity()) != null) { item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + eg.get(loadedItem.getCommunity())), this.courseMining, this.oldCourseMining); } item.setId(assignmentLogs.size() + this.assignmentLogMax + 1); item.setDuration(0L); if ((item.getCourse() != null) && (item.getAssignment() != null) && (item.getUser() != null)) { assignmentLogs.put(item.getId(), item); if (this.courseAssignmentMining.get(item.getAssignment().getId()) == null) { final CourseAssignmentMining cam = new CourseAssignmentMining(); cam.setAssignment(item.getAssignment()); cam.setCourse(item.getCourse()); cam.setPlatform(this.connector.getPlatformId()); cam.setId(Long.valueOf(this.connector.getPrefix() + "" + (this.courseAssignmentMining.size()))); this.courseAssignmentMining.put(cam.getAssignment().getId(), cam); } } } this.logger.info("Generated " + assignmentLogs.size() + " AssignmentLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return assignmentLogs; } /** * Generates ScormLogMining-objects from the given data. * * @return HashMap with ScormLogMining-objects */ private Map<Long, ScormLogMining> generateScormLogMining() { final HashMap<Long, ScormLogMining> scormLogs = new HashMap<Long, ScormLogMining>(); final HashMap<Long, Long> eComp = new HashMap<Long, Long>(); for (final EComposing item : this.eComposing) { eComp.put(item.getComponent(), item.getComposing()); } try { for (final ScormSessionTimes loadedItem : this.scormSessionTimes) { final ScormLogMining item = new ScormLogMining(); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getPerson()), this.userMining, this.oldUserMining); try { if ((loadedItem.getScore() != null) && !loadedItem.getScore().equals("null")) { item.setGrade(Double.valueOf(loadedItem.getScore().toString())); } item.setScorm(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getComponent()), this.scormMining, this.oldScormMining); item.setAction(loadedItem.getStatus()); item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setId(scormLogs.size() + this.scormLogMax + 1); item.setPlatform(this.connector.getPlatformId()); item.setDuration(0L); if (eComp.get(loadedItem.getComponent()) != null) { item.setCourse( Long.valueOf(this.connector.getPrefix() + "" + eComp.get(loadedItem.getComponent())), this.courseMining, this.oldCourseMining); } if ((item.getUser() != null) && (item.getScorm() != null)) { scormLogs.put(item.getId(), item); } } catch (final NullPointerException e) { this.logger.info("Couldn't parse grade: " + loadedItem.getScore()); } } this.logger.info("Generated " + scormLogs.size() + " ScormLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return scormLogs; } /** * Generates ResourceLogMining-objects from the given data. * * @return HashMap with ResourceLogMining-objects */ private Map<Long, ResourceLogMining> generateResourceLogMining() { final HashMap<Long, ResourceLogMining> resourceLogs = new HashMap<Long, ResourceLogMining>(); try { for (final BiTrackContentImpressions loadedItem : this.biTrackContentImpressions) { final ResourceLogMining item = new ResourceLogMining(); item.setResource(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getContent()), this.resourceMining, this.oldResourceMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getUser()), this.userMining, this.oldUserMining); item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getContainer()), this.courseMining, this.oldCourseMining); item.setAction("View"); item.setDuration(0L); item.setId(resourceLogs.size() + this.resourceLogMax + 1); // Time stamp has different format (2009-07-31) item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getDayOfAccess() + " 00:00:00.000")); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setPlatform(this.connector.getPlatformId()); if ((item.getResource() != null) && (item.getCourse() != null) && (item.getUser() != null)) { resourceLogs.put(item.getId(), item); } } this.logger.info("Generated " + resourceLogs.size() + " ResourceLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return resourceLogs; } /** * Generates ChatLogMining-objects from the given data. * * @return HashMap with ChatLogMining-objects */ private Map<Long, ChatLogMining> generateChatLogMining() { final HashMap<Long, ChatLogMining> chatLogs = new HashMap<Long, ChatLogMining>(); try { for (final ChatProtocol loadedItem : this.chatProtocol) { final ChatLogMining item = new ChatLogMining(); item.setId(chatLogs.size() + this.chatLogMax + 1); item.setChat(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getChatroom()), this.chatMining, this.oldChatMining); item.setUser(Long.valueOf(this.connector.getPrefix() + "" + loadedItem.getPerson()), this.userMining, this.oldUserMining); item.setMessage(TextHelper.replaceString(loadedItem.getChatSource())); item.setTimestamp(TimeConverter.getTimestamp(loadedItem.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setPlatform(this.connector.getPlatformId()); item.setDuration(0L); EComposing l = this.eComposingMap.get(loadedItem.getChatroom()); if(l != null) item.setCourse(Long.valueOf(this.connector.getPrefix() + "" + l.getComposing()), courseMining, oldCourseMining); if ((item.getChat() != null) && (item.getUser() != null)) { chatLogs.put(item.getId(), item); } } this.logger.info("Generated " + chatLogs.size() + " ChatLogMinings."); } catch (final Exception e) { logger.error(this + e.getMessage()); } return chatLogs; } /** * Generates ILogMining-objects from the given data. * * @return HashMap with ILogMining-objects */ private ArrayList<ILogMining> generateILogMining() { final ArrayList<ILogMining> iLogs = new ArrayList<ILogMining>(); final ArrayList<AssignmentLogMining> assignmentLogs = new ArrayList<AssignmentLogMining>(); final ArrayList<ScormLogMining> scormLogs = new ArrayList<ScormLogMining>(); final ArrayList<WikiLogMining> wikiLogs = new ArrayList<WikiLogMining>(); final ArrayList<ResourceLogMining> resourceLogs = new ArrayList<ResourceLogMining>(); try { Long lastATime = null; Long lastAUser = null; Long lastRTime = null; Long lastRUser = null; Long lastSTime = null; Long lastSUser = null; Long lastWTime = null; Long lastWUser = null; for(LearningLog log : this.learningLog) { if(this.assignmentMining.get(Long.valueOf(connector.getPrefix() + "" + log.getComponent())) != null) { if(!(TimeConverter.getTimestamp(log.getLastUpdated()).equals(lastATime) && log.getPerson().equals(lastAUser))) { AssignmentLogMining item = new AssignmentLogMining(); item.setId(assignmentLogs.size() + this.assignmentLogMax + 1); item.setCourse(Long.valueOf(connector.getPrefix() + "" + log.getCourse()), courseMining, oldCourseMining); item.setAssignment(Long.valueOf(connector.getPrefix() + "" + log.getComponent()), assignmentMining, oldAssignmentMining); item.setUser(Long.valueOf(connector.getPrefix() + "" + log.getPerson()), userMining, oldUserMining); item.setDuration(0L); item.setAction(log.getTypeOfModification() + ""); item.setGrade(log.getEvaluatedScore()); item.setPlatform(connector.getPlatformId()); item.setTimestamp(TimeConverter.getTimestamp(log.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } if(item.getCourse() != null && item.getUser() != null && item.getAssignment() != null) assignmentLogs.add(item); //lastATime = item.getTimestamp(); //lastAUser = log.getPerson(); } } else if(this.resourceMining.get(Long.valueOf(connector.getPrefix() + "" + log.getComponent())) != null) { if(!(TimeConverter.getTimestamp(log.getLastUpdated()).equals(lastRTime) && log.getPerson().equals(lastRUser))) { ResourceLogMining item = new ResourceLogMining(); item.setId(resourceLogs.size() + this.resourceLogMax + 1); item.setCourse(Long.valueOf(connector.getPrefix() + "" + log.getCourse()), courseMining, oldCourseMining); item.setResource(Long.valueOf(connector.getPrefix() + "" + log.getComponent()), resourceMining, oldResourceMining); item.setUser(Long.valueOf(connector.getPrefix() + "" + log.getPerson()), userMining, oldUserMining); item.setDuration(0L); item.setAction(log.getTypeOfModification() + ""); item.setPlatform(connector.getPlatformId()); item.setTimestamp(TimeConverter.getTimestamp(log.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } if(item.getCourse() != null && item.getUser() != null && item.getResource() != null) resourceLogs.add(item); } } else if(this.wikiMining.get(Long.valueOf(connector.getPrefix() + "" + log.getComponent())) != null) { if(!(TimeConverter.getTimestamp(log.getLastUpdated()).equals(lastWTime) && log.getPerson().equals(lastWUser))) { WikiLogMining item = new WikiLogMining(); item.setId(wikiLogs.size() + this.wikiLogMax + 1); item.setCourse(Long.valueOf(connector.getPrefix() + "" + log.getCourse()), courseMining, oldCourseMining); item.setWiki(Long.valueOf(connector.getPrefix() + "" + log.getComponent()), wikiMining, oldWikiMining); item.setUser(Long.valueOf(connector.getPrefix() + "" + log.getPerson()), userMining, oldUserMining); item.setDuration(0L); item.setAction(log.getTypeOfModification() + ""); item.setPlatform(connector.getPlatformId()); item.setTimestamp(TimeConverter.getTimestamp(log.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } if(item.getCourse() != null && item.getUser() != null && item.getWiki() != null) wikiLogs.add(item); } } else if(this.scormMining.get(Long.valueOf(connector.getPrefix() + "" + log.getComponent())) != null) { if(!(TimeConverter.getTimestamp(log.getLastUpdated()).equals(lastSTime) && log.getPerson().equals(lastSUser))) { ScormLogMining item = new ScormLogMining(); item.setId(scormLogs.size() + this.scormLogMax + 1); item.setCourse(Long.valueOf(connector.getPrefix() + "" + log.getCourse()), courseMining, oldCourseMining); item.setScorm(Long.valueOf(connector.getPrefix() + "" + log.getComponent()), scormMining, oldScormMining); item.setUser(Long.valueOf(connector.getPrefix() + "" + log.getPerson()), userMining, oldUserMining); item.setDuration(0L); item.setAction(log.getTypeOfModification() + ""); item.setPlatform(connector.getPlatformId()); item.setTimestamp(TimeConverter.getTimestamp(log.getLastUpdated())); if(item.getTimestamp() > maxLog) { maxLog = item.getTimestamp(); } item.setGrade(log.getEvaluatedScore()); if(item.getCourse() != null && item.getUser() != null && item.getScorm() != null) scormLogs.add(item); } } } }catch (Exception e) { logger.error(this + e.getMessage()); } Collections.sort(assignmentLogs); this.logger.info("Generated " + assignmentLogs.size() + " AssignmentLogMinings."); Collections.sort(resourceLogs); this.logger.info("Generated " + resourceLogs.size() + " ResourceLogMinings."); Collections.sort(wikiLogs); this.logger.info("Generated " + wikiLogs.size() + " WikiLogMinings."); Collections.sort(scormLogs); this.logger.info("Generated " + scormLogs.size() + " ScormLogMinings."); iLogs.addAll(assignmentLogs); iLogs.addAll(resourceLogs); iLogs.addAll(wikiLogs); iLogs.addAll(scormLogs); return iLogs; } }