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.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.envers.AuditMappedBy;
import org.hibernate.envers.Audited;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import com.intuit.tank.vm.api.enumerated.ScriptDriver;
/**
*
* Project top level Object in data model. All objects are eventually traversable from their project.
*
* @author dangleton
*
*/
@Entity
@Audited
@Table(name = "project")
public class Project extends OwnableEntity {
private static final long serialVersionUID = 1L;
public static final String PROPERTY_NAME = "name";
public static final String PROPERTY_SCRIPT_DRIVER = "scriptDriver";
public static final String PROPERTY_PRODUCT_NAME = "productName";
public static final String PROPERTY_COMMENTS = "comments";
public static final String PROPERTY_WORKLOADS = "workloads";
@Column(name = "name", unique = true, nullable = false)
@NotEmpty
@Length(max = 255)
private String name;
@Column(name = "script_driver", nullable = false)
@Enumerated(EnumType.STRING)
@NotNull
private ScriptDriver scriptDriver = ScriptDriver.Tank;
@Column(name = "product_name")
@Length(max = 255)
private String productName;
@Column(name = "comments", length = 1024)
@Length(max = 1024)
private String comments;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "project_id", referencedColumnName = "id")
@OrderColumn(name = "position")
@AuditMappedBy(mappedBy = "project", positionMappedBy = "position")
private List<Workload> workloads = new ArrayList<Workload>();
@Transient
private String workloadNames;
public Project() {
}
public void setWorkloads(List<Workload> workloads) {
this.workloads = workloads;
}
public List<Workload> getWorkloads() {
return this.workloads;
}
public void addWorkload(Workload userType) {
userType.setProject(this);
this.workloads.add(userType);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setScriptDriver(ScriptDriver driver) {
this.scriptDriver = driver;
}
public ScriptDriver getScriptDriver() {
return this.scriptDriver;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getComments() {
if(StringUtils.isEmpty(comments)) {
return "...";
}
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
/**
* @return the workloadNames
*/
public String getWorkloadNames() {
return workloadNames;
}
/**
* @param workloadNames
* the workloadNames to set
*/
public void setWorkloadNames(String workloadNames) {
this.workloadNames = workloadNames;
}
/**
* @{inheritDoc
*/
@Override
public String toString() {
return new ToStringBuilder(this).append("id", getId()).append("name", name)
.toString();
}
/**
* @{inheritDoc
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Project)) {
return false;
}
Project o = (Project) obj;
return new EqualsBuilder().append(o.getId(), getId()).isEquals();
}
/**
* @{inheritDoc
*/
@Override
public int hashCode() {
return new HashCodeBuilder(29, 45).append(getId()).toHashCode();
}
public static Builder builder() {
return new Builder();
}
public static Builder builderFrom(Project p) {
return new Builder(p);
}
public static class Builder extends ProjectBuilderBase<Builder> {
private Builder(Project p) {
super(p);
}
private Builder() {
super(new Project());
}
public Project build() {
return getInstance();
}
}
static class ProjectBuilderBase<GeneratorT extends ProjectBuilderBase<GeneratorT>> {
private Project instance;
protected ProjectBuilderBase(Project aInstance) {
instance = aInstance;
}
protected Project getInstance() {
return instance;
}
@SuppressWarnings("unchecked")
public GeneratorT workloads(List<Workload> aValue) {
instance.setWorkloads(aValue);
return (GeneratorT) this;
}
@SuppressWarnings("unchecked")
public GeneratorT addWorkload(Workload aValue) {
if (instance.getWorkloads() == null) {
instance.setWorkloads(new ArrayList<Workload>());
}
((ArrayList<Workload>) instance.getWorkloads()).add(aValue);
return (GeneratorT) this;
}
@SuppressWarnings("unchecked")
public GeneratorT name(String aValue) {
instance.setName(aValue);
return (GeneratorT) this;
}
@SuppressWarnings("unchecked")
public GeneratorT scriptDriver(ScriptDriver aValue) {
instance.setScriptDriver(aValue);
return (GeneratorT) this;
}
@SuppressWarnings("unchecked")
public GeneratorT productName(String aValue) {
instance.setProductName(aValue);
return (GeneratorT) this;
}
@SuppressWarnings("unchecked")
public GeneratorT comments(String aValue) {
instance.setComments(aValue);
return (GeneratorT) this;
}
@SuppressWarnings("unchecked")
public GeneratorT creator(String aValue) {
instance.setCreator(aValue);
return (GeneratorT) this;
}
}
}