package org.opennms.netmgt.model.ncs;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Version;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
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.MapKey;
@Entity
@Table(name="ncscomponent")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@XmlRootElement(name="component")
@XmlAccessorType(XmlAccessType.FIELD)
public class NCSComponent {
public enum DependencyRequirements { ANY, ALL };
@XmlRootElement(name="node")
@XmlAccessorType(XmlAccessType.FIELD)
@Embeddable
public static class NodeIdentification {
@XmlAttribute(name="foreignSource", required=true)
private String m_foreignSource;
@XmlAttribute(name="foreignId", required=true)
private String m_foreignId;
public NodeIdentification() {
}
public NodeIdentification(String nodeForeignSource, String nodeForeignId) {
m_foreignSource = nodeForeignSource;
m_foreignId = nodeForeignId;
}
@Column(name = "nodeForeignSource")
public String getForeignSource() {
return m_foreignSource;
}
public void setForeignSource(String foreignSource) {
m_foreignSource = foreignSource;
}
@Column(name = "nodeForeignId")
public String getForeignId() {
return m_foreignId;
}
public void setForeignId(String foreignId) {
m_foreignId = foreignId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((m_foreignId == null) ? 0 : m_foreignId.hashCode());
result = prime
* result
+ ((m_foreignSource == null) ? 0 : m_foreignSource
.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
NodeIdentification other = (NodeIdentification) obj;
if (m_foreignId == null) {
if (other.m_foreignId != null)
return false;
} else if (!m_foreignId.equals(other.m_foreignId))
return false;
if (m_foreignSource == null) {
if (other.m_foreignSource != null)
return false;
} else if (!m_foreignSource.equals(other.m_foreignSource))
return false;
return true;
}
}
@XmlElement(name="id")
private Long m_id;
@XmlTransient
private Integer m_version;
@XmlAttribute(name="foreignSource", required=true)
private String m_foreignSource;
@XmlAttribute(name="foreignId", required=true)
private String m_foreignId;
@XmlAttribute(name="type", required=true)
private String m_type;
@XmlElement(name="name")
private String m_name;
@XmlElement(name="node")
private NodeIdentification m_nodeIdentification;
@XmlElement(name="upEventUei")
private String m_upEventUei;
@XmlElement(name="downEventUei")
private String m_downEventUei;
@XmlElement(name="dependenciesRequired", required=false, defaultValue="ALL")
private DependencyRequirements m_dependenciesRequired;
@XmlElement(name = "attributes", required = false)
@XmlJavaTypeAdapter(JAXBMapAdapter.class)
private Map<String, String> m_attributes = new LinkedHashMap<String, String>();
@XmlElement(name="component")
private Set<NCSComponent> m_subcomponents = new LinkedHashSet<NCSComponent>();
@XmlTransient
private Set<NCSComponent> m_parents = new LinkedHashSet<NCSComponent>();
public NCSComponent(final String type, final String foreignSource, final String foreignId) {
this();
m_type = type;
m_foreignSource = foreignSource;
m_foreignId = foreignId;
}
public NCSComponent() {
}
@Id
@Column(name="id", nullable=false)
@SequenceGenerator(name="opennmsSequence", sequenceName="opennmsNxtId")
@GeneratedValue(generator="opennmsSequence")
public Long getId() {
return m_id;
}
public void setId(Long id) {
m_id = id;
}
@Version
public Integer getVersion() {
return m_version;
}
public void setVersion(Integer version) {
m_version = version;
}
public String getForeignSource() {
return m_foreignSource;
}
public void setForeignSource(String foreignSource) {
m_foreignSource = foreignSource;
}
public String getForeignId() {
return m_foreignId;
}
public void setForeignId(String foreignId) {
m_foreignId = foreignId;
}
public String getType() {
return m_type;
}
public void setType(String type) {
m_type = type;
}
public NodeIdentification getNodeIdentification() {
return m_nodeIdentification;
}
public void setNodeIdentification(NodeIdentification nodeIdentification) {
m_nodeIdentification = nodeIdentification;
}
public String getName() {
return m_name;
}
public void setName(String name) {
m_name = name;
}
public String getUpEventUei() {
return m_upEventUei;
}
public void setUpEventUei(String upEventUei) {
m_upEventUei = upEventUei;
}
public String getDownEventUei() {
return m_downEventUei;
}
public void setDownEventUei(String downEventUei) {
m_downEventUei = downEventUei;
}
@Enumerated(EnumType.STRING)
@Column(name = "depsRequired")
public DependencyRequirements getDependenciesRequired() {
return m_dependenciesRequired;
}
public void setDependenciesRequired(DependencyRequirements dependenciesRequired) {
m_dependenciesRequired = dependenciesRequired;
}
@ManyToMany
@JoinTable(name="subcomponents", joinColumns = { @JoinColumn(name="subcomponent_id") }, inverseJoinColumns = { @JoinColumn(name="component_id") })
public Set<NCSComponent> getParentcomponents() {
return m_parents ;
}
public void setParentcomponents(final Set<NCSComponent> parents) {
m_parents = parents;
}
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="subcomponents", joinColumns = { @JoinColumn(name="component_id") }, inverseJoinColumns = { @JoinColumn(name="subcomponent_id") })
public Set<NCSComponent> getSubcomponents() {
return m_subcomponents;
}
public void setSubcomponents(Set<NCSComponent> subComponents) {
m_subcomponents = subComponents;
}
public void addSubcomponent(NCSComponent subComponent) {
getSubcomponents().add(subComponent);
}
public void removeSubcomponent(NCSComponent subComponent) {
getSubcomponents().remove(subComponent);
}
public NCSComponent getSubcomponent(String foreignSource, String foreignId) {
for(NCSComponent subcomponent : getSubcomponents()) {
if (subcomponent.hasIdentity(foreignSource, foreignId)) {
return subcomponent;
}
}
return null;
}
public boolean hasIdentity(String foreignSource, String foreignId) {
return m_foreignSource.equals(foreignSource) && m_foreignId.equals(foreignId);
}
@CollectionOfElements
@JoinTable(name="ncs_attributes")
@MapKey(columns=@Column(name="key"))
@Column(name="value", nullable=false)
public Map<String, String> getAttributes() {
return m_attributes;
}
public void setAttributes(Map<String, String> attributes) {
m_attributes = attributes;
}
public void setAttribute(String key, String value) {
m_attributes.put(key, value);
}
public String removeAttribute(String key) {
return m_attributes.remove(key);
}
public void visit(NCSComponentVisitor visitor) {
// visit this component
visitor.visitComponent(this);
// visit subcomponents
for(NCSComponent subcomponent : getSubcomponents()) {
subcomponent.visit(visitor);
}
// complete visiting this component
visitor.completeComponent(this);
}
}