Package org.cast.isi.service

Source Code of org.cast.isi.service.ISIResponseService

/*
* Copyright 2011 CAST, Inc.
*
* This file is part of the UDL Curriculum Toolkit:
* see <http://code.google.com/p/udl-curriculum-toolkit>.
*
* The UDL Curriculum Toolkit is free software: you can redistribute and/or
* modify it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* The UDL Curriculum Toolkit 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this software.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.cast.isi.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import net.databinder.hib.Databinder;
import net.databinder.models.hib.HibernateListModel;
import net.databinder.models.hib.HibernateObjectModel;

import org.apache.wicket.Application;
import org.apache.wicket.Page;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.util.ListModel;
import org.cast.cwm.CwmApplication;
import org.cast.cwm.data.Period;
import org.cast.cwm.data.Prompt;
import org.cast.cwm.data.Response;
import org.cast.cwm.data.ResponseData;
import org.cast.cwm.data.User;
import org.cast.cwm.data.models.PromptModel;
import org.cast.cwm.data.models.UserModel;
import org.cast.cwm.service.IEventService;
import org.cast.cwm.service.ResponseService;
import org.cast.cwm.xml.XmlSection;
import org.cast.isi.ISISession;
import org.cast.isi.ISIXmlSection;
import org.cast.isi.data.ClassMessage;
import org.cast.isi.data.ContentElement;
import org.cast.isi.data.ContentLoc;
import org.cast.isi.data.FeedbackMessage;
import org.cast.isi.data.ISIEvent;
import org.cast.isi.data.ISIPrompt;
import org.cast.isi.data.ISIResponse;
import org.cast.isi.data.PromptType;
import org.cast.isi.data.StudentFlag;
import org.cast.isi.data.builder.ISIResponseCriteriaBuilder;
import org.cast.isi.page.ISIBasePage;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Inject;


/**
* Methods for teacher administrative duties: Flagging students, creating class messages, etc.
*
* TODO: Many of these methods should be swapped to cwm-data standards or removed.
* @author jbrookover
*
*/
public class ISIResponseService extends ResponseService implements IISIResponseService {
 
  @SuppressWarnings("unused")
  private static final Logger log = LoggerFactory.getLogger(ISIResponseService.class);
 
  @Inject
  private IEventService eventService;

  protected ISIResponseService() {/* Protected Constructor - use injection */}
 
  public static ISIResponseService get() {
    return (ISIResponseService) ResponseService.get();
  }
 
