/*
* 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.operation;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlTransient;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.resource.Resource;
/**
* Information on a specific operation execution on a particular resource. This individual operation execution may or
* may not have been part of a {@link #getGroupOperationHistory() group execution}.
*
* @author John Mazzitelli
*/
@DiscriminatorValue("resource")
@Entity
@NamedQueries( {
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_ALL_IN_STATUS, query = "SELECT h FROM ResourceOperationHistory h WHERE h.status = :status"),
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_BY_GROUP_OPERATION_HISTORY_ID, query = "select h "
+ "from ResourceOperationHistory h " + "where h.groupOperationHistory.id = :groupHistoryId "),
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_BY_RESOURCE_ID_AND_STATUS, query = "select h "
+ "from ResourceOperationHistory h " + "where h.resource.id = :resourceId " + "and h.status = :status"),
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_BY_RESOURCE_ID_AND_NOT_STATUS, query = "" //
+ "SELECT h " //
+ " FROM ResourceOperationHistory h " //
+ " WHERE h.resource.id = :resourceId " //
+ " AND h.status <> :status " //
+ " AND (h.startedTime > :beginTime OR :beginTime IS NULL) " //
+ " AND (h.modifiedTime < :endTime OR :endTime IS NULL) "),
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_LATEST_COMPLETED_OPERATION, query = "select h "
+ "from ResourceOperationHistory h " + "where h.resource.id = :resourceId " + " and h.status <> 'INPROGRESS' "
+ " and h.modifiedTime = (select max(h2.modifiedTime) " + "from ResourceOperationHistory h2 "
+ "where h2.resource.id = :resourceId " + " and h2.status <> 'INPROGRESS')"),
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_OLDEST_INPROGRESS_OPERATION, query = "select h "
+ "from ResourceOperationHistory h " + "where h.resource.id = :resourceId " + " and h.status = 'INPROGRESS' "
+ " and h.modifiedTime = (select min(h2.modifiedTime) " + "from ResourceOperationHistory h2 "
+ "where h2.resource.id = :resourceId " + " and h2.status = 'INPROGRESS')"),
@NamedQuery(name = ResourceOperationHistory.QUERY_DELETE_BY_RESOURCES, query = "DELETE FROM ResourceOperationHistory roh "
+ " WHERE roh.resource.id IN ( :resourceIds ) )"),
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_ALL_ADMIN, query = "" //
+ " SELECT new org.rhq.core.domain.operation.composite.ResourceOperationHistoryComposite" //
+ " ( roh, parent.id, parent.name ) " //
+ " FROM ResourceOperationHistory roh " //
+ " JOIN roh.resource res " //
+ "LEFT JOIN res.parentResource parent " //
+ " WHERE (UPPER(res.name) LIKE :resourceFilter ESCAPE :escapeChar OR :resourceFilter IS NULL) " //
+ " AND (UPPER(parent.name) LIKE :parentFilter ESCAPE :escapeChar OR :parentFilter IS NULL) " //
+ " AND (roh.startedTime > :startTime OR :startTime IS NULL) " //
+ " AND (roh.modifiedTime < :endTime OR :endTime IS NULL) " //
+ " AND (roh.status LIKE :status OR :status IS NULL) "), //
@NamedQuery(name = ResourceOperationHistory.QUERY_FIND_ALL, query = "" //
+ " SELECT new org.rhq.core.domain.operation.composite.ResourceOperationHistoryComposite" //
+ " ( roh, parent.id, parent.name ) " //
+ " FROM ResourceOperationHistory roh " //
+ " JOIN roh.resource res " //
+ "LEFT JOIN res.parentResource parent " //
+ " WHERE res.id IN ( SELECT rr.id FROM Resource rr " //
+ " JOIN rr.implicitGroups g JOIN g.roles r JOIN r.subjects s " //
+ " WHERE s.id = :subjectId ) " //
+ " AND (UPPER(res.name) LIKE :resourceFilter ESCAPE :escapeChar OR :resourceFilter IS NULL) " //
+ " AND (UPPER(parent.name) LIKE :parentFilter ESCAPE :escapeChar OR :parentFilter IS NULL) " //
+ " AND (roh.startedTime > :startTime OR :startTime IS NULL) " //
+ " AND (roh.modifiedTime < :endTime OR :endTime IS NULL) " //
+ " AND (roh.status LIKE :status OR :status IS NULL) "),
@NamedQuery(name = ResourceOperationHistory.QUERY_DETACH_FROM_GROUP_HISTORY, query = ""
+ "UPDATE ResourceOperationHistory h set h.groupOperationHistory = NULL WHERE h.groupOperationHistory.id = :historyId") })
@XmlAccessorType(XmlAccessType.FIELD)
public class ResourceOperationHistory extends OperationHistory {
public static final String QUERY_FIND_ALL_IN_STATUS = "ResourceOperationHistory.findAllInStatus";
public static final String QUERY_FIND_BY_GROUP_OPERATION_HISTORY_ID = "ResourceOperationHistory.findByGroupOperationHistoryId";
public static final String QUERY_FIND_BY_RESOURCE_ID_AND_STATUS = "ResourceOperationHistory.findByResourceIdAndStatus";
public static final String QUERY_FIND_BY_RESOURCE_ID_AND_NOT_STATUS = "ResourceOperationHistory.findByResourceIdAndNotStatus";
public static final String QUERY_FIND_LATEST_COMPLETED_OPERATION = "ResourceOperationHistory.findLatestCompletedOperation";
public static final String QUERY_FIND_OLDEST_INPROGRESS_OPERATION = "ResourceOperationHistory.findOldestInProgressOperation";
public static final String QUERY_DELETE_BY_RESOURCES = "ResourceOperationHistory.deleteByResources";
public static final String QUERY_DETACH_FROM_GROUP_HISTORY = "ResourceOperationHistory.detachFromGroupHistory";
// for subsystem views
public static final String QUERY_FIND_ALL = "OperationHistory.findAll";
public static final String QUERY_FIND_ALL_ADMIN = "OperationHistory.findAll_admin";
private static final long serialVersionUID = 1L;
@JoinColumn(name = "RESOURCE_ID", referencedColumnName = "ID")
@ManyToOne
@XmlTransient
private Resource resource;
@JoinColumn(name = "RESULTS_CONFIG_ID", referencedColumnName = "ID", nullable = true)
@OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, optional = true)
private Configuration results;
@JoinColumn(name = "GROUP_HISTORY_ID", referencedColumnName = "ID", nullable = true)
@ManyToOne(optional = true)
private GroupOperationHistory groupOperationHistory;
protected ResourceOperationHistory() {
}
public ResourceOperationHistory(String jobName, String jobGroup, String subjectName,
OperationDefinition operationDefinition, Configuration parameters, Resource resource,
GroupOperationHistory groupHistory) {
super(jobName, jobGroup, subjectName, operationDefinition, parameters);
this.resource = resource;
setGroupOperationHistory(groupHistory);
}
public Resource getResource() {
return resource;
}
public void setResource(Resource resource) {
this.resource = resource;
}
public Configuration getResults() {
return results;
}
public void setResults(Configuration results) {
this.results = results;
}
/**
* If this individual resource operation execution history was part of a group operation execution, this will return
* the non-<code>null</code> history for that group execution. If this was not part of a group execution, this will
* return <code>null</code>.
*
* @return the group history entity
*/
public GroupOperationHistory getGroupOperationHistory() {
return groupOperationHistory;
}
public void setGroupOperationHistory(GroupOperationHistory groupOperationHistory) {
this.groupOperationHistory = groupOperationHistory;
if (this.groupOperationHistory != null) {
groupOperationHistory.addResourceOperationHistory(this);
}
}
/*
* there may be some operations whose results are sensitive values, such as passwords - do not show them
* as part of the toString. they can still be gotten by explicitly calling getResults()
*/
@Override
public String toString() {
StringBuilder str = new StringBuilder("ResourceOperationHistory: ");
str.append("resource=[" + this.resource);
str.append("], group-history=[" + this.groupOperationHistory);
str.append("], " + super.toString());
str.append("]");
return str.toString();
}
}