package com.intuit.tank.project;
/*
* #%L
* Intuit Tank data model
* %%
* 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.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.MapKeyColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.annotations.Index;
import com.intuit.tank.vm.api.enumerated.JobQueueStatus;
import com.intuit.tank.vm.vmManager.JobUtil;
@Entity
@Table(name = "job_instance")
public class JobInstance extends BaseJob {
private static final long serialVersionUID = 1L;
public static final String PROPERTY_STATUS = "status";
public static final String PROPERTY_START_TIME = "startTime";
public static final String PROPERTY_END_TIME = "endTime";
@Column(name = "workload_id")
private int workloadId;
@Column(name = "total_virtual_users")
private int totalVirtualUsers;
@Column(name = "name")
private String name;
@Column(name = "scheduled_time")
@Temporal(TemporalType.TIMESTAMP)
private Date scheduledTime;
@Column(name = "creator")
private String creator;
@Column(name = "status")
@Enumerated(EnumType.STRING)
@Index(name = "IDX_JQ_STATUS")
private JobQueueStatus status = JobQueueStatus.Created;
@Column(name = "start")
@Temporal(TemporalType.TIMESTAMP)
private Date startTime;
@Column(name = "end")
@Temporal(TemporalType.TIMESTAMP)
private Date endTime;
@Column(name = "job_details")
@Lob
private String jobDetails;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "job_id", referencedColumnName = "id")
private Set<JobVMInstance> vmInstances = new HashSet<JobVMInstance>();
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "job_instance_to_job_notification_version", joinColumns = @JoinColumn(name = "job_instance_id"))
@AttributeOverrides({
@AttributeOverride(name = "objectId", column = @Column(name = "notification_id")),
@AttributeOverride(name = "versionId", column = @Column(name = "notification_version_id")),
@AttributeOverride(name = "objectClass", column = @Column(name = "notification_object_class")) })
private Set<EntityVersion> notificationVersions = new HashSet<EntityVersion>();
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "job_instance_to_data_file", joinColumns = @JoinColumn(name = "job_instance_id"))
@AttributeOverrides({
@AttributeOverride(name = "objectId", column = @Column(name = "datafile_id")),
@AttributeOverride(name = "versionId", column = @Column(name = "datafile_version_id")),
@AttributeOverride(name = "objectClass", column = @Column(name = "datafile_object_class")) })
private Set<EntityVersion> dataFileVersions = new HashSet<EntityVersion>();
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "job_instance_to_job_regions", joinColumns = @JoinColumn(name = "job_instance_id"))
@AttributeOverrides({
@AttributeOverride(name = "objectId", column = @Column(name = "jobregion_id")),
@AttributeOverride(name = "versionId", column = @Column(name = "jobregion_version_id")),
@AttributeOverride(name = "objectClass", column = @Column(name = "jobregion_object_class")) })
private Set<EntityVersion> jobRegionVersions = new HashSet<EntityVersion>();
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "name")
@Column(name = "value")
@CollectionTable(name = "job_instance_varibles", joinColumns = @JoinColumn(name = "job_id"))
Map<String, String> variables = new HashMap<String, String>(); // maps from attribute name to value
/**
*
*/
public JobInstance() {
super();
}
/**
* @param workloadVersionId
* @param name
*/
public JobInstance(Workload workload, String name) {
super(workload.getJobConfiguration());
// this.workloadVersion = workloadVersion;
this.workloadId = workload.getId();
this.name = name;
this.totalVirtualUsers = JobUtil.calculateTotalVirtualUsers(workload.getJobConfiguration().getJobRegions());
}
/**
*
* @return
*/
public String getJobDetails() {
return jobDetails;
}
/**
*
* @param jobDetails
*/
public void setJobDetails(String jobDetails) {
this.jobDetails = jobDetails;
}
/**
* @return the creator
*/
public String getCreator() {
return creator;
}
/**
* @param creator
* the creator to set
*/
public void setCreator(String creator) {
this.creator = creator;
}
/**
* @return the variables
*/
public Map<String, String> getVariables() {
return variables != null ? variables : new HashMap<String, String>();
}
/**
* @param variables
* the variables to set
*/
public void setVariables(Map<String, String> variables) {
this.variables = variables;
}
/**
* @return the dataFileIds
*/
public Set<Integer> getDataFileIds() {
Set<Integer> ret = new HashSet<Integer>();
for (EntityVersion ev : dataFileVersions) {
ret.add(ev.getObjectId());
}
return ret;
}
/**
* @return the startTime
*/
public Date getStartTime() {
return startTime;
}
/**
* @param startTime
* the startTime to set
*/
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
/**
* @return the endTime
*/
public Date getEndTime() {
return endTime;
}
/**
* @param endTime
* the endTime to set
*/
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
/**
* @return the workloadId
*/
public int getWorkloadId() {
return workloadId;
}
/**
* @param workloadId
* the workloadId to set
*/
public void setWorkloadId(int workloadId) {
this.workloadId = workloadId;
}
/**
* @return the totalVirtualUsers
*/
public int getTotalVirtualUsers() {
return totalVirtualUsers;
}
/**
* @return the notificationVersions
*/
public Set<EntityVersion> getNotificationVersions() {
return notificationVersions;
}
/**
* @param notificationVersions
* the notificationVersions to set
*/
protected void setNotificationVersions(Set<EntityVersion> notificationVersions) {
this.notificationVersions = notificationVersions;
}
/**
* @return the dataFileVersions
*/
public Set<EntityVersion> getDataFileVersions() {
return dataFileVersions;
}
/**
* @param dataFileVersions
* the dataFileVersions to set
*/
protected void setDataFileVersions(Set<EntityVersion> dataFileVersions) {
this.dataFileVersions = dataFileVersions;
}
/**
* @return the jobRegionVersions
*/
public Set<EntityVersion> getJobRegionVersions() {
return jobRegionVersions;
}
/**
* @param jobRegionVersions
* the jobRegionVersions to set
*/
protected void setJobRegionVersions(Set<EntityVersion> jobRegionVersions) {
this.jobRegionVersions = jobRegionVersions;
}
/**
* @param totalVirtualUsers
* the totalVirtualUsers to set
*/
public void setTotalVirtualUsers(int totalVirtualUsers) {
this.totalVirtualUsers = totalVirtualUsers;
}
/**
* @return the scheduledTime
*/
public Date getScheduledTime() {
return scheduledTime;
}
/**
* @param scheduledTime
* the scheduledTime to set
*/
public void setScheduledTime(Date scheduledTime) {
this.scheduledTime = scheduledTime;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the status
*/
public JobQueueStatus getStatus() {
return status;
}
/**
* @param status
* the status to set
*/
public void setStatus(JobQueueStatus status) {
this.status = status;
}
/**
* @return the vmInstances
*/
public Set<JobVMInstance> getVmInstances() {
return vmInstances;
}
/**
* @param vmInstances
* the vmInstances to set
*/
public void setVmInstances(Set<JobVMInstance> vmInstances) {
this.vmInstances = vmInstances;
}
/**
* @{inheritDoc
*/
@Override
public String toString() {
return new ToStringBuilder(this).append("id", getId()).append("status", status).append("name", name)
.append("reportingMode", getReportingMode())
.toString();
}
/**
* @{inheritDoc
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof JobInstance)) {
return false;
}
JobInstance o = (JobInstance) obj;
return new EqualsBuilder().append(o.getId(), getId()).isEquals();
}
/**
* @{inheritDoc
*/
@Override
public int hashCode() {
return new HashCodeBuilder(29, 45).append(getId()).toHashCode();
}
}