/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2006-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.net.InetAddress; import java.util.Calendar; import java.util.Date; import java.util.Map; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.hibernate.annotations.CollectionOfElements; import org.hibernate.annotations.Filter; import org.hibernate.annotations.MapKey; import org.hibernate.annotations.Type; import org.opennms.core.xml.bind.InetAddressXmlAdapter; import org.springframework.core.style.ToStringCreator; /** * <p>OnmsAlarm class.</p> */ @XmlRootElement(name="alarm") @Entity @Table(name="alarms") @Filter(name=FilterManager.AUTH_FILTER_NAME, condition="exists (select distinct x.nodeid from node x join category_node cn on x.nodeid = cn.nodeid join category_group cg on cn.categoryId = cg.categoryId where x.nodeid = nodeid and cg.groupId in (:userGroups))") public class OnmsAlarm implements Acknowledgeable, Serializable { private static final long serialVersionUID = 7275548439687562161L; /** Constant <code>PROBLEM_TYPE=1</code> */ public static final int PROBLEM_TYPE = 1; /** Constant <code>RESOLUTION_TYPE=2</code> */ public static final int RESOLUTION_TYPE = 2; /** identifier field */ private Integer m_id; /** persistent field */ private String m_uei; /** persistent field */ private OnmsDistPoller m_distPoller; /** nullable persistent field */ private OnmsNode m_node; /** nullable persistent field */ private InetAddress m_ipAddr; /** nullable persistent field */ private OnmsServiceType m_serviceType; /** nullable persistent field */ private String m_reductionKey; /** nullable persistent field */ private Integer m_alarmType; /** nullable persistent field */ private Integer m_ifIndex; /** persistent field */ private Integer m_counter; /** persistent field */ private OnmsSeverity m_severity = OnmsSeverity.INDETERMINATE; /** persistent field */ private Date m_firstEventTime; /** persistent field */ private Date m_lastEventTime; /** persistent field */ private Date m_firstAutomationTime; /** persistent field */ private Date m_lastAutomationTime; /** nullable persistent field */ private String m_description; /** nullable persistent field */ private String m_logMsg; /** nullable persistent field */ private String m_operInstruct; /** nullable persistent field */ private String m_tTicketId; /** nullable persistent field */ private TroubleTicketState m_tTicketState; /** nullable persistent field */ private String m_mouseOverText; /** nullable persistent field */ private Date m_suppressedUntil; /** nullable persistent field */ private String m_suppressedUser; /** nullable persistent field */ private Date m_suppressedTime; /** nullable persistent field */ private String m_alarmAckUser; /** nullable persistent field */ private Date m_alarmAckTime; /** nullable persistent field */ private String m_clearKey; /** persistent field */ private OnmsEvent m_lastEvent; /** persistent field */ private String m_eventParms; /** persistent field */ private String m_managedObjectInstance; /** persistent field */ private String m_managedObjectType; /** persistent field */ private String m_applicationDN; private String m_ossPrimaryKey; private String m_x733AlarmType; private String m_qosAlarmState; private int m_x733ProbableCause = 0; private Map<String, String> m_details; private OnmsMemo m_stickyMemo; private OnmsReductionKeyMemo m_reductionKeyMemo; /** * default constructor */ public OnmsAlarm() { } /** * minimal constructor * * @param alarmid a {@link java.lang.Integer} object. * @param eventuei a {@link java.lang.String} object. * @param distPoller a {@link org.opennms.netmgt.model.OnmsDistPoller} object. * @param counter a {@link java.lang.Integer} object. * @param severity a {@link java.lang.Integer} object. * @param firsteventtime a {@link java.util.Date} object. * @param event a {@link org.opennms.netmgt.model.OnmsEvent} object. */ public OnmsAlarm(Integer alarmid, String eventuei, OnmsDistPoller distPoller, Integer counter, Integer severity, Date firsteventtime, OnmsEvent event) { this.m_id = alarmid; this.m_uei = eventuei; this.m_distPoller = distPoller; this.m_counter = counter; this.m_severity = OnmsSeverity.get(severity); this.m_firstEventTime = firsteventtime; this.m_lastEvent = event; } /** * <p>getId</p> * * @return a {@link java.lang.Integer} object. */ @Id @SequenceGenerator(name="alarmSequence", sequenceName="alarmsNxtId") @GeneratedValue(generator="alarmSequence") @Column(name="alarmId", nullable=false) @XmlAttribute(name="id") public Integer getId() { return this.m_id; } /** * <p>setId</p> * * @param alarmid a {@link java.lang.Integer} object. */ public void setId(Integer alarmid) { this.m_id = alarmid; } /** * <p>getUei</p> * * @return a {@link java.lang.String} object. */ @Column(name="eventUEI", length=256, nullable=false) @XmlElement(name="uei") public String getUei() { return this.m_uei; } /** * <p>setUei</p> * * @param eventuei a {@link java.lang.String} object. */ public void setUei(String eventuei) { this.m_uei = eventuei; } /** * <p>getDistPoller</p> * * @return a {@link org.opennms.netmgt.model.OnmsDistPoller} object. */ @XmlTransient @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="dpName", nullable=false) public OnmsDistPoller getDistPoller() { return this.m_distPoller; } /** * <p>setDistPoller</p> * * @param distPoller a {@link org.opennms.netmgt.model.OnmsDistPoller} object. */ public void setDistPoller(OnmsDistPoller distPoller) { this.m_distPoller = distPoller; } // TODO change this to an Entity and remove nodeid, ipaddr, serviceid /** * <p>getNode</p> * * @return a {@link org.opennms.netmgt.model.OnmsNode} object. */ @XmlTransient @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="nodeId") public OnmsNode getNode() { return this.m_node; } /** * <p>setNode</p> * * @param node a {@link org.opennms.netmgt.model.OnmsNode} object. */ public void setNode(OnmsNode node) { this.m_node = node; } @Transient @XmlElement(name="nodeId", required=false) public Integer getNodeId() { if (m_node == null) return null; return m_node.getId(); } @Transient @XmlElement(name="nodeLabel", required=false) public String getNodeLabel() { if (m_node == null) return null; return m_node.getLabel(); } /** * <p>getIpAddr</p> * * @return a {@link java.lang.String} object. */ @Column(name="ipAddr") @XmlElement(name="ipAddress") @Type(type="org.opennms.netmgt.model.InetAddressUserType") @XmlJavaTypeAdapter(InetAddressXmlAdapter.class) public InetAddress getIpAddr() { return this.m_ipAddr; } /** * <p>setIpAddr</p> * * @param ipaddr a {@link java.lang.String} object. */ public void setIpAddr(InetAddress ipaddr) { this.m_ipAddr = ipaddr; } /** * <p>getServiceType</p> * * @return a {@link org.opennms.netmgt.model.OnmsServiceType} object. */ @ManyToOne @JoinColumn(name="serviceid") public OnmsServiceType getServiceType() { return this.m_serviceType; } /** * <p>setServiceType</p> * * @param service a {@link org.opennms.netmgt.model.OnmsServiceType} object. */ public void setServiceType(OnmsServiceType service) { this.m_serviceType = service; } /** * <p>getReductionKey</p> * * @return a {@link java.lang.String} object. */ @Column(name="reductionKey", unique=true, length=256) @XmlElement(name="reductionKey") public String getReductionKey() { return this.m_reductionKey; } /** * <p>setReductionKey</p> * * @param reductionkey a {@link java.lang.String} object. */ public void setReductionKey(String reductionkey) { this.m_reductionKey = reductionkey; } /** * <p>getAlarmType</p> * * @return a {@link java.lang.Integer} object. */ @Column(name="alarmType") @XmlAttribute(name="type") public Integer getAlarmType() { return this.m_alarmType; } /** * <p>setAlarmType</p> * * @param alarmtype a {@link java.lang.Integer} object. */ public void setAlarmType(Integer alarmtype) { this.m_alarmType = alarmtype; } /** * <p>getCounter</p> * * @return a {@link java.lang.Integer} object. */ @XmlAttribute(name="count") @Column(name="counter", nullable=false) public Integer getCounter() { return this.m_counter; } /** * <p>setCounter</p> * * @param counter a {@link java.lang.Integer} object. */ public void setCounter(Integer counter) { this.m_counter = counter; } /** * <p>getSeverityLabel</p> * * @return a {@link java.lang.String} object. */ @Transient @XmlAttribute(name="severity") public String getSeverityLabel() { return this.m_severity.name(); } /** * <p>setSeverityLabel</p> * * @param label a {@link java.lang.String} object. */ public void setSeverityLabel(final String label) { m_severity = OnmsSeverity.get(label); } /** * <p>getSeverity</p> * * @return a {@link org.opennms.netmgt.model.OnmsSeverity} object. */ @Column(name="severity", nullable=false) // @Enumerated(EnumType.ORDINAL) @Type(type="org.opennms.netmgt.model.OnmsSeverityUserType") @XmlTransient public OnmsSeverity getSeverity() { return this.m_severity; } /** * <p>setSeverity</p> * * @param severity a {@link org.opennms.netmgt.model.OnmsSeverity} object. */ public void setSeverity(final OnmsSeverity severity) { m_severity = severity; } /** * <p>getSeverityId</p> * * @return a {@link java.lang.Integer} object. */ @Transient @XmlTransient public Integer getSeverityId() { return this.m_severity.getId(); } /** * <p>setSeverityId</p> * * @param severity a {@link java.lang.Integer} object. */ public void setSeverityId(final Integer severity) { this.m_severity = OnmsSeverity.get(severity); } /** * <p>getFirstEventTime</p> * * @return a {@link java.util.Date} object. */ @Temporal(TemporalType.TIMESTAMP) @Column(name="firstEventTime") public Date getFirstEventTime() { return this.m_firstEventTime; } /** * <p>setFirstEventTime</p> * * @param firsteventtime a {@link java.util.Date} object. */ public void setFirstEventTime(Date firsteventtime) { this.m_firstEventTime = firsteventtime; } /** * <p>getDescription</p> * * @return a {@link java.lang.String} object. */ @Column(name="description", length=4000) public String getDescription() { return this.m_description; } /** * <p>setDescription</p> * * @param description a {@link java.lang.String} object. */ public void setDescription(String description) { this.m_description = description; } /** * <p>getLogMsg</p> * * @return a {@link java.lang.String} object. */ @Column(name="logmsg", length=1024) @XmlElement(name="logMessage") public String getLogMsg() { return this.m_logMsg; } /** * <p>setLogMsg</p> * * @param logmsg a {@link java.lang.String} object. */ public void setLogMsg(String logmsg) { this.m_logMsg = logmsg; } /** * <p>getOperInstruct</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="operatorInstructions") @Column(name="operinstruct", length=1024) public String getOperInstruct() { return this.m_operInstruct; } /** * <p>setOperInstruct</p> * * @param operinstruct a {@link java.lang.String} object. */ public void setOperInstruct(String operinstruct) { this.m_operInstruct = operinstruct; } /** * <p>getTTicketId</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="troubleTicket") @Column(name="tticketId", length=128) public String getTTicketId() { return this.m_tTicketId; } /** * <p>setTTicketId</p> * * @param tticketid a {@link java.lang.String} object. */ public void setTTicketId(String tticketid) { this.m_tTicketId = tticketid; } /** * <p>getTTicketState</p> * * @return a {@link org.opennms.netmgt.model.TroubleTicketState} object. */ @XmlElement(name="troubleTicketState") @Column(name="tticketState") public TroubleTicketState getTTicketState() { return this.m_tTicketState; } /** * <p>setTTicketState</p> * * @param tticketstate a {@link org.opennms.netmgt.model.TroubleTicketState} object. */ public void setTTicketState(TroubleTicketState tticketstate) { this.m_tTicketState = tticketstate; } /** * <p>getMouseOverText</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="mouseOverText") @Column(name="mouseOverText", length=64) public String getMouseOverText() { return this.m_mouseOverText; } /** * <p>setMouseOverText</p> * * @param mouseovertext a {@link java.lang.String} object. */ public void setMouseOverText(String mouseovertext) { this.m_mouseOverText = mouseovertext; } /** * <p>getSuppressedUntil</p> * * @return a {@link java.util.Date} object. */ @Temporal(TemporalType.TIMESTAMP) @XmlElement(name="suppressedUntil") @Column(name="suppressedUntil") public Date getSuppressedUntil() { return this.m_suppressedUntil; } /** * <p>setSuppressedUntil</p> * * @param suppresseduntil a {@link java.util.Date} object. */ public void setSuppressedUntil(Date suppresseduntil) { this.m_suppressedUntil = suppresseduntil; } /** * <p>getSuppressedUser</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="suppressedBy") @Column(name="suppressedUser", length=256) public String getSuppressedUser() { return this.m_suppressedUser; } /** * <p>setSuppressedUser</p> * * @param suppresseduser a {@link java.lang.String} object. */ public void setSuppressedUser(String suppresseduser) { this.m_suppressedUser = suppresseduser; } /** * <p>getSuppressedTime</p> * * @return a {@link java.util.Date} object. */ @Temporal(TemporalType.TIMESTAMP) @Column(name="suppressedTime") @XmlElement(name="suppressedTime") public Date getSuppressedTime() { return this.m_suppressedTime; } /** * <p>setSuppressedTime</p> * * @param suppressedtime a {@link java.util.Date} object. */ public void setSuppressedTime(Date suppressedtime) { this.m_suppressedTime = suppressedtime; } /** * <p>getAlarmAckUser</p> * * @return a {@link java.lang.String} object. */ @Column(name="alarmAckUser", length=256) @XmlElement(name="ackUser") public String getAlarmAckUser() { return this.m_alarmAckUser; } /** * <p>setAlarmAckUser</p> * * @param alarmackuser a {@link java.lang.String} object. */ public void setAlarmAckUser(String alarmackuser) { this.m_alarmAckUser = alarmackuser; } /** * <p>getAlarmAckTime</p> * * @return a {@link java.util.Date} object. */ @Temporal(TemporalType.TIMESTAMP) @Column(name="alarmAckTime") @XmlElement(name="ackTime") public Date getAlarmAckTime() { return this.m_alarmAckTime; } /** * <p>setAlarmAckTime</p> * * @param alarmacktime a {@link java.util.Date} object. */ public void setAlarmAckTime(Date alarmacktime) { this.m_alarmAckTime = alarmacktime; } /** * <p>getClearKey</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="clearKey") @Column(name="clearKey", length=256) public String getClearKey() { return this.m_clearKey; } /** * <p>setClearKey</p> * * @param clearKey a {@link java.lang.String} object. */ public void setClearKey(String clearKey) { this.m_clearKey = clearKey; } /** * <p>getLastEvent</p> * * @return a {@link org.opennms.netmgt.model.OnmsEvent} object. */ @ManyToOne(fetch=FetchType.LAZY, optional=true) @JoinColumn(name="lastEventId") @XmlElement(name="lastEvent") public OnmsEvent getLastEvent() { return this.m_lastEvent; } /** * <p>setLastEvent</p> * * @param event a {@link org.opennms.netmgt.model.OnmsEvent} object. */ public void setLastEvent(OnmsEvent event) { this.m_lastEvent = event; if (event!=null) this.m_lastEventTime = event.getEventTime(); // alarm can be saved with no associated event } /** * <p>getEventParms</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="parms") @Column(name="eventParms", length=1024) public String getEventParms() { return this.m_eventParms; } /** * <p>setEventParms</p> * * @param eventparms a {@link java.lang.String} object. */ public void setEventParms(String eventparms) { this.m_eventParms = eventparms; } /** * <p>toString</p> * * @return a {@link java.lang.String} object. */ public String toString() { return new ToStringCreator(this) .append("alarmid", getId()) .toString(); } /** * <p>getLastEventTime</p> * * @return a {@link java.util.Date} object. */ @Temporal(TemporalType.TIMESTAMP) @Column(name="lastEventTime") @XmlElement(name="lastEventTime") public Date getLastEventTime() { return m_lastEventTime; } /** * <p>setLastEventTime</p> * * @param lastEventTime a {@link java.util.Date} object. */ public void setLastEventTime(Date lastEventTime) { m_lastEventTime = lastEventTime; } /** * <p>getApplicationDN</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="applicationDN") @Column(name="applicationDN", length=512) public String getApplicationDN() { return m_applicationDN; } /** * <p>setApplicationDN</p> * * @param applicationDN a {@link java.lang.String} object. */ public void setApplicationDN(String applicationDN) { m_applicationDN = applicationDN; } /** * <p>getManagedObjectInstance</p> * * @return a {@link java.lang.String} object. */ @Column(name="managedObjectInstance", length=512) public String getManagedObjectInstance() { return m_managedObjectInstance; } /** * <p>setManagedObjectInstance</p> * * @param managedObjectInstance a {@link java.lang.String} object. */ public void setManagedObjectInstance(String managedObjectInstance) { m_managedObjectInstance = managedObjectInstance; } /** * <p>getManagedObjectType</p> * * @return a {@link java.lang.String} object. */ @Column(name="managedObjectType", length=512) public String getManagedObjectType() { return m_managedObjectType; } /** * <p>setManagedObjectType</p> * * @param managedObjectType a {@link java.lang.String} object. */ public void setManagedObjectType(String managedObjectType) { m_managedObjectType = managedObjectType; } /** * <p>getOssPrimaryKey</p> * * @return a {@link java.lang.String} object. */ @Column(name="ossPrimaryKey", length=512) public String getOssPrimaryKey() { return m_ossPrimaryKey; } /** * <p>setOssPrimaryKey</p> * * @param key a {@link java.lang.String} object. */ public void setOssPrimaryKey(String key) { m_ossPrimaryKey = key; } /** * <p>getX733AlarmType</p> * * @return a {@link java.lang.String} object. */ @Column(name="x733AlarmType", length=31) public String getX733AlarmType() { return m_x733AlarmType; } /** * <p>setX733AlarmType</p> * * @param alarmType a {@link java.lang.String} object. */ public void setX733AlarmType(String alarmType) { m_x733AlarmType = alarmType; } /** * <p>getX733ProbableCause</p> * * @return a int. */ @Column(name="x733ProbableCause", nullable=false) public int getX733ProbableCause() { return m_x733ProbableCause; } /** * <p>setX733ProbableCause</p> * * @param cause a int. */ public void setX733ProbableCause(int cause) { m_x733ProbableCause = cause; } /** * <p>getQosAlarmState</p> * * @return a {@link java.lang.String} object. */ @Column(name="qosAlarmState", length=31) public String getQosAlarmState() { return m_qosAlarmState; } /** * <p>setQosAlarmState</p> * * @param alarmState a {@link java.lang.String} object. */ public void setQosAlarmState(String alarmState) { m_qosAlarmState = alarmState; } /** * <p>getFirstAutomationTime</p> * * @return a {@link java.util.Date} object. */ @Temporal(TemporalType.TIMESTAMP) @Column(name="firstAutomationTime") @XmlElement(name="firstAutomationTime") public Date getFirstAutomationTime() { return m_firstAutomationTime; } /** * <p>setFirstAutomationTime</p> * * @param firstAutomationTime a {@link java.util.Date} object. */ public void setFirstAutomationTime(Date firstAutomationTime) { m_firstAutomationTime = firstAutomationTime; } /** * <p>getLastAutomationTime</p> * * @return a {@link java.util.Date} object. */ @Temporal(TemporalType.TIMESTAMP) @Column(name="lastAutomationTime") @XmlElement(name="lastAutomationTime") public Date getLastAutomationTime() { return m_lastAutomationTime; } /** * <p>setLastAutomationTime</p> * * @param lastAutomationTime a {@link java.util.Date} object. */ public void setLastAutomationTime(Date lastAutomationTime) { m_lastAutomationTime = lastAutomationTime; } /** * <p>getDetails</p> * * @return a {@link java.util.Map} object. */ @XmlTransient @CollectionOfElements @JoinTable(name="alarm_attributes", joinColumns = @JoinColumn(name="alarmId")) @MapKey(columns=@Column(name="attribute")) @Column(name="attributeValue", nullable=false) public Map<String, String> getDetails() { return m_details; } /** * <p>setDetails</p> * * @param alarmDetails a {@link java.util.Map} object. */ public void setDetails(Map<String, String> alarmDetails) { m_details = alarmDetails; } /** * <p>getIfIndex</p> * * @return a {@link java.lang.Integer} object. */ @Column(name="ifIndex") @XmlAttribute(name="ifIndex") public Integer getIfIndex() { return m_ifIndex; } /** * <p>setIfIndex</p> * * @param ifIndex a {@link java.lang.Integer} object. */ public void setIfIndex(Integer ifIndex) { m_ifIndex = ifIndex; } @ManyToOne @JoinColumn(name="reductionKey", referencedColumnName="reductionkey", updatable=false, insertable=false) @XmlElement(name="reductionKeyMemo") public OnmsReductionKeyMemo getReductionKeyMemo() { return m_reductionKeyMemo; } public void setReductionKeyMemo(OnmsReductionKeyMemo reductionKeyMemo) { this.m_reductionKeyMemo = reductionKeyMemo; } @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="stickymemo") @XmlElement(name="stickyMemo") public OnmsMemo getStickyMemo() { return m_stickyMemo; } public void setStickyMemo(OnmsMemo stickyMemo) { this.m_stickyMemo = stickyMemo; } /** {@inheritDoc} */ public void acknowledge(String user) { if (m_alarmAckTime == null || m_alarmAckUser == null) { m_alarmAckTime = Calendar.getInstance().getTime(); m_alarmAckUser = user; } } /** {@inheritDoc} */ public void unacknowledge(String ackUser) { m_alarmAckTime = null; m_alarmAckUser = null; } /** {@inheritDoc} */ public void clear(String ackUser) { m_severity = OnmsSeverity.CLEARED; } /** {@inheritDoc} */ public void escalate(String ackUser) { m_severity = OnmsSeverity.escalate(m_severity); // m_alarmAckUser = ackUser; // m_alarmAckTime = Calendar.getInstance().getTime(); } /** * <p>getType</p> * * @return a {@link org.opennms.netmgt.model.AckType} object. */ @Transient public AckType getType() { return AckType.ALARM; } /** * <p>getAckId</p> * * @return a {@link java.lang.Integer} object. */ @Transient public Integer getAckId() { return m_id; } /** * <p>getAckUser</p> * * @return a {@link java.lang.String} object. */ @Transient public String getAckUser() { return m_alarmAckUser; } /** * <p>getAckTime</p> * * @return a {@link java.util.Date} object. */ @Transient public Date getAckTime() { return m_alarmAckTime; } }