/*
* (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.BacklogItem;
import com.agilebooster.data.entity.Project;
import com.agilebooster.data.entity.Release;
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.Persistence;
/**
* Controller class from Releases table.
*
* @author Maxime ESCOURBIAC
*/
public class ReleaseController {
private final EntityManagerFactory emf;
/**
* Default constructor.
*/
public ReleaseController() {
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 release in database.
*
* @param release Release to create.
* @return Release created with id value returned.
*
* Sprints and Backlog items are not taken in account because the release
* creation process these two lists are empty.
*/
public Release create(Release release) {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
//Insert release
em.persist(release);
em.flush();
//Update Project.
Project project = release.getProject();
project.addRelease(release);
em.merge(project);
//Commit.
em.getTransaction().commit();
} catch (Exception ex) {
release = null;
Logger.getLogger(ReleaseController.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (em != null) {
em.close();
}
}
return release;
}
/**
* Destroy the release.
*
* @param release Release to destroy.
* @return True if the deletion was sucessfuly executed.
*
* If the release contained sprints the deletion will not be successful.
*/
public boolean destroy(Release release) {
EntityManager em = null;
boolean success = true;
try {
em = getEntityManager();
em.getTransaction().begin();
release = em.getReference(Release.class, release.getId());
//Updating project.
Project project = release.getProject();
if (project != null) {
project.getReleases().remove(release);
em.merge(project);
}
//Updating Backlog items
List<BacklogItem> backlogItems = release.getBacklogItems();
for (BacklogItem backlogItem : backlogItems) {
backlogItem.setRelease(null);
em.merge(backlogItem);
}
//Deleting release.
em.remove(em.merge(release));
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;
}
/**
* Refresh a release.
*
* @param release Release to refresh.
* @return The release refreshed.
*/
public Release refresh(Release release) {
return getEntityManager().getReference(Release.class, release.getId());
}
}