diff --git a/source/java/org/alfresco/repo/rating/RatingServiceImpl.java b/source/java/org/alfresco/repo/rating/RatingServiceImpl.java index 62f86629fb..8ca2ab7728 100644 --- a/source/java/org/alfresco/repo/rating/RatingServiceImpl.java +++ b/source/java/org/alfresco/repo/rating/RatingServiceImpl.java @@ -20,6 +20,7 @@ package org.alfresco.repo.rating; import java.io.Serializable; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; @@ -37,6 +38,8 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.service.namespace.QNamePattern; +import org.alfresco.service.namespace.RegexQNamePattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -79,17 +82,39 @@ public class RatingServiceImpl implements RatingService * (non-Javadoc) * @see org.alfresco.service.cmr.rating.RatingService#applyRating(org.alfresco.service.cmr.repository.NodeRef, int, java.lang.String) */ - public void applyRating(NodeRef targetNode, int rating, - String ratingSchemeName) throws RatingServiceException + public void applyRating(final NodeRef targetNode, final int rating, + final String ratingSchemeName) throws RatingServiceException { - String currentUser = AuthenticationUtil.getFullyAuthenticatedUser(); - this.applyRating(targetNode, rating, ratingSchemeName, currentUser); + final String currentUser = AuthenticationUtil.getFullyAuthenticatedUser(); + boolean isCreator = isCurrentUserNodeCreator(targetNode); + if (isCreator) + { + throw new RatingServiceException("Users can't rate their own content."); + } + + AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() { + public Void doWork() throws Exception + { + applyRating(targetNode, rating, ratingSchemeName, currentUser); + return null; + } + }, AuthenticationUtil.getSystemUserName()); + } + + private boolean isCurrentUserNodeCreator(NodeRef targetNode) + { + final String currentUser = AuthenticationUtil.getFullyAuthenticatedUser(); + // TODO Is creator the right property here? + Serializable creator = nodeService.getProperty(targetNode, ContentModel.PROP_CREATOR); + return currentUser.equals(creator); } @SuppressWarnings("unchecked") private void applyRating(NodeRef targetNode, int rating, String ratingSchemeName, final String userName) throws RatingServiceException { + //TODO More logging. + // Sanity check the rating scheme being used and the rating being applied. final RatingScheme ratingScheme = this.getRatingScheme(ratingSchemeName); if (ratingScheme == null) @@ -127,11 +152,12 @@ public class RatingServiceImpl implements RatingService else { // There are previous ratings by this user. Things are a little more complex. - if (myRatingChildren.size() > 1) + if (myRatingChildren.size() > 1 && log.isDebugEnabled()) { - //TODO This should not happen. Log + log.debug(""); } NodeRef myPreviousRatingsNode = myRatingChildren.get(0).getChildRef(); + Map existingProps = nodeService.getProperties(myPreviousRatingsNode); List existingRatingSchemes = (List)existingProps.get(ContentModel.PROP_RATING_SCHEME); List existingRatingScores = (List)existingProps.get(ContentModel.PROP_RATING_SCORE); @@ -164,16 +190,16 @@ public class RatingServiceImpl implements RatingService /* * (non-Javadoc) - * @see org.alfresco.service.cmr.rating.RatingService#getRating(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.rating.RatingScheme) + * @see org.alfresco.service.cmr.rating.RatingService#getRatingByCurrentUser(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) */ - public Rating getRatingByCurrentUser(NodeRef targetNode, RatingScheme ratingScheme) + public Rating getRatingByCurrentUser(NodeRef targetNode, String ratingSchemeName) { String currentUser = AuthenticationUtil.getFullyAuthenticatedUser(); - return this.getRating(targetNode, ratingScheme, currentUser); + return this.getRating(targetNode, ratingSchemeName, currentUser); } @SuppressWarnings("unchecked") - private Rating getRating(NodeRef targetNode, RatingScheme ratingScheme, String user) + private Rating getRating(NodeRef targetNode, String ratingSchemeName, String user) { List ratingChildren = getRatingNodeChildren(targetNode, user); @@ -188,6 +214,7 @@ public class RatingServiceImpl implements RatingService Map properties = nodeService.getProperties(lastChild.getChildRef()); // Find the index of the rating scheme we're interested in. + RatingScheme ratingScheme = getRatingScheme(ratingSchemeName); int index = findIndexOfRatingScheme(properties, ratingScheme); if (index == -1) { @@ -219,17 +246,17 @@ public class RatingServiceImpl implements RatingService /* * (non-Javadoc) - * @see org.alfresco.service.cmr.rating.RatingService#removeRatingByCurrentUser(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.rating.RatingScheme) + * @see org.alfresco.service.cmr.rating.RatingService#removeRatingByCurrentUser(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) */ public Rating removeRatingByCurrentUser(NodeRef targetNode, - RatingScheme ratingScheme) + String ratingScheme) { String currentUser = AuthenticationUtil.getFullyAuthenticatedUser(); return removeRating(targetNode, ratingScheme, currentUser); } @SuppressWarnings("unchecked") - private Rating removeRating(NodeRef targetNode, RatingScheme ratingScheme, String user) + private Rating removeRating(NodeRef targetNode, String ratingSchemeName, String user) { List ratingChildren = getRatingNodeChildren(targetNode, user); if (ratingChildren.isEmpty()) @@ -242,6 +269,7 @@ public class RatingServiceImpl implements RatingService Map properties = nodeService.getProperties(lastChild.getChildRef()); // Find the index of the rating scheme we're interested in. + RatingScheme ratingScheme = getRatingScheme(ratingSchemeName); int index = this.findIndexOfRatingScheme(properties, ratingScheme); if (index == -1) { @@ -263,23 +291,140 @@ public class RatingServiceImpl implements RatingService oldScore, user, oldDate); } } + + /* + * (non-Javadoc) + * @see org.alfresco.service.cmr.rating.RatingService#getTotalRating(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) + */ + public int getTotalRating(NodeRef targetNode, String ratingSchemeName) + { + //TODO Put these in the db as properties? + List ratingsNodes = this.getRatingNodeChildren(targetNode, null); + + // It's one node per user so the size of this list is the number of ratings applied. + // However not all of these users' ratings need be in the specified scheme. + // So we need to go through and check that the rating node contains a rating for the + // specified scheme. + int result = 0; + for (ChildAssociationRef ratingsNode : ratingsNodes) + { + List ratings = getRatingsFrom(ratingsNode.getChildRef()); + for (Rating rating : ratings) + { + if (rating.getScheme().getName().equals(ratingSchemeName)) + { + result += rating.getScore(); + } + } + } + return result; + } + + // TODO We can at least amagamate these into one looping call. + public float getAverageRating(NodeRef targetNode, String ratingSchemeName) + { + //TODO Put these in the db as properties? + List ratingsNodes = this.getRatingNodeChildren(targetNode, null); + + // It's one node per user so the size of this list is the number of ratings applied. + // However not all of these users' ratings need be in the specified scheme. + // So we need to go through and check that the rating node contains a rating for the + // specified scheme. + int ratingCount = 0; + int ratingTotal = 0; + for (ChildAssociationRef ratingsNode : ratingsNodes) + { + List ratings = getRatingsFrom(ratingsNode.getChildRef()); + for (Rating rating : ratings) + { + if (rating.getScheme().getName().equals(ratingSchemeName)) + { + ratingCount++; + ratingTotal += rating.getScore(); + } + } + } + return (float)ratingTotal / (float)ratingCount; + } + + public int getRatingsCount(NodeRef targetNode, String ratingSchemeName) + { + //TODO Put these in the db as properties? + List ratingsNodes = this.getRatingNodeChildren(targetNode, null); + + // It's one node per user so the size of this list is the number of ratings applied. + // However not all of these users' ratings need be in the specified scheme. + // So we need to go through and check that the rating node contains a rating for the + // specified scheme. + int result = 0; + for (ChildAssociationRef ratingsNode : ratingsNodes) + { + List ratings = getRatingsFrom(ratingsNode.getChildRef()); + for (Rating rating : ratings) + { + if (rating.getScheme().getName().equals(ratingSchemeName)) + { + result++; + } + } + } + return result; + } + /** * This method gets all the cm:rating child nodes of the specified targetNode that * have been applied by the specified user. * * @param targetNode the target node under which the cm:rating nodes reside. - * @param user the user name of the user whose ratings are sought. + * @param user the user name of the user whose ratings are sought, null + * for all users. * @return */ private List getRatingNodeChildren(NodeRef targetNode, String user) { - QName userAssocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, user); + QNamePattern qnamePattern = null; + if (user != null) + { + qnamePattern = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, user); + } + else + { + qnamePattern = RegexQNamePattern.MATCH_ALL; + } + List results = nodeService.getChildAssocs(targetNode, ContentModel.ASSOC_RATINGS, qnamePattern); - // Get all the rating nodes which are from the specified user. - List ratingChildren = - nodeService.getChildAssocs(targetNode, ContentModel.ASSOC_RATINGS, userAssocQName); - return ratingChildren; + return results; + } + + /** + * This method returns a List of {@link Rating} objects for the specified cm:rating + * node. As it's one ratingNode the results will be form one user, but will represent + * 0..n schemes. + * @param ratingNode + * @return + */ + @SuppressWarnings("unchecked") + private List getRatingsFrom(NodeRef ratingNode) + { + // The appliedBy is encoded in the parent assoc qname. + // It will be the same user for all ratings in this node. + ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(ratingNode); + String appliedBy = parentAssoc.getQName().getLocalName(); + + Map properties = nodeService.getProperties(ratingNode); + List ratingSchemes = (List)properties.get(ContentModel.PROP_RATING_SCHEME); + List ratingScores = (List)properties.get(ContentModel.PROP_RATING_SCORE); + List ratingDates = (List)properties.get(ContentModel.PROP_RATED_AT); + + List result = new ArrayList(ratingSchemes.size()); + for (int i = 0; i < ratingSchemes.size(); i++) + { + final String schemeName = ratingSchemes.get(i); + RatingScheme scheme = getRatingScheme(schemeName); + result.add(new Rating(scheme, ratingScores.get(i), appliedBy, ratingDates.get(i))); + } + return result; } } diff --git a/source/java/org/alfresco/repo/rating/RatingServiceIntegrationTest.java b/source/java/org/alfresco/repo/rating/RatingServiceIntegrationTest.java index 10a1abf99f..4a8f35c47d 100644 --- a/source/java/org/alfresco/repo/rating/RatingServiceIntegrationTest.java +++ b/source/java/org/alfresco/repo/rating/RatingServiceIntegrationTest.java @@ -34,10 +34,12 @@ import org.alfresco.service.cmr.rating.RatingService; import org.alfresco.service.cmr.rating.RatingServiceException; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.BaseAlfrescoSpringTest; +import org.alfresco.util.PropertyMap; /** * @author Neil McErlean @@ -45,15 +47,18 @@ import org.alfresco.util.BaseAlfrescoSpringTest; */ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest { + private static final String USER_ERNIE = "Ernie"; + private static final String USER_ERIC = "Eric"; + private PersonService personService; private RatingService ratingService; private Repository repositoryHelper; private NodeRef companyHome; // These NodeRefs are used by the test methods. private NodeRef testFolder; - private NodeRef testSubFolder; - private NodeRef testDocInFolder; - private NodeRef testDocInSubFolder; + private NodeRef testDoc_Admin; + private NodeRef testDoc_Eric; + private NodeRef testDoc_Ernie; // The out of the box scheme names. private static final String LIKES_SCHEME_NAME = "likesRatingScheme"; @@ -63,6 +68,7 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest protected void onSetUpInTransaction() throws Exception { super.onSetUpInTransaction(); + this.personService = (PersonService)this.applicationContext.getBean("PersonService"); this.ratingService = (RatingService) this.applicationContext.getBean("ratingService"); this.repositoryHelper = (Repository) this.applicationContext.getBean("repositoryHelper"); @@ -73,10 +79,26 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest //TODO These could be created @BeforeClass testFolder = createNode(companyHome, "testFolder", ContentModel.TYPE_FOLDER); - testSubFolder = createNode(testFolder, "testSubFolder", ContentModel.TYPE_FOLDER); - - testDocInFolder = createNode(testFolder, "testDocInFolder", ContentModel.TYPE_CONTENT); - testDocInSubFolder = createNode(testSubFolder, "testDocInSubFolder", ContentModel.TYPE_CONTENT); + testDoc_Admin = createNode(testFolder, "testDocInFolder", ContentModel.TYPE_CONTENT); + + createUser(USER_ERIC); + createUser(USER_ERNIE); + + AuthenticationUtil.setFullyAuthenticatedUser(USER_ERIC); + testDoc_Eric = createNode(testFolder, "ericsDoc", ContentModel.TYPE_CONTENT); + AuthenticationUtil.setFullyAuthenticatedUser(USER_ERNIE); + testDoc_Ernie = createNode(testFolder, "erniesDoc", ContentModel.TYPE_CONTENT); + + // And back to admin + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); + } + + @Override + protected void onTearDownInTransaction() throws Exception + { + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); + deleteUser(USER_ERIC); + deleteUser(USER_ERNIE); } private NodeRef createNode(NodeRef parentNode, String name, QName type) @@ -127,7 +149,7 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest int[] illegalRatings = new int[]{0, 2}; for (int illegalRating : illegalRatings) { - applyIllegalRating(testDocInFolder, illegalRating, LIKES_SCHEME_NAME); + applyIllegalRating(testDoc_Admin, illegalRating, LIKES_SCHEME_NAME); } } @@ -145,24 +167,25 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest public void testApplyUpdateDeleteRatings_SingleUserMultipleSchemes() throws Exception { + // We'll do all this as user 'eric'. + AuthenticationUtil.setFullyAuthenticatedUser(USER_ERIC); + //Before we start, let's ensure the read behaviour on a pristine node is correct. - final RatingScheme likesRatingScheme = ratingService.getRatingScheme(LIKES_SCHEME_NAME); - Rating nullRating = ratingService.getRatingByCurrentUser(testDocInFolder, likesRatingScheme); + Rating nullRating = ratingService.getRatingByCurrentUser(testDoc_Admin, LIKES_SCHEME_NAME); assertNull("Expected a null rating,", nullRating); - assertNull("Expected a null remove result.", ratingService.removeRatingByCurrentUser(testDocInFolder, likesRatingScheme)); + assertNull("Expected a null remove result.", ratingService.removeRatingByCurrentUser(testDoc_Admin, LIKES_SCHEME_NAME)); final int likesScore = 1; final int fiveStarScore = 5; - // Both of these ratings will be applied by the same user: the 'current' user. - ratingService.applyRating(testDocInFolder, likesScore, LIKES_SCHEME_NAME); - ratingService.applyRating(testDocInFolder, fiveStarScore, FIVE_STAR_SCHEME_NAME); + ratingService.applyRating(testDoc_Admin, likesScore, LIKES_SCHEME_NAME); + ratingService.applyRating(testDoc_Admin, fiveStarScore, FIVE_STAR_SCHEME_NAME); // Some basic node structure tests. assertTrue(ContentModel.ASPECT_RATEABLE + " aspect missing.", - nodeService.hasAspect(testDocInFolder, ContentModel.ASPECT_RATEABLE)); + nodeService.hasAspect(testDoc_Admin, ContentModel.ASPECT_RATEABLE)); - List allChildren = nodeService.getChildAssocs(testDocInFolder, + List allChildren = nodeService.getChildAssocs(testDoc_Admin, ContentModel.ASSOC_RATINGS, RegexQNamePattern.MATCH_ALL); // It's one cm:rating node per user @@ -176,10 +199,9 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest // Now to check the persisted ratings data are ok. - Rating likeRating = ratingService.getRatingByCurrentUser(testDocInFolder, likesRatingScheme); + Rating likeRating = ratingService.getRatingByCurrentUser(testDoc_Admin, LIKES_SCHEME_NAME); - final RatingScheme fiveStarRatingScheme = ratingService.getRatingScheme(FIVE_STAR_SCHEME_NAME); - Rating fiveStarRating = ratingService.getRatingByCurrentUser(testDocInFolder, fiveStarRatingScheme); + Rating fiveStarRating = ratingService.getRatingByCurrentUser(testDoc_Admin, FIVE_STAR_SCHEME_NAME); assertNotNull("'like' rating was null.", likeRating); assertEquals("Wrong score for rating", likesScore, likeRating.getScore()); @@ -195,10 +217,10 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest // Now we'll update a rating final int updatedFiveStarScore = 3; - ratingService.applyRating(testDocInFolder, updatedFiveStarScore, FIVE_STAR_SCHEME_NAME); + ratingService.applyRating(testDoc_Admin, updatedFiveStarScore, FIVE_STAR_SCHEME_NAME); // Some basic node structure tests. - allChildren = nodeService.getChildAssocs(testDocInFolder, + allChildren = nodeService.getChildAssocs(testDoc_Admin, ContentModel.ASSOC_RATINGS, RegexQNamePattern.MATCH_ALL); // Still one cm:rating node @@ -210,7 +232,7 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest // Now to check the updated ratings data are ok. - Rating updatedFiveStarRating = ratingService.getRatingByCurrentUser(testDocInFolder, fiveStarRatingScheme); + Rating updatedFiveStarRating = ratingService.getRatingByCurrentUser(testDoc_Admin, FIVE_STAR_SCHEME_NAME); // 'like' rating data should be unchanged. assertNotNull("'like' rating was null.", likeRating); @@ -226,7 +248,7 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest assertDateIsCloseToNow(updatedFiveStarRating.getAppliedAt()); // Now we'll delete the 'likes' rating. - Rating deletedLikesRating = ratingService.removeRatingByCurrentUser(testDocInFolder, likesRatingScheme); + Rating deletedLikesRating = ratingService.removeRatingByCurrentUser(testDoc_Admin, LIKES_SCHEME_NAME); // 'like' rating data should be unchanged. assertNotNull("'like' rating was null.", deletedLikesRating); assertEquals("Wrong score for rating", likesScore, deletedLikesRating.getScore()); @@ -234,7 +256,7 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest assertEquals("Wrong date for rating", likeRatingAppliedAt, deletedLikesRating.getAppliedAt()); // And delete the 'five star' rating. - Rating deletedStarRating = ratingService.removeRatingByCurrentUser(testDocInFolder, fiveStarRatingScheme); + Rating deletedStarRating = ratingService.removeRatingByCurrentUser(testDoc_Admin, FIVE_STAR_SCHEME_NAME); // 'five star' rating data should be unchanged. assertNotNull("'5*' rating was null.", deletedStarRating); assertEquals("Wrong score for rating", updatedFiveStarScore, deletedStarRating.getScore()); @@ -256,6 +278,65 @@ public class RatingServiceIntegrationTest extends BaseAlfrescoSpringTest final long millisTolerance = 5000l; // 5 seconds assertTrue("Date was not within " + millisTolerance + "ms of 'now'.", now.getTime() - d.getTime() < millisTolerance); } + + public void testApplyRating_MultipleUsers() throws Exception + { + // 2 different users rating the same piece of content in the same rating scheme + AuthenticationUtil.setFullyAuthenticatedUser(USER_ERNIE); + ratingService.applyRating(testDoc_Admin, 4, FIVE_STAR_SCHEME_NAME); - //TODO Multiple users applying ratings to a doc. + AuthenticationUtil.setFullyAuthenticatedUser(USER_ERIC); + ratingService.applyRating(testDoc_Admin, 2, FIVE_STAR_SCHEME_NAME); + + float meanRating = ratingService.getAverageRating(testDoc_Admin, FIVE_STAR_SCHEME_NAME); + assertEquals("Document had wrong mean rating.", 3f, meanRating); + + int totalRating = ratingService.getTotalRating(testDoc_Admin, FIVE_STAR_SCHEME_NAME); + assertEquals("Document had wrong total rating.", 6, totalRating); + + int ratingsCount = ratingService.getRatingsCount(testDoc_Admin, FIVE_STAR_SCHEME_NAME); + assertEquals("Document had wrong ratings count.", 2, ratingsCount); + } + + public void testUsersCantRateTheirOwnContent() throws Exception + { + try + { + AuthenticationUtil.setFullyAuthenticatedUser(USER_ERNIE); + ratingService.applyRating(testDoc_Ernie, 4, FIVE_STAR_SCHEME_NAME); + } catch (RatingServiceException expected) + { + return; + } + fail("Expected exception not thrown"); + } + + private void createUser(String userName) + { + if (! authenticationService.authenticationExists(userName)) + { + authenticationService.createAuthentication(userName, "PWD".toCharArray()); + } + + if (! personService.personExists(userName)) + { + PropertyMap ppOne = new PropertyMap(4); + ppOne.put(ContentModel.PROP_USERNAME, userName); + ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); + ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); + ppOne.put(ContentModel.PROP_EMAIL, "email@email.com"); + ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); + + personService.createPerson(ppOne); + } + } + + private void deleteUser(String userName) + { + if (personService.personExists(userName)) + { + personService.deletePerson(userName); + } + } + } diff --git a/source/java/org/alfresco/service/cmr/rating/RatingService.java b/source/java/org/alfresco/service/cmr/rating/RatingService.java index d1303b0dbf..356361ac93 100644 --- a/source/java/org/alfresco/service/cmr/rating/RatingService.java +++ b/source/java/org/alfresco/service/cmr/rating/RatingService.java @@ -26,7 +26,18 @@ import org.alfresco.service.PublicService; import org.alfresco.service.cmr.repository.NodeRef; /** - * The Rating service. TODO + * Interface for public and internal rating operations. + *

