From 814e7b506442dc2df387672dd51cb090d73ab648 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 20 Dec 2013 10:39:07 +0100
Subject: [PATCH] OO-917: implement a count method pendant to the list of
 properties

---
 .../auditing/UserNodeAuditManagerImpl.java    |  7 +-
 .../properties/CoursePropertyManager.java     | 10 +++
 .../PersistingCoursePropertyManager.java      |  7 ++
 .../preview/PreviewCoursePropertyManager.java |  5 ++
 .../properties/NarrowedPropertyManager.java   |  4 ++
 .../org/olat/properties/PropertyManager.java  | 66 ++++++++++++++++---
 .../org/olat/properties/PropertyTest.java     |  3 +
 7 files changed, 89 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
index a57441599de..db58d52d9e9 100644
--- a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
+++ b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
@@ -26,7 +26,6 @@ package org.olat.course.auditing;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.List;
 
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -102,17 +101,19 @@ public class UserNodeAuditManagerImpl extends UserNodeAuditManager {
 	/**
 	 * @see org.olat.course.auditing.AuditManager#hasUserNodeLogs(org.olat.course.nodes.CourseNode)
 	 */
+	@Override
 	public boolean hasUserNodeLogs(CourseNode node) {
 		ICourse course = CourseFactory.loadCourse(ores);
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
-		List<?> logsProperties = cpm.listCourseNodeProperties(node, null, null, LOG_IDENTIFYER);
-		return logsProperties.size() == 0 ? false : true;
+		int numOfProperties = cpm.countCourseNodeProperties(node, null, null, LOG_IDENTIFYER);
+		return numOfProperties > 0;
 	}
 
 	/**
 	 * @see org.olat.course.auditing.AuditManager#getUserNodeLog(org.olat.course.nodes.CourseNode,
 	 *      org.olat.core.id.Identity)
 	 */
+	@Override
 	public String getUserNodeLog(CourseNode courseNode, Identity identity) {
 		ICourse course = CourseFactory.loadCourse(ores);
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
diff --git a/src/main/java/org/olat/course/properties/CoursePropertyManager.java b/src/main/java/org/olat/course/properties/CoursePropertyManager.java
index fcd5a442580..58eae4067d7 100644
--- a/src/main/java/org/olat/course/properties/CoursePropertyManager.java
+++ b/src/main/java/org/olat/course/properties/CoursePropertyManager.java
@@ -87,6 +87,16 @@ public interface CoursePropertyManager extends IdentityAnonymizerCallback {
 	 */
 	public List<Property> listCourseNodeProperties(CourseNode node, Identity identity, BusinessGroup grp, String name);
 	
+	/**
+	 * Same as above but only count the properties
+	 * @param node
+	 * @param identity
+	 * @param grp
+	 * @param name
+	 * @return
+	 */
+	public int countCourseNodeProperties(CourseNode node, Identity identity, BusinessGroup grp, String name);
+	
 	/**
 	 * Find course node properties (exact match. I.e. null values are taken into account)
 	 * @param node
diff --git a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java
index aecac3a8dc4..81619b54a12 100644
--- a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java
+++ b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java
@@ -125,11 +125,18 @@ public class PersistingCoursePropertyManager extends BasicManager implements Cou
 	 *      org.olat.core.id.Identity, org.olat.group.BusinessGroup,
 	 *      java.lang.String)
 	 */
+	@Override
 	public List<Property> listCourseNodeProperties(CourseNode node, Identity identity, BusinessGroup grp, String name) {
 		String myCategory = buildCourseNodePropertyCategory(node);
 		return pm.listProperties(identity, grp, myCategory, name);
 	}
 
+	@Override
+	public int countCourseNodeProperties(CourseNode node, Identity identity, BusinessGroup grp, String name) {
+		String myCategory = buildCourseNodePropertyCategory(node);
+		return pm.countProperties(identity, grp, myCategory, name);
+	}
+
 	/**
 	 * @see org.olat.course.properties.CoursePropertyManager#findCourseNodeProperties(org.olat.course.nodes.CourseNode,
 	 *      org.olat.core.id.Identity, org.olat.group.BusinessGroup,
diff --git a/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java b/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java
index fda347cd63e..a7c41451a64 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java
@@ -124,6 +124,11 @@ final class PreviewCoursePropertyManager extends BasicManager implements CourseP
 		throw new AssertException("Not implemented for preview.");
 	}
 
+	@Override
+	public int countCourseNodeProperties(CourseNode node, Identity identity, BusinessGroup grp, String name) {
+		return 0;
+	}
+
 	/**
 	 * @see org.olat.course.properties.CoursePropertyManager#findCourseNodeProperties(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity, org.olat.group.BusinessGroup, java.lang.String)
 	 */
diff --git a/src/main/java/org/olat/properties/NarrowedPropertyManager.java b/src/main/java/org/olat/properties/NarrowedPropertyManager.java
index 58099d16644..5aed6555919 100644
--- a/src/main/java/org/olat/properties/NarrowedPropertyManager.java
+++ b/src/main/java/org/olat/properties/NarrowedPropertyManager.java
@@ -118,6 +118,10 @@ public class NarrowedPropertyManager {
 		return pm.listProperties(identity, grp, resourceable, category, name);
 	}
 	
+	public int countProperties(Identity identity, BusinessGroup grp, String category, String name) {
+		return pm.countProperties(identity, grp, resourceable, category, name);
+	}
+	
 	/**
 	 * Generic find method. Returns a list of Property objects. This is an exact match i.e. if you pass-on null values,
 	 * null values will be included in the query.
diff --git a/src/main/java/org/olat/properties/PropertyManager.java b/src/main/java/org/olat/properties/PropertyManager.java
index a8ae2569dfb..b049e17db6f 100644
--- a/src/main/java/org/olat/properties/PropertyManager.java
+++ b/src/main/java/org/olat/properties/PropertyManager.java
@@ -181,10 +181,19 @@ public class PropertyManager extends BasicManager implements UserDataDeletable {
 	 * @return a list of Property objects
 	 */
 	public List<Property> listProperties(Identity identity, BusinessGroup grp, OLATResourceable resourceable, String category, String name) {
-		if (resourceable == null) 
+		if (resourceable == null) {
 			return listProperties(identity, grp, null, null, category, name);
-		else
+		} else {
 			return listProperties(identity, grp, resourceable.getResourceableTypeName(), resourceable.getResourceableId(), category, name);
+		}
+	}
+	
+	public int countProperties(Identity identity, BusinessGroup grp, OLATResourceable resourceable, String category, String name) {
+		if (resourceable == null) {
+			return countProperties(identity, grp, null, null, category, name, null, null);
+		} else {
+			return countProperties(identity, grp, resourceable.getResourceableTypeName(), resourceable.getResourceableId(), category, name, null, null);
+		}
 	}
 	
 	/**
@@ -201,6 +210,13 @@ public class PropertyManager extends BasicManager implements UserDataDeletable {
 		return listProperties(identity, grp, resourceTypeName, resourceTypeId, category, name, null, null);
 	}
 
+	public int countProperties(Identity identity, BusinessGroup grp, String resourceTypeName, Long resourceTypeId,
+			String category, String name, Long longValue, String stringValue) {
+		TypedQuery<Number> query = createQueryListProperties(identity, grp, resourceTypeName, resourceTypeId,
+				category, name, longValue, stringValue, Number.class);
+		return query.getSingleResult().intValue();
+	}
+
 	/**
 	 * Only to use if no OLATResourceable Object is available.
 	 * @param identity
@@ -215,14 +231,44 @@ public class PropertyManager extends BasicManager implements UserDataDeletable {
 	 */
 	public List<Property> listProperties(Identity identity, BusinessGroup grp, String resourceTypeName, Long resourceTypeId,
 			String category, String name, Long longValue, String stringValue) {
+		TypedQuery<Property> query = createQueryListProperties(identity, grp, resourceTypeName, resourceTypeId,
+				category, name, longValue, stringValue, Property.class);
+		return query.getResultList();
+	}
+	
+	/**
+	 * 
+	 * @param identity
+	 * @param grp
+	 * @param resourceTypeName
+	 * @param resourceTypeId
+	 * @param category
+	 * @param name
+	 * @param longValue
+	 * @param stringValue
+	 * @param resultClass Only Number and Property are acceptable
+	 * @return
+	 */
+	private <U> TypedQuery<U> createQueryListProperties(Identity identity, BusinessGroup grp, String resourceTypeName, Long resourceTypeId,
+			String category, String name, Long longValue, String stringValue, Class<U> resultClass) {
 		
 		StringBuilder sb = new StringBuilder();
-		sb.append("select v from ").append(Property.class.getName()).append(" as v ");
-		if (identity != null) {
-			sb.append(" inner join fetch v.identity identity ");
-		}
-		if (grp != null) {
-			sb.append(" inner join fetch v.grp grp ");
+		if(Number.class.equals(resultClass)) {
+			sb.append("select count(v) from ").append(Property.class.getName()).append(" as v ");
+			if (identity != null) {
+				sb.append(" inner join v.identity identity ");
+			}
+			if (grp != null) {
+				sb.append(" inner join v.grp grp ");
+			}
+		} else {
+			sb.append("select v from ").append(Property.class.getName()).append(" as v ");
+			if (identity != null) {
+				sb.append(" inner join fetch v.identity identity ");
+			}
+			if (grp != null) {
+				sb.append(" inner join fetch v.grp grp ");
+			}
 		}
 		sb.append(" where ");
 
@@ -260,7 +306,7 @@ public class PropertyManager extends BasicManager implements UserDataDeletable {
 			sb.append("v.stringValue=:string");			
 		}
 		
-		TypedQuery<Property> queryProps = DBFactory.getInstance().getCurrentEntityManager().createQuery(sb.toString(), Property.class);
+		TypedQuery<U> queryProps = DBFactory.getInstance().getCurrentEntityManager().createQuery(sb.toString(), resultClass);
 		if (identity != null) {
 			queryProps.setParameter("identityKey", identity.getKey());
 		}
@@ -285,7 +331,7 @@ public class PropertyManager extends BasicManager implements UserDataDeletable {
 		if (stringValue != null) {
 			queryProps.setParameter("string", stringValue);
 		}
-		return queryProps.getResultList();
+		return queryProps;
 	}
 	
 	/**
diff --git a/src/test/java/org/olat/properties/PropertyTest.java b/src/test/java/org/olat/properties/PropertyTest.java
index 75bab137531..cb49d236bee 100644
--- a/src/test/java/org/olat/properties/PropertyTest.java
+++ b/src/test/java/org/olat/properties/PropertyTest.java
@@ -196,6 +196,9 @@ public class PropertyTest extends OlatTestCase {
 		Property prop = (Property) entries.get(0);
 		assertEquals(ores.getResourceableTypeName(), prop.getResourceTypeName());
 		assertEquals(ores.getResourceableId(), prop.getResourceTypeId());
+		
+		int numOfEntries = PropertyManager.getInstance().countProperties(identity, group, ores.getResourceableTypeName(), ores.getResourceableId(), "cat", "TestProperty", null, null);
+		Assert.assertEquals(entries.size(), numOfEntries);
 	}
 	
 	/**
-- 
GitLab