public synchronized ListResponse list()

in src/main/java/com/amazon/photosharing/iface/ServiceFacade.java [88:146]


	 public synchronized <T> ListResponse<T> list(ListRequest<T> p_request) {		 		 	
		 
	    	CriteriaBuilder builder = em().getCriteriaBuilder();
			
	    	CriteriaQuery<T> search = builder.createQuery(p_request.getType());		
			CriteriaQuery<Long> count = builder.createQuery(Long.class);
			
			Root<T> root = search.from(p_request.getType());			
					
			count.select(builder.count(root));
			count.from(p_request.getType());
			
			search.select(root);								
			
			Predicate or_predicate = getFilterPredicate(builder::or, root, builder, p_request.getORFilter());
			Predicate and_predicate = getFilterPredicate(builder::and, root, builder, p_request.getANDFilter());	
			Predicate member_predicate = getIsMemberOfPredicate(root, builder, p_request.getMemberFilter());
			Predicate filter_predicate = null;							
			
			if (and_predicate != null && or_predicate != null)
				filter_predicate = builder.and(and_predicate, or_predicate);
			else if (and_predicate != null)
				filter_predicate = and_predicate;
			else if (or_predicate != null)
				filter_predicate = or_predicate;	
			if (member_predicate != null) {
				if  (filter_predicate != null)
					filter_predicate = builder.and(filter_predicate, member_predicate);
				else
					filter_predicate = member_predicate;					
			}
			
			
			if (filter_predicate != null) {
				search.where(filter_predicate);
				count.where(filter_predicate);
			}					
			
			List<Order> order = getSort(root,  builder,  p_request.getSort());
			
			if (order.size() > 0) {
				search.orderBy(order);
			}
				
			
			List<T> results = em().createQuery(search)
				.setHint("org.hibernate.cacheable", p_request.getCachable())
				.setFirstResult(p_request.getFirst())
				.setMaxResults(p_request.getMax())				
				.getResultList();					
			
			Long total = em().createQuery(count)
							.setHint("org.hibernate.cacheable", p_request.getCachable())
							.getSingleResult();					
									
			done();
			
			return new ListResponse<T>(results, p_request.getFirst(), p_request.getMax(), total.intValue());
	    }