Index: lams_build/lib/lams/lams-central.jar
===================================================================
RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams-central.jar,v
diff -u -r1.84 -r1.85
Binary files differ
Index: lams_build/lib/lams/lams.jar
===================================================================
RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams.jar,v
diff -u -r1.445 -r1.446
Binary files differ
Index: lams_central/src/java/org/lamsfoundation/lams/rest/RestTags.java
===================================================================
RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/rest/RestTags.java,v
diff -u -r1.1 -r1.2
--- lams_central/src/java/org/lamsfoundation/lams/rest/RestTags.java 2 May 2015 10:37:17 -0000 1.1
+++ lams_central/src/java/org/lamsfoundation/lams/rest/RestTags.java 21 May 2015 23:39:24 -0000 1.2
@@ -52,6 +52,8 @@
public static String SUBMISSION_DEADLINE = "submissionDeadline";
public static String ALLOW_RICH_TEXT_EDITOR = "allowRichEditor";
public static String USE_SELECT_LEADER_TOOL_OUTPUT = "useSelectLeaderToolOuput";
+ public static String MINIMUM_RATES = "minimumRates";
+ public static String MAXIMUM_RATES = "maximumRates";
public static String QUESTIONS = "questions";
public static String QUESTION_TEXT = "questionText";
Index: lams_central/src/java/org/lamsfoundation/lams/web/RatingServlet.java
===================================================================
RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/web/RatingServlet.java,v
diff -u -r1.5 -r1.6
--- lams_central/src/java/org/lamsfoundation/lams/web/RatingServlet.java 29 Apr 2015 18:19:28 -0000 1.5
+++ lams_central/src/java/org/lamsfoundation/lams/web/RatingServlet.java 21 May 2015 23:39:24 -0000 1.6
@@ -36,7 +36,7 @@
import org.apache.log4j.Logger;
import org.apache.tomcat.util.json.JSONException;
import org.apache.tomcat.util.json.JSONObject;
-import org.lamsfoundation.lams.rating.dto.RatingCriteriaDTO;
+import org.lamsfoundation.lams.rating.dto.ItemRatingCriteriaDTO;
import org.lamsfoundation.lams.rating.model.LearnerItemRatingCriteria;
import org.lamsfoundation.lams.rating.model.RatingCriteria;
import org.lamsfoundation.lams.rating.service.RatingService;
@@ -84,7 +84,7 @@
float rating = Float.parseFloat((String) request.getParameter("rate"));
- RatingCriteriaDTO averageRatingDTO = ratingService.rateItem(criteria, userId, itemId, rating);
+ ItemRatingCriteriaDTO averageRatingDTO = ratingService.rateItem(criteria, userId, itemId, rating);
NumberFormat numberFormat = NumberFormat.getInstance(Locale.US);
numberFormat.setMaximumFractionDigits(1);
Index: lams_central/web/css/jquery.jRating.css
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/css/jquery.jRating.css,v
diff -u -r1.6 -r1.7
--- lams_central/web/css/jquery.jRating.css 29 Apr 2015 18:19:28 -0000 1.6
+++ lams_central/web/css/jquery.jRating.css 21 May 2015 23:39:24 -0000 1.7
@@ -47,7 +47,13 @@
}
/** Please, note this is a LAMS customization. In case of library upgrade copy these lines manually. **/
-.rating-stars-holder {width: 150px; text-align: center;}
+.extra-controls-inner:after {
+ content: " ";
+ display: block;
+ height: 0;
+ clear: both;
+}
+.rating-stars-holder {width: 150px; text-align: center; float: right;}
.rating-stars-caption {padding-top: 6px;}
.rating-stars, .rating-stars-disabled {margin: 0px auto; min-height: 20px;}
.add-comment {
Index: lams_central/web/includes/javascript/common.js
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/includes/javascript/common.js,v
diff -u -r1.8 -r1.9
--- lams_central/web/includes/javascript/common.js 30 Apr 2014 22:47:32 -0000 1.8
+++ lams_central/web/includes/javascript/common.js 21 May 2015 23:39:24 -0000 1.9
@@ -107,4 +107,16 @@
xmlhttp.open("POST", url, false);
xmlhttp.send();
}
+
+function getNumberOfWords(value, isRemoveHtmlTags) {
+
+ //HTML tags stripping
+ if (isRemoveHtmlTags) {
+ value = value.replace(/ /g, '').replace(/<\/?[a-z][^>]*>/gi, '');
+ }
+ value = value.trim();
+
+ var wordCount = value ? (value.replace(/['";:,.?\-!]+/g, '').match(/\S+/g) || []).length : 0;
+ return wordCount;
+}
\ No newline at end of file
Index: lams_central/web/includes/javascript/rating.js
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/includes/javascript/rating.js,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lams_central/web/includes/javascript/rating.js 21 May 2015 23:39:24 -0000 1.1
@@ -0,0 +1,142 @@
+
+//Please, set up LAMS_URL, COUNT_RATED_ITEMS, COMMENTS_MIN_WORDS_LIMIT, MAX_RATES and MIN_RATES,
+//COMMENT_TEXTAREA_TIP_LABEL, WARN_COMMENTS_IS_BLANK_LABEL, WARN_MIN_NUMBER_WORDS_LABEL constants in parent document
+
+//constant indicating there is rting limits set up
+var HAS_RATING_LIMITS;
+
+$(document).ready(function(){
+ HAS_RATING_LIMITS = MAX_RATES!=0 || MIN_RATES!=0;
+
+ initializeJRating();
+
+ //check minimum rates limit initially
+ if (MIN_RATES != 0) {
+ checkMinimumRatesLimit(COUNT_RATED_ITEMS);
+ }
+});
+
+//initialize jRating and post comment button
+function initializeJRating() {
+
+ $(".rating-stars-new").filter($(".rating-stars")).jRating({
+ phpPath : LAMS_URL + "servlet/rateItem?hasRatingLimits=" + HAS_RATING_LIMITS,
+ rateMax : 5,
+ decimalLength : 1,
+ onSuccess : function(data, itemId){
+
+ $("#user-rating-" + itemId).html(data.userRating);
+ $("#average-rating-" + itemId).html(data.averageRating);
+ $("#number-of-votes-" + itemId).html(data.numberOfVotes);
+ $("#rating-stars-caption-" + itemId).css("visibility", "visible");
+
+ //handle rating limits if available
+ handleRatingLimits(data.countRatedItems);
+
+ },
+ onError : function(){
+ jError('Error. Please, retry');
+ }
+ });
+
+ $(".rating-stars-new").filter($(".rating-stars-disabled")).jRating({
+ rateMax : 5,
+ isDisabled : true
+ });
+
+ $(".rating-stars-new").removeClass("rating-stars-new");
+
+ //addNewComment button handler
+ $(".add-comment-new").click(function() {
+ var itemId = $(this).data("item-id");
+ var commentsCriteriaId = $(this).data("comment-criteria-id");
+
+ //replace special characters with HTML tags
+ var tempTextarea = jQuery('');
+ filterData(document.getElementById('comment-textarea-' + itemId), tempTextarea);
+ var comment = tempTextarea.value;
+
+ //comment can't be blank
+ if (comment == "" || comment == COMMENT_TEXTAREA_TIP_LABEL) {
+ alert(WARN_COMMENTS_IS_BLANK_LABEL);
+ return false;
+ }
+
+ //word count limit
+ if (COMMENTS_MIN_WORDS_LIMIT != 0) { //removed isCommentsEnabled && --was it worth it?
+ var value = $("#comment-textarea-" + itemId).val();
+ value = value.trim();
+
+ var wordCount = value ? (value.replace(/['";:,.?\-!]+/g, '').match(/\S+/g) || []).length : 0;
+
+ if(wordCount < COMMENTS_MIN_WORDS_LIMIT){
+ alert( WARN_MIN_NUMBER_WORDS_LABEL.replace("{1}", wordCount));
+ return false;
+ }
+ }
+
+ //add new comment
+ $.ajax({
+ type: "POST",
+ url: LAMS_URL + 'servlet/rateItem',
+ data: {
+ idBox: commentsCriteriaId + '-' + itemId,
+ comment: comment,
+ hasRatingLimits: HAS_RATING_LIMITS
+ },
+ success: function(data, textStatus) {
+
+ //add comment to HTML
+ jQuery('
', {
+ 'class': "rating-comment",
+ html: data.comment
+ }).appendTo('#comments-area-' + itemId);
+
+ //hide comments textarea and button
+ $("#add-comment-area-" + itemId).hide();
+
+ //handle rating limits if available
+ if (HAS_RATING_LIMITS) {
+ handleRatingLimits(data.countRatedItems);
+ }
+
+ }
+ });
+ //apply only once
+ }).removeClass("add-comment-new");
+}
+
+function handleRatingLimits(countRatedItems) {
+
+ if (HAS_RATING_LIMITS) {
+
+ //update info box
+ $("#count-rated-items").html(countRatedItems);
+
+ //callback function
+ if (typeof onRatingSuccessCallback === "function") {
+ // safe to use the function
+ onRatingSuccessCallback(countRatedItems);
+ }
+
+ //handle max rates limit
+ if (MAX_RATES != 0) {
+
+ //disable rating feature in case MAX_RATES limit reached
+ if (countRatedItems >= MAX_RATES) {
+ $(".rating-stars").each(function() {
+ $(this).unbind().css('cursor','default').addClass('jDisabled');
+ });
+ }
+ }
+
+ //handle min rates limit
+ if (MIN_RATES != 0) {
+ checkMinimumRatesLimit(countRatedItems)
+ }
+ }
+}
+
+function checkMinimumRatesLimit(countRatedItems) {
+ $( "#learner-submit" ).toggle( countRatedItems >= MIN_RATES );
+}
\ No newline at end of file
Index: lams_common/src/java/org/lamsfoundation/lams/rating/ToolRatingManager.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/ToolRatingManager.java,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lams_common/src/java/org/lamsfoundation/lams/rating/ToolRatingManager.java 21 May 2015 23:39:28 -0000 1.1
@@ -0,0 +1,90 @@
+/****************************************************************
+ * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+/* $Id: ToolRatingManager.java,v 1.1 2015/05/21 23:39:28 andreyb Exp $ */
+package org.lamsfoundation.lams.rating;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.lamsfoundation.lams.rating.dto.ItemRatingDTO;
+import org.lamsfoundation.lams.rating.model.RatingCriteria;
+import org.lamsfoundation.lams.rating.service.IRatingService;
+
+/**
+ * Tool interface that defines the contract regarding Rating and RatingCriteria manipulation.
+ *
+ * @author Andrey Balan
+ */
+public interface ToolRatingManager {
+
+ List getRatingCriterias(Long toolContentId);
+
+ boolean isCommentsEnabled(Long toolContentId);
+
+ /**
+ * Read modified rating criterias from request, then update existing ones/add new ones/delete removed ones. Used on
+ * saving content action in authoring.
+ *
+ * @param request
+ * @param oldCriterias
+ * criterias stored in the DB
+ * @param toolContentId
+ */
+ void saveRatingCriterias(HttpServletRequest request, Collection oldCriterias, Long toolContentId);
+
+ /**
+ * Returns results for only one item.
+ *
+ * @param contentId
+ * @param itemIds
+ * @param userId
+ * @return
+ */
+ ItemRatingDTO getRatingCriteriaDtos(Long contentId, Long itemId, Long userId);
+
+ /**
+ * Returns results for all items. If result is needed for only one item provide provide it as a single element in a
+ * itemIds list.
+ *
+ * @param contentId
+ * @param itemIds
+ * @param isAllItemResultsRequested
+ * is all item results requested. If so it will query DB without using itemIds and instead return all available
+ * results.
+ * @param userId
+ * @return
+ */
+ List getRatingCriteriaDtos(Long contentId, Collection itemIds, boolean isAllItemResultsRequested, Long userId);
+
+ /**
+ * Returns number of images rated by specified user in a current activity. It counts comments as ratings.
+ *
+ * @param toolContentId
+ * @param userId
+ * @return
+ */
+ int getCountItemsRatedByUser(Long toolContentId, Integer userId);
+
+}
\ No newline at end of file
Index: lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingCommentDAO.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingCommentDAO.java,v
diff -u -r1.1 -r1.2
--- lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingCommentDAO.java 23 Apr 2015 22:42:39 -0000 1.1
+++ lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingCommentDAO.java 21 May 2015 23:39:28 -0000 1.2
@@ -23,21 +23,43 @@
/* $Id$ */
package org.lamsfoundation.lams.rating.dao;
-import org.lamsfoundation.lams.rating.dto.RatingCriteriaDTO;
+import java.util.Collection;
+import java.util.List;
+
+import org.lamsfoundation.lams.rating.dto.ItemRatingCriteriaDTO;
+import org.lamsfoundation.lams.rating.dto.RatingCommentDTO;
import org.lamsfoundation.lams.rating.model.RatingComment;
public interface IRatingCommentDAO {
- RatingComment getRatingComment(Long ratingCriteriaId, Integer userId, Long itemId);
-
/**
- * Constructs RatingCriteriaDTO for rating criteria that allows comments.
+ * Returns list of RatingCommentDTO which hold only minimum information required for displaying in Rating.tag
+ * Created in order to lighten the data passed from DB.
*
* @param ratingCriteriaId
+ * @return
+ */
+ List getCommentsByCriteria(Long ratingCriteriaId);
+
+ /**
+ * Constructs ItemRatingCriteriaDTO for rating criteria that allows comments.
+ *
+ * @param ratingCriteriaId
* @param itemId
* @param userId
* @return
*/
- RatingCriteriaDTO getCommentsRatingDTO(Long ratingCriteriaId, Long itemId, Integer userId);
+ List getCommentsByCriteriaAndItem(Long ratingCriteriaId, Long itemId);
+
+ /**
+ * Constructs ItemRatingCriteriaDTO for rating criteria that allows comments. Returns comments only for itemIds supplied.
+ *
+ * @param ratingCriteriaId
+ * @param itemIds
+ * @return
+ */
+ List getCommentsByCriteriaAndItems(Long ratingCriteriaId, Collection itemIds);
+
+ RatingComment getRatingComment(Long ratingCriteriaId, Integer userId, Long itemId);
}
Index: lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingDAO.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingDAO.java,v
diff -u -r1.4 -r1.5
--- lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingDAO.java 29 Apr 2015 18:18:54 -0000 1.4
+++ lams_common/src/java/org/lamsfoundation/lams/rating/dao/IRatingDAO.java 21 May 2015 23:39:28 -0000 1.5
@@ -25,7 +25,10 @@
package org.lamsfoundation.lams.rating.dao;
-import org.lamsfoundation.lams.rating.dto.RatingCriteriaDTO;
+import java.util.Collection;
+import java.util.List;
+
+import org.lamsfoundation.lams.rating.dto.ItemRatingCriteriaDTO;
import org.lamsfoundation.lams.rating.model.Rating;
public interface IRatingDAO {
@@ -34,15 +37,34 @@
Rating getRating(Long ratingCriteriaId, Integer userId, Long itemId);
+ List getRatingsByUser(Long contentId, Integer userId);
+
/**
* Returns rating statistics by particular item
*
* @param itemId
* @return
*/
- RatingCriteriaDTO getRatingAverageDTOByItem(Long ratingCriteriaId, Long itemId);
+ ItemRatingCriteriaDTO getRatingAverageDTOByItem(Long ratingCriteriaId, Long itemId);
+
+ List getRatingAverageByContentAndItem(Long contentId, Long itemId);
+
+ /**
+ * Returns rating statistics for specified itemIds.
+ *
+ * @param contentId
+ * @param itemIds
+ * @return
+ */
+ List getRatingAverageByContentAndItems(Long contentId, Collection itemIds);
- RatingCriteriaDTO getRatingAverageDTOByUser(Long ratingCriteriaId, Long itemId, Integer userId);
+ /**
+ * Returns rating statistics for entire tool.
+ *
+ * @param contentId
+ * @return
+ */
+ List getRatingAverageByContent(Long contentId);
Rating get(Long uid);
Index: lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingCommentDAO.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingCommentDAO.java,v
diff -u -r1.2 -r1.3
--- lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingCommentDAO.java 29 Apr 2015 18:18:54 -0000 1.2
+++ lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingCommentDAO.java 21 May 2015 23:39:28 -0000 1.3
@@ -23,32 +23,87 @@
/* $Id$ */
package org.lamsfoundation.lams.rating.dao.hibernate;
+import java.util.Collection;
+import java.util.LinkedList;
import java.util.List;
import org.lamsfoundation.lams.dao.hibernate.BaseDAO;
import org.lamsfoundation.lams.rating.dao.IRatingCommentDAO;
-import org.lamsfoundation.lams.rating.dto.RatingCriteriaDTO;
+import org.lamsfoundation.lams.rating.dto.RatingCommentDTO;
import org.lamsfoundation.lams.rating.model.Rating;
import org.lamsfoundation.lams.rating.model.RatingComment;
-import org.lamsfoundation.lams.rating.model.ToolActivityRatingCriteria;
public class RatingCommentDAO extends BaseDAO implements IRatingCommentDAO {
private static final String FIND_RATING_BY_CRITERIA_AND_USER_AND_ITEM = "FROM " + RatingComment.class.getName()
+ " AS r where r.ratingCriteria.ratingCriteriaId=? AND r.learner.userId=? AND r.itemId=?";
- private static final String FIND_COMMENTS_BY_CRITERIA_AND_ITEM = "FROM " + RatingComment.class.getName()
+ private static final String FIND_COMMENTS_BY_CRITERIA_AND_ITEM = "SELECT r.itemId, r.learner.userId, r.comment "
+ + "FROM " + RatingComment.class.getName()
+ " AS r where r.ratingCriteria.ratingCriteriaId=? AND r.itemId=?";
+
+ private static final String FIND_COMMENTS_BY_CRITERIA_AND_ITEMS = "SELECT r.itemId, r.learner.userId, r.comment "
+ + "FROM " + RatingComment.class.getName()
+ + " AS r where r.ratingCriteria.ratingCriteriaId=:ratingCriteriaId AND r.itemId IN (:itemIds)";
+
+ private static final String FIND_COMMENTS_BY_CRITERIA = "SELECT r.itemId, r.learner.userId, r.comment "
+ + "FROM " + RatingComment.class.getName() + " AS r where r.ratingCriteria.ratingCriteriaId=?";
+
+ private static final String FIND_RATING_AVERAGE_BY_CONTENT_ID = "SELECT r.itemId, r.ratingCriteria.ratingCriteriaId, AVG(r.rating), COUNT(*) FROM "
+ + Rating.class.getName()
+ + " AS r where r.ratingCriteria.toolContentId=? GROUP BY r.itemId, r.ratingCriteria.ratingCriteriaId";
// private static final String COUNT_COMMENTS_BY_ITEM_AND_USER = "SELECT COUNT(r) FROM "
// + RatingComment.class.getName()
// + " AS r "
// + " WHERE r.ratingCriteria.toolContentId = ? AND r.ratingCriteria.commentsEnabled IS TRUE AND r.itemId =? AND r.learner.userId =?";
- private List getCommentsByCriteriaAndItem(Long ratingCriteriaId, Long itemId) {
- return (List) (getHibernateTemplate().find(FIND_COMMENTS_BY_CRITERIA_AND_ITEM, new Object[] {
+ @Override
+ public List getCommentsByCriteriaAndItem(Long ratingCriteriaId, Long itemId) {
+ List results = (List) (getHibernateTemplate().find(FIND_COMMENTS_BY_CRITERIA_AND_ITEM, new Object[] {
ratingCriteriaId, itemId }));
+
+ return convertIntoCommentDtos(results);
}
+
+ @Override
+ public List getCommentsByCriteriaAndItems(Long ratingCriteriaId, Collection itemIds) {
+
+ List results = getSession().createQuery(FIND_COMMENTS_BY_CRITERIA_AND_ITEMS)
+ .setLong("ratingCriteriaId", ratingCriteriaId).setParameterList("itemIds", itemIds).list();
+
+ return convertIntoCommentDtos(results);
+ }
+
+ @Override
+ public List getCommentsByCriteria(Long ratingCriteriaId) {
+ List results = (List) (getHibernateTemplate().find(FIND_COMMENTS_BY_CRITERIA,
+ new Object[] { ratingCriteriaId }));
+
+ return convertIntoCommentDtos(results);
+ }
+
+ /*
+ * Converts DB results presentation into list of RatingCommentDTO.
+ *
+ * @param results
+ * @return
+ */
+ private List convertIntoCommentDtos(List results) {
+ //populate RatingCommentDTOs list
+ List commentDtos = new LinkedList();
+ for (Object[] result : results) {
+ Long itemId = (Long) result[0];
+ Long userId = ((Integer) result[1]).longValue();
+ String comment = (String) result[2];
+
+ RatingCommentDTO commentDto = new RatingCommentDTO(itemId, userId, comment);
+ commentDtos.add(commentDto);
+ }
+
+ return commentDtos;
+ }
+
@Override
public RatingComment getRatingComment(Long ratingCriteriaId, Integer userId, Long itemId) {
List list = getHibernateTemplate().find(FIND_RATING_BY_CRITERIA_AND_USER_AND_ITEM,
@@ -60,17 +115,6 @@
}
}
- @Override
- public RatingCriteriaDTO getCommentsRatingDTO(Long ratingCriteriaId, Long itemId, Integer userId) {
-
- List ratingComments = getCommentsByCriteriaAndItem(ratingCriteriaId, itemId);
-
- RatingCriteriaDTO criteriaDto = new RatingCriteriaDTO();
- criteriaDto.setItemId(itemId);
- criteriaDto.setRatingComments(ratingComments);
- return criteriaDto;
- }
-
// @Override
// public boolean isUserCommentedItem(Long toolContentId, Long itemId, Integer userId) {
// List list = getHibernateTemplate().find(COUNT_COMMENTS_BY_ITEM_AND_USER,
Index: lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingDAO.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingDAO.java,v
diff -u -r1.4 -r1.5
--- lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingDAO.java 29 Apr 2015 18:18:54 -0000 1.4
+++ lams_common/src/java/org/lamsfoundation/lams/rating/dao/hibernate/RatingDAO.java 21 May 2015 23:39:28 -0000 1.5
@@ -26,6 +26,7 @@
package org.lamsfoundation.lams.rating.dao.hibernate;
import java.text.NumberFormat;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
@@ -35,7 +36,7 @@
import org.hibernate.Session;
import org.lamsfoundation.lams.dao.hibernate.BaseDAO;
import org.lamsfoundation.lams.rating.dao.IRatingDAO;
-import org.lamsfoundation.lams.rating.dto.RatingCriteriaDTO;
+import org.lamsfoundation.lams.rating.dto.ItemRatingCriteriaDTO;
import org.lamsfoundation.lams.rating.model.Rating;
import org.lamsfoundation.lams.rating.model.RatingComment;
import org.lamsfoundation.lams.rating.model.ToolActivityRatingCriteria;
@@ -53,17 +54,30 @@
private static final String FIND_RATING_BY_CRITERIA_AND_USER = "FROM " + Rating.class.getName()
+ " AS r where r.ratingCriteria.ratingCriteriaId=? AND r.learner.userId=?";
+ private static final String FIND_RATINGS_BY_USER = "FROM " + Rating.class.getName()
+ + " AS r where r.ratingCriteria.toolContentId=? AND r.learner.userId=?";
+
private static final String FIND_RATING_AVERAGE_BY_ITEM = "SELECT AVG(r.rating), COUNT(*) FROM "
+ Rating.class.getName() + " AS r where r.ratingCriteria.ratingCriteriaId=? AND r.itemId=?";
+
+ private static final String FIND_RATING_AVERAGE_BY_CONTENT_AND_ITEM = "SELECT r.itemId, r.ratingCriteria.ratingCriteriaId, AVG(r.rating), COUNT(*) FROM "
+ + Rating.class.getName() + " AS r where r.ratingCriteria.toolContentId=? AND r.itemId=? GROUP BY r.ratingCriteria.ratingCriteriaId";
+
+ private static final String FIND_RATING_AVERAGE_BY_CONTENT_AND_ITEMS = "SELECT r.itemId, r.ratingCriteria.ratingCriteriaId, AVG(r.rating), COUNT(*) FROM "
+ + Rating.class.getName() + " AS r where r.ratingCriteria.toolContentId=:contentId AND r.itemId IN (:itemIds) GROUP BY r.ratingCriteria.ratingCriteriaId";
- private static final String COUNT_ITEMS_RATED_BY_ACTIVITY_AND_USER = "SELECT COUNT(DISTINCT r.itemId)+(SELECT COUNT(comment) FROM "
- + RatingComment.class.getName()
- + " AS comment "
- + " WHERE comment.ratingCriteria.toolContentId = :toolContentId AND comment.learner.userId =:userId AND comment.itemId =:itemId AND cr.commentsEnabled IS TRUE ) FROM "
- + Rating.class.getName()
- + " AS r "
- + " WHERE r.ratingCriteria.toolContentId = :toolContentId AND r.learner.userId =:userId";
+ private static final String FIND_RATING_AVERAGE_BY_CONTENT_ID = "SELECT r.itemId, r.ratingCriteria.ratingCriteriaId, AVG(r.rating), COUNT(*) FROM "
+ + Rating.class.getName()
+ + " AS r where r.ratingCriteria.toolContentId=? GROUP BY r.itemId, r.ratingCriteria.ratingCriteriaId";
+// private static final String COUNT_ITEMS_RATED_BY_ACTIVITY_AND_USER = "SELECT COUNT(DISTINCT r.itemId)+(SELECT COUNT(comment) FROM "
+// + RatingComment.class.getName()
+// + " AS comment "
+// + " WHERE comment.ratingCriteria.toolContentId = :toolContentId AND comment.learner.userId =:userId AND comment.itemId =:itemId AND cr.commentsEnabled IS TRUE ) FROM "
+// + Rating.class.getName()
+// + " AS r "
+// + " WHERE r.ratingCriteria.toolContentId = :toolContentId AND r.learner.userId =:userId";
+
@Override
public void saveOrUpdate(Object object) {
this.getHibernateTemplate().saveOrUpdate(object);
@@ -81,6 +95,7 @@
}
}
+ // method is not used at the moment
private Rating getRating(Long ratingCriteriaId, Integer userId) {
List list = getHibernateTemplate().find(FIND_RATING_BY_CRITERIA_AND_USER,
new Object[] { ratingCriteriaId, userId });
@@ -92,7 +107,12 @@
}
@Override
- public RatingCriteriaDTO getRatingAverageDTOByItem(Long ratingCriteriaId, Long itemId) {
+ public List getRatingsByUser(Long contentId, Integer userId) {
+ return getHibernateTemplate().find(FIND_RATINGS_BY_USER, new Object[] { contentId, userId });
+ }
+
+ @Override
+ public ItemRatingCriteriaDTO getRatingAverageDTOByItem(Long ratingCriteriaId, Long itemId) {
List list = getHibernateTemplate().find(FIND_RATING_AVERAGE_BY_ITEM,
new Object[] { ratingCriteriaId, itemId });
Object[] results = list.get(0);
@@ -103,29 +123,24 @@
String averageRating = numberFormat.format(averageRatingObj);
String numberOfVotes = (results[1] == null) ? "0" : String.valueOf(results[1]);
- return new RatingCriteriaDTO(averageRating, numberOfVotes);
+ return new ItemRatingCriteriaDTO(averageRating, numberOfVotes);
}
@Override
- public RatingCriteriaDTO getRatingAverageDTOByUser(Long ratingCriteriaId, Long itemId, Integer userId) {
+ public List getRatingAverageByContentAndItem(Long contentId, Long itemId) {
+ return getHibernateTemplate().find(FIND_RATING_AVERAGE_BY_CONTENT_AND_ITEM,
+ new Object[] { contentId, itemId });
+ }
+
+ @Override
+ public List getRatingAverageByContentAndItems(Long contentId, Collection itemIds) {
+ return getSession().createQuery(FIND_RATING_AVERAGE_BY_CONTENT_AND_ITEMS)
+ .setLong("contentId", contentId).setParameterList("itemIds", itemIds).list();
+ }
- RatingCriteriaDTO criteriaDto = getRatingAverageDTOByItem(ratingCriteriaId, itemId);
-
- List list = getHibernateTemplate().find(FIND_USER_RATING_VALUE,
- new Object[] { ratingCriteriaId, userId, itemId });
- String userRating;
- if (list.size() > 0) {
- userRating = ((Float) list.get(0)).toString();
-
- // user didn't leave his rating yet
- } else {
- userRating = "";
-
- }
- criteriaDto.setUserRating(userRating);
- criteriaDto.setItemId(itemId);
-
- return criteriaDto;
+ @Override
+ public List getRatingAverageByContent(Long contentId) {
+ return getHibernateTemplate().find(FIND_RATING_AVERAGE_BY_CONTENT_ID, new Object[] { contentId });
}
@Override
@@ -140,8 +155,8 @@
@Override
public int getCountItemsRatedByUser(final Long toolContentId, final Integer userId) {
-
- //unions don't work in HQL so doing 2 separate DB queries (http://stackoverflow.com/a/3940445)
+
+ // unions don't work in HQL so doing 2 separate DB queries (http://stackoverflow.com/a/3940445)
String FIND_ITEM_IDS_RATED_BY_USER = "SELECT DISTINCT r.itemId FROM " + Rating.class.getName() + " AS r "
+ " WHERE r.ratingCriteria.toolContentId = :toolContentId AND r.learner.userId =:userId";
@@ -152,13 +167,13 @@
List ratedItemIds = this.getSession().createQuery(FIND_ITEM_IDS_RATED_BY_USER)
.setLong("toolContentId", toolContentId).setInteger("userId", userId).list();
-
+
List commentedItemIds = this.getSession().createQuery(FIND_ITEM_IDS_COMMENTED_BY_USER)
.setLong("toolContentId", toolContentId).setInteger("userId", userId).list();
-
+
Set unionItemIds = new HashSet(ratedItemIds);
unionItemIds.addAll(commentedItemIds);
-
+
return unionItemIds.size();
}
}
Index: lams_common/src/java/org/lamsfoundation/lams/rating/dto/ItemRatingCriteriaDTO.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/dto/ItemRatingCriteriaDTO.java,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lams_common/src/java/org/lamsfoundation/lams/rating/dto/ItemRatingCriteriaDTO.java 21 May 2015 23:39:27 -0000 1.1
@@ -0,0 +1,78 @@
+/****************************************************************
+ * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+/* $Id: ItemRatingCriteriaDTO.java,v 1.1 2015/05/21 23:39:27 andreyb Exp $ */
+package org.lamsfoundation.lams.rating.dto;
+
+import org.lamsfoundation.lams.rating.model.RatingCriteria;
+
+public class ItemRatingCriteriaDTO {
+
+ //common properties
+ private RatingCriteria ratingCriteria;
+
+ //rating properties
+ private String userRating;
+ private String averageRating;
+ private String numberOfVotes;
+
+ public ItemRatingCriteriaDTO() {
+ }
+
+ public ItemRatingCriteriaDTO(String rating, String numberOfVotes) {
+ this.averageRating = rating;
+ this.numberOfVotes = numberOfVotes;
+ }
+
+ public RatingCriteria getRatingCriteria() {
+ return ratingCriteria;
+ }
+
+ public void setRatingCriteria(RatingCriteria ratingCriteria) {
+ this.ratingCriteria = ratingCriteria;
+ }
+
+ public String getUserRating() {
+ return userRating;
+ }
+
+ public void setUserRating(String userRating) {
+ this.userRating = userRating;
+ }
+
+ public String getAverageRating() {
+ return averageRating;
+ }
+
+ public void setAverageRating(String averageRating) {
+ this.averageRating = averageRating;
+ }
+
+ public String getNumberOfVotes() {
+ return numberOfVotes;
+ }
+
+ public void setNumberOfVotes(String numberOfVotes) {
+ this.numberOfVotes = numberOfVotes;
+ }
+
+}
Index: lams_common/src/java/org/lamsfoundation/lams/rating/dto/ItemRatingDTO.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/dto/ItemRatingDTO.java,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lams_common/src/java/org/lamsfoundation/lams/rating/dto/ItemRatingDTO.java 21 May 2015 23:39:28 -0000 1.1
@@ -0,0 +1,101 @@
+/****************************************************************
+ * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+/* $Id: ItemRatingDTO.java,v 1.1 2015/05/21 23:39:28 andreyb Exp $ */
+package org.lamsfoundation.lams.rating.dto;
+
+import java.util.Collection;
+import java.util.List;
+
+public class ItemRatingDTO {
+
+ //common properties
+ private Long itemId;
+ private Collection criteriaDtos;
+
+ //comments properties
+ private boolean commentsEnabled;
+ private Long commentsCriteriaId;
+ private int commentsMinWordsLimit;
+ private List commentDtos;
+ private RatingCommentDTO commentPostedByUser;
+
+ public ItemRatingDTO () {
+ commentsEnabled = false;
+ }
+
+ public Long getItemId() {
+ return itemId;
+ }
+
+ public void setItemId(Long itemId) {
+ this.itemId = itemId;
+ }
+
+ public Collection getCriteriaDtos() {
+ return criteriaDtos;
+ }
+
+ public void setCriteriaDtos(Collection criteriaDtos) {
+ this.criteriaDtos = criteriaDtos;
+ }
+
+ public boolean isCommentsEnabled() {
+ return commentsEnabled;
+ }
+
+ public void setCommentsEnabled(boolean commentsCriteriaAvailable) {
+ this.commentsEnabled = commentsCriteriaAvailable;
+ }
+
+ public Long getCommentsCriteriaId() {
+ return commentsCriteriaId;
+ }
+
+ public void setCommentsCriteriaId(Long commentsCriteriaId) {
+ this.commentsCriteriaId = commentsCriteriaId;
+ }
+
+ public int getCommentsMinWordsLimit() {
+ return commentsMinWordsLimit;
+ }
+
+ public void setCommentsMinWordsLimit(int commentsMinWordsLimit) {
+ this.commentsMinWordsLimit = commentsMinWordsLimit;
+ }
+
+ public List getCommentDtos() {
+ return commentDtos;
+ }
+
+ public void setCommentDtos(List commentDtos) {
+ this.commentDtos = commentDtos;
+ }
+
+ public RatingCommentDTO getCommentPostedByUser() {
+ return commentPostedByUser;
+ }
+
+ public void setCommentPostedByUser(RatingCommentDTO commentPostedByUser) {
+ this.commentPostedByUser = commentPostedByUser;
+ }
+}
Index: lams_common/src/java/org/lamsfoundation/lams/rating/dto/RatingCommentDTO.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/dto/RatingCommentDTO.java,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lams_common/src/java/org/lamsfoundation/lams/rating/dto/RatingCommentDTO.java 21 May 2015 23:39:27 -0000 1.1
@@ -0,0 +1,76 @@
+/****************************************************************
+ * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+/* $Id: RatingCommentDTO.java,v 1.1 2015/05/21 23:39:27 andreyb Exp $ */
+package org.lamsfoundation.lams.rating.dto;
+
+
+/**
+ * Holds minimum information required for displaying in Rating.tag Created in order to lighten the data passed from DB.
+ *
+ * @author Andrey Balan
+ */
+public class RatingCommentDTO {
+
+ private Long itemId;
+
+ private Long userId;
+
+ private String comment;
+
+ public RatingCommentDTO() {
+ }
+
+ public RatingCommentDTO(Long itemId, Long userId, String comment) {
+ this.itemId = itemId;
+ this.userId = userId;
+ this.comment = comment;
+ }
+
+ /**
+ */
+ public Long getItemId() {
+ return itemId;
+ }
+
+ public void setItemId(Long itemId) {
+ this.itemId = itemId;
+ }
+
+ /**
+ */
+ public Long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Long userId) {
+ this.userId = userId;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public String getComment() {
+ return this.comment;
+ }
+}
Fisheye: Tag 1.3 refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/rating/dto/RatingCriteriaDTO.java'.
Fisheye: No comparison available. Pass `N' to diff?
Index: lams_common/src/java/org/lamsfoundation/lams/rating/service/IRatingService.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/service/IRatingService.java,v
diff -u -r1.4 -r1.5
--- lams_common/src/java/org/lamsfoundation/lams/rating/service/IRatingService.java 29 Apr 2015 18:18:54 -0000 1.4
+++ lams_common/src/java/org/lamsfoundation/lams/rating/service/IRatingService.java 21 May 2015 23:39:28 -0000 1.5
@@ -25,25 +25,38 @@
package org.lamsfoundation.lams.rating.service;
+import java.util.Collection;
import java.util.List;
-import org.lamsfoundation.lams.rating.dto.RatingCriteriaDTO;
+import javax.servlet.http.HttpServletRequest;
+
+import org.lamsfoundation.lams.rating.dto.ItemRatingCriteriaDTO;
+import org.lamsfoundation.lams.rating.dto.ItemRatingDTO;
import org.lamsfoundation.lams.rating.model.Rating;
import org.lamsfoundation.lams.rating.model.RatingCriteria;
public interface IRatingService {
void saveOrUpdateRating(Rating rating);
- void saveOrUpdateRatingCriteria(RatingCriteria criteria);
+ /**
+ * Read modified rating criterias from request, then update existing ones/add new ones/delete removed ones. Used on
+ * saving content action in authoring.
+ *
+ * @param request
+ * @param oldCriterias
+ * criterias stored in the DB
+ * @param toolContentId
+ */
+ void saveRatingCriterias(HttpServletRequest request, Collection oldCriterias, Long toolContentId);
- void deleteRatingCriteria(Long ratingCriteriaId);
-
List getCriteriasByToolContentId(Long toolContentId);
RatingCriteria getCriteriaByCriteriaId(Long ratingCriteriaId);
RatingCriteria getCriteriaByCriteriaId(Long ratingCriteriaId, Class clasz);
+
+ boolean isCommentsEnabled(Long toolContentId);
/**
* Return Rating by the given itemId and userId.
@@ -62,11 +75,24 @@
*/
List getRatingsByItem(Long itemId);
- RatingCriteriaDTO rateItem(RatingCriteria criteria, Integer userId, Long itemId, float ratingFloat);
+ ItemRatingCriteriaDTO rateItem(RatingCriteria criteria, Integer userId, Long itemId, float ratingFloat);
void commentItem(RatingCriteria ratingCriteria, Integer userId, Long itemId, String comment);
- RatingCriteriaDTO getCriteriaDTOByUser(RatingCriteria criteria, Long itemId, Integer userId);
+ /**
+ * Returns results for all items. If result is needed for only one item provide provide it as a single element in a
+ * itemIds list.
+ *
+ * @param contentId
+ * @param itemIds
+ * @param isAllItemResultsRequested
+ * is all item results requested. If so it will query DB without using itemIds and instead return all
+ * available results.
+ * @param userId
+ * @return
+ */
+ List getRatingCriteriaDtos(Long contentId, Collection itemIds,
+ boolean isAllItemResultsRequested, Long userId);
/**
* Returns number of images rated by specified user in a current activity. It counts comments as ratings. This
Index: lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java,v
diff -u -r1.4 -r1.5
--- lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java 29 Apr 2015 18:18:54 -0000 1.4
+++ lams_common/src/java/org/lamsfoundation/lams/rating/service/RatingService.java 21 May 2015 23:39:28 -0000 1.5
@@ -25,19 +25,32 @@
package org.lamsfoundation.lams.rating.service;
+import java.text.NumberFormat;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.lamsfoundation.lams.rating.dao.IRatingCommentDAO;
import org.lamsfoundation.lams.rating.dao.IRatingCriteriaDAO;
import org.lamsfoundation.lams.rating.dao.IRatingDAO;
-import org.lamsfoundation.lams.rating.dto.RatingCriteriaDTO;
+import org.lamsfoundation.lams.rating.dto.ItemRatingCriteriaDTO;
+import org.lamsfoundation.lams.rating.dto.ItemRatingDTO;
+import org.lamsfoundation.lams.rating.dto.RatingCommentDTO;
+import org.lamsfoundation.lams.rating.model.LearnerItemRatingCriteria;
import org.lamsfoundation.lams.rating.model.Rating;
import org.lamsfoundation.lams.rating.model.RatingComment;
import org.lamsfoundation.lams.rating.model.RatingCriteria;
import org.lamsfoundation.lams.usermanagement.User;
import org.lamsfoundation.lams.usermanagement.service.IUserManagementService;
import org.lamsfoundation.lams.util.MessageService;
+import org.lamsfoundation.lams.util.WebUtil;
public class RatingService implements IRatingService {
@@ -74,7 +87,7 @@
}
@Override
- public RatingCriteriaDTO rateItem(RatingCriteria ratingCriteria, Integer userId, Long itemId, float ratingFloat) {
+ public ItemRatingCriteriaDTO rateItem(RatingCriteria ratingCriteria, Integer userId, Long itemId, float ratingFloat) {
Long ratingCriteriaId = ratingCriteria.getRatingCriteriaId();
Rating rating = ratingDAO.getRating(ratingCriteriaId, userId, itemId);
@@ -117,20 +130,132 @@
}
@Override
- public RatingCriteriaDTO getCriteriaDTOByUser(RatingCriteria criteria, Long itemId, Integer userId) {
- Long criteriaId = criteria.getRatingCriteriaId();
+ public List getRatingCriteriaDtos(Long contentId, Collection itemIds, boolean isAllItemResultsRequested, Long userId) {
- RatingCriteriaDTO criteriaDto;
- if (criteria.isCommentsEnabled()) {
- criteriaDto = ratingCommentDAO.getCommentsRatingDTO(criteriaId, itemId, userId);
- criteriaDto.setCommentsMinWordsLimit(criteria.getCommentsMinWordsLimit());
-
+ //initial preparations
+ NumberFormat numberFormat = NumberFormat.getInstance(Locale.US);
+ numberFormat.setMaximumFractionDigits(1);
+ List criterias = getCriteriasByToolContentId(contentId);
+ boolean isSingleItem = itemIds.size() == 1;
+ Long singleItemId = isSingleItem ? itemIds.iterator().next() : null;
+
+ //initialize itemDtos
+ List itemDtos = new LinkedList();
+ for (Long itemId : itemIds) {
+ ItemRatingDTO itemDto = new ItemRatingDTO();
+ itemDto.setItemId(itemId);
+ itemDtos.add(itemDto);
+ }
+
+ //handle comments criteria
+ for (RatingCriteria criteria : criterias) {
+ if (criteria.isCommentsEnabled()) {
+ Long commentCriteriaId = criteria.getRatingCriteriaId();
+
+ List commentDtos;
+ if (isSingleItem) {
+ commentDtos = ratingCommentDAO.getCommentsByCriteriaAndItem(commentCriteriaId, singleItemId);
+
+ //query DB using itemIds
+ } else if (!isAllItemResultsRequested) {
+ commentDtos = ratingCommentDAO.getCommentsByCriteriaAndItems(commentCriteriaId, itemIds);
+
+ //query DB without specifying itemIds
+ } else {
+ commentDtos = ratingCommentDAO.getCommentsByCriteria(commentCriteriaId);
+ }
+
+ for (ItemRatingDTO itemDto: itemDtos) {
+ itemDto.setCommentsEnabled(true);
+ itemDto.setCommentsCriteriaId(commentCriteriaId);
+ itemDto.setCommentsMinWordsLimit(criteria.getCommentsMinWordsLimit());
+
+ //sort commentDtos by the item
+ List commentDtosPerItem = new LinkedList();
+ for (RatingCommentDTO commentDto: commentDtos) {
+ if (commentDto.getItemId().equals(itemDto.getItemId())) {
+ commentDtosPerItem.add(commentDto);
+
+ //fill in commentPostedByUser field
+ if (commentDto.getUserId().equals(userId)) {
+ itemDto.setCommentPostedByUser(commentDto);
+ }
+ }
+ }
+
+ itemDto.setCommentDtos(commentDtosPerItem);
+ }
+
+ break;
+ }
+ }
+
+ //get all data from DB
+ List userRatings = ratingDAO.getRatingsByUser(contentId, userId.intValue());
+ List itemsStatistics;
+ if (isSingleItem) {
+ itemsStatistics = ratingDAO.getRatingAverageByContentAndItem(contentId, singleItemId);
+
+ // query DB using itemIds
+ } else if (!isAllItemResultsRequested) {
+ itemsStatistics = ratingDAO.getRatingAverageByContentAndItems(contentId, itemIds);
+
+ // query DB without specifying itemIds
} else {
- criteriaDto = ratingDAO.getRatingAverageDTOByUser(criteriaId, itemId, userId);
+ itemsStatistics = ratingDAO.getRatingAverageByContent(contentId);
}
- criteriaDto.setRatingCriteria(criteria);
- return criteriaDto;
+ //handle all criterias except for comments' one
+ for (ItemRatingDTO itemDto : itemDtos) {
+ Long itemId = itemDto.getItemId();
+ List criteriaDtos = new LinkedList();
+ itemDto.setCriteriaDtos(criteriaDtos);
+
+ for (RatingCriteria criteria : criterias) {
+ Long criteriaId = criteria.getRatingCriteriaId();
+
+ //comments' criteria are handled earlier, at the beginning of this function
+ if (criteria.isCommentsEnabled()) {
+ continue;
+ }
+
+ ItemRatingCriteriaDTO criteriaDto = new ItemRatingCriteriaDTO();
+ criteriaDto.setRatingCriteria(criteria);
+
+ // set user's rating
+ Rating userRating = null;
+ for (Rating userRatingIter : userRatings) {
+ if (userRatingIter.getItemId().equals(itemId)
+ && userRatingIter.getRatingCriteria().getRatingCriteriaId().equals(criteriaId)) {
+ userRating = userRatingIter;
+ }
+ }
+ String userRatingStr = userRating == null ? "" : numberFormat.format(userRating.getRating());
+ criteriaDto.setUserRating(userRatingStr);
+
+ // check if there is any data returned from DB regarding this item and criteria
+ Object[] itemStatistics = null;
+ for (Object[] itemStatisticsIter : itemsStatistics) {
+ Long itemIdIter = (Long) itemStatisticsIter[0];
+ Long ratingCriteriaIdIter = (Long) itemStatisticsIter[1];
+
+ if (itemIdIter.equals(itemId) && ratingCriteriaIdIter.equals(criteriaId)) {
+ itemStatistics = itemStatisticsIter;
+ }
+ }
+
+ String averageRating = itemStatistics == null ? "0" : numberFormat.format(itemStatistics[2]);
+ String numberOfVotes = itemStatistics == null ? "0" : String.valueOf(itemStatistics[3]);
+ criteriaDto.setAverageRating(averageRating);
+ criteriaDto.setNumberOfVotes(numberOfVotes);
+
+ criteriaDtos.add(criteriaDto);
+
+ }
+
+ }
+
+ return itemDtos;
}
@Override
@@ -150,13 +275,89 @@
}
@Override
- public void saveOrUpdateRatingCriteria(RatingCriteria criteria) {
- ratingCriteriaDAO.saveOrUpdate(criteria);
- }
+ public void saveRatingCriterias(HttpServletRequest request, Collection oldCriterias,
+ Long toolContentId) {
+ // create orderId to RatingCriteria map
+ Map mapOrderIdToRatingCriteria = new HashMap();
+ for (RatingCriteria ratingCriteriaIter : oldCriterias) {
+ mapOrderIdToRatingCriteria.put(ratingCriteriaIter.getOrderId(), ratingCriteriaIter);
+ }
+ int criteriaMaxOrderId = WebUtil.readIntParam(request, "criteriaMaxOrderId");
+ // i is equal to an old orderId
+ for (int i = 1; i <= criteriaMaxOrderId; i++) {
+
+ String criteriaTitle = WebUtil.readStrParam(request, "criteriaTitle" + i, true);
+
+ RatingCriteria ratingCriteria = mapOrderIdToRatingCriteria.get(i);
+ if (StringUtils.isNotBlank(criteriaTitle)) {
+ int newCriteriaOrderId = WebUtil.readIntParam(request, "criteriaOrderId" + i);
+
+ // modify existing one if it exists. add otherwise
+ if (ratingCriteria == null) {
+ ratingCriteria = new LearnerItemRatingCriteria();
+ ratingCriteria.setRatingCriteriaTypeId(LearnerItemRatingCriteria.LEARNER_ITEM_CRITERIA_TYPE);
+ ((LearnerItemRatingCriteria) ratingCriteria).setToolContentId(toolContentId);
+ }
+
+ ratingCriteria.setOrderId(newCriteriaOrderId);
+ ratingCriteria.setTitle(criteriaTitle);
+ ratingCriteriaDAO.saveOrUpdate(ratingCriteria);
+ // !!updatedCriterias.add(ratingCriteria);
+
+ // delete
+ } else if (ratingCriteria != null) {
+ ratingCriteriaDAO.deleteRatingCriteria(ratingCriteria.getRatingCriteriaId());
+ }
+
+ }
+
+ // ==== handle comments criteria ====
+
+ boolean isCommentsEnabled = WebUtil.readBooleanParam(request, "isCommentsEnabled", false);
+ // find comments' responsible RatingCriteria
+ RatingCriteria commentsResponsibleCriteria = null;
+ for (RatingCriteria ratingCriteriaIter : oldCriterias) {
+ if (ratingCriteriaIter.isCommentsEnabled()) {
+ commentsResponsibleCriteria = ratingCriteriaIter;
+ break;
+ }
+ }
+ // create commentsRatingCriteria if it's required
+ if (isCommentsEnabled) {
+ if (commentsResponsibleCriteria == null) {
+ commentsResponsibleCriteria = new LearnerItemRatingCriteria();
+ commentsResponsibleCriteria
+ .setRatingCriteriaTypeId(LearnerItemRatingCriteria.LEARNER_ITEM_CRITERIA_TYPE);
+ ((LearnerItemRatingCriteria) commentsResponsibleCriteria).setToolContentId(toolContentId);
+ commentsResponsibleCriteria.setOrderId(0);
+ commentsResponsibleCriteria.setCommentsEnabled(true);
+ }
+
+ int commentsMinWordsLimit = WebUtil.readIntParam(request, "commentsMinWordsLimit");
+ commentsResponsibleCriteria.setCommentsMinWordsLimit(commentsMinWordsLimit);
+
+ ratingCriteriaDAO.saveOrUpdate(commentsResponsibleCriteria);
+
+ // delete commentsRatingCriteria if it's not required
+ } else {
+ if (commentsResponsibleCriteria != null) {
+ ratingCriteriaDAO.deleteRatingCriteria(commentsResponsibleCriteria.getRatingCriteriaId());
+ }
+ }
+ }
+
@Override
- public void deleteRatingCriteria(Long ratingCriteriaId) {
- ratingCriteriaDAO.deleteRatingCriteria(ratingCriteriaId);
+ public boolean isCommentsEnabled(Long toolContentId) {
+ //TODO implement as new DAO method without getting all criterias
+ List criterias = ratingCriteriaDAO.getByToolContentId(toolContentId);
+
+ boolean isCommentsEnabled = false;
+ for (RatingCriteria criteria : criterias) {
+ isCommentsEnabled |= criteria.isCommentsEnabled();
+ }
+
+ return isCommentsEnabled;
}
/* ********** Used by Spring to "inject" the linked objects ************* */
Index: lams_common/src/java/org/lamsfoundation/lams/web/util/AttributeNames.java
===================================================================
RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/web/util/AttributeNames.java,v
diff -u -r1.36 -r1.37
--- lams_common/src/java/org/lamsfoundation/lams/web/util/AttributeNames.java 26 Mar 2015 21:17:44 -0000 1.36
+++ lams_common/src/java/org/lamsfoundation/lams/web/util/AttributeNames.java 21 May 2015 23:39:28 -0000 1.37
@@ -84,8 +84,12 @@
public static final String ATTR_SESSION_STATUS = "sessionStatus";
public static final String ATTR_ACTIVITY_POSITION = "activityPosition";
public static final String ATTR_LEARNER_CONTENT_FOLDER = "learnerContentFolder";
+
public static final String ATTR_RATING_CRITERIAS = "ratingCriterias";
public static final String ATTR_RATINGS = "ratings";
+ public static final String ATTR_ITEM_RATING_DTO = "itemRatingDto";
+ public static final String ATTR_ITEM_RATING_DTOS = "itemRatingDtos";
+ public static final String ATTR_COUNT_RATED_ITEMS = "countRatedItems";
// for Pedagogical Planner
public static final String PARAM_COMMAND = "command";