/** * File ./src/main/java/de/lemo/dms/connectors/moodle_2_3/ExtractAndMapMoodle.java * Lemo-Data-Management-Server for learning analytics. * Copyright (C) 2015 * 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/moodle_2_3/ExtractAndMapMoodle.java * Date 2013-01-24 * Project Lemo Learning Analytics */ package de.lemo.dms.connectors.moodle_2_3; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; 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.TextHelper; import de.lemo.dms.connectors.moodle_2_3.mapping.AssignGradesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.AssignLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ChatLogLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ChatLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ContextLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.CourseCategoriesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.CourseLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.CourseModulesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.EnrolLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ForumLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ForumDiscussionsLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ForumPostsLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.GradeGradesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.GradeItemsLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.GroupsLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.GroupsMembersLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.LogLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ModulesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.PageLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.QuestionLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.QuestionStatesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.QuizLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.QuizAttemptsLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.QuizGradesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.QuizQuestionInstancesLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ResourceLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.UrlLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.RoleLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.RoleAssignmentsLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.ScormLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.UserEnrolmentsLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.UserLMS; import de.lemo.dms.connectors.moodle_2_3.mapping.WikiLMS; import de.lemo.dms.db.DBConfigObject; import de.lemo.dms.db.mapping.Attribute; import de.lemo.dms.db.mapping.CollaborationLog; import de.lemo.dms.db.mapping.Course; import de.lemo.dms.db.mapping.CourseAttribute; import de.lemo.dms.db.mapping.CourseLearning; import de.lemo.dms.db.mapping.CourseUser; import de.lemo.dms.db.mapping.LearningAttribute; import de.lemo.dms.db.mapping.LearningObj; import de.lemo.dms.db.mapping.LearningType; import de.lemo.dms.db.mapping.UserAssessment; import de.lemo.dms.db.mapping.AccessLog; import de.lemo.dms.db.mapping.Role; import de.lemo.dms.db.mapping.AssessmentLog; import de.lemo.dms.db.mapping.User; import de.lemo.dms.db.mapping.UserAttribute; import de.lemo.dms.processing.resulttype.CourseObject; /** * The main class of the extraction process. * Implementation of the abstract extract class for the LMS Moodle. */ public class ExtractAndMapMoodle extends ExtractAndMap { // Versionsnummer in Namen einfügen // LMS tables instances lists /** The log_lms. */ private List<LogLMS> logLms; private List<AssignGradesLMS> assignGradesLms; private List<ResourceLMS> resourceLms; private List<UrlLMS> urlLms; private List<PageLMS> pageLms; private List<CourseLMS> courseLms; private List<ForumLMS> forumLms; private List<WikiLMS> wikiLms; private List<UserLMS> userLms; private List<QuizLMS> quizLms; private List<QuizQuestionInstancesLMS> quizQuestionInstancesLms; private List<QuestionLMS> questionLms; private List<GroupsLMS> groupLms; private List<GroupsMembersLMS> groupMembersLms; private List<QuestionStatesLMS> questionStatesLms; private List<ForumPostsLMS> forumPostsLms; private List<RoleLMS> roleLms; private List<ContextLMS> contextLms; private List<RoleAssignmentsLMS> roleAssignmentsLms; private List<QuizGradesLMS> quizGradesLms; private List<ForumDiscussionsLMS> forumDiscussionsLms; private List<ScormLMS> scormLms; private List<GradeGradesLMS> gradeGradesLms; private List<GradeItemsLMS> gradeItemsLms; private List<ChatLMS> chatLms; private List<ChatLogLMS> chatLogLms; private List<CourseCategoriesLMS> courseCategoriesLms; private List<AssignLMS> assignLms; private List<EnrolLMS> enrolLms; private List<UserEnrolmentsLMS> userEnrolmentsLms; private List<ModulesLMS> modulesLms; private List<CourseModulesLMS> courseModulesLms; private List<QuizAttemptsLMS> quizAttemptsLms; final Map<Course, CourseObject> courseDetails = new HashMap<Course, CourseObject>(); private Map<Long, Long> chatCourse = new HashMap<Long, Long>(); private final Logger logger = Logger.getLogger(this.getClass()); private final IConnector connector; public ExtractAndMapMoodle(final IConnector connector) { super(connector); this.connector = connector; } @Override @SuppressWarnings("unchecked") public void getLMStables(final DBConfigObject dbConfig, final long readingfromtimestamp, List<Long> courses, List<String> logins) { // accessing DB by creating a session and a transaction using HibernateUtil final Session session = HibernateUtil.getSessionFactory(dbConfig).openSession(); session.clear(); final Transaction tx = session.beginTransaction(); boolean hasCR = false; if(courses != null && courses.size() > 0) hasCR = true; else courses = new ArrayList<Long>(); boolean empty = false; //Read Context Criteria criteria = session.createCriteria(ContextLMS.class, "obj"); List<Long> contextLevels = new ArrayList<Long>(); contextLevels.add(40L); contextLevels.add(50L); criteria.add(Restrictions.in("obj.contextlevel", contextLevels)); criteria.addOrder(Property.forName("obj.id").asc()); this.contextLms = criteria.list(); logger.info("ContextLMS tables: " + this.contextLms.size()); if(logins != null && !logins.isEmpty()) { List<String> archetypes = new ArrayList<String>(); List<Long> roleIds = new ArrayList<Long>(); List<String> userIds = new ArrayList<String>(); archetypes.add("manager"); archetypes.add("coursecreator"); archetypes.add("teacher"); archetypes.add("editingteacher"); criteria = session.createCriteria(RoleLMS.class, "obj"); criteria.add(Restrictions.in("obj.archetype", archetypes)); for(RoleLMS role : (List<RoleLMS>)criteria.list()) roleIds.add(role.getId()); criteria = session.createCriteria(UserLMS.class, "obj"); criteria.add(Restrictions.in("obj.username", logins)); for(UserLMS user : (List<UserLMS>)criteria.list()) userIds.add(user.getId()+""); criteria = session.createCriteria(RoleAssignmentsLMS.class, "obj"); criteria.add(Restrictions.in("obj.userid", userIds)); criteria.add(Restrictions.in("obj.roleid", roleIds)); for(ContextLMS c : this.contextLms) { for(RoleAssignmentsLMS ra : (List<RoleAssignmentsLMS>)criteria.list()) { if(c.getContextlevel() == 50 && c.getId() == ra.getContextid()) { courses.add(c.getInstanceid()); hasCR = true; } } } } // reading the LMS Database, create tables as lists of instances of the DB-table classes criteria = session.createCriteria(AssignLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.assignLms = criteria.list(); logger.info("AssignLMS tables: " + this.assignLms.size()); //Read RoleAssignments criteria = session.createCriteria(RoleAssignmentsLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(ContextLMS c : this.contextLms) { if(c.getContextlevel() == 50 && courses.contains(c.getInstanceid())) ids.add(c.getId()); } if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.contextid", ids)); } //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.roleAssignmentsLms = criteria.list(); else this.roleAssignmentsLms = new ArrayList<RoleAssignmentsLMS>(); logger.info("RoleAssignmentsLMS tables: " + this.roleAssignmentsLms.size()); //Read Assign criteria = session.createCriteria(AssignGradesLMS.class, "obj"); if(hasCR) { List<Long> tmp = new ArrayList<Long>(); for(AssignLMS assign : assignLms) { tmp.add(assign.getId()); } if(!(empty = tmp.isEmpty())) criteria.add(Restrictions.in("obj.assignment", tmp)); } criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.assignGradesLms = criteria.list(); else this.assignGradesLms = new ArrayList<AssignGradesLMS>(); logger.info("AssignGradesLMS tables: " + this.assignGradesLms.size()); //Read Enrol criteria = session.createCriteria(EnrolLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.courseid", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.enrolLms = criteria.list(); logger.info("EnrolLMS tables: " + this.enrolLms.size()); //Read Modules criteria = session.createCriteria(ModulesLMS.class, "obj"); criteria.addOrder(Property.forName("obj.id").asc()); this.modulesLms = criteria.list(); logger.info("ModulesLMS tables: " + this.modulesLms.size()); //Read UserEnrolments criteria = session.createCriteria(UserEnrolmentsLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(EnrolLMS e : this.enrolLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.enrolid", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.userEnrolmentsLms = criteria.list(); else this.userEnrolmentsLms = new ArrayList<UserEnrolmentsLMS>(); logger.info("UserEnrolmentsLMS tables: " + this.userEnrolmentsLms.size()); //Read CourseModules criteria = session.createCriteria(CourseModulesLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.courseModulesLms = criteria.list(); logger.info("CourseModulesLMS tables: " + this.courseModulesLms.size()); //Read Log criteria = session.createCriteria(LogLMS.class, "obj"); if(hasCR){ criteria.add(Restrictions.in("obj.course", courses)); } criteria.add(Restrictions.gt("obj.time", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.logLms = criteria.list(); logger.info("LogLMS tables: " + this.logLms.size()); //Read Resource criteria = session.createCriteria(ResourceLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.resourceLms = criteria.list(); logger.info("ResourceLMS tables: " + this.resourceLms.size()); //Read Urls criteria = session.createCriteria(UrlLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.urlLms = criteria.list(); logger.info("UrlLMS tables: " + this.urlLms.size()); //Read Pages criteria = session.createCriteria(PageLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.pageLms = criteria.list(); logger.info("UrlLMS tables: " + this.pageLms.size()); //Read Quiz criteria = session.createCriteria(QuizLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.quizLms = criteria.list(); logger.info("QuizLMS tables: " + this.quizLms.size()); //Read QuizAttempts criteria = session.createCriteria(QuizAttemptsLMS.class, "obj"); if(hasCR) if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizLMS e : this.quizLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.quiz", ids)); } criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.quizAttemptsLms = criteria.list(); else this.quizAttemptsLms = new ArrayList<QuizAttemptsLMS>(); logger.info("QuizAttemptsLMS tables: " + this.quizAttemptsLms.size()); //Read Chats criteria = session.createCriteria(ChatLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.chatLms = criteria.list(); logger.info("ChatLMS tables: " + this.chatLms.size()); //Read ChatLog criteria = session.createCriteria(ChatLogLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(ChatLMS e : this.chatLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.chat", ids)); } criteria.add(Restrictions.gt("obj.timestamp", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.chatLogLms = criteria.list(); else this.chatLogLms = new ArrayList<ChatLogLMS>(); logger.info("ChatLogLMS tables: " + this.chatLogLms.size()); criteria = session.createCriteria(CourseCategoriesLMS.class, "obj"); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.courseCategoriesLms = criteria.list(); logger.info("CourseCategoriesLMS tables: " + this.courseCategoriesLms.size()); criteria = session.createCriteria(CourseLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.id", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.courseLms = criteria.list(); logger.info("CourseLMS tables: " + this.courseLms.size()); final Query forumPosts; if(!hasCR) { forumPosts= session .createQuery("from ForumPostsLMS x where x.modified>=:readingtimestamp order by x.id asc"); forumPosts.setParameter("readingtimestamp", readingfromtimestamp); this.forumPostsLms = forumPosts.list(); } else { String courseClause ="("; for(int i = 0; i < courses.size(); i++) { courseClause += courses.get(i); if(i < courses.size() - 1) courseClause += ","; else courseClause += ")"; } forumPosts = session.createSQLQuery("SELECT posts.id,posts.userid,posts.created,posts.modified,posts.subject,posts.message,posts.discussion from mdl_forum_posts as posts JOIN mdl_log as logs ON posts.userid = logs.userid Where logs.course in "+ courseClause +" and (posts.created = logs.time or posts.modified = logs.time) AND posts.modified>=:readingtimestamp"); forumPosts.setParameter("readingtimestamp", readingfromtimestamp); List<Object[]> tmpl = forumPosts.list(); this.forumPostsLms = new ArrayList<ForumPostsLMS>(); for(Object[] obj : tmpl) { ForumPostsLMS p = new ForumPostsLMS(); if(obj[0].getClass().equals(BigInteger.class)) { p.setId(((BigInteger) obj[0]).longValue()); } else { p.setId(((Integer) obj[0]).longValue()); } if(obj[0].getClass().equals(BigInteger.class)) { p.setUserid(((BigInteger) obj[1]).longValue()); } else { p.setUserid(((Integer) obj[1]).longValue()); } if(obj[0].getClass().equals(BigInteger.class)) { p.setCreated(((BigInteger) obj[2]).longValue()); } else { p.setCreated(((Integer) obj[2]).longValue()); } if(obj[0].getClass().equals(BigInteger.class)) { p.setModified(((BigInteger) obj[3]).longValue()); } else { p.setModified(((Integer) obj[3]).longValue()); } p.setSubject((String) obj[4]); p.setMessage((String) obj[5]); if(obj[0].getClass().equals(BigInteger.class)) { p.setDiscussion(((BigInteger) obj[6]).longValue()); } else { p.setDiscussion(((Integer) obj[6]).longValue()); } this.forumPostsLms.add(p); } } logger.info("ForumPostsLMS tables: " + this.forumPostsLms.size()); criteria = session.createCriteria(ForumLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.forumLms = criteria.list(); logger.info("ForumLMS tables: " + this.forumLms.size()); criteria = session.createCriteria(GroupsLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.courseid", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.groupLms = criteria.list(); logger.info("GroupsLMS tables: " + this.groupLms.size()); criteria = session.createCriteria(WikiLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.wikiLms = criteria.list(); logger.info("WikiLMS tables: " + this.wikiLms.size()); criteria = session.createCriteria(GroupsMembersLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(GroupsLMS e : this.groupLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.groupid", ids)); } //criteria.add(Restrictions.gt("obj.timeadded", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.groupMembersLms = criteria.list(); else this.groupMembersLms = new ArrayList<GroupsMembersLMS>(); logger.info("GroupsMembersLMS tables: " + this.groupMembersLms.size()); criteria = session.createCriteria(QuizQuestionInstancesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizLMS e : this.quizLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.quiz", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.quizQuestionInstancesLms = criteria.list(); else this.quizQuestionInstancesLms = new ArrayList<QuizQuestionInstancesLMS>(); logger.info("QuizQuestionInstancesLMS tables: " + this.quizQuestionInstancesLms.size()); criteria = session.createCriteria(QuestionStatesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizQuestionInstancesLMS e : this.quizQuestionInstancesLms) ids.add(e.getQuestion()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.question", ids)); } criteria.add(Restrictions.gt("obj.timestamp", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.questionStatesLms = criteria.list(); else this.questionStatesLms = new ArrayList<QuestionStatesLMS>(); logger.info("QuestionStatesLMS tables: " + this.questionStatesLms.size()); criteria = session.createCriteria(QuestionLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizQuestionInstancesLMS e : this.quizQuestionInstancesLms) ids.add(e.getQuestion()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.id", ids)); } //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.questionLms = criteria.list(); else this.questionLms = new ArrayList<QuestionLMS>(); logger.info("QuestionLMS tables: " + this.questionLms.size()); criteria = session.createCriteria(UserLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(RoleAssignmentsLMS e : this.roleAssignmentsLms) ids.add(Long.valueOf(e.getUserid())); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.id", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.userLms = criteria.list(); else this.userLms = new ArrayList<UserLMS>(); logger.info("UserLMS tables: " + this.userLms.size()); criteria = session.createCriteria(RoleLMS.class, "obj"); criteria.addOrder(Property.forName("obj.id").asc()); this.roleLms = criteria.list(); logger.info("RoleLMS tables: " + this.roleLms.size()); criteria = session.createCriteria(QuizGradesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizLMS e : this.quizLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.quiz", ids)); } criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.quizGradesLms = criteria.list(); else this.quizGradesLms = new ArrayList<QuizGradesLMS>(); logger.info("QuizGradesLMS tables: " + this.quizGradesLms.size()); criteria = session.createCriteria(ForumDiscussionsLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(ForumLMS e : this.forumLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.forum", ids)); } criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.forumDiscussionsLms = criteria.list(); else this.forumDiscussionsLms = new ArrayList<ForumDiscussionsLMS>(); logger.info("ForumDiscussionsLMS tables: " + this.forumDiscussionsLms.size()); criteria = session.createCriteria(ScormLMS.class, "obj"); if(hasCR) { criteria.add(Restrictions.in("obj.course", courses)); } //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.scormLms = criteria.list(); logger.info("ScormLMS tables: " + this.scormLms.size()); criteria = session.createCriteria(GradeItemsLMS.class, "obj"); if(hasCR) { criteria.add(Restrictions.in("obj.courseid", courses)); } //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.gradeItemsLms = criteria.list(); logger.info("GradeItemsLMS tables: " + this.gradeItemsLms.size()); criteria = session.createCriteria(GradeGradesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(GradeItemsLMS e : this.gradeItemsLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.itemid", ids)); } //criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.gradeGradesLms = criteria.list(); else this.gradeGradesLms = new ArrayList<GradeGradesLMS>(); logger.info("GradeGradesLMS tables: " + this.gradeGradesLms.size()); // hibernate session finish and close tx.commit(); session.close(); } @Override @SuppressWarnings("unchecked") public void getLMStables(final DBConfigObject dbConf, final long readingfromtimestamp, final long readingtotimestamp, List<Long> courses, List<String> logins) { // accessing DB by creating a session and a transaction using HibernateUtil final Session session = HibernateUtil.getSessionFactory(dbConf).openSession(); // Session session = HibernateUtil.getDynamicSourceDBFactoryMoodle("jdbc:mysql://localhost/moodle19", session.clear(); final Transaction tx = session.beginTransaction(); // reading the LMS Database, create tables as lists of instances of the DB-table classes Criteria criteria; boolean hasCR = false; if(courses != null && courses.size() > 0) hasCR = true; boolean empty = false; if (this.userLms == null) { //Read Context criteria = session.createCriteria(ContextLMS.class, "obj"); List<Long> contextLevels = new ArrayList<Long>(); contextLevels.add(40L); contextLevels.add(50L); criteria.add(Restrictions.in("obj.contextlevel", contextLevels)); criteria.addOrder(Property.forName("obj.id").asc()); this.contextLms = criteria.list(); logger.info("ContextLMS tables: " + this.contextLms.size()); if(logins != null && !logins.isEmpty()) { List<String> archetypes = new ArrayList<String>(); List<Long> roleIds = new ArrayList<Long>(); List<String> userIds = new ArrayList<String>(); archetypes.add("manager"); archetypes.add("coursecreator"); archetypes.add("teacher"); archetypes.add("editingteacher"); criteria = session.createCriteria(RoleLMS.class, "obj"); criteria.add(Restrictions.in("obj.archetype", archetypes)); for(RoleLMS role : (List<RoleLMS>)criteria.list()) roleIds.add(role.getId()); criteria = session.createCriteria(UserLMS.class, "obj"); criteria.add(Restrictions.in("obj.username", logins)); for(UserLMS user : (List<UserLMS>)criteria.list()) userIds.add(user.getId()+""); criteria = session.createCriteria(RoleAssignmentsLMS.class, "obj"); criteria.add(Restrictions.in("obj.userid", userIds)); criteria.add(Restrictions.in("obj.roleid", roleIds)); for(ContextLMS c : this.contextLms) { for(RoleAssignmentsLMS ra : (List<RoleAssignmentsLMS>)criteria.list()) { if(c.getContextlevel() == 50 && c.getId() == ra.getContextid()) { courses.add(c.getInstanceid()); hasCR = true; } } } } criteria = session.createCriteria(AssignLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.assignLms = criteria.list(); logger.info("AssignLMS tables: " + this.assignLms.size()); criteria = session.createCriteria(EnrolLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.courseid", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.enrolLms = criteria.list(); logger.info("EnrolLMS tables: " + this.enrolLms.size()); criteria = session.createCriteria(ModulesLMS.class, "obj"); criteria.addOrder(Property.forName("obj.id").asc()); this.modulesLms = criteria.list(); logger.info("ModulesLMS tables: " + this.modulesLms.size()); criteria = session.createCriteria(UserEnrolmentsLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(EnrolLMS e : this.enrolLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.enrolid", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.userEnrolmentsLms = criteria.list(); else this.userEnrolmentsLms = new ArrayList<UserEnrolmentsLMS>(); logger.info("UserEnrolmentsLMS tables: " + this.userEnrolmentsLms.size()); criteria = session.createCriteria(CourseModulesLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.courseModulesLms = criteria.list(); logger.info("CourseModulesLMS tables: " + this.courseModulesLms.size()); criteria = session.createCriteria(ResourceLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.resourceLms = criteria.list(); logger.info("ResourceLMS tables: " + this.resourceLms.size()); //Read Urls criteria = session.createCriteria(UrlLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.urlLms = criteria.list(); logger.info("UrlLMS tables: " + this.urlLms.size()); //Read Pages criteria = session.createCriteria(PageLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.pageLms = criteria.list(); logger.info("UrlLMS tables: " + this.pageLms.size()); criteria = session.createCriteria(CourseLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.id", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.courseLms = criteria.list(); logger.info("CourseLMS tables: " + this.courseLms.size()); criteria = session.createCriteria(ChatLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.chatLms = criteria.list(); logger.info("ChatLMS tables: " + this.chatLms.size()); criteria = session.createCriteria(CourseCategoriesLMS.class, "obj"); criteria.addOrder(Property.forName("obj.id").asc()); this.courseCategoriesLms = criteria.list(); logger.info("CourseCategoriesLMS tables: " + this.courseCategoriesLms.size()); criteria = session.createCriteria(ForumLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.forumLms = criteria.list(); logger.info("ForumLMS tables: " + this.forumLms.size()); criteria = session.createCriteria(GroupsLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.courseid", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.groupLms = criteria.list(); logger.info("GroupsLMS tables: " + this.groupLms.size()); criteria = session.createCriteria(QuizLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.quizLms = criteria.list(); logger.info("QuizLMS tables: " + this.quizLms.size()); criteria = session.createCriteria(WikiLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.addOrder(Property.forName("obj.id").asc()); this.wikiLms = criteria.list(); logger.info("WikiLMS tables: " + this.wikiLms.size()); criteria = session.createCriteria(QuizQuestionInstancesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizLMS e : this.quizLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.quiz", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.quizQuestionInstancesLms = criteria.list(); else this.quizQuestionInstancesLms = new ArrayList<QuizQuestionInstancesLMS>(); logger.info("QuizQuestionInstancesLMS tables: " + this.quizQuestionInstancesLms.size()); criteria = session.createCriteria(QuestionLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizQuestionInstancesLMS e : this.quizQuestionInstancesLms) ids.add(e.getQuestion()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.id", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.questionLms = criteria.list(); else this.questionLms = new ArrayList<QuestionLMS>(); logger.info("QuestionLMS tables: " + this.questionLms.size()); criteria = session.createCriteria(RoleLMS.class, "obj"); criteria.addOrder(Property.forName("obj.id").asc()); this.roleLms = criteria.list(); logger.info("RoleLMS tables: " + this.roleLms.size()); session.clear(); /* criteria = session.createCriteria(AssignmentLMS.class, "obj"); if(hasCR) { criteria.add(Restrictions.in("obj.course", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.assignmentLms = criteria.list(); logger.info("AssignmentLMS tables: " + this.assignmentLms.size()); */ criteria = session.createCriteria(ScormLMS.class, "obj"); if(hasCR) { criteria.add(Restrictions.in("obj.course", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.scormLms = criteria.list(); logger.info("ScormLMS tables: " + this.scormLms.size()); criteria = session.createCriteria(GradeItemsLMS.class, "obj"); if(hasCR) { criteria.add(Restrictions.in("obj.courseid", courses)); } criteria.addOrder(Property.forName("obj.id").asc()); this.gradeItemsLms = criteria.list(); logger.info("GradeItemsLMS tables: " + this.gradeItemsLms.size()); criteria = session.createCriteria(RoleAssignmentsLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(ContextLMS c : this.contextLms) { if(c.getContextlevel() == 50 && courses.contains(c.getInstanceid())) ids.add(c.getId()); } if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.contextid", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.roleAssignmentsLms = criteria.list(); else this.roleAssignmentsLms = new ArrayList<RoleAssignmentsLMS>(); logger.info("RoleAssignmentsLMS tables: " + this.roleAssignmentsLms.size()); criteria = session.createCriteria(UserLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(RoleAssignmentsLMS e : this.roleAssignmentsLms) ids.add(Long.valueOf(e.getUserid())); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.id", ids)); } criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.userLms = criteria.list(); else this.userLms = new ArrayList<UserLMS>(); logger.info("UserLMS tables: " + this.userLms.size()); } criteria = session.createCriteria(QuizAttemptsLMS.class, "obj"); if(hasCR) if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizLMS e : this.quizLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.quiz", ids)); } criteria.add(Restrictions.lt("obj.timemodified", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.quizAttemptsLms = criteria.list(); else this.quizAttemptsLms = new ArrayList<QuizAttemptsLMS>(); logger.info("QuizAttemptsLMS tables: " + this.quizAttemptsLms.size()); criteria = session.createCriteria(LogLMS.class, "obj"); if(hasCR) criteria.add(Restrictions.in("obj.course", courses)); criteria.add(Restrictions.lt("obj.time", readingtotimestamp)); criteria.add(Restrictions.gt("obj.time", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); this.logLms = criteria.list(); logger.info("LogLMS tables: " + this.logLms.size()); criteria = session.createCriteria(ChatLogLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(ChatLMS e : this.chatLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.chat", ids)); } criteria.add(Restrictions.lt("obj.timestamp", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timestamp", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.chatLogLms = criteria.list(); else this.chatLogLms = new ArrayList<ChatLogLMS>(); logger.info("ChatLogLMS tables: " + this.chatLogLms.size()); final Query forumPosts; if(!hasCR) { forumPosts= session .createQuery("from ForumPostsLMS x where x.created>=:readingtimestamp and x.created<=:ceiling order by x.id asc"); forumPosts.setParameter("readingtimestamp", readingfromtimestamp); forumPosts.setParameter("ceiling", readingtotimestamp); this.forumPostsLms = forumPosts.list(); } else { String courseClause ="("; for(int i = 0; i < courses.size(); i++) { courseClause += courses.get(i); if(i < courses.size() - 1) courseClause += ","; else courseClause += ")"; } forumPosts = session.createSQLQuery("SELECT posts.id,posts.userid,posts.created,posts.modified,posts.subject,posts.message,posts.discussion from forum_posts as posts JOIN log as logs ON posts.userid = logs.userid Where logs.course in "+ courseClause +" and (posts.created = logs.time or posts.modified = logs.time) AND posts.created>=:readingtimestamp and posts.created<=:ceiling"); forumPosts.setParameter("readingtimestamp", readingfromtimestamp); forumPosts.setParameter("ceiling", readingtotimestamp); List<Object[]> tmpl = forumPosts.list(); if(this.forumPostsLms == null) this.forumPostsLms = new ArrayList<ForumPostsLMS>(); for(Object[] obj : tmpl) { ForumPostsLMS p = new ForumPostsLMS(); if(obj[0].getClass().equals(BigInteger.class)) { p.setId(((BigInteger) obj[0]).longValue()); } else { p.setId(((Integer) obj[0]).longValue()); } if(obj[0].getClass().equals(BigInteger.class)) { p.setUserid(((BigInteger) obj[1]).longValue()); } else { p.setUserid(((Integer) obj[1]).longValue()); } if(obj[0].getClass().equals(BigInteger.class)) { p.setCreated(((BigInteger) obj[2]).longValue()); } else { p.setCreated(((Integer) obj[2]).longValue()); } if(obj[0].getClass().equals(BigInteger.class)) { p.setModified(((BigInteger) obj[3]).longValue()); } else { p.setModified(((Integer) obj[3]).longValue()); } p.setSubject((String) obj[4]); p.setMessage((String) obj[5]); if(obj[0].getClass().equals(BigInteger.class)) { p.setDiscussion(((BigInteger) obj[6]).longValue()); } else { p.setDiscussion(((Integer) obj[6]).longValue()); } this.forumPostsLms.add(p); } } logger.info("ForumPostsLMS tables: " + this.forumPostsLms.size()); final Query forumPostsModified; if(!hasCR) { forumPostsModified= session .createQuery("from ForumPostsLMS x where x.modified>=:readingtimestamp and x.modified<=:ceiling order by x.id asc"); this.forumPostsLms.addAll(forumPostsModified.list()); } else { String courseClause ="("; for(int i = 0; i < courses.size(); i++) { courseClause += courses.get(i); if(i < courses.size() - 1) courseClause += ","; else courseClause += ")"; } forumPostsModified = session.createSQLQuery("SELECT posts.id,posts.userid,posts.created,posts.modified,posts.subject,posts.message from mdl_forum_posts as posts JOIN mdl_log as logs ON posts.userid = logs.userid Where logs.course in "+ courseClause +" and (posts.created = logs.time or posts.modified = logs.time) AND posts.modified>=:readingtimestamp and posts.modified<=:ceiling"); forumPostsModified.setParameter("readingtimestamp", readingfromtimestamp); forumPostsModified.setParameter("ceiling", readingtotimestamp); List<Object[]> tmpl = forumPostsModified.list(); if(this.forumPostsLms == null) this.forumPostsLms = new ArrayList<ForumPostsLMS>(); for(Object[] obj : tmpl) { ForumPostsLMS p = new ForumPostsLMS(); p.setId(((Integer) obj[0]).longValue()); p.setUserid(((Integer) obj[1]).longValue()); p.setCreated(((Integer) obj[2]).longValue()); p.setModified(((Integer) obj[3]).longValue()); p.setSubject((String) obj[4]); p.setMessage((String) obj[5]); this.forumPostsLms.add(p); } } logger.info("ForumPostsModifiedLMS tables: " + this.forumPostsLms.size()); session.clear(); criteria = session.createCriteria(AssignGradesLMS.class, "obj"); if(hasCR) { List<Long> tmp = new ArrayList<Long>(); for(AssignLMS assign : assignLms) { tmp.add(assign.getId()); } if(!(empty = tmp.isEmpty())) criteria.add(Restrictions.in("obj.assignment", tmp)); } criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.add(Restrictions.lt("obj.timemodified", readingtotimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.assignGradesLms = criteria.list(); else this.assignGradesLms = new ArrayList<AssignGradesLMS>(); logger.info("AssignGradesLMS tables: " + this.assignGradesLms.size()); criteria = session.createCriteria(GroupsMembersLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(GroupsLMS e : this.groupLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.groupid", ids)); } criteria.add(Restrictions.lt("obj.timeadded", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timeadded", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.groupMembersLms = criteria.list(); else this.groupMembersLms = new ArrayList<GroupsMembersLMS>(); logger.info("GroupsMembersLMS tables: " + this.groupMembersLms.size()); criteria = session.createCriteria(QuestionStatesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizQuestionInstancesLMS e : this.quizQuestionInstancesLms) ids.add(e.getQuestion()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.question", ids)); } criteria.add(Restrictions.lt("obj.timestamp", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timestamp", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.questionStatesLms = criteria.list(); else this.questionStatesLms = new ArrayList<QuestionStatesLMS>(); logger.info("QuestionStatesLMS tables: " + this.questionStatesLms.size()); /* criteria = session.createCriteria(AssignmentSubmissionsLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(AssignmentLMS e : this.assignmentLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.id", ids)); } criteria.add(Restrictions.lt("obj.timecreated", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timecreated", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.assignmentSubmissionLms = criteria.list(); else this.assignmentSubmissionLms = new ArrayList<AssignmentSubmissionsLMS>(); logger.info("AssignmentSubmissionsLMS tables: " + this.userLms.size()); */ criteria = session.createCriteria(QuizGradesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(QuizLMS e : this.quizLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.quiz", ids)); } criteria.add(Restrictions.lt("obj.timemodified", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.quizGradesLms = criteria.list(); else this.quizGradesLms = new ArrayList<QuizGradesLMS>(); logger.info("QuizGradesLMS tables: " + this.quizGradesLms.size()); criteria = session.createCriteria(ForumDiscussionsLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(ForumLMS e : this.forumLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.forum", ids)); } criteria.add(Restrictions.lt("obj.timemodified", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.forumDiscussionsLms = criteria.list(); else this.forumDiscussionsLms = new ArrayList<ForumDiscussionsLMS>(); logger.info("ForumDiscussionsLMS tables: " + this.forumDiscussionsLms.size()); criteria = session.createCriteria(GradeGradesLMS.class, "obj"); if(hasCR) { ArrayList<Long> ids = new ArrayList<Long>(); for(GradeItemsLMS e : this.gradeItemsLms) ids.add(e.getId()); if(!(empty = ids.isEmpty())) criteria.add(Restrictions.in("obj.itemid", ids)); } criteria.add(Restrictions.lt("obj.timemodified", readingtotimestamp)); criteria.add(Restrictions.gt("obj.timemodified", readingfromtimestamp)); criteria.addOrder(Property.forName("obj.id").asc()); if(!(hasCR && empty)) this.gradeGradesLms = criteria.list(); else this.gradeGradesLms = new ArrayList<GradeGradesLMS>(); logger.info("GradeGradesLMS tables: " + this.gradeGradesLms.size()); session.clear(); // hibernate session finish and close tx.commit(); session.close(); } @Override public void clearLMStables() { this.logLms.clear(); this.resourceLms.clear(); this.courseLms.clear(); this.forumLms.clear(); this.wikiLms.clear(); this.userLms.clear(); this.quizLms.clear(); this.gradeGradesLms.clear(); this.groupLms.clear(); this.groupMembersLms.clear(); this.questionStatesLms.clear(); this.forumPostsLms.clear(); this.roleLms.clear(); this.roleAssignmentsLms.clear(); } // methods for create and fill the mining-table instances @Override public Map<Long, CourseUser> generateCourseUsers() { final HashMap<Long, CourseUser> courseUserMining = new HashMap<Long, CourseUser>(); for (final ContextLMS loadedItem : this.contextLms) { if (loadedItem.getContextlevel() == 50) { for (final RoleAssignmentsLMS loadedItem2 : this.roleAssignmentsLms) { if (loadedItem2.getContextid() == loadedItem.getId()) { final CourseUser insert = new CourseUser(); insert.setId(loadedItem2.getId()); insert.setRole(loadedItem2.getRoleid(), this.roleMining, this.oldRoleMining); insert.setUser(Long.valueOf(loadedItem2.getUserid()), this.userMining, this.oldUserMining); insert.setCourse(loadedItem.getInstanceid(), this.courseMining, this.oldCourseMining); if ((insert.getUser() != null) && (insert.getCourse() != null) && (insert.getRole() != null)) { courseUserMining.put(insert.getId(), insert); } } } } } return courseUserMining; } @Override public Map<Long, Course> generateCourses() { final HashMap<Long, Course> courseMining = new HashMap<Long, Course>(); for (final CourseLMS loadedItem : this.courseLms) { final Course insert = new Course(); insert.setId(loadedItem.getId()); insert.setTitle(loadedItem.getFullname()); courseMining.put(insert.getId(), insert); } return courseMining; } /* @Override public Map<Long, QuestionLogMining> generateQuestionLogMining() { final HashMap<Long, QuestionLogMining> questionLogMiningtmp = new HashMap<Long, QuestionLogMining>(); final HashMap<Long, QuestionLogMining> questionLogMining = new HashMap<Long, QuestionLogMining>(); final HashMap<String, Long> timestampIdMap = new HashMap<String, Long>(); final HashMap<Long, ArrayList<Long>> users = new HashMap<Long, ArrayList<Long>>(); for (final QuestionStatesLMS loadedItem : this.questionStatesLms) { final QuestionLogMining insert = new QuestionLogMining(); insert.setId(questionLogMiningtmp.size() + 1 + this.questionLogMax); insert.setQuestion(loadedItem.getQuestion()), this.questionMining, this.oldQuestionMining); insert.setPenalty(loadedItem.getPenalty()); insert.setAnswers(loadedItem.getAnswer()); insert.setTimestamp(loadedItem.getTimestamp()); if(insert.getTimestamp() > maxLog) { maxLog = insert.getTimestamp(); } insert.setPlatform(this.connector.getPlatformId()); // Set Grades if ((loadedItem.getEvent() == 3) || (loadedItem.getEvent() == 6) || (loadedItem.getEvent() == 9)) { insert.setRawGrade(loadedItem.getRawGrade()); insert.setFinalGrade(loadedItem.getGrade()); } switch (loadedItem.getEvent()) { case 0: insert.setAction("OPEN"); break; case 1: insert.setAction("NAVIGATE"); break; case 2: insert.setAction("SAVE"); break; case 3: insert.setAction("GRADE"); break; case 4: insert.setAction("DUPLICATE"); break; case 5: insert.setAction("VALIDATE"); break; case 6: insert.setAction("CLOSEANDGRADE"); break; case 7: insert.setAction("SUBMIT"); break; case 8: insert.setAction("CLOSE"); break; case 9: insert.setAction("MANUALGRADE"); break; default: insert.setAction("UNKNOWN"); } // Set quiz type if ((insert.getQuestion() != null) && (this.quizQuestionMining.get(insert.getQuestion().getId()) != null)) { insert.setQuiz(this.quizQuestionMining.get(insert.getQuestion().getId()).getQuiz()); if (this.courseQuizMining.get(insert.getQuiz().getId()) != null) { insert.setCourse(this.courseQuizMining.get(insert.getQuiz().getId()).getCourse()); } } else if ((insert.getQuestion() != null) && (this.oldQuizQuestionMining.get(insert.getQuestion().getId()) != null) && (this.oldCourseQuizMining.get(insert.getQuiz().getId()) != null)) { insert.setQuiz(this.oldQuizQuestionMining.get(insert.getQuestion().getId()).getQuiz()); if (this.oldCourseQuizMining.get(insert.getQuiz().getId()) != null) { insert.setCourse(this.courseQuizMining.get(insert.getQuiz().getId()).getCourse()); } } // Set Type for (final QuestionLMS loadedItem2 : this.questionLms) { if (loadedItem2.getId() == (loadedItem.getQuestion())) { insert.setType(loadedItem2.getQtype()); break; } } if ((insert.getType() == null) && (this.oldQuestionMining.get(loadedItem.getQuestion()) != null)) { insert.setType(this.oldQuestionMining.get(loadedItem.getQuestion()).getType()); } if (insert.getType() == null) { this.logger.debug("In QuestionLogMining, type not found for questionStates: " + loadedItem.getId() + " and question: " + loadedItem.getQuestion() + " question list size: " + this.questionLms.size()); } if ((insert.getQuestion() != null) && (insert.getQuiz() != null) && (insert.getCourse() != null)) { timestampIdMap.put(insert.getTimestamp() + " " + insert.getQuiz().getId(), insert.getId()); questionLogMiningtmp.put(insert.getId(), insert); } } // Set Course and for (final LogLMS loadedItem : this.logLms) { final long uid1 = loadedItem.getUserid()); // Creates a list of time stamps for every user indicating requests // We later use this lists to determine the time a user accessed a resource if (users.get(uid1) == null) { // if the user isn't already listed, create a new key final ArrayList<Long> times = new ArrayList<Long>(); times.add(loadedItem.getTime()); users.put(uid1, times); } else { final ArrayList<Long> times = users.get(uid1); if (loadedItem.getAction().equals("login")) { times.add(0L); } if (!times.contains(loadedItem.getTime())) { times.add(loadedItem.getTime()); } users.put(uid1, times); } if (loadedItem.getModule().equals("quiz") && (timestampIdMap.get(loadedItem.getTime() + " " + "" + loadedItem.getInfo()) != null)) { { final QuestionLogMining qlm = questionLogMiningtmp.get(timestampIdMap.get(loadedItem.getTime() + " " + "" + loadedItem.getInfo())); qlm.setUser(uid1, this.userMining, this.oldUserMining); questionLogMining.put(qlm.getId(), qlm); } } } for (final QuestionLogMining r : questionLogMining.values()) { if (r.getUser() != null) { long duration = -1; final ArrayList<Long> times = users.get(r.getUser().getId()); final int pos = times.indexOf(r.getTimestamp()); if ((pos > -1) && (pos < (times.size() - 1))) { if (times.get(pos + 1) != 0) { duration = times.get(pos + 1) - times.get(pos); } } // All duration that are longer than one hour are cut to an hour if (duration > 3600) { duration = 3600; } r.setDuration(duration); } } return questionLogMining; } */ @Override public Map<Long, AssessmentLog> generateAssessmentLogs() { final HashMap<Long, AssessmentLog> assessmentLogs = new HashMap<Long, AssessmentLog>(); final HashMap<Long, ArrayList<AssignGradesLMS>> assignGrades = new HashMap<Long, ArrayList<AssignGradesLMS>>(); final HashMap<Long, CourseModulesLMS> courseModules = new HashMap<Long, CourseModulesLMS>(); long moduleid = 0; for (final ModulesLMS loadedItem : this.modulesLms) { if (loadedItem.getName().equals("assign")) { moduleid = loadedItem.getId(); break; } } for(CourseModulesLMS cm : this.courseModulesLms) { if(cm.getModule() == moduleid) courseModules.put(cm.getId(), cm); } for (final AssignGradesLMS assignGrade : this.assignGradesLms) { if (assignGrades.get(assignGrade.getAssignment()) == null) { final ArrayList<AssignGradesLMS> a = new ArrayList<AssignGradesLMS>(); a.add(assignGrade); assignGrades.put(assignGrade.getAssignment(), a); } else { assignGrades.get(assignGrade.getAssignment()).add(assignGrade); } } for (final LogLMS loadedItem : this.logLms) { final AssessmentLog insert = new AssessmentLog(); insert.setId(assessmentLogs.size() + 1 + this.assessmentLogMax); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setUser(loadedItem.getUserid(), this.userMining, this.oldUserMining); insert.setTimestamp(loadedItem.getTime()); if (loadedItem.getModule().equals("assign")) { if(courseModules.containsKey(loadedItem.getCmid()) ) { insert.setLearning(Long.valueOf("07" + courseModules.get(loadedItem.getCmid()).getInstance()), learningObjectMining, oldLearningObjectMining); } } if (loadedItem.getModule().equals("scorm")) { if (loadedItem.getInfo().matches("[0-9]+")) { insert.setLearning(Long.valueOf("09" + loadedItem.getInfo()), this.learningObjectMining, this.oldLearningObjectMining); } } if (loadedItem.getModule().equals("quiz")) { if (loadedItem.getInfo().matches("[0-9]+")) { insert.setLearning(Long.valueOf("08" + loadedItem.getInfo()), this.learningObjectMining, this.oldLearningObjectMining); } } if(!courseDetails.containsKey(insert.getCourse()) && insert.getCourse() != null){ CourseObject co = new CourseObject(); co.setId(insert.getCourse().getId()); co.setFirstRequest(insert.getTimestamp()); courseDetails.put(insert.getCourse(), co); } if(insert.getCourse() != null) courseDetails.get(insert.getCourse()).setLastRequest(insert.getTimestamp()); if(insert.getTimestamp() > maxLog) { maxLog = insert.getTimestamp(); } if ((insert.getCourse() != null) && (insert.getLearning() != null) && (insert.getUser() != null)) { assessmentLogs.put(insert.getId(), insert); } } return assessmentLogs; } /* @Override public Map<Long, QuizQuestionMining> generateQuizQuestionMining() { final HashMap<Long, QuizQuestionMining> quizQuestionMining = new HashMap<Long, QuizQuestionMining>(); for (final QuizQuestionInstancesLMS loadedItem : this.quizQuestionInstancesLms) { final QuizQuestionMining insert = new QuizQuestionMining(); insert.setId(loadedItem.getId())); insert.setQuiz(loadedItem.getQuiz()), this.quizMining, this.oldQuizMining); insert.setQuestion(loadedItem.getQuestion()), this.questionMining, this.oldQuestionMining); insert.setPlatform(this.connector.getPlatformId()); if ((insert.getQuiz() != null) && (insert.getQuestion() != null)) { quizQuestionMining.put(insert.getQuestion().getId(), insert); } else { this.logger.debug("In QuizQuestionMining, quiz not found: " + loadedItem.getQuiz()); } } return quizQuestionMining; } @Override public Map<Long, QuestionMining> generateQuestionMining() { final HashMap<Long, QuestionMining> questionMining = new HashMap<Long, QuestionMining>(); for (final QuestionLMS loadedItem : this.questionLms) { final QuestionMining insert = new QuestionMining(); insert.setId(loadedItem.getId())); insert.setTitle(loadedItem.getName()); insert.setText(loadedItem.getQuestiontext()); insert.setType(loadedItem.getQtype()); insert.setTimeCreated(loadedItem.getTimecreated()); insert.setPlatform(this.connector.getPlatformId()); insert.setTimeModified(loadedItem.getTimemodified()); questionMining.put(insert.getId(), insert); } return questionMining; } */ @Override public Map<Long, UserAssessment> generateUserAssessments() { final HashMap<Long, UserAssessment> taskUserMining = new HashMap<Long, UserAssessment>(); for(AssignGradesLMS loadedItem : this.assignGradesLms) { UserAssessment insert = new UserAssessment(); insert.setId(loadedItem.getId()); insert.setLearning(Long.valueOf("07" + loadedItem.getAssignment()), learningObjectMining, oldLearningObjectMining); insert.setUser(loadedItem.getUser(), userMining, oldUserMining); if(loadedItem.getGrade() != null) { insert.setGrade(loadedItem.getGrade()); } insert.setTimemodified(loadedItem.getTimemodified()); for(AssignLMS loadedItem2 : this.assignLms) { if(loadedItem2.getId() == loadedItem.getAssignment()) { insert.setCourse(loadedItem2.getCourse(), courseMining, oldCourseMining); break; } } if(insert.getUser() != null && insert.getCourse() != null && insert.getLearning() != null) taskUserMining.put(insert.getId(), insert); } for (final GradeGradesLMS loadedItem : this.gradeGradesLms) { final UserAssessment insert = new UserAssessment(); insert.setId(loadedItem.getId()); if (loadedItem.getFinalgrade() != null) { insert.setGrade(loadedItem.getFinalgrade()); } if (loadedItem.getTimemodified() != null) { insert.setTimemodified(loadedItem.getTimemodified()); } insert.setUser(Long.valueOf(loadedItem.getUserid()), this.userMining, this.oldUserMining); for (final GradeItemsLMS loadedItem2 : this.gradeItemsLms) { if ((loadedItem2.getId() == loadedItem.getItemid()) && (loadedItem2.getIteminstance() != null)) { insert.setCourse(loadedItem2.getCourseid(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("08" + loadedItem2.getIteminstance()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getLearning() != null) && (insert.getUser() != null)) { taskUserMining.put(insert.getId(), insert); } } } } return taskUserMining; } @Override public Map<Long, Role> generateRoles() { // generate role tables final HashMap<Long, Role> roleMining = new HashMap<Long, Role>(); for (final RoleLMS loadedItem : this.roleLms) { final Role insert = new Role(); insert.setId(loadedItem.getId()); insert.setTitle(loadedItem.getName()); insert.setSortOrder(loadedItem.getSortorder()); if(loadedItem.getArchetype().equals("manager") || loadedItem.getArchetype().equals("coursecreator")) { insert.setType(0); } else if(loadedItem.getArchetype().equals("teacher") || loadedItem.getArchetype().equals("editingteacher")) { insert.setType(1); } else { insert.setType(2); } roleMining.put(insert.getId(), insert); } return roleMining; } @Override public Map<Long, CollaborationLog> generateCollaborativeLogs() { final HashMap<Long, CollaborationLog> collaborationLogs = new HashMap<Long, CollaborationLog>(); final HashMap<Long, CourseModulesLMS> couMod = new HashMap<Long, CourseModulesLMS>(); for (final ChatLogLMS loadedItem : this.chatLogLms) { final CollaborationLog insert = new CollaborationLog(); insert.setId(collaborationLogs.size() + 1 + this.collaborationLogMax); insert.setLearning(Long.valueOf("04" + loadedItem.getChat()), this.learningObjectMining, this.oldLearningObjectMining); insert.setText(TextHelper.replaceString(loadedItem.getMessage())); insert.setTimestamp(loadedItem.getTimestamp()); if(insert.getTimestamp() > maxLog) { maxLog = insert.getTimestamp(); } if (this.chatCourse.get(insert.getLearning()) != null) { insert.setCourse(this.chatCourse.get(insert.getLearning()), this.courseMining, this.oldCourseMining); } insert.setUser(Long.valueOf(loadedItem.getUser()), this.userMining, this.oldUserMining); if ((insert.getLearning() != null) && (insert.getUser() != null) && (insert.getCourse() != null)) { collaborationLogs.put(insert.getId(), insert); } } final HashMap<Long, ForumDiscussionsLMS> discussions = new HashMap<Long, ForumDiscussionsLMS>(); final HashMap<Long, ForumPostsLMS> posts = new HashMap<Long, ForumPostsLMS>(); for(ForumDiscussionsLMS dis : this.forumDiscussionsLms) { discussions.put(dis.getId(), dis); } for(ForumPostsLMS post : this.forumPostsLms) { posts.put(post.getId(), post); } for (final CourseModulesLMS cm : this.courseModulesLms) { couMod.put(cm.getId(), cm); } for (final LogLMS loadedItem : this.logLms) { final CollaborationLog insert = new CollaborationLog(); insert.setId(collaborationLogs.size() + 1 + this.collaborationLogMax); insert.setUser(loadedItem.getUserid(), this.userMining, this.oldUserMining); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setTimestamp(loadedItem.getTime()); if (loadedItem.getModule().equals("forum")) { if ((loadedItem.getAction().equals("view forum") || loadedItem.getAction().equals("subscribe")) && loadedItem.getInfo().matches("[0-9]+")) { insert.setLearning(Long.valueOf("05" + loadedItem.getInfo()), this.learningObjectMining, this.oldLearningObjectMining); } else if((loadedItem.getAction().equals("add discussion") || loadedItem.getAction().equals( "view discussion")) && loadedItem.getInfo().matches("[0-9]+")) { if (discussions.containsKey(Long.valueOf(loadedItem.getInfo()))) { Long f = discussions.get(Long.valueOf(loadedItem.getInfo())).getForum(); insert.setLearning(Long.valueOf("05" + f), this.learningObjectMining, this.oldLearningObjectMining); } } else if(loadedItem.getAction().equals("add post") && posts.containsKey(Long.valueOf(loadedItem.getInfo()))) { ForumPostsLMS p = posts.get(Long.valueOf(loadedItem.getInfo())); if(discussions.containsKey(p.getDiscussion())) { insert.setLearning(Long.valueOf("05" + discussions.get(p.getDiscussion()).getForum()), this.learningObjectMining, this.oldLearningObjectMining ); insert.setText(TextHelper.replaceString(p.getMessage())); } } if(insert.getText() == null) for (final ForumPostsLMS loadedItem2 : this.forumPostsLms) { if ((loadedItem2.getUserid() == loadedItem.getUserid()) && ((loadedItem2.getCreated() == loadedItem.getTime()) || (loadedItem2.getModified() == loadedItem .getTime()))) { insert.setText(TextHelper.replaceString(loadedItem2.getMessage())); break; } } } if (loadedItem.getModule().equals("wiki")) { if (couMod.get(loadedItem.getCmid()) != null) { insert.setLearning( Long.valueOf("06" + couMod.get(loadedItem.getCmid()).getInstance()), this.learningObjectMining, this.oldLearningObjectMining); } } if(insert.getTimestamp() > maxLog) { maxLog = insert.getTimestamp(); } if(!courseDetails.containsKey(insert.getCourse()) && insert.getCourse() != null){ CourseObject co = new CourseObject(); co.setId(insert.getCourse().getId()); co.setFirstRequest(insert.getTimestamp()); courseDetails.put(insert.getCourse(), co); } if(insert.getCourse() != null) courseDetails.get(insert.getCourse()).setLastRequest(insert.getTimestamp()); if ((insert.getUser() != null) && (insert.getCourse() != null) && (insert.getLearning() != null)) { collaborationLogs.put(insert.getId(), insert); } } return collaborationLogs; } public Map<String, LearningType> generateLearningTypes(){ return this.learningTypeMining; } @Override public Map<Long, LearningObj> generateLearningObjs() { Map<Long, LearningObj> learningObjs = new HashMap<Long, LearningObj>(); for (final ResourceLMS loadedItem : this.resourceLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Resource") && !this.oldLearningTypeMining.containsKey("Resource")) { LearningType type = new LearningType(); type.setType("Resource"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("01" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); insert.setType("Resource", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Access"); // Get time of creation learningObjs.put(insert.getId(), insert); } for (final UrlLMS loadedItem : this.urlLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("URL") && !this.oldLearningTypeMining.containsKey("URL")) { LearningType type = new LearningType(); type.setType("URL"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("02" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); insert.setType("URL", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Access"); learningObjs.put(insert.getId(), insert); } for (final PageLMS loadedItem : this.pageLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Page") && !this.oldLearningTypeMining.containsKey("Page")) { LearningType type = new LearningType(); type.setType("Page"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("03" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); insert.setType("Page", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Access"); learningObjs.put(insert.getId(), insert); } final HashMap<Long, LearningObj> amTmp = new HashMap<Long, LearningObj>(); for (final AssignLMS loadedItem : this.assignLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Assign") && !this.oldLearningTypeMining.containsKey("Assign")) { LearningType type = new LearningType(); type.setType("Assign"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("07" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); insert.setType("Assign", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Assessment"); for (final GradeItemsLMS loadedItem2 : this.gradeItemsLms) { if ((loadedItem2.getIteminstance() != null) && (loadedItem2.getItemmodule() != null)) { this.logger.debug("Iteminstance " + loadedItem2.getIteminstance() + " AssignId" + loadedItem.getId()); if ((loadedItem.getId() == loadedItem2.getIteminstance().longValue()) && loadedItem2.getItemmodule().equals("assign")) { //insert.setMaxGrade(loadedItem2.getGrademax()); break; } } else { this.logger.debug("Iteminstance or Itemmodule not found for AssignId" + loadedItem.getId() + " and type quiz and Iteminstance " + loadedItem2.getIteminstance() + " Itemmodule:" + loadedItem2.getItemmodule()); } } amTmp.put(insert.getId(), insert); } learningObjs.putAll(amTmp); for (final QuizLMS loadedItem : this.quizLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Quiz") && !this.oldLearningTypeMining.containsKey("Quiz")) { LearningType type = new LearningType(); type.setType("Quiz"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("08" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); //insert.setMaxGrade(loadedItem.getSumgrade()); insert.setType("Quiz", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Assessment"); learningObjs.put(insert.getId(), insert); } for (final ScormLMS loadedItem : this.scormLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Scorm") && !this.oldLearningTypeMining.containsKey("Scorm")) { LearningType type = new LearningType(); type.setType("Scorm"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("09" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); //insert.setMaxGrade(loadedItem.getMaxgrade()); insert.setType("Scorm", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Assessment"); learningObjs.put(insert.getId(), insert); } for (final ChatLMS loadedItem : this.chatLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Chat") && !this.oldLearningTypeMining.containsKey("Chat")) { LearningType type = new LearningType(); type.setType("Chat"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("04" + loadedItem.getId())); insert.setTitle(loadedItem.getTitle()); this.chatCourse.put(insert.getId(), loadedItem.getCourse()); insert.setType("Chat", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Collaboration"); learningObjs.put(insert.getId(), insert); } for (final ForumLMS loadedItem : this.forumLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Forum") && !this.oldLearningTypeMining.containsKey("Forum")) { LearningType type = new LearningType(); type.setType("Forum"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("05" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); insert.setType("Forum", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Collaboration"); learningObjs.put(insert.getId(), insert); } for (final WikiLMS loadedItem : this.wikiLms) { final LearningObj insert = new LearningObj(); if(!this.learningTypeMining.containsKey("Wiki") && !this.oldLearningTypeMining.containsKey("Wiki")) { LearningType type = new LearningType(); type.setType("Wiki"); type.setId(this.learningObjectTypeMax + 1 + this.learningTypeMining.size()); this.learningTypeMining.put(type.getType(), type); } insert.setId(Long.valueOf("06" + loadedItem.getId())); insert.setTitle(loadedItem.getName()); insert.setType("Wiki", this.learningTypeMining, this.oldLearningTypeMining); insert.setInteractionType("Collaboration"); learningObjs.put(insert.getId(), insert); } return learningObjs; } @Override public Map<Long, User> generateUsers() { final HashMap<Long, User> userMining = new HashMap<Long, User>(); for (final UserLMS loadedItem : this.userLms) { final User insert = new User(); insert.setId(loadedItem.getId()); insert.setLogin(Encoder.createMD5(loadedItem.getUsername())); userMining.put(insert.getId(), insert); } return userMining; } @Override public Map<Long, CourseAttribute> generateCourseAttributes() { for(CourseAttribute ca : this.oldCourseAttributeMining.values()) { if(ca.getAttribute().getName().equals("CourseLastRequest") && this.courseDetails.get(ca.getCourse()) != null && this.courseDetails.get(ca.getCourse()).getLastRequest() > Long.valueOf(ca.getValue())) { ca.setValue(this.courseDetails.get(ca.getCourse()).getLastRequest().toString()); this.courseAttributeMining.put(ca.getId(), ca); } if(ca.getAttribute().getName().equals("CourseFirstRequest") && this.courseDetails.get(ca.getCourse()) != null && this.courseDetails.get(ca.getCourse()).getFirstRequest() < Long.valueOf(ca.getValue())) { ca.setValue(this.courseDetails.get(ca.getCourse()).getFirstRequest().toString()); this.courseAttributeMining.put(ca.getId(), ca); } } if(this.oldCourseAttributeMining.isEmpty()) { for(CourseObject co :this.courseDetails.values()) { CourseAttribute ca = new CourseAttribute(); ca.setId(this.courseAttributeIdMax + 1); this.courseAttributeIdMax++; ca.setAttribute(this.attributeMining.get("CourseLastRequest")); ca.setCourse(this.courseMining.get(co.getId())); ca.setValue(co.getLastRequest().toString()); this.courseAttributeMining.put(ca.getId(), ca); CourseAttribute first= new CourseAttribute(); first.setId(this.courseAttributeIdMax + 1); this.courseAttributeIdMax++; first.setAttribute(this.attributeMining.get("CourseFirstRequest")); first.setCourse(this.courseMining.get(co.getId())); first.setValue(co.getFirstRequest().toString()); this.courseAttributeMining.put(first.getId(), first); } } return this.courseAttributeMining; } @Override public Map<Long, UserAttribute> generateUserAttributes() { return this.userAttributeMining; } @Override public Map<Long, LearningAttribute> generateLearningAttributes() { return this.learningAttributeMining; } @Override public Map<Long, CourseLearning> generateCourseLearnings() { Map<Long, CourseLearning> courseLearnings = new HashMap<Long, CourseLearning>(); for (final AssignLMS loadedItem : this.assignLms) { final CourseLearning insert = new CourseLearning(); insert.setId(loadedItem.getId()); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); if (insert.getCourse() == null) { this.logger.debug("course not found for course-assignment: " + loadedItem.getId() + " and course: " + loadedItem.getCourse()); } insert.setLearning(Long.valueOf("07" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final ScormLMS loadedItem : this.scormLms) { final CourseLearning insert = new CourseLearning(); insert.setId(loadedItem.getId()); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("09" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final QuizLMS loadedItem : this.quizLms) { final CourseLearning insert = new CourseLearning(); insert.setId(loadedItem.getId()); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("08" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final Entry<Long, Long> loadedItem : this.chatCourse.entrySet()) { final CourseLearning insert = new CourseLearning(); insert.setId(loadedItem.getKey()); insert.setCourse(loadedItem.getValue(), this.courseMining, this.oldCourseMining); insert.setLearning(loadedItem.getKey(), this.learningObjectMining, this.learningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final ForumLMS loadedItem : this.forumLms) { final CourseLearning insert = new CourseLearning(); insert.setId(loadedItem.getId()); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("05" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final WikiLMS loadedItem : this.wikiLms) { final CourseLearning insert = new CourseLearning(); insert.setId(loadedItem.getId()); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("06" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final ResourceLMS loadedItem : this.resourceLms) { final CourseLearning insert = new CourseLearning(); insert.setId(Long.valueOf("01" + loadedItem.getId())); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("01" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final UrlLMS loadedItem : this.urlLms) { final CourseLearning insert = new CourseLearning(); insert.setId(Long.valueOf("02" + loadedItem.getId())); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("02" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } for (final PageLMS loadedItem : this.pageLms) { final CourseLearning insert = new CourseLearning(); insert.setId(Long.valueOf("03" + loadedItem.getId())); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); insert.setLearning(Long.valueOf("03" + loadedItem.getId()), this.learningObjectMining, this.oldLearningObjectMining); if ((insert.getCourse() != null) && (insert.getLearning() != null)) { courseLearnings.put(insert.getId(), insert); } } return courseLearnings; } @Override public Map<Long, AccessLog> generateAccessLogs() { final HashMap<Long, AccessLog> accessLogMining = new HashMap<Long, AccessLog>(); // A HashMap of list of timestamps. Every key represents one user, the according value is a list of his/her // requests times. for (final LogLMS loadedItem : this.logLms) { final AccessLog insert = new AccessLog(); insert.setId(accessLogMining.size() + 1 + this.accessLogMax); insert.setTimestamp(loadedItem.getTime()); insert.setUser(loadedItem.getUserid(), this.userMining, this.oldUserMining); insert.setCourse(loadedItem.getCourse(), this.courseMining, this.oldCourseMining); if (loadedItem.getModule().equals("resource")) { if (loadedItem.getInfo().matches("[0-9]+")) { insert.setLearning(Long.valueOf("01" + loadedItem.getInfo()), this.learningObjectMining, this.oldLearningObjectMining); } if ((insert.getLearning() == null) && !(loadedItem.getAction().equals("view all"))) { this.logger.debug("In ResourceLogMining, resource not found for log: " + loadedItem.getId() + " and cmid: " + loadedItem.getCmid() + " and info: " + loadedItem.getInfo() + " and action: " + loadedItem.getAction()); } } if (loadedItem.getModule().equals("url")) { if (loadedItem.getInfo().matches("[0-9]+")) { insert.setLearning(Long.valueOf("02" + loadedItem.getInfo()), this.learningObjectMining, this.oldLearningObjectMining); } if ((insert.getLearning() == null) && !(loadedItem.getAction().equals("view all"))) { this.logger.debug("In ResourceLogMining, resource not found for log: " + loadedItem.getId() + " and cmid: " + loadedItem.getCmid() + " and info: " + loadedItem.getInfo() + " and action: " + loadedItem.getAction()); } } if (loadedItem.getModule().equals("page")) { if (loadedItem.getInfo().matches("[0-9]+")) { insert.setLearning(Long.valueOf("03" + loadedItem.getInfo()), this.learningObjectMining, this.oldLearningObjectMining); } if ((insert.getLearning() == null) && !(loadedItem.getAction().equals("view all"))) { this.logger.debug("In ResourceLogMining, resource not found for log: " + loadedItem.getId() + " and cmid: " + loadedItem.getCmid() + " and info: " + loadedItem.getInfo() + " and action: " + loadedItem.getAction()); } } if(!courseDetails.containsKey(insert.getCourse()) && insert.getCourse() != null){ CourseObject co = new CourseObject(); co.setId(insert.getCourse().getId()); co.setFirstRequest(insert.getTimestamp()); courseDetails.put(insert.getCourse(), co); } if(insert.getCourse() != null) courseDetails.get(insert.getCourse()).setLastRequest(insert.getTimestamp()); if(insert.getTimestamp() > maxLog) { maxLog = insert.getTimestamp(); } if ((insert.getCourse() != null) && (insert.getLearning() != null) && (insert.getUser() != null)) { accessLogMining.put(insert.getId(), insert); } } return accessLogMining; } @Override public Map<String, Attribute> generateAttributes() { if(!this.oldAttributeMining.containsKey("CourseLastRequest") && !this.attributeMining.containsKey("CourseLastRequest")) { Attribute attribute = new Attribute(); attribute.setId(this.attributeIdMax + 1); this.attributeIdMax++; attribute.setName("CourseLastRequest"); this.attributeMining.put("CourseLastRequest", attribute); } if(!this.oldAttributeMining.containsKey("CourseFirstRequest") && !this.attributeMining.containsKey("CourseFirstRequest")) { Attribute attribute = new Attribute(); attribute.setId(this.attributeIdMax + 1); this.attributeIdMax++; attribute.setName("CourseFirstRequest"); this.attributeMining.put("CourseFirstRequest", attribute); } return this.attributeMining; } }