/**
* Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.glite.security.voms.admin.persistence.model.task;
import java.util.Date;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.TimeUnit;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.glite.security.voms.admin.persistence.model.VOMSAdmin;
import org.glite.security.voms.admin.persistence.model.VOMSUser;
import org.hibernate.annotations.Sort;
import org.hibernate.annotations.SortType;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "task")
public abstract class Task {
public enum TaskStatus {
CREATED, REASSIGNED, COMPLETED, EXPIRED
}
@Id
@Column(name = "task_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long id;
@ManyToOne(optional = false)
@JoinColumn(name = "task_type_id", nullable = false, updatable = false)
TaskType type;
Date creationDate;
Date expiryDate;
Date completionDate;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
TaskStatus status;
@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "task")
@Sort(type = SortType.NATURAL)
@org.hibernate.annotations.Cascade(
value = { org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
SortedSet<LogRecord> logRecords = new TreeSet<LogRecord>();
@ManyToOne
@JoinColumn(name = "usr_id")
VOMSUser user;
@ManyToOne
@JoinColumn(name = "admin_id")
VOMSAdmin admin;
/**
* @return the id
*/
public Long getId() {
return id;
}
/**
* @return the typeInfo
*/
public TaskType getType() {
return type;
}
/**
* @param id
* the id to set
*/
public void setId(Long id) {
this.id = id;
}
/**
* @param typeInfo
* the typeInfo to set
*/
public void setType(TaskType typeInfo) {
this.type = typeInfo;
}
/**
* @return the creationDate
*/
public Date getCreationDate() {
return creationDate;
}
/**
* @param creationDate
* the creationDate to set
*/
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
/**
* @return the status
*/
public TaskStatus getStatus() {
return status;
}
/**
* @param status
* the status to set
*/
public void setStatus(TaskStatus status) {
this.status = status;
}
/**
* @return the expiryDate
*/
public Date getExpiryDate() {
return expiryDate;
}
/**
* @param expiryDate
* the expiryDate to set
*/
public void setExpiryDate(Date expiryDate) {
this.expiryDate = expiryDate;
}
/**
* @return the completionDate
*/
public Date getCompletionDate() {
return completionDate;
}
/**
* @param completionDate
* the completionDate to set
*/
public void setCompletionDate(Date completionDate) {
this.completionDate = completionDate;
}
public void setCompleted() {
setCompletionDate(new Date());
setStatus(TaskStatus.COMPLETED);
addLogRecord(getCompletionDate());
}
public void setExpired() {
setStatus(TaskStatus.EXPIRED);
addLogRecord(new Date());
}
public boolean isExpired(){
return status == TaskStatus.EXPIRED;
}
public boolean equals(Object other) {
if (this == other)
return true;
if (!(other instanceof Task))
return false;
if (other == null)
return false;
Task that = (Task) other;
EqualsBuilder builder = new EqualsBuilder();
builder.append(type, that.type).append(creationDate, that.creationDate)
.append(expiryDate, that.expiryDate)
.append(completionDate, that.completionDate).append(status, that.status)
.append(admin, that.admin).append(user, that.user);
return builder.isEquals();
}
@Override
public int hashCode() {
HashCodeBuilder builder = new HashCodeBuilder(11, 67);
builder.append(getType()).append(creationDate).append(expiryDate)
.append(completionDate).append(status).append(admin).append(user);
return builder.toHashCode();
}
/**
* @return the logRecords
*/
public SortedSet<LogRecord> getLogRecords() {
return logRecords;
}
/**
* @param logRecords
* the logRecords to set
*/
public void setLogRecords(SortedSet<LogRecord> logRecords) {
this.logRecords = logRecords;
}
/**
* @return the user
*/
public VOMSUser getUser() {
return user;
}
/**
* @return the admin
*/
public VOMSAdmin getAdmin() {
return admin;
}
/**
* @param user
* the user to set
*/
public void setUser(VOMSUser user) {
this.user = user;
}
/**
* @param admin
* the admin to set
*/
public void setAdmin(VOMSAdmin admin) {
this.admin = admin;
}
protected void addLogRecord(Date d) {
LogRecord r = new LogRecord();
r.setDate(d);
r.setEvent(getStatus());
r.setTask(this);
if (getUser() != null)
r.setUserDn(getUser().getDefaultCertificate().getSubjectString());
if (getAdmin() != null)
r.setAdminDn(getAdmin().getDn());
getLogRecords().add(r);
}
public long getDaysBeforeExpiration() {
long now = new Date().getTime();
return TimeUnit.MILLISECONDS.toDays(getExpiryDate().getTime() - now);
}
public boolean expiryDateInThePast() {
long now = System.currentTimeMillis();
return now > getExpiryDate().getTime();
}
}