+ * The RatingService can be used to manage ratings on any content node in the repository. + * These ratings are defined by {@link RatingScheme rating schemes} + * which are injected via spring (see rating-service-context.xml). The rating + * schemes define a minimum and a maximum score value for that scheme. + *

+ * Ratings can be {@link RatingService#applyRating(NodeRef, int, String) applied}, + * {@link RatingService#applyRating(NodeRef, int, String) updated} and + * {@link RatingService#removeRatingByCurrentUser(NodeRef, RatingScheme) removed}. + * + * TODO Get average/total * * @author Neil McErlean * @since 3.4 @@ -68,6 +79,24 @@ public interface RatingService @NotAuditable void applyRating(NodeRef targetNode, int rating, String ratingSchemeName) throws RatingServiceException; + /** + * This method gets the number of individual ratings which have been applied to + * the specified node in the specified {@link RatingScheme}. + * + * @param targetNode the node on which the rating is sought. + * @param ratingScheme the rating scheme to use. + * + * @return the number of individual ratings applied to this node. + * @see RatingService#getRatingSchemes() + * @see RatingScheme + */ + @NotAuditable + int getRatingsCount(NodeRef targetNode, String ratingSchemeName); + + int getTotalRating(NodeRef targetNode, String ratingSchemeName); + + float getAverageRating(NodeRef targetNode, String ratingSchemeName); + /** * This method gets the {@link Rating} applied by the current user to the specified node in the specified * {@link RatingScheme} - if there is one. @@ -80,10 +109,7 @@ public interface RatingService * @see RatingScheme */ @NotAuditable - - // TODO Get average/total ratings on node - - Rating getRatingByCurrentUser(NodeRef targetNode, RatingScheme ratingScheme); + Rating getRatingByCurrentUser(NodeRef targetNode, String ratingSchemeName); /** * This method removes any {@link Rating} applied by the current user to the specified node in the specified @@ -97,5 +123,5 @@ public interface RatingService * @see RatingScheme */ @NotAuditable - Rating removeRatingByCurrentUser(NodeRef targetNode, RatingScheme ratingScheme); + Rating removeRatingByCurrentUser(NodeRef targetNode, String ratingSchemeName); }