/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/edu-services/trunk/sections-service/sections-impl/standalone/src/java/org/sakaiproject/component/section/SectionAwarenessHibernateImpl.java $ * $Id: SectionAwarenessHibernateImpl.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2005, 2006, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.component.section; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.section.api.SectionAwareness; import org.sakaiproject.section.api.coursemanagement.Course; import org.sakaiproject.section.api.coursemanagement.CourseSection; import org.sakaiproject.section.api.coursemanagement.ParticipationRecord; import org.sakaiproject.section.api.coursemanagement.User; import org.sakaiproject.section.api.facade.Role; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * Hibernate based implementation of SectionAwareness. * * @author <a href="mailto:jholtzman@berkeley.edu">Josh Holtzman</a> * */ public class SectionAwarenessHibernateImpl extends HibernateDaoSupport implements SectionAwareness { private static final Log log = LogFactory.getLog(SectionAwarenessHibernateImpl.class); /** * @inheritDoc */ public List getSections(final String siteContext) { if(log.isDebugEnabled()) log.debug("Getting sections for context " + siteContext); HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { // Get the sections Query secQuery = session.getNamedQuery("findSectionsBySiteContext"); secQuery.setParameter("context", siteContext); List list = secQuery.list(); // Get the teams Query teamQuery = session.getNamedQuery("findTeamsBySiteContext"); teamQuery.setParameter("context", siteContext); // Add the teams after the sections list.addAll(teamQuery.list()); return list; } }; return getHibernateTemplate().executeFind(hc); } /** * @inheritDoc */ public List getSectionCategories(String siteContext) { ResourceBundle bundle = ResourceBundle.getBundle(SectionManagerHibernateImpl.CATEGORY_BUNDLE, Locale.US); Enumeration keys = bundle.getKeys(); List categoryIds = new ArrayList(); while(keys.hasMoreElements()) { categoryIds.add(keys.nextElement()); } Collections.sort(categoryIds); return categoryIds; } /** * @inheritDoc */ public CourseSection getSection(final String sectionUuid) { if(log.isDebugEnabled()) log.debug("Getting section with uuid=" + sectionUuid); HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { return getSection(sectionUuid, session); } }; return (CourseSection)getHibernateTemplate().execute(hc); } private CourseSection getSection(final String sectionUuid, Session session) throws HibernateException { Query q = session.getNamedQuery("loadSectionByUuid"); q.setParameter("uuid", sectionUuid); Object section = q.uniqueResult(); if(section == null) { throw new IllegalArgumentException("No section exists with uuid=" + sectionUuid); } else { return (CourseSection)section; } } /** * @inheritDoc */ public List getSiteMembersInRole(final String siteContext, final Role role) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { Course course = getCourse(siteContext, session); if(course == null) { if(log.isInfoEnabled()) log.info("No course founf for siteContext " + siteContext); return new ArrayList(); } Query q; if(role.isInstructor()) { q = session.getNamedQuery("findSiteInstructors"); } else if(role.isStudent()) { q = session.getNamedQuery("findSiteEnrollments"); } else if(role.isTeachingAssistant()) { q = session.getNamedQuery("findSiteTAs"); } else { throw new IllegalArgumentException("There are no users without a role in a site."); } q.setParameter("course", course); return q.list(); } }; return getHibernateTemplate().executeFind(hc); } private Course getCourse(String siteContext, Session session) throws HibernateException { Query q = session.getNamedQuery("loadCourseBySiteContext"); q.setParameter("siteContext", siteContext); Object course = q.uniqueResult(); return (Course)course; } /** * The sakai implementation will not use the database to do this kind of searching, * so I'll skip doing optimizations here. * * @inheritDoc */ public List findSiteMembersInRole(final String siteContext, final Role role, final String pattern) { List fullList = getSiteMembersInRole(siteContext, role); List filteredList = new ArrayList(); for(Iterator iter = fullList.iterator(); iter.hasNext();) { ParticipationRecord record = (ParticipationRecord)iter.next(); User user = record.getUser(); if(user.getDisplayName().toLowerCase().startsWith(pattern.toLowerCase()) || user.getSortName().toLowerCase().startsWith(pattern.toLowerCase()) || user.getDisplayId().toLowerCase().startsWith(pattern.toLowerCase())) { filteredList.add(record); } } return filteredList; } /** * @inheritDoc */ public boolean isSiteMemberInRole(final String siteContext, final String userUid, final Role role) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { Course course = getCourse(siteContext, session); if(course == null) { if(log.isInfoEnabled()) log.info("No course founf for siteContext " + siteContext); return Boolean.valueOf(false); } Query q = session.getNamedQuery("checkForSiteMembershipInRole"); q.setParameter("course", course); q.setParameter("userUid", userUid); List list = q.list(); return checkRole(role, list); } }; return ((Boolean)getHibernateTemplate().execute(hc)).booleanValue(); } /** * This code pops up a few places... * * @param role The role to check * @param list A list of participant records returned by hibernate * @return Whether the list of participation record includes one record of * the specified role. */ private Boolean checkRole(final Role role, List list) { if(list.size() == 1) { ParticipationRecord record = (ParticipationRecord)list.get(0); if(record.getRole().equals(role)) { if(log.isDebugEnabled()) log.debug("This user is in role " + role.getDescription()); return Boolean.valueOf(true); } else { if(log.isDebugEnabled()) log.debug("This user is not in role " + role.getDescription()); return Boolean.valueOf(false); } } else if(list.size() == 0){ if(log.isDebugEnabled()) log.debug("This user has no role in this learning context."); return Boolean.valueOf(false); } else { throw new RuntimeException("There are multiple participation records for this user in this learning context."); } } /** * @inheritDoc */ public List getSectionMembers(final String sectionUuid) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { Query q = session.getNamedQuery("findSectionMembers"); q.setParameter("sectionUuid", sectionUuid); return q.list(); } }; return getHibernateTemplate().executeFind(hc); } /** * @inheritDoc */ public List getSectionMembersInRole(final String sectionUuid, final Role role) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { CourseSection section = getSection(sectionUuid, session); Query q; if(role.isInstructor()) { q = session.getNamedQuery("findSectionInstructors"); } else if(role.isStudent()) { q = session.getNamedQuery("findSectionStudents"); } else if(role.isTeachingAssistant()) { q = session.getNamedQuery("findSectionTAs"); } else { throw new IllegalArgumentException("There are no users without a role in a section."); } q.setParameter("section", section); return q.list(); } }; return getHibernateTemplate().executeFind(hc); } /** * @inheritDoc */ public boolean isSectionMemberInRole(final String sectionUuid, final String userUid, final Role role) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { CourseSection section = getSection(sectionUuid, session); Query q = session.getNamedQuery("checkForSectionMembershipInRole"); q.setParameter("section", section); q.setParameter("userUid", userUid); List list = q.list(); return checkRole(role, list); } }; return ((Boolean)getHibernateTemplate().execute(hc)).booleanValue(); } /** * @inheritDoc */ public String getSectionName(final String sectionUuid) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { Query q = session.getNamedQuery("loadSectionName"); q.setParameter("sectionUuid", sectionUuid); Object name = q.uniqueResult(); if(name != null) { if(log.isDebugEnabled()) log.debug("Section " + sectionUuid + " does not exist."); } return name; } }; return (String)getHibernateTemplate().execute(hc); } /** * @inheritDoc */ public String getSectionCategory(final String sectionUuid) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { Query q = session.getNamedQuery("loadSectionCategory"); q.setParameter("sectionUuid", sectionUuid); Object category = q.uniqueResult(); if(category == null) { if(log.isDebugEnabled()) log.debug("Section " + sectionUuid + " does not exist."); } return category; } }; return (String)getHibernateTemplate().execute(hc); } /** * @inheritDoc */ public List getSectionsInCategory(final String siteContext, final String categoryId) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { Query q = session.getNamedQuery("findSectionsByCategory"); q.setParameter("categoryId", categoryId); q.setParameter("siteContext", siteContext); return q.list(); } }; return getHibernateTemplate().executeFind(hc); } /** * @inheritDoc */ public String getCategoryName(String categoryId, Locale locale) { ResourceBundle bundle = ResourceBundle.getBundle(SectionManagerHibernateImpl.CATEGORY_BUNDLE, locale); String name; try { name = bundle.getString(categoryId); } catch(MissingResourceException mre) { if(log.isInfoEnabled()) log.info("Could not find the name for category id = " + categoryId + " in locale " + locale.getDisplayName()); name = null; } return name; } /** * @inheritDoc */ public List getUnassignedMembersInRole(final String siteContext, final Role role) { HibernateCallback hc = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException { Course course = getCourse(siteContext, session); Query q; if(role.isStudent()) { q = session.getNamedQuery("findUnsectionedStudents"); } else if (role.isTeachingAssistant()) { q = session.getNamedQuery("findUnsectionedTas"); } else { if(log.isInfoEnabled()) log.info(role + " is never assigned to sections, so unsectioned members is empty."); return new ArrayList(); } q.setParameter("courseUuid", course.getUuid()); return q.list(); } }; return getHibernateTemplate().executeFind(hc); } }