  /**
   * Use this Service class.  Called in {@link Application#init()}.
   */
  public static void useAsServiceInstance() {
    ResponseService.instance = new ISIResponseService();
  }
   
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreatePrompt(org.cast.isi.data.PromptType)
   */
  public IModel<Prompt> getOrCreatePrompt(PromptType type) {
    return genericGetOrCreatePrompt(type, null, null, null, null, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreatePrompt(org.cast.isi.data.PromptType, java.lang.String)
   */
  public IModel<Prompt> getOrCreatePrompt(PromptType type, String identifier) {
    return genericGetOrCreatePrompt(type, null, null, null, identifier, null);
  }
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreatePrompt(org.cast.isi.data.PromptType, org.cast.isi.data.ContentLoc)
   */
  public IModel<Prompt> getOrCreatePrompt(PromptType type, ContentLoc loc) {
    return genericGetOrCreatePrompt(type, loc, null, null, null, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreatePrompt(org.cast.isi.data.PromptType, org.cast.isi.data.ContentLoc, java.lang.String)
   */
  public IModel<Prompt> getOrCreatePrompt(PromptType type, ContentLoc loc, String xmlId) {
    return genericGetOrCreatePrompt(type, loc, xmlId, null, null, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreatePrompt(org.cast.isi.data.PromptType, org.apache.wicket.model.IModel)
   */
  public IModel<Prompt> getOrCreatePrompt(PromptType type, IModel<User> targetUser) {
    return genericGetOrCreatePrompt(type, null, null, targetUser, null, null);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreatePrompt(org.cast.isi.data.PromptType, org.apache.wicket.model.IModel, java.lang.String)
   */
  public IModel<Prompt> getOrCreatePrompt(PromptType type, IModel<User> targetUser, String identifier) {
    return genericGetOrCreatePrompt(type, null, null, targetUser, identifier, null);
  }

 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreatePrompt(org.cast.isi.data.PromptType, org.cast.isi.data.ContentLoc, java.lang.String, java.lang.String)
   */
  public IModel<Prompt> getOrCreatePrompt(PromptType type, ContentLoc loc, String xmlId, String collectionName) {
    return genericGetOrCreatePrompt(type, loc, xmlId, null, null, collectionName);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreateHighlightPrompt(org.cast.isi.data.PromptType, org.cast.isi.data.ContentLoc, java.lang.String)
   */
  public IModel<Prompt> getOrCreateHighlightPrompt(PromptType highlightlabel, ContentLoc loc, String color) {
    return genericGetOrCreatePrompt(highlightlabel, loc, null, null, color, null);
  }

 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#genericGetOrCreatePrompt(org.cast.isi.data.PromptType, org.cast.isi.data.ContentLoc, java.lang.String, org.apache.wicket.model.IModel, java.lang.String, java.lang.String)
   */
  public synchronized IModel<Prompt> genericGetOrCreatePrompt(PromptType type, ContentLoc loc, String xmlId, IModel<User> targetUser, String identifier, String collectionName) {

    //TODO: Do we need this for other fields?
    if ("".equals(collectionName))
      collectionName = null;

    IModel<ContentElement> ce = getOrCreateContentElement(loc, xmlId);
   
    Criteria c = Databinder.getHibernateSession().createCriteria(ISIPrompt.class)
    .add(Restrictions.eq("type", type))
    .setCacheable(true);
   
    if (ce != null)
      c.add(Restrictions.eq("contentElement", ce.getObject()));
    else
      c.add(Restrictions.isNull("contentElement"));

    if (targetUser != null)
      c.add(Restrictions.eq("targetUser", targetUser.getObject()));
    else
      c.add(Restrictions.isNull("targetUser"));

    if (identifier != null)
      c.add(Restrictions.eq("identifier", identifier));
    else
      c.add(Restrictions.isNull("identifier"));

    if (collectionName != null)
      c.add(Restrictions.eq("collectionName", collectionName));
    else
      c.add(Restrictions.isNull("collectionName"));

    ISIPrompt p = (ISIPrompt) c.uniqueResult();

    // If it doesn't exist, create it
    if (p == null) {
      p = new ISIPrompt(type);
      if (ce != null)
        p.setContentElement(ce.getObject());
      if (targetUser != null)
        p.setTargetUser(targetUser.getObject());
      if (identifier != null)
        p.setIdentifier(identifier);
      if (collectionName != null) {
        p.setCollectionName(collectionName);
      }
      Databinder.getHibernateSession().save(p)
    }
   
    cwmService.flushChanges();
   
    return new PromptModel(p);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreateContentElement(org.cast.isi.data.ContentLoc)
   */
  public IModel<ContentElement> getOrCreateContentElement(ContentLoc loc) {
    return getOrCreateContentElement(loc, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getOrCreateContentElement(org.cast.isi.data.ContentLoc, java.lang.String)
   */
  public synchronized IModel<ContentElement> getOrCreateContentElement(ContentLoc loc, String xmlId) {
   
    if (loc == null)
      return null;
 
    Criteria c = Databinder.getHibernateSession().createCriteria(ContentElement.class)
    .add(Restrictions.eq("contentLocation", loc.getLocation()))
    .setCacheable(true);
   
    if (xmlId != null) {
      c.add(Restrictions.eq("xmlId", xmlId));
    } else {
      c.add(Restrictions.isNull("xmlId"));
    }
   
    ContentElement e = (ContentElement) c.uniqueResult();

    // If it doesn't exist, create it
    if (e == null) {
      e = new ContentElement(loc);
      if (xmlId != null)
        e.setXmlId(xmlId);
      Databinder.getHibernateSession().save(e)
    }
    cwmService.flushChanges();
   
    return new HibernateObjectModel<ContentElement>(e);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#newPageHighlightsLabel(org.apache.wicket.model.IModel, org.apache.wicket.model.IModel)
   */
  public IModel<Response> newPageHighlightsLabel(IModel<User> user, IModel<ISIPrompt> prompt) {
    return super.newResponse(user, CwmApplication.get().getResponseType("TEXT"), prompt);
  }

 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#saveSingleSelectResponse(org.apache.wicket.model.IModel, java.lang.String, boolean, java.lang.String)
   */
  public void saveSingleSelectResponse(IModel<Response> mResponse, String text, boolean correct, String pageName) {
    Response r = mResponse.getObject();
    int score = correct ? 1 : 0;
    // Number of tries counts up until a correct response is recorded, then stops.
    if (!r.isCorrect()) {
      Set<ResponseData> previousResponses = r.getAllResponseData();
      r.setTries(previousResponses==null ? 1 : previousResponses.size()+1);
    }
    // New score is recorded if it is better than previous tries
    if (r.getScore()==null || score > r.getScore())
      r.setScore(score);
    // Multiple choice always has total points = 1
    r.setTotal(1);
    super.genericSaveResponse(mResponse, text, score, 1, 1, null, pageName);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#newSingleSelectResponse(org.apache.wicket.model.IModel, org.apache.wicket.model.IModel)
   */
  public IModel<Response> newSingleSelectResponse(IModel<User> user, IModel<Prompt> model) {
    return super.newResponse(user, CwmApplication.get().getResponseType("SINGLE_SELECT"), model);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#saveHighlighterLabel(org.apache.wicket.model.IModel, java.lang.String)
   */ 
  public void saveHighlighterLabel(IModel<Response> response, String label) {
    super.saveTextResponse(response, label, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#setClassMessage(org.apache.wicket.model.IModel, java.lang.String)
   */
  public void setClassMessage(IModel<Period> mPeriod, String s) {
   
    Period p = mPeriod.getObject();
   
    ClassMessage m = new ClassMessage();
    m.setTimestamp(new Date());
    m.setPeriod(p);
    m.setCurrent(true);
    m.setMessage(s);
    m.setAuthor(ISISession.get().getUser());
   
    ClassMessage old = getClassMessage(mPeriod);
    if (old != null) {
      old.setCurrent(false);
    }
    Databinder.getHibernateSession().save(m);
    cwmService.flushChanges();
    eventService.saveEvent("classmessage:create", "Period Id: " + p.getId() + " Message Id: " + m.getId(), null);   
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getClassMessage(org.apache.wicket.model.IModel)
   */
  public ClassMessage getClassMessage(IModel<Period> p) {
    Query q = Databinder.getHibernateSession().getNamedQuery("ClassMessage.queryByPeriod");
    q.setParameter("period", p.getObject());
    q.setCacheable(true);
    ClassMessage m = (ClassMessage) q.uniqueResult();
    // Databinder.getHibernateSession().evict(m);
    // TODO: test without evict
    return m;
  }
 
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#deleteClassMessage(org.apache.wicket.model.IModel)
   */
  public void deleteClassMessage(IModel<Period> mPeriod) {
   
    Period p = mPeriod.getObject();
    ClassMessage m = getClassMessage(mPeriod);
    if (m != null) {
      m.setCurrent(false);
      cwmService.flushChanges();
      eventService.saveEvent("classmessage:delete", "Period Id: " + p.getId() + " Message Id: " + m.getId(), null);
    }
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#findLatestMatchingEvent(org.cast.cwm.data.User, java.lang.String)
   */
  public ISIEvent findLatestMatchingEvent (User person, String type) {
    Session s = Databinder.getHibernateSession();
    return (ISIEvent) s.createCriteria(ISIEvent.class)
      .add(Restrictions.eq("user", person))
      .add(Restrictions.eq("type", type))
      .addOrder(Order.desc("insertTime"))
      .setMaxResults(1)
      .uniqueResult();
  }

 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#toggleFlag(org.cast.cwm.data.User, org.cast.cwm.data.Period)
   */
  public void toggleFlag(User person, Period period) {
    Query q;
    String note;
    if (period != null) {
      q = Databinder.getHibernateSession().getNamedQuery("StudentFlag.queryByPeriodAndFlaggerAndFlagee");
      q.setParameter("period", period);
    } else {
      q = Databinder.getHibernateSession().getNamedQuery("StudentFlag.queryByFlaggerAndFlagee");
    }
    q.setParameter("flagee", person);
    q.setParameter("flagger", ISISession.get().getUser());
    StudentFlag f = (StudentFlag) q.uniqueResult();
    // Databinder.getHibernateSession().evict(f);
    Session session = Databinder.getHibernateSession();
    if (f == null) { // Create Flag
      f = new StudentFlag();
      f.setFlagee(person);
      f.setFlagger(ISISession.get().getUser());
      if (period != null)
        f.setPeriod(period);
      f.setTimestamp(new Date());
      session.save(f);
      note = "on";
    } else { // Delete Flag
      session.delete(f);
      note = "off";
    }
    cwmService.flushChanges();
    eventService.saveEvent("flag", note, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#toggleFlag(org.cast.cwm.data.User)
   */
  public void toggleFlag(User person) {
    toggleFlag(person, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#isFlagged(org.cast.cwm.data.User, org.cast.cwm.data.Period)
   */
  public boolean isFlagged(User person, Period period) {
    Query q;
    if (period != null) {
      q = Databinder.getHibernateSession().getNamedQuery("StudentFlag.queryByPeriodAndFlaggerAndFlagee");
      q.setParameter("period", period);
    } else {
      q = Databinder.getHibernateSession().getNamedQuery("StudentFlag.queryByFlaggerAndFlagee");
    }
    q.setParameter("flagee", person);
    q.setParameter("flagger", ISISession.get().getUser());
    q.setCacheable(true);
    StudentFlag f = (StudentFlag) q.uniqueResult();
    // Databinder.getHibernateSession().evict(f);
    if (f == null) {
      return false;
    } else {
      return true;
    }
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#isFlagged(org.cast.cwm.data.User)
   */
  public boolean isFlagged(User person) {
    return isFlagged(person, null);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getAllFlags()
   */
  @SuppressWarnings("unchecked")
  public List<StudentFlag> getAllFlags () {
    Query q = Databinder.getHibernateSession().getNamedQuery("StudentFlag.queryByFlagger");
    q.setParameter("flagger", ISISession.get().getUser());
    q.setCacheable(true);
    return q.list();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getFeedbackMessages(org.apache.wicket.model.IModel<org.cast.cwm.data.Prompt>, org.cast.cwm.data.User)
   */
  @SuppressWarnings("unchecked")
  public List<FeedbackMessage> getFeedbackMessages(IModel<Prompt> promptM, User student) {
    // FIXME needs to query by prompt
    Query q = Databinder.getHibernateSession().getNamedQuery("FeedbackMessage.getAllMessagesByPromptAndStudent");
    q.setParameter("prompt", promptM.getObject());
    q.setParameter("student", student);
    q.setCacheable(true);
    return q.list();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#deleteFeedbackMessage(org.apache.wicket.model.IModel)
   */
  public void deleteFeedbackMessage(IModel<FeedbackMessage> mFeedbackMessage) {
    FeedbackMessage feedbackMessage = mFeedbackMessage.getObject();
    feedbackMessage.setVisible(false);
    Databinder.getHibernateSession().update(feedbackMessage);
    cwmService.flushChanges();
    eventService.saveEvent("feedback:delete", "Message Id: " + feedbackMessage.getId(), null);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#updateFeedbackMessage(org.apache.wicket.model.IModel, org.apache.wicket.Page)
   */
  public void updateFeedbackMessage(IModel<FeedbackMessage> mFeedbackMessage, Page page) {
    FeedbackMessage feedbackMessage = mFeedbackMessage.getObject();
    Databinder.getHibernateSession().update(feedbackMessage);
    cwmService.flushChanges();
    String pageName = page instanceof ISIBasePage ? ((ISIBasePage)page).getPageName() : null;
    eventService.saveEvent("message:view", "Message Id: " + String.valueOf(feedbackMessage.getId()), pageName);
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getTeacherNotes(org.apache.wicket.model.IModel)
   */
  @SuppressWarnings("unchecked")
  public List<ISIPrompt> getTeacherNotes(IModel<User> teacher) {
    Criteria promptCriteria = Databinder.getHibernateSession()
      .createCriteria(ISIPrompt.class)
      .createAlias("responses", "r")
        .add(Restrictions.eq("type", PromptType.TEACHER_NOTES))
      .add(Restrictions.eq("r.user", teacher.getObject()))
      .add(Restrictions.eq("r.valid", true))
      .setCacheable(true)
      .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return promptCriteria.list();
  }

 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getPagesWithNotes(org.cast.cwm.data.User, boolean)
   */
  @SuppressWarnings("unchecked")
  public List<String> getPagesWithNotes(User student, boolean isUnread) {
    Query q = Databinder.getHibernateSession().getNamedQuery("FeedbackMessage.getPagesWithNotesByStudentAndUnreadStatus");
    q.setParameter("student", student);
    q.setParameter("isUnread", isUnread);
    q.setParameter("role", ISISession.get().getUser().getRole());
    q.setCacheable(true);
    return q.list();
  }

 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getPagesWithNotes(org.cast.cwm.data.User)
   */
  @SuppressWarnings("unchecked")
  public List<String> getPagesWithNotes(User student) {
    Query q = Databinder.getHibernateSession().getNamedQuery("FeedbackMessage.getPagesWithNotesByStudent");
    q.setParameter("student", student);
    q.setCacheable(true);
    return q.list();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getNotesForPage(org.cast.cwm.data.User, java.lang.String)
   */
  @SuppressWarnings("unchecked")
  public List<FeedbackMessage> getNotesForPage(User student, String loc) {
    Query q = Databinder.getHibernateSession().getNamedQuery("FeedbackMessage.getNotesForPage");
    q.setParameter("student", student);
    q.setParameter("loc", loc);
    q.setCacheable(true);
    return q.list();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#locationOfFirstUnreadMessage(org.cast.cwm.data.User, org.cast.isi.ISIXmlSection)
   */
  public String locationOfFirstUnreadMessage(User student, ISIXmlSection sec) {
    List<String> locations = new ArrayList<String>();
    if (sec.hasChildren()) {
      for (XmlSection sec3 : sec.getChildren()) {
        locations.add((new ContentLoc(sec3)).getLocation());
      }
    } else {
      locations.add(new ContentLoc(sec).getLocation());
    }
    Query q = Databinder.getHibernateSession().getNamedQuery("FeedbackMessage.getFirstUnreadMessageByStudentAndSection");
    q.setParameter("student", student);
    q.setParameterList("locationList", locations);
    q.setMaxResults(1);
    q.setCacheable(true);
    if (q.list().isEmpty())
      return null;
    FeedbackMessage m = (FeedbackMessage) q.list().get(0);
    return m.getLocation();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getAllNotebookResponsesByStudent(org.apache.wicket.model.IModel<org.cast.cwm.data.User>)
   */
  public IModel<List<ISIResponse>> getAllNotebookResponsesByStudent (IModel<User> student) {
    ISIResponseCriteriaBuilder builder = new ISIResponseCriteriaBuilder();
    builder.setUserModel(student);
    builder.setInNotebook(true);
    builder.setOrderByNotebookInsert(true);
    // TODO: Extend ResponseListModel?  How do you resolve the return type of Response vs. ISIResponse?
    return new HibernateListModel<ISIResponse>(ISIResponse.class, builder);
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getAllWhiteboardResponses()
   */
  @SuppressWarnings("unchecked")
  public List<ISIResponse> getAllWhiteboardResponses() {
    Query q = Databinder.getHibernateSession().getNamedQuery("ISIResponse.getAllWhiteboardResponses");
    q.setCacheable(true);
    return q.list();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getWhiteboardResponsesByPeriod(org.cast.cwm.data.Period)
   */
  @SuppressWarnings("unchecked")
  public List<ISIResponse> getWhiteboardResponsesByPeriod(Period p) {
    Query q = Databinder.getHibernateSession().getNamedQuery("ISIResponse.getPeriodWhiteboardResponses");
    q.setParameter("period", p);
    q.setCacheable(true);
    return q.list();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#clearWhiteboardForPeriod(org.cast.cwm.data.Period)
   */
  public void clearWhiteboardForPeriod(Period p) {
    List<ISIResponse> list = getWhiteboardResponsesByPeriod(p);
    for (ISIResponse r : list) {
      r.setInWhiteboard(false);
      r.setWhiteboardInsertTime(null);
    }
    eventService.saveEvent("whiteboard:clear", "Period: "+p.getId(), null);
    cwmService.flushChanges();
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#addToWhiteboard(org.cast.isi.data.ISIResponse, org.apache.wicket.Page)
   */
  public void addToWhiteboard(ISIResponse resp, Page page) {
    resp.setInWhiteboard(true);
    resp.setWhiteboardInsertTime(new Date());
    String pageName = page instanceof ISIBasePage ? ((ISIBasePage)page).getPageName() : null;
    eventService.saveEvent("whiteboard:add", String.valueOf(resp.getId()), pageName);
    cwmService.flushChanges();
  }
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#removeFromWhiteboard(org.cast.isi.data.ISIResponse, org.apache.wicket.Page)
   */
  public void removeFromWhiteboard(ISIResponse resp, Page page) {
    resp.setInWhiteboard(false);
    resp.setWhiteboardInsertTime(null);
    String pageName = page instanceof ISIBasePage ? ((ISIBasePage)page).getPageName() : null;
    eventService.saveEvent("whiteboard:remove", String.valueOf(resp.getId()), pageName);
    cwmService.flushChanges();
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#addToNotebook(org.cast.isi.data.ISIResponse, org.apache.wicket.Page)
   */
  public void addToNotebook(ISIResponse resp, Page page) {
    resp.setInNotebook(true);
    resp.setNotebookInsertTime(new Date());
    String pageName = page instanceof ISIBasePage ? ((ISIBasePage)page).getPageName() : null;
    eventService.saveEvent("notebook:add", String.valueOf(resp.getId()), pageName);
    cwmService.flushChanges();
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#removeFromNotebook(org.cast.isi.data.ISIResponse, org.apache.wicket.Page)
   */
  public void removeFromNotebook(ISIResponse resp, Page page) {
    resp.setInNotebook(false);
    resp.setNotebookInsertTime(null);
    String pageName = page instanceof ISIBasePage ? ((ISIBasePage)page).getPageName() : null;
    eventService.saveEvent("notebook:remove", String.valueOf(resp.getId()), pageName);
    cwmService.flushChanges();
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getResponseCollectionNames(org.apache.wicket.model.IModel<org.cast.cwm.data.User>)
   */

  @SuppressWarnings("unchecked")
  public List<String> getResponseCollectionNames(IModel<User> mUser) {
    Query q = Databinder.getHibernateSession().createQuery("select distinct(p.collectionName) " +
        "from ISIPrompt p join p.responses r where p.collectionName is not null and r.valid='true' and r.user.id=:userId");
    q.setLong("userId", mUser.getObject().getId());
    q.setCacheable(true);
    return q.list();
  }

 
  /**
   * Generate the prompts for this user's responseCollections
   * @param mUser
   * @return
   */
  @SuppressWarnings("unchecked")
  public List<ISIPrompt> getResponseCollectionNamePrompts(IModel<User> mUser) {
 
    Query q = Databinder.getHibernateSession().createQuery("select p " +
        "from ISIPrompt p join p.responses r where p.collectionName is not null and p.collectionName!='' and r.valid='true' and r.user.id=:userId");
    q.setLong("userId", mUser.getObject().getId());
    q.setCacheable(true);
    return q.list();
  }
 
 
  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getResponseCollectionPrompts(org.apache.wicket.model.IModel<org.cast.cwm.data.User>, java.lang.String)
   */
  @SuppressWarnings("unchecked")
  public List<ISIPrompt> getResponseCollectionPrompts(IModel<User> mUser, String collectionName) {
    Criteria promptCriteria = Databinder.getHibernateSession()
      .createCriteria(ISIPrompt.class)
      .createAlias("responses", "r")
        .add(Restrictions.eq("collectionName", collectionName))
      .add(Restrictions.eq("r.user", mUser.getObject()))
      .add(Restrictions.eq("r.valid", true))
      .setCacheable(true)
      .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return promptCriteria.list();
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getAllResponsesForPromptByStudent(org.apache.wicket.model.IModel<org.cast.cwm.data.Prompt>, org.apache.wicket.model.IModel<org.cast.cwm.data.User>)
   */
  @SuppressWarnings("unchecked")
  public List<ISIResponse> getAllResponsesForPromptByStudent(
      IModel<Prompt> mPrompt, IModel<User> mUser) {
    Criteria criteria = Databinder.getHibernateSession()
        .createCriteria(ISIResponse.class)
        .add(Restrictions.eq("prompt", mPrompt.getObject()))
        .add(Restrictions.eq("user", mUser.getObject()))
        .add(Restrictions.eq("valid", true))
        .setCacheable(true)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return criteria.list();
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#getAllResponsesForCollectionByStudent(String, org.apache.wicket.model.IModel<org.cast.cwm.data.User>)
   */
  @SuppressWarnings("unchecked")
  public IModel<List<ISIResponse>> getAllResponsesForCollectionByStudent(
      String collectionName, UserModel mUser) {
    Criteria criteria = Databinder.getHibernateSession()
        .createCriteria(ISIResponse.class)
        .createAlias("prompt", "p")
        .add(Restrictions.eq("p.collectionName", collectionName))
        .add(Restrictions.eq("user", mUser.getObject()))
        .add(Restrictions.eq("valid", true))
        .setCacheable(true)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return new ListModel<ISIResponse>(criteria.list());
  }

  /* (non-Javadoc)
   * @see org.cast.isi.service.IISIResponseService#gePeriodResponsesForPrompt(org.apache.wicket.model.IModel<org.cast.isi.data.ISIPrompt>,org.apache.wicket.model.IModel<org.cast.cwm.data.Period>)
   */
  @SuppressWarnings("unchecked")
  public IModel<List<ISIResponse>> getPeriodResponsesForPrompt(IModel<Prompt> mPrompt, IModel<Period> mPeriod) {
    Criteria criteria = Databinder.getHibernateSession()
        .createCriteria(ISIResponse.class)
        .createAlias("user", "user")
        .createAlias("user.periods", "p" )
        .add(Restrictions.eq("p.id", mPeriod.getObject().getId()))
        .add(Restrictions.eq("prompt", mPrompt.getObject()))
        .add(Restrictions.eq("valid", true))
        .setCacheable(true)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return new ListModel<ISIResponse>(criteria.list());
  }

}
TOP

Related Classes of org.cast.isi.service.ISIResponseService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.