/**
* Copyright 2011 Intuit Inc. All Rights Reserved
*/
package com.intuit.tank.dao;
/*
* #%L
* Data Access
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* 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
* #L%
*/
import java.util.Date;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Fetch;
import javax.persistence.criteria.Root;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.transform.Transformers;
import com.intuit.tank.project.BaseEntity;
import com.intuit.tank.project.JobConfiguration;
import com.intuit.tank.project.Project;
import com.intuit.tank.project.ProjectDTO;
import com.intuit.tank.project.ScriptGroup;
import com.intuit.tank.project.ScriptGroupStep;
import com.intuit.tank.project.TestPlan;
import com.intuit.tank.project.Workload;
import com.intuit.tank.view.filter.ViewFilterType;
/**
* ProductDao
*
* @author dangleton
*
*/
public class ProjectDao extends OwnableDao<Project> {
/**
* @param entityClass
*/
public ProjectDao() {
super();
setReloadEntities(true);
}
/**
* @param id
* @return
*/
@Nonnull
public List<Workload> getWorkloadsForProject(@Nonnull Integer projectId) {
return findById(projectId).getWorkloads();
}
/**
*
* @param name
* @return
*/
public Project findByName(@Nonnull String name) {
Project project = null;
EntityManager em = getEntityManager();
try {
begin();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Project> query = cb.createQuery(Project.class);
Root<Project> root = query.from(Project.class);
Fetch<Project, Workload> wl = root.fetch(Project.PROPERTY_WORKLOADS);
wl.fetch("jobConfiguration");
query.select(root);
query.where(cb.equal(root.<String>get(Project.PROPERTY_NAME), name));
project = em.createQuery(query).getSingleResult();
if( project != null) {
project.getWorkloads().get(0).getJobConfiguration().readConfig();
project.getWorkloads().get(0).getJobConfiguration().getJobRegions();
project.getWorkloads().get(0).getJobConfiguration().getVariables();
project.getWorkloads().get(0).getJobConfiguration().getDataFileIds();
project.getWorkloads().get(0).getJobConfiguration().getNotifications();
for ( TestPlan tp : project.getWorkloads().get(0).getTestPlans() ) {
for (ScriptGroup sg : tp.getScriptGroups() ) {
sg.getScriptGroupSteps();
}
}
}
commit();
} catch (Exception e) {
rollback();
e.printStackTrace();
throw new RuntimeException(e);
} finally {
cleanup();
}
return project;
}
/**
* @param project
* @return
*/
public synchronized Project saveOrUpdateProject(Project project) {
boolean saveAs = project.getId() == 0;
for (Workload w : project.getWorkloads()) {
w.setParent(project);
if (saveAs) {
w.setId(0);
}
JobConfiguration jobConfiguration = w.getJobConfiguration();
jobConfiguration.setParent(w);
jobConfiguration.setJobRegions(JobRegionDao.cleanRegions(jobConfiguration.getJobRegions()));
// for (TestPl sg : w.getTestPlans()) {
// sg.setParent(w);
// if (saveAs) {
// sg.setId(0);
// }
// for (ScriptGroupStep sgs : sg.getScriptGroupSteps()) {
// sgs.setParent(sg);
// if (saveAs) {
// sgs.setId(0);
// }
// }
// }
}
project = saveOrUpdate(project);
return project;
}
@Override
public Project saveOrUpdate(Project entity) throws HibernateException {
entity.setModified(new Date());
return super.saveOrUpdate(entity);
}
/**
* This is an override of the BaseEntity to initiate eager loading when needed.
*
* @param id
* the primary key
* @return the entity or null
*/
@Nullable
@Override
public Project findById(@Nonnull Integer id) {
Project project = null;
try {
begin();
project = getEntityManager().find(Project.class, id);
if( project != null) {
project.getWorkloads().get(0).getJobConfiguration().readConfig();
project.getWorkloads().get(0).getJobConfiguration().getJobRegions();
project.getWorkloads().get(0).getJobConfiguration().getVariables();
project.getWorkloads().get(0).getJobConfiguration().getDataFileIds();
project.getWorkloads().get(0).getJobConfiguration().getNotifications();
for ( TestPlan tp : project.getWorkloads().get(0).getTestPlans() ) {
for (ScriptGroup sg : tp.getScriptGroups() ) {
sg.getScriptGroupSteps();
}
}
}
commit();
} catch (Exception e) {
rollback();
e.printStackTrace();
throw new RuntimeException(e);
} finally {
cleanup();
}
return project;
}
/**
* Finds all Objects of type T_ENTITY
*
* @return the nonnull list of entities
* @throws HibernateException
* if there is an error in persistence
*/
@Nonnull
public List<Project> findAll() throws HibernateException {
List<Project> results = null;
EntityManager em = getEntityManager();
try {
begin();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Project> query = cb.createQuery(Project.class);
Root<Project> root = query.from(Project.class);
Fetch<Project, Workload> wl = root.fetch(Project.PROPERTY_WORKLOADS);
wl.fetch("jobConfiguration");
query.select(root);
results = em.createQuery(query).getResultList();
for (Project project : results) {
project.getWorkloads().get(0).getJobConfiguration().getVariables();
project.getWorkloads().get(0).getJobConfiguration().getDataFileIds();
}
commit();
} catch (Exception e) {
rollback();
e.printStackTrace();
throw new RuntimeException(e);
} finally {
cleanup();
}
return results;
}
@Nullable
public Project loadScripts(Integer ProjectId) {
Project project = findById(ProjectId);
ScriptDao sd = new ScriptDao();
for (TestPlan testPlan : project.getWorkloads().get(0).getTestPlans()) {
for (ScriptGroup scriptGroup : testPlan.getScriptGroups()) {
for (ScriptGroupStep scriptGroupStep : scriptGroup.getScriptGroupSteps()) {
sd.loadScriptSteps(scriptGroupStep.getScript());
}
}
}
return project;
}
}