/******************************************************************************* * 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.HashSet; import java.util.Set; 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.ManyToOne; import javax.persistence.OneToMany; 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.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.hibernate.annotations.Filter; import org.hibernate.annotations.Type; import org.opennms.core.xml.bind.InetAddressXmlAdapter; import org.springframework.core.style.ToStringCreator; /** * <p>OnmsNotification class.</p> */ @XmlRootElement(name="notification") @Entity @Table(name="notifications") @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 OnmsNotification implements Acknowledgeable, Serializable { private static final long serialVersionUID = -1162549324168290004L; /** identifier field */ private Integer m_notifyId; /** persistent field */ private String m_textMsg; /** nullable persistent field */ private String m_subject; /** nullable persistent field */ private String m_numericMsg; /** nullable persistent field */ private Date m_pageTime; /** nullable persistent field */ private Date m_respondTime; /** nullable persistent field */ private String m_answeredBy; /** nullable persistent field */ private OnmsServiceType m_serviceType; /** nullable persistent field */ private String m_queueId; /** persistent field */ private OnmsEvent m_event; /** persistent field */ private OnmsNode m_node; /** persistent field */ private Set<OnmsUserNotification> m_usersNotified = new HashSet<OnmsUserNotification>(); private InetAddress m_ipAddress; /** * persistent field representing the name of the configured notification from * notifications.xml */ private String m_notifConfigName; /** * full constructor * * @param notifyId a {@link java.lang.Integer} object. * @param textMsg a {@link java.lang.String} object. * @param subject a {@link java.lang.String} object. * @param numericMsg a {@link java.lang.String} object. * @param pageTime a {@link java.util.Date} object. * @param respondTime a {@link java.util.Date} object. * @param answeredBy a {@link java.lang.String} object. * @param ipAddress a {@link java.lang.String} object. * @param serviceType a {@link org.opennms.netmgt.model.OnmsServiceType} object. * @param queueId a {@link java.lang.String} object. * @param event a {@link org.opennms.netmgt.model.OnmsEvent} object. * @param node a {@link org.opennms.netmgt.model.OnmsNode} object. * @param usersNotified a {@link java.util.Set} object. * @param notifConfigName a {@link java.lang.String} object. */ public OnmsNotification(Integer notifyId, String textMsg, String subject, String numericMsg, Date pageTime, Date respondTime, String answeredBy, InetAddress ipAddress, OnmsServiceType serviceType, String queueId, OnmsEvent event, OnmsNode node, Set<OnmsUserNotification> usersNotified, String notifConfigName) { m_notifyId = notifyId; m_textMsg = textMsg; m_subject = subject; m_numericMsg = numericMsg; m_pageTime = pageTime; m_respondTime = respondTime; m_answeredBy = answeredBy; m_ipAddress = ipAddress; m_serviceType = serviceType; m_queueId = queueId; m_event = event; m_node = node; m_usersNotified = usersNotified; m_notifConfigName = notifConfigName; } /** * default constructor */ public OnmsNotification() { } /** * minimal constructor * * @param notifyId a {@link java.lang.Integer} object. * @param textMsg a {@link java.lang.String} object. * @param event a {@link org.opennms.netmgt.model.OnmsEvent} object. * @param node a {@link org.opennms.netmgt.model.OnmsNode} object. * @param usersNotified a {@link java.util.Set} object. */ public OnmsNotification(Integer notifyId, String textMsg, OnmsEvent event, OnmsNode node, Set<OnmsUserNotification> usersNotified) { m_notifyId = notifyId; m_textMsg = textMsg; m_event = event; m_node = node; m_usersNotified = usersNotified; } /** * <p>getNotifyId</p> * * @return a {@link java.lang.Integer} object. */ @Id @Column(nullable=false) @XmlAttribute(name="id") @SequenceGenerator(name="notifySequence", sequenceName="notifyNxtId") @GeneratedValue(generator="notifySequence") public Integer getNotifyId() { return m_notifyId; } /** * <p>setNotifyId</p> * * @param notifyid a {@link java.lang.Integer} object. */ public void setNotifyId(Integer notifyid) { m_notifyId = notifyid; } /** * <p>getTextMsg</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="textMessage") @Column(name="textMsg", length=4000, nullable=false) public String getTextMsg() { return m_textMsg; } /** * <p>setTextMsg</p> * * @param textmsg a {@link java.lang.String} object. */ public void setTextMsg(String textmsg) { m_textMsg = textmsg; } /** * <p>getSubject</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="subject") @Column(name="subject", length=256) public String getSubject() { return m_subject; } /** * <p>setSubject</p> * * @param subject a {@link java.lang.String} object. */ public void setSubject(String subject) { m_subject = subject; } /** * <p>getNumericMsg</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="numericMessage") @Column(name="numericMsg", length=256) public String getNumericMsg() { return m_numericMsg; } /** * <p>setNumericMsg</p> * * @param numericmsg a {@link java.lang.String} object. */ public void setNumericMsg(String numericmsg) { m_numericMsg = numericmsg; } /** * <p>getPageTime</p> * * @return a {@link java.util.Date} object. */ @XmlElement(name="pageTime") @Temporal(TemporalType.TIMESTAMP) @Column(name="pageTime") public Date getPageTime() { return m_pageTime; } /** * <p>setPageTime</p> * * @param pagetime a {@link java.util.Date} object. */ public void setPageTime(Date pagetime) { m_pageTime = pagetime; } /** * <p>getRespondTime</p> * * @return a {@link java.util.Date} object. */ @XmlElement(name="respondTime") @Temporal(TemporalType.TIMESTAMP) @Column(name="respondTime") public Date getRespondTime() { return m_respondTime; } /** * <p>setRespondTime</p> * * @param respondtime a {@link java.util.Date} object. */ public void setRespondTime(Date respondtime) { m_respondTime = respondtime; } /** * <p>getAnsweredBy</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="answeredBy") @Column(name="answeredBy", length=256) public String getAnsweredBy() { return m_answeredBy; } /** * <p>setAnsweredBy</p> * * @param answeredby a {@link java.lang.String} object. */ public void setAnsweredBy(String answeredby) { m_answeredBy = answeredby; } /** * <p>getIpAddress</p> * * @return a {@link java.lang.String} object. */ @Column(name="interfaceId") @XmlElement(name="ipAddress") @Type(type="org.opennms.netmgt.model.InetAddressUserType") @XmlJavaTypeAdapter(InetAddressXmlAdapter.class) public InetAddress getIpAddress() { return m_ipAddress; } /** * <p>setIpAddress</p> * * @param ipAddress a {@link java.lang.String} object. */ public void setIpAddress(InetAddress ipAddress) { m_ipAddress = ipAddress; } /** * <p>getServiceType</p> * * @return a {@link org.opennms.netmgt.model.OnmsServiceType} object. */ @ManyToOne @JoinColumn(name="serviceId") public OnmsServiceType getServiceType() { return m_serviceType; } /** * <p>setServiceType</p> * * @param serviceType a {@link org.opennms.netmgt.model.OnmsServiceType} object. */ public void setServiceType(OnmsServiceType serviceType) { m_serviceType = serviceType; } /** * <p>getQueueId</p> * * @return a {@link java.lang.String} object. */ @Column(name="queueId", length=256) public String getQueueId() { return m_queueId; } /** * <p>setQueueId</p> * * @param queueid a {@link java.lang.String} object. */ public void setQueueId(String queueid) { m_queueId = queueid; } /** * <p>getEvent</p> * * @return a {@link org.opennms.netmgt.model.OnmsEvent} object. */ @XmlTransient @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="eventId", nullable=false) public OnmsEvent getEvent() { return m_event; } /** * <p>setEvent</p> * * @param event a {@link org.opennms.netmgt.model.OnmsEvent} object. */ public void setEvent(OnmsEvent event) { m_event = event; } /* * FIXME: HACK for some reason we put the eventUEI in the notifications table along with the eventId * so we have to HACK this so we can properly write the table */ /** * <p>getEventUei</p> * * @return a {@link java.lang.String} object. */ @XmlElement(name="uei") @Column(name="eventUEI") public String getEventUei() { return m_event.getEventUei(); } /** * <p>setEventUei</p> * * @param eventUei a {@link java.lang.String} object. */ public void setEventUei(String eventUei) { // do nothing as this is a HACK } /** * <p>getSeverityLabel</p> * * @return a {@link java.lang.String} object. */ @Transient @XmlAttribute(name="severity") public String getSeverityLabel() { return m_event.getSeverityLabel(); } /** * <p>getNode</p> * * @return a {@link org.opennms.netmgt.model.OnmsNode} object. */ @XmlTransient @ManyToOne @JoinColumn(name="nodeId") public OnmsNode getNode() { return m_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>setNode</p> * * @param node a {@link org.opennms.netmgt.model.OnmsNode} object. */ public void setNode(OnmsNode node) { m_node = node; } /** * <p>getUsersNotified</p> * * @return a {@link java.util.Set} object. */ @XmlElement(name="destination") @XmlElementWrapper(name="destinations") @OneToMany(mappedBy="notification", fetch=FetchType.LAZY) public Set<OnmsUserNotification> getUsersNotified() { return m_usersNotified; } /** * <p>setUsersNotified</p> * * @param usersnotifieds a {@link java.util.Set} object. */ public void setUsersNotified(Set<OnmsUserNotification> usersnotifieds) { m_usersNotified = usersnotifieds; } /** * <p>toString</p> * * @return a {@link java.lang.String} object. */ public String toString() { return new ToStringCreator(this) .append("notifyid", getNotifyId()) .toString(); } /** * <p>getNotifConfigName</p> * * @return a {@link java.lang.String} object. */ public String getNotifConfigName() { return m_notifConfigName; } /** * <p>setNotifConfigName</p> * * @param notifConfigName a {@link java.lang.String} object. */ @XmlElement(name="notificationName") @Column(name="notifConfigName", length=63 ) public void setNotifConfigName(String notifConfigName) { m_notifConfigName = notifConfigName; } /** {@inheritDoc} */ public void acknowledge(String ackUser) { if(m_answeredBy == null || m_respondTime == null) { m_answeredBy = ackUser; m_respondTime = Calendar.getInstance().getTime(); } } /** * <p>getType</p> * * @return a {@link org.opennms.netmgt.model.AckType} object. */ @Transient public AckType getType() { return AckType.NOTIFICATION; } /** * <p>getAckId</p> * * @return a {@link java.lang.Integer} object. */ @Transient public Integer getAckId() { return m_notifyId; } /** * <p>getAckUser</p> * * @return a {@link java.lang.String} object. */ @Transient public String getAckUser() { return m_answeredBy; } /** * <p>getAckTime</p> * * @return a {@link java.util.Date} object. */ @Transient public Date getAckTime() { return m_respondTime; } /** {@inheritDoc} */ public void clear(String ackUser) { /* Note: this currently works based on the way Notifd currently processes queued notifications. * Outstanding notifications are not removed from the queue when a response is received, instead, * when the queued notification task is ran, the task checks to see if the notice is still outstanding. */ m_respondTime = Calendar.getInstance().getTime(); m_answeredBy = ackUser; } /** {@inheritDoc} */ public void escalate(String ackUser) { //does nothing for there is no severity state in a notification object //escalation of a notification is handled in the notification path } /** {@inheritDoc} */ public void unacknowledge(String ackUser) { m_respondTime = null; m_answeredBy = null; } }