/*
* (C) Copyright 2014 Agile Booster.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Maxime ESCOURBIAC
*/
package com.agilebooster.data.jpa;
import com.agilebooster.data.entity.Event;
import com.agilebooster.data.entity.Project;
import com.agilebooster.data.entity.User;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
/**
* Controller class from Projects table.
*
* @author Maxime ESCOURBIAC
*/
public class ProjectController {
private final EntityManagerFactory emf;
/**
* Default constructor.
*/
public ProjectController() {
this.emf = Persistence.createEntityManagerFactory("org.agilebooster_db");
}
/**
* Entity Manager. Manage the object-relational-mapping persistance.
*
* @return Entity Manager.
*/
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
/**
* Create the project in database.
*
* @param project Project to create.
* @return Project created with id value returned. Events are not taken in
* account because project calendar is empty when the project is created.
*/
public Project create(Project project) {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
//Insert project
em.persist(project);
em.flush();
//Update Scrum Master user.
User scrumMaster = project.getScrumMaster();
scrumMaster.addAssignedProjectAsSM(project);
em.merge(scrumMaster);
//Update Product Owner User.
User productOwner = project.getProductOwner();
productOwner.addAssignedProjectAsPO(project);
em.merge(productOwner);
//Update assigned users
List<User> assignees = project.getAssignedUsers();
for (User assignee : assignees) {
assignee.addAssignedProject(project);
em.merge(assignee);
}
//Commit.
em.getTransaction().commit();
} catch (Exception ex) {
project = null;
Logger.getLogger(ProjectController.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (em != null) {
em.close();
}
}
return project;
}
/**
* Destroy the project.
*
* @param project Project to destroy.
* @return True if the deletion was successfuly executed.
*
* Project having Backlog items, Releases, Sprints cannot be deleted.
*/
public boolean destroy(Project project) {
EntityManager em = null;
boolean success = true;
try {
em = getEntityManager();
em.getTransaction().begin();
project = em.getReference(Project.class, project.getId());
//Updating user assignment (SM, PO, Developers).
User scrumMaster = project.getScrumMaster();
scrumMaster.getAssignedProjectsAsSM().remove(project);
em.merge(scrumMaster);
User productOwner = project.getProductOwner();
productOwner.getAssignedProjectsAsPO().remove(project);
em.merge(productOwner);
List<User> assignees = project.getAssignedUsers();
for (User assignee : assignees) {
assignee.getAssignedProjects().remove(project);
em.merge(assignee);
}
//Deleting events related to the project.
List<Event> events = project.getEvents();
EventController eventController = new EventController();
for(Event event : events){
eventController.destroy(event);
}
//Deleting project.
em.remove(em.merge(project));
em.getTransaction().commit();
} catch (Exception ex) {
Logger.getLogger(ProjectController.class.getName()).log(Level.SEVERE, null, ex);
success = false;
} finally {
if (em != null) {
em.close();
}
}
return success;
}
/**
* List of all projects
*
* @return List of all projects
*/
public List<Project> getProjects() {
EntityManager em = null;
List<Project> projects = null;
try {
em = getEntityManager();
projects = em.createNamedQuery(("Projects.findAll")).getResultList();
} catch (Exception ex) {
Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
projects = null;
} finally {
if (em != null) {
em.close();
}
}
return projects;
}
/**
* Look for project by key name
*
* @param keyName Project key name
* @return Project corresponding to the key name.
*/
public Project getProjectByKeyName(String keyName) {
EntityManager em = null;
Project project = null;
try {
em = getEntityManager();
project = (Project) em.createNamedQuery(("Projects.findByKeyName")).setParameter("keyName", keyName).getSingleResult();
} catch (NoResultException ex) {
project = null;
} catch (Exception ex) {
Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
project = null;
} finally {
if (em != null) {
em.close();
}
}
return project;
}
/**
* Refresh a project.
*
* @param project Project to refresh.
* @return The project refreshed.
*/
public Project refresh(Project project) {
return getEntityManager().getReference(Project.class, project.getId());
}
}