/**
* 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.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import javax.annotation.Nonnull;
import javax.persistence.EntityManager;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.cfg.RecoverableException;
import com.intuit.tank.common.ScriptUtil;
import com.intuit.tank.project.Project;
import com.intuit.tank.project.Script;
import com.intuit.tank.project.ScriptGroupStep;
import com.intuit.tank.project.ScriptStep;
import com.intuit.tank.project.SerializedScriptStep;
import com.intuit.tank.vm.common.util.MethodTimer;
/**
* ProductDao
*
* @author dangleton
*
*/
public class ScriptDao extends BaseDao<Script> {
private static final Logger LOG = LogManager.getLogger(ScriptDao.class);
/**
* @param entityClass
*/
public ScriptDao() {
super();
setReloadEntities(true);
}
/**
* @{inheritDoc
*/
@Override
public Script findById(Integer id) {
Script script = super.findById(id);
if (script != null) {
script = loadScriptSteps(script);
}
return script;
}
/**
* @{inheritDoc
*/
public Script getScript(Integer id) {
Script script = super.findById(id);
return script;
}
/**
* @{inheritDoc
*/
@Override
public void delete(Integer id) throws HibernateException {
EntityManager em = getEntityManager();
try {
begin();
Script entity = em.find(Script.class, id);
if (entity != null) {
// check if it is used in scriptGroups
List<ScriptGroupStep> scriptGroupsForScript = new ScriptGroupStepDao().getScriptGroupsForScript(entity);
if (!scriptGroupsForScript.isEmpty()) {
StringBuilder sb = new StringBuilder();
for (ScriptGroupStep step : scriptGroupsForScript) {
Project p = extractProject(step);
if (sb.length() != 0) {
sb.append(", ");
}
if (p != null) {
sb.append(p.getName()).append(" (id=").append(p.getId()).append(")");
} else {
sb.append("unknown project");
}
}
if (sb.length() > 0) {
// throw exception
throw new IllegalArgumentException("Cannot delete script " + entity.getName()
+ " because it is used in the following projects: " + sb.toString());
}
}
LOG.debug("deleting entity " + entity.toString());
em.remove(entity);
commit();
}
commit();
} catch (Exception e) {
rollback();
e.printStackTrace();
throw new RuntimeException(e);
} finally {
cleanup();
}
}
private Project extractProject(ScriptGroupStep step) {
if (step.getScriptGroup() != null &&
step.getScriptGroup().getTestPlan() != null
&& step.getScriptGroup().getTestPlan().getWorkload() != null
&& step.getScriptGroup().getTestPlan().getWorkload().getProject() != null) {
return step.getScriptGroup().getTestPlan().getWorkload().getProject();
}
return null;
}
/**
*
* @param projectId
* @return
*/
public List<Script> getScriptsForProductId(int productId) {
// TODO: DA Fix when using real projects in model
// List<Script> result = new ArrayList<Script>();
// ProjectDao projectDao = new ProjectDao();
// Project project = projectDao.findById(projectId);
// for (Workload w : project.getWorkloads()) {
// for (ScriptGroup g : w.getScriptGroups()) {
// for (ScriptGroupStep step : g.getScriptGroupSteps()) {
// result.add(step.getScript());
// }
// }
// }
// return result;
return findAll();
}
public Script loadScriptSteps(@Nonnull Script script) {
if (script.getScriptSteps() == null || script.getScriptSteps().isEmpty()) {
SerializedScriptStep serializedScriptStep = new SerializedScriptStepDao().findById(script
.getSerializedScriptStepId());
script.setSerializedSteps(serializedScriptStep);
}
return script;
}
/**
*
* @{inheritDoc
*/
@Override
public Script saveOrUpdate(Script script) {
MethodTimer mt = new MethodTimer(LOG, getClass(), "saveOrUpdate").start();
int size = script.getScriptSteps().size();
ScriptUtil.setScriptStepLabels(script);
// try {
LOG.info("persisting script " + script.getName() + " with id " + script.getId()
+ " into database");
EntityManager em = getEntityManager();
try {
begin();
SerializedScriptStep serializedScriptStep = serialize(script.getScriptSteps());
serializedScriptStep.setSerialzedData(
Hibernate.getLobCreator(getHibernateSession()).createBlob(serializedScriptStep.getBytes()));
SerializedScriptStep serializedSteps = new SerializedScriptStepDao().saveOrUpdate(serializedScriptStep);
script.setSerializedScriptStepId(serializedScriptStep.getId());
if (script.getId() == 0) {
em.persist(script);
} else {
script = em.merge(script);
}
LOG.debug("Saved Script Steps with id " + serializedSteps.getId() + " for script " + script.getId());
commit();
} catch (Exception e) {
rollback();
e.printStackTrace();
throw new RuntimeException(e);
} finally {
cleanup();
}
mt.markAndLog("Store script with " + size + " steps to database.");
mt.endAndLog();
return script;
}
public SerializedScriptStep serialize(List<ScriptStep> steps) {
ObjectOutputStream s = null;
try {
// if (steps.size() > 0) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
s = new ObjectOutputStream(bos);
s.writeObject(steps);
return new SerializedScriptStep(bos.toByteArray());
// }
} catch (IOException e) {
throw new RecoverableException(e);
} finally {
IOUtils.closeQuietly(s);
}
}
// private String getUniqueProjects(List<ScriptGroupStep> steps) {
// Set<String> projectNames = new HashSet<String>();
// for (ScriptGroupStep step : steps) {
// try {
// if (step.getScriptGroup() != null) {
// if (step.getScriptGroup().get)
// }
// projectNames.add(step.getScriptGroup().getWorkload().getProject().getName());
// } catch (NullPointerException e) {
// projectNames.add("Unkonwn Project with ScriptGroup " + step.getScriptGroup().getName());
// }
// }
// ArrayList<String> list = new ArrayList<String>(projectNames);
// Collections.sort(list);
// return StringUtils.join(list, ", ");
// }
}