/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.domain.resource;
import java.io.Serializable;
import java.util.Date;
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.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
/**
* Describes one requests that a resource be deleted. The actual resource will be deleted by the plugin.
*
* @author Jason Dobies
*/
@Entity(name = "DeleteResourceHistory")
@NamedQueries( {
@NamedQuery(name = DeleteResourceHistory.QUERY_FIND_WITH_STATUS, query = "SELECT drh from DeleteResourceHistory AS drh where drh.status = :status"),
@NamedQuery(name = DeleteResourceHistory.QUERY_FIND_BY_PARENT_RESOURCE_ID, query = "" //
+ "SELECT drh " //
+ " FROM DeleteResourceHistory AS drh " //
+ " WHERE drh.parentResource.id = :id " //
+ " AND ( drh.ctime > :startTime OR :startTime IS NULL ) " //
+ " AND ( drh.mtime < :endTime OR :endTime IS NULL ) "),
@NamedQuery(name = DeleteResourceHistory.QUERY_DELETE_BY_PARENT_RESOURCE_IDS, query = "DELETE FROM DeleteResourceHistory drh WHERE drh.parentResource.id IN ( :resourceIds ) )"),
@NamedQuery(name = DeleteResourceHistory.QUERY_DELETE_BY_RESOURCE_TYPE_ID, query = "DELETE FROM DeleteResourceHistory drh WHERE drh.resourceType.id = :resourceTypeId") })
@SequenceGenerator(allocationSize = org.rhq.core.domain.util.Constants.ALLOCATION_SIZE, name = "RHQ_DELETE_RES_HIST_ID_SEQ", sequenceName = "RHQ_DELETE_RES_HIST_ID_SEQ")
@Table(name = "RHQ_DELETE_RES_HIST")
public class DeleteResourceHistory implements Serializable {
private static final long serialVersionUID = 1L;
// Constants --------------------------------------------
public static final String QUERY_FIND_WITH_STATUS = "DeleteResourceHistory.findWithStatus";
public static final String QUERY_FIND_BY_PARENT_RESOURCE_ID = "DeleteResourceHistory.findByParentResourceId";
public static final String QUERY_DELETE_BY_PARENT_RESOURCE_IDS = "DeleteResourceHistory.deleteByResources";
public static final String QUERY_DELETE_BY_RESOURCE_TYPE_ID = "DeleteResourceHistory.deleteByResourceTypeId";
// Attributes --------------------------------------------
@GeneratedValue(generator = "RHQ_DELETE_RES_HIST_ID_SEQ", strategy = GenerationType.AUTO)
@Id
private int id;
@Column(name = "ERROR_MESSAGE")
private String errorMessage;
@Column(name = "SUBJECT_NAME", nullable = false)
private String subjectName;
@Column(name = "CTIME", nullable = false)
private long ctime = System.currentTimeMillis();
@Column(name = "MTIME", nullable = false)
private long mtime = System.currentTimeMillis();
@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
private DeleteResourceStatus status;
@JoinColumn(name = "PARENT_RESOURCE_ID", referencedColumnName = "ID", nullable = false)
@ManyToOne
private Resource parentResource;
@Column(name = "RESOURCE_NAME", nullable = false)
private String resourceName;
@JoinColumn(name = "RESOURCE_TYPE_ID", referencedColumnName = "ID", nullable = false)
@ManyToOne
ResourceType resourceType;
@Column(name = "RESOURCE_KEY", nullable = false)
private String resourceKey;
// Constructors --------------------------------------------
public DeleteResourceHistory() {
}
/**
* Creates a new history instance representing a request to delete the specified resource.
*
* @param resource being deleted
*/
public DeleteResourceHistory(Resource resource, String subjectName) {
this.resourceName = resource.getName();
this.resourceKey = resource.getResourceKey();
this.resourceType = resource.getResourceType();
this.parentResource = resource.getParentResource();
this.subjectName = subjectName;
}
// Public --------------------------------------------
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getErrorMessage() {
return errorMessage;
}
/**
* Calling this method with a non-<code>null</code> error message implies that the request's status is
* {@link CreateResourceStatus#FAILURE}. The inverse is <i>not</i> true - that is, if you set the error message to
* <code>null</code>, the status is left as-is; it will not assume that a <code>null</code> error message means the
* status is successful.
*
* @param errorMessage description of the error
*/
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
if (errorMessage != null) {
setStatus(DeleteResourceStatus.FAILURE);
}
}
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public long getCreatedTime() {
return ctime;
}
public Date getCreatedDate() {
return new Date(ctime);
}
public long getLastModifiedTime() {
return mtime;
}
public Date getLastModifiedDate() {
return new Date(mtime);
}
public DeleteResourceStatus getStatus() {
return status;
}
public void setStatus(DeleteResourceStatus status) {
this.status = status;
}
public String getResourceName() {
return resourceName;
}
public String getResourceKey() {
return resourceKey;
}
public ResourceType getResourceType() {
return resourceType;
}
/**
* The duration of the configuration update request which simply is the difference between the
* {@link #getCreatedTime()} and the {@link #getLastModifiedTime()}. If the request hasn't completed yet, this will
* be the difference between the current time and the created time.
*
* @return the duration of time that the request took or is taking to complete
*/
public long getDuration() {
long start = this.ctime;
long end = this.mtime;
if ((status == null) || (status == DeleteResourceStatus.IN_PROGRESS)) {
end = System.currentTimeMillis();
}
return end - start;
}
// Package --------------------------------------------
@PrePersist
void onPersist() {
this.mtime = System.currentTimeMillis();
}
@PreUpdate
void onUpdate() {
this.mtime = System.currentTimeMillis();
}
// Object Overridden --------------------------------------------
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = (PRIME * result) + (int) (ctime ^ (ctime >>> 32));
result = (PRIME * result) + ((subjectName == null) ? 0 : subjectName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if ((obj == null) || !(obj instanceof DeleteResourceHistory)) {
return false;
}
final DeleteResourceHistory other = (DeleteResourceHistory) obj;
if (ctime != other.ctime) {
return false;
}
if (subjectName == null) {
if (other.subjectName != null) {
return false;
}
} else if (!subjectName.equals(other.subjectName)) {
return false;
}
return true;
}
}