From f4f3d919c32a93807c0d820815a9c7bbbc76a929 Mon Sep 17 00:00:00 2001
From: dan-kjel <dan-kjel@73ecded7-942e-4092-bab0-0e58ef0ee984>
Date: Tue, 1 Feb 2011 17:28:54 +0000
Subject: [PATCH] =?UTF-8?q?Bytte=20till=20"Imp"=20ist=C3=A4llet=20f=C3=B6r?=
 =?UTF-8?q?=20"Impl"=20p=C3=A5=20de=20som=20hette=20det=20i=20paketet.=20S?=
 =?UTF-8?q?krev=20om=20EventDaoJPAImp=20till=20SciProevents.=20Skapade=20A?=
 =?UTF-8?q?lla=20Project-relaterade=20klasser?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

git-svn-id: svn://svn.dsv.su.se/scipro/scipro/trunk@42 73ecded7-942e-4092-bab0-0e58ef0ee984
---
 ...DaoJPAImpl.java => AbstractDaoJPAImp.java} |   4 +-
 .../scipro/data/dao/jpa/EventDaoJPAImp.java   |  32 +---
 ....java => LazyDeleteAbstractDaoJPAImp.java} |   4 +-
 .../scipro/data/dao/jpa/ProjectDaoJPAImp.java | 164 ++++++++++++++++++
 .../dao/jpa/ProjectFollowerDaoJPAImp.java     |  12 ++
 .../dao/jpa/ProjectScheduleDaoJPAImp.java     | 110 ++++++++++++
 .../scipro/data/dao/jpa/RoleDaoJPAImp.java    |   2 +-
 .../scipro/data/dao/jpa/UserDaoJPAImp.java    |   2 +-
 .../data/dao/jpa/UserNameDaoJPAImp.java       |   2 +-
 9 files changed, 294 insertions(+), 38 deletions(-)
 rename src/main/java/se/su/dsv/scipro/data/dao/jpa/{AbstractDaoJPAImpl.java => AbstractDaoJPAImp.java} (95%)
 rename src/main/java/se/su/dsv/scipro/data/dao/jpa/{LazyDeleteAbstractDaoJPAImpl.java => LazyDeleteAbstractDaoJPAImp.java} (95%)
 create mode 100644 src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectDaoJPAImp.java
 create mode 100644 src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectFollowerDaoJPAImp.java
 create mode 100644 src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectScheduleDaoJPAImp.java

diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImpl.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImp.java
similarity index 95%
rename from src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImpl.java
rename to src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImp.java
index 6e8b48a848..32c3c03da7 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImpl.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImp.java
@@ -21,7 +21,7 @@ import se.su.dsv.scipro.data.dataobjects.DomainObject;
  *
  * @param <T>
  */
-public abstract class AbstractDaoJPAImpl<T extends DomainObject> extends JpaDaoSupport implements Dao<T> {
+public abstract class AbstractDaoJPAImp<T extends DomainObject> extends JpaDaoSupport implements Dao<T> {
 	
 	protected Class<T> domainClass;
 	protected String domainClassString;
@@ -35,7 +35,7 @@ public abstract class AbstractDaoJPAImpl<T extends DomainObject> extends JpaDaoS
 	}
 	
 
-	public AbstractDaoJPAImpl(Class<T> domainClass) {
+	public AbstractDaoJPAImp(Class<T> domainClass) {
 		this.domainClass = domainClass;
 		domainClassString = domainClass.getCanonicalName();
 	}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java
index ef9b4b756c..b7e76c640e 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java
@@ -1,14 +1,5 @@
 package se.su.dsv.scipro.data.dao.jpa;
 
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceException;
-import javax.persistence.TypedQuery;
-
-import org.springframework.orm.jpa.JpaCallback;
-import org.springframework.transaction.annotation.Transactional;
-
 import se.su.dsv.scipro.data.dao.interfaces.EventDao;
 import se.su.dsv.scipro.data.dataobjects.Event;
 
@@ -16,31 +7,10 @@ import se.su.dsv.scipro.data.dataobjects.Event;
  * @author Richard Wilkinson - richard.wilkinson@jweekend.com
  *
  */
-public class EventDaoJPAImp extends AbstractDaoJPAImpl<Event> implements EventDao {
+public class EventDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<Event> implements EventDao {
 
 	public EventDaoJPAImp() {
 		super(Event.class);
 	}
 
-	@Transactional
-	public List<Event> findAll() {
-		return getJpaTemplate().execute(new JpaCallback<List<Event>>() {
-			public List<Event> doInJpa(EntityManager em) throws PersistenceException {
-				TypedQuery<Event> query = em.createQuery("select e from Event e", Event.class);
-				return query.getResultList();
-			}
-		});
-	}
-
-	@Transactional
-	public int countAll() {
-		return getJpaTemplate().execute(new JpaCallback<Integer>() {
-
-			public Integer doInJpa(EntityManager em) throws PersistenceException {
-				TypedQuery<Long> query = em.createQuery("select count (e) from Event e", Long.class);
-				return (query.getSingleResult()).intValue();
-			}
-		});
-
-	}
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/LazyDeleteAbstractDaoJPAImpl.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/LazyDeleteAbstractDaoJPAImp.java
similarity index 95%
rename from src/main/java/se/su/dsv/scipro/data/dao/jpa/LazyDeleteAbstractDaoJPAImpl.java
rename to src/main/java/se/su/dsv/scipro/data/dao/jpa/LazyDeleteAbstractDaoJPAImp.java
index 42e9cd0155..e23673cc46 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/LazyDeleteAbstractDaoJPAImpl.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/LazyDeleteAbstractDaoJPAImp.java
@@ -20,9 +20,9 @@ import se.su.dsv.scipro.data.dataobjects.DomainObject;
  *
  * @param <T>
  */
-public abstract class LazyDeleteAbstractDaoJPAImpl<T extends DomainObject & LazyDeletable> extends AbstractDaoJPAImpl<T> implements LazyDeleteDao<T> {
+public abstract class LazyDeleteAbstractDaoJPAImp<T extends DomainObject & LazyDeletable> extends AbstractDaoJPAImp<T> implements LazyDeleteDao<T> {
 	
-	public LazyDeleteAbstractDaoJPAImpl(Class<T> domainClass) {
+	public LazyDeleteAbstractDaoJPAImp(Class<T> domainClass) {
 		super(domainClass);
 	}
 	
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectDaoJPAImp.java
new file mode 100644
index 0000000000..66499de4f4
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectDaoJPAImp.java
@@ -0,0 +1,164 @@
+package se.su.dsv.scipro.data.dao.jpa;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceException;
+import javax.persistence.TypedQuery;
+
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.transaction.annotation.Transactional;
+
+import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
+import se.su.dsv.scipro.data.dataobjects.Project;
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.enums.ProjectStatus;
+import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
+
+public class ProjectDaoJPAImp extends AbstractDaoJPAImp<Project> implements ProjectDao {
+
+	public ProjectDaoJPAImp() {
+		super(Project.class);
+	}
+
+	@Transactional
+	public List<Project> getProjectsByParticipant(final User user, final ProjectStatus projectStatus) {
+		return getJpaTemplate().execute(new JpaCallback<List<Project>>() {
+			public List<Project> doInJpa(EntityManager em)
+			throws PersistenceException {
+				String q = "select p " +
+							"from Project p, User u " +
+							"join p.projectParticipants participant " +
+							"join u.roles role " +
+							"where participant = role " +
+							"and u = :user ";
+				
+				if(projectStatus != null){
+					q += "and p.projectStatus = :status ";
+				}
+				
+				q += "order by p.title asc";
+				
+				TypedQuery<Project> query = em.createQuery(q, Project.class);
+				query.setParameter("user", user);
+				
+				if(projectStatus != null){
+					query.setParameter("status", projectStatus);
+				}
+				
+				try {
+					return query.getResultList();
+				} catch (NoResultException e) {
+					return new ArrayList<Project>();
+				}
+			}
+		});
+	}
+	
+	@Transactional
+	public int countProjectsByParticipant(final User user, final ProjectStatus projectStatus) {
+		return getJpaTemplate().execute(new JpaCallback<Integer>() {
+			public Integer doInJpa(EntityManager em)
+			throws PersistenceException {
+				String q = "select count(p) " +
+							"from Project p, User u " +
+							"join p.projectParticipants participant " +
+							"join u.roles role " +
+							"where participant = role " +
+							"and u = :user ";
+				
+				if(projectStatus != null){
+					q += "and p.projectStatus = :status ";
+				}
+				
+				TypedQuery<Long> query = em.createQuery(q, Long.class);
+				query.setParameter("user", user);
+				
+				if(projectStatus != null){
+					query.setParameter("status", projectStatus);
+				}
+				
+				return (query.getSingleResult()).intValue();
+			}
+		});
+	}
+	
+	@Transactional
+	public List<Project> getProjectsByHeadSupervisor(final User user, final ProjectStatus projectStatus) {
+		return getJpaTemplate().execute(new JpaCallback<List<Project>>() {
+			public List<Project> doInJpa(EntityManager em)
+			throws PersistenceException {
+				String q = "select p " +
+							"from Project p, User u " +
+							"join u.roles role " +
+							"where u = :user " +
+							"and p.headSupervisor = role ";
+				
+				if(projectStatus != null){
+					q += "and p.projectStatus = :status ";
+				}
+				
+				q += "order by p.title asc";
+				
+				TypedQuery<Project> query = em.createQuery(q, Project.class);
+				query.setParameter("user", user);
+				
+				if(projectStatus != null){
+					query.setParameter("status", projectStatus);
+				}
+				
+				try {
+					return query.getResultList();
+				} catch (NoResultException e) {
+					e.printStackTrace();
+					return new ArrayList<Project>();
+				}
+			}
+		});
+	}
+	
+	@Transactional
+	public List<Project> getProjectsByProjectTeamMember(final User user, final ProjectStatus projectStatus, final ProjectTeamMemberRoles teamRole) {
+		return getJpaTemplate().execute(new JpaCallback<List<Project>>() {
+			public List<Project> doInJpa(EntityManager em)
+			throws PersistenceException {
+				String q = "select p " +
+							"from Project p, User u " +
+							"join u.roles role " +
+							"join p.projectFollowers pf " +
+							"where u = :user " +
+							"and pf.follower = role ";
+				
+				if(projectStatus != null){
+					q += "and p.projectStatus = :status ";
+				}
+				
+				if(teamRole != null){
+					q += "and pf.projectRole = :teamRole ";
+				}
+				
+				q += "order by p.title asc";
+				
+				TypedQuery<Project> query = em.createQuery(q, Project.class);
+				query.setParameter("user", user);
+				
+				if(projectStatus != null){
+					query.setParameter("status", projectStatus);
+				}
+				
+				if(teamRole != null){
+					query.setParameter("teamRole", teamRole);
+				}
+				
+				try {
+					return query.getResultList();
+				} catch (NoResultException e) {
+					e.printStackTrace();
+					return new ArrayList<Project>();
+				}
+			}
+		});
+	}
+}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectFollowerDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectFollowerDaoJPAImp.java
new file mode 100644
index 0000000000..fd5a56d6d7
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectFollowerDaoJPAImp.java
@@ -0,0 +1,12 @@
+package se.su.dsv.scipro.data.dao.jpa;
+
+import se.su.dsv.scipro.data.dao.interfaces.ProjectFollowerDao;
+import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
+
+public class ProjectFollowerDaoJPAImp extends AbstractDaoJPAImp<ProjectFollower> implements ProjectFollowerDao {
+
+	public ProjectFollowerDaoJPAImp() {
+		super(ProjectFollower.class);
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectScheduleDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectScheduleDaoJPAImp.java
new file mode 100644
index 0000000000..7da9b1287c
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectScheduleDaoJPAImp.java
@@ -0,0 +1,110 @@
+package se.su.dsv.scipro.data.dao.jpa;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceException;
+import javax.persistence.TypedQuery;
+
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.transaction.annotation.Transactional;
+
+import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
+import se.su.dsv.scipro.data.dataobjects.Event;
+import se.su.dsv.scipro.data.dataobjects.ProjectSchedule;
+
+public class ProjectScheduleDaoJPAImp extends AbstractDaoJPAImp<ProjectSchedule>
+											implements ProjectScheduleDao {
+	
+	private static final int ALL_EVENTS = 0;
+	private static final int OLD_EVENTS = 1;
+	private static final int UPCOMING_EVENTS = 2;
+	private static final int UPCOMING_AND_NOT_DONE_EVENTS = 3;
+
+	public ProjectScheduleDaoJPAImp() {
+		super(ProjectSchedule.class);
+	}
+	
+	@Transactional
+	public List<Event> getEventsByProjectSchedule(final ProjectSchedule ps, final int eventCode, final Boolean eventIsDone) {
+		return getJpaTemplate().execute(new JpaCallback<List<Event>>() {
+			public List<Event> doInJpa(EntityManager em) throws PersistenceException {
+				
+				String q = "Select e " +
+							"from Event e " +
+							"where e.projectSchedule = :ps " +
+							"and e.deleted = false ";
+				
+				switch(eventCode){
+					case OLD_EVENTS:
+						q += "and e.dueDate < now() ";
+						break;
+					case UPCOMING_AND_NOT_DONE_EVENTS:
+						q += "and (e.dueDate > now() or e.done = false) ";
+						break;
+					case UPCOMING_EVENTS:
+						q += "and e.dueDate > now() ";
+						break;
+					case ALL_EVENTS:
+					default:
+						break;
+				}
+				
+				if(eventIsDone != null){
+					q += String.format("and e.done = %s ", eventIsDone);
+				}
+				
+				q += "order by e.dueDate asc";
+				
+				System.out.println(q);
+				
+				TypedQuery<Event> query = em.createQuery(q, Event.class);
+				query.setParameter("ps", ps);
+				
+				try {
+					return query.getResultList();
+				} catch (NoResultException e){
+					return new ArrayList<Event>(1);
+				}
+			}
+		});
+	}
+	
+	public List<Event> getUpcomingEventsByProjectSchedule(final ProjectSchedule ps, boolean includeOldNotDoneEvents) {
+		if(includeOldNotDoneEvents)
+			return getEventsByProjectSchedule(ps, UPCOMING_AND_NOT_DONE_EVENTS, null);
+		else
+			return getEventsByProjectSchedule(ps, UPCOMING_EVENTS, null);
+	}
+	
+	public List<Event> getAllEventsByProjectSchedule(final ProjectSchedule ps) {
+		return getEventsByProjectSchedule(ps, ALL_EVENTS, null);
+	}
+	
+	public List<Event> getOldEventsByProjectSchedule(final ProjectSchedule ps, final Boolean done) {
+		return getEventsByProjectSchedule(ps, OLD_EVENTS, done);
+	}
+	
+	@Transactional
+	public int countOverDueEvents(final ProjectSchedule ps) {
+		return getJpaTemplate().execute(new JpaCallback<Integer>() {
+			public Integer doInJpa(EntityManager em) throws PersistenceException {
+				
+				String q = "select count(e) " +
+							"from Event e " +
+							"where e.projectSchedule = :ps " +
+							"and e.done = false " +
+							"and e.dueDate < now() " +
+							"and e.deleted = false ";
+				
+				TypedQuery<Long> query = em.createQuery(q, Long.class);
+				query.setParameter("ps", ps);
+				
+				return (query.getSingleResult()).intValue();
+			}
+		});
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/RoleDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/RoleDaoJPAImp.java
index 04b6eca47a..1f2e65bf9d 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/RoleDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/RoleDaoJPAImp.java
@@ -13,7 +13,7 @@ import se.su.dsv.scipro.data.dataobjects.Role;
 import se.su.dsv.scipro.data.dataobjects.User;
 
 
-public class RoleDaoJPAImp extends LazyDeleteAbstractDaoJPAImpl<Role> implements
+public class RoleDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<Role> implements
 		RoleDao {
 
 	public RoleDaoJPAImp() {
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java
index f980054707..c226d8dc79 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java
@@ -12,7 +12,7 @@ import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dataobjects.User;
 
 
-public class UserDaoJPAImp extends LazyDeleteAbstractDaoJPAImpl<User> implements
+public class UserDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<User> implements
 		UserDao {
 
 	public UserDaoJPAImp() {
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserNameDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserNameDaoJPAImp.java
index e60db624df..d6ab2011ae 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserNameDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserNameDaoJPAImp.java
@@ -15,7 +15,7 @@ import se.su.dsv.scipro.data.dao.interfaces.UsernameDao;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.Username;
 
-public class UserNameDaoJPAImp extends AbstractDaoJPAImpl<Username> implements UsernameDao{
+public class UserNameDaoJPAImp extends AbstractDaoJPAImp<Username> implements UsernameDao{
 
 	public UserNameDaoJPAImp() {
 		super(Username.class);