/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2009-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.netmgt.model;
import java.io.Serializable;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Transient;
/**
* Represents the status of a node, interface or services
*
* @author brozow
* @version $Id: $
*/
@Embeddable
public class PollStatus implements Serializable {
private static final long serialVersionUID = 3L;
private Date m_timestamp = new Date();
/**
* Status of the pollable object.
*/
private int m_statusCode;
private String m_reason;
private Map<String, Number> m_properties = new LinkedHashMap<String, Number>();
/**
* <P>
* The constant that defines a service that is up but is most likely
* suffering due to excessive load or latency issues and because of that has
* not responded within the configured timeout period.
* </P>
*/
public static final int SERVICE_UNRESPONSIVE = 3;
/**
* <P>
* The constant that defines a service that is not working normally and
* should be scheduled using the downtime models.
* </P>
*/
public static final int SERVICE_UNAVAILABLE = 2;
/**
* <P>
* The constant that defines a service as being in a normal state. If this
* is returned by the poll() method then the framework will re-schedule the
* service for its next poll using the standard uptime interval
* </P>
*/
public static final int SERVICE_AVAILABLE = 1;
/**
* The constant the defines a status is unknown. Used mostly internally
*/
public static final int SERVICE_UNKNOWN = 0;
private static final String[] s_statusNames = {
"Unknown",
"Up",
"Down",
"Unresponsive"
};
private static int decodeStatusName(final String statusName) {
for (int statusCode = 0; statusCode < s_statusNames.length; statusCode++) {
if (s_statusNames[statusCode].equalsIgnoreCase(statusName)) {
return statusCode;
}
}
return SERVICE_UNKNOWN;
}
/**
* <p>decode</p>
*
* @param statusName a {@link java.lang.String} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus decode(final String statusName) {
return decode(statusName, null, null);
}
/**
* <p>decode</p>
*
* @param statusName a {@link java.lang.String} object.
* @param reason a {@link java.lang.String} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus decode(final String statusName, final String reason) {
return decode(statusName, reason, null);
}
/**
* <p>decode</p>
*
* @param statusName a {@link java.lang.String} object.
* @param responseTime a {@link java.lang.Double} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus decode(final String statusName, final Double responseTime) {
return decode(statusName, null, responseTime);
}
/**
* <p>decode</p>
*
* @param statusName a {@link java.lang.String} object.
* @param reason a {@link java.lang.String} object.
* @param responseTime a {@link java.lang.Double} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus decode(final String statusName, final String reason, final Double responseTime) {
return new PollStatus(decodeStatusName(statusName), reason, responseTime);
}
/**
* <p>get</p>
*
* @param status a int.
* @param reason a {@link java.lang.String} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus get(final int status, final String reason) {
return get(status, reason, null);
}
/**
* <p>get</p>
*
* @param status a int.
* @param responseTime a {@link java.lang.Double} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus get(final int status, final Double responseTime) {
return get(status, null, responseTime);
}
/**
* <p>get</p>
*
* @param status a int.
* @param reason a {@link java.lang.String} object.
* @param responseTime a {@link java.lang.Double} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus get(final int status, final String reason, final Double responseTime) {
return new PollStatus(status, reason, responseTime);
}
private PollStatus() {
this(SERVICE_UNKNOWN, null, null);
}
private PollStatus(final int statusCode, final String reason, final Double responseTime) {
setStatusCode(statusCode);
setReason(reason);
setResponseTime(responseTime);
}
/**
* <p>up</p>
*
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus up() {
return up(null);
}
/**
* <p>up</p>
*
* @param responseTime a {@link java.lang.Double} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus up(final Double responseTime) {
return available(responseTime);
}
/**
* <p>available</p>
*
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus available() {
return available(null);
}
/**
* <p>available</p>
*
* @param responseTime a {@link java.lang.Double} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus available(final Double responseTime) {
return new PollStatus(SERVICE_AVAILABLE, null, responseTime);
}
/**
* <p>unknown</p>
*
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus unknown() {
return unknown(null);
}
/**
* <p>unknown</p>
*
* @param reason a {@link java.lang.String} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus unknown(final String reason) {
return new PollStatus(SERVICE_UNKNOWN, reason, null);
}
/**
* <p>unresponsive</p>
*
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus unresponsive() {
return unresponsive(null);
}
/**
* <p>unresponsive</p>
*
* @param reason a {@link java.lang.String} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus unresponsive(final String reason) {
return new PollStatus(SERVICE_UNRESPONSIVE, reason, null);
}
/**
* <p>down</p>
*
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus down() {
return down(null);
}
/**
* <p>unavailable</p>
*
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus unavailable() {
return unavailable(null);
}
/**
* <p>down</p>
*
* @param reason a {@link java.lang.String} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus down(final String reason) {
return unavailable(reason);
}
/**
* <p>unavailable</p>
*
* @param reason a {@link java.lang.String} object.
* @return a {@link org.opennms.netmgt.model.PollStatus} object.
*/
public static PollStatus unavailable(final String reason) {
return new PollStatus(SERVICE_UNAVAILABLE, reason, null);
}
/** {@inheritDoc} */
public boolean equals(final Object o) {
if (o instanceof PollStatus) {
return m_statusCode == ((PollStatus)o).m_statusCode;
}
return false;
}
/**
* <p>hashCode</p>
*
* @return a int.
*/
public int hashCode() {
return m_statusCode;
}
/**
* <p>isUp</p>
*
* @return a boolean.
*/
@Transient
public boolean isUp() {
return !isDown();
}
/**
* <p>isAvailable</p>
*
* @return a boolean.
*/
@Transient
public boolean isAvailable() {
return this.m_statusCode == SERVICE_AVAILABLE;
}
/**
* <p>isUnresponsive</p>
*
* @return a boolean.
*/
@Transient
public boolean isUnresponsive() {
return this.m_statusCode == SERVICE_UNRESPONSIVE;
}
/**
* <p>isUnavailable</p>
*
* @return a boolean.
*/
@Transient
public boolean isUnavailable() {
return this.m_statusCode == SERVICE_UNAVAILABLE;
}
/**
* <p>isDown</p>
*
* @return a boolean.
*/
@Transient
public boolean isDown() {
return this.m_statusCode == SERVICE_UNAVAILABLE;
}
/**
* <p>isUnknown</p>
*
* @return a boolean.
*/
@Transient
public boolean isUnknown() {
return this.m_statusCode == SERVICE_UNKNOWN;
}
/**
* <p>toString</p>
*
* @return a {@link java.lang.String} object.
*/
public String toString() {
return getStatusName();
}
/**
* <p>getTimestamp</p>
*
* @return a {@link java.util.Date} object.
*/
@Column(name="statusTime", nullable=false)
public Date getTimestamp() {
return m_timestamp;
}
/**
* <p>setTimestamp</p>
*
* @param timestamp a {@link java.util.Date} object.
*/
public void setTimestamp(final Date timestamp) {
m_timestamp = timestamp;
}
/**
* <p>getReason</p>
*
* @return a {@link java.lang.String} object.
*/
@Column(name="statusReason", length=255, nullable=true)
public String getReason() {
return m_reason;
}
/**
* <p>setReason</p>
*
* @param reason a {@link java.lang.String} object.
*/
public void setReason(final String reason) {
if (reason == null) {
m_reason = null;
} else if (reason.length() <= 255) {
m_reason = reason;
} else {
m_reason = reason.substring(0, 255);
}
}
/**
* <p>getResponseTime</p>
*
* @return a {@link java.lang.Double} object.
*/
@Column(name="responseTime", nullable=true)
public Double getResponseTime() {
Number val = getProperty("response-time");
return (val == null ? null : val.doubleValue());
}
/* stores the individual item for compatibility with database schema, as well as the new property map */
/**
* <p>setResponseTime</p>
*
* @param responseTime a {@link java.lang.Double} object.
*/
public void setResponseTime(final Double responseTime) {
if (responseTime == null) {
m_properties.remove("response-time");
} else {
m_properties.put("response-time", responseTime);
}
}
/**
* <p>getProperties</p>
*
* @return a {@link java.util.Map} object.
*/
@Transient
public Map<String, Number> getProperties() {
if (m_properties == null) {
m_properties = new LinkedHashMap<String, Number>();
}
return m_properties;
}
/**
* <p>setProperties</p>
*
* @param p a {@link java.util.Map} object.
*/
public void setProperties(Map<String, Number> p) {
m_properties = p;
}
/**
* <p>getProperty</p>
*
* @param key a {@link java.lang.String} object.
* @return a {@link java.lang.Number} object.
*/
@Transient
public Number getProperty(final String key) {
if (m_properties != null) {
return m_properties.get(key);
} else {
return null;
}
}
/**
* <p>setProperty</p>
*
* @param key a {@link java.lang.String} object.
* @param value a {@link java.lang.Number} object.
*/
public void setProperty(final String key, final Number value) {
Map<String, Number> m = getProperties();
m.put(key, value);
setProperties(m);
}
/**
* <p>getStatusCode</p>
*
* @return a int.
*/
@Column(name="statusCode", nullable=false)
public int getStatusCode() {
return m_statusCode;
}
private void setStatusCode(final int statusCode) {
m_statusCode = statusCode;
}
/**
* <p>getStatusName</p>
*
* @return a {@link java.lang.String} object.
*/
@Transient
public String getStatusName() {
return s_statusNames[m_statusCode];
}
}