/*
* 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.discovery;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.AvailabilityType;
/**
* Contains a set of one or more {@link Availability} values used to indicate the statuses of a set of resources. Note
* that only the {@link Availability#getStartTime() start times} are used when looking at the resource times - the end
* times found in the {@link Availability} objects are ignored. This is because a report only defines a snapshot in time
* - at a particular time (the availabilities' start times) a resource was either up or down. Reports do not tell you
* the span of time a resource was up or down, it only tells you what state they were in at a particular millisecond in
* time.
*
* @author Jay Shaughnessy
* @author Greg Hinkle
* @author Joseph Marques
*/
public class AvailabilityReport implements Serializable {
private static final long serialVersionUID = 1L;
public static class Datum implements Serializable {
private static final long serialVersionUID = 1L;
private int resourceId;
private AvailabilityType availabilityType;
private long startTime;
public Datum(Availability availability) {
this.resourceId = availability.getResource().getId();
this.startTime = availability.getStartTime();
this.availabilityType = availability.getAvailabilityType();
}
public Datum(int resourceId, AvailabilityType availabilityType, long startTime) {
this.resourceId = resourceId;
this.availabilityType = availabilityType;
this.startTime = startTime;
}
public int getResourceId() {
return resourceId;
}
public long getStartTime() {
return startTime;
}
public AvailabilityType getAvailabilityType() {
return availabilityType;
}
public String toString() {
return "AvailabilityReport.Datum[resourceId=" + this.resourceId + ",type=" + this.availabilityType
+ ",start-time=" + new Date(startTime) + "]";
}
}
private String agentName;
private List<Datum> availabilities = new ArrayList<Datum>();
private boolean changesOnly = false;
// true if this is a server-generated report for enabling or disabling resources
private boolean enablementReport = false;
// true if this is report was generated on the server side - it did not come from an actual agent
private boolean serverSideReport = false;
/**
* Constructor for {@link AvailabilityReport} that assumes this report will represent a full inventory (same as if
* constructing with {@link #AvailabilityReport(boolean, String)} with the first argument being <code>false</code>).
*
* @param agentName identifies the agent that produced this report
*/
public AvailabilityReport(String agentName) {
this(false, agentName);
}
/**
* Constructor for {@link AvailabilityReport}.
*
* @param changesOnly if <code>false</code>, this report will represent the full inventory; in other words, it will
* contain availability statuses for all resources. If <code>true</code>, this report will only
* contain availability statuses for only those resources that have changed status
* @param agentName identifies the agent that produced this report
*/
public AvailabilityReport(boolean changesOnly, String agentName) {
this.changesOnly = changesOnly;
this.agentName = agentName;
}
/**
* Returns the agent name of the agent that produced this report.
*
* @return the agent name
*/
public String getAgentName() {
return agentName;
}
public void addAvailability(Availability availability) {
this.availabilities.add(new Datum(availability));
}
public void addAvailability(Datum availability) {
this.availabilities.add(availability);
}
public List<AvailabilityReport.Datum> getResourceAvailability() {
return availabilities;
}
/**
* Returns <code>false</code> if all resources in inventory are represented in this report. <code>true</code> is
* returned if only those resources that have changed status are in this report.
*
* @return indicates if all resources or just resources that changed are found in this report
*/
public boolean isChangesOnlyReport() {
return changesOnly;
}
public boolean isEnablementReport() {
return enablementReport;
}
public void setEnablementReport(boolean enablementReport) {
this.enablementReport = enablementReport;
// all enablement reports are generated server side
if (enablementReport) {
setServerSideReport(true);
}
}
public boolean isServerSideReport() {
return serverSideReport;
}
public void setServerSideReport(boolean serverSideReport) {
this.serverSideReport = serverSideReport;
}
/**
* Tries to find the availability for given resource in this report.
*
* @param resourceId the id of the resource to look for
* @return the availability type found in this report for given report on null if not found
*/
public AvailabilityType forResource(int resourceId) {
for(Datum d : availabilities) {
if (d.getResourceId() == resourceId) {
return d.getAvailabilityType();
}
}
return null;
}
@Override
public String toString() {
return toString(false);
}
/**
* Returns a string representation of this report.
*
* @param includeAll if <code>true</code>, the returned string includes all the individual availabilities,
* otherwise, the returned string only tells you how many of them there are
*
* @return string representation of the report
*/
public String toString(boolean includeAll) {
StringBuilder str = new StringBuilder("AV:");
str.append('[').append(agentName).append(']');
str.append('[').append(availabilities.size()).append(']');
str.append('[').append(changesOnly ? "changesOnly" : "full").append(']');
if (includeAll && (availabilities.size() > 0)) {
for (Datum next : availabilities) {
str.append('\n');
str.append(next);
}
}
return str.toString();
}
}