/******************************************************************************* * 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/ *******************************************************************************/ // // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.3-b01-fcs // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2009.01.29 at 01:15:48 PM EST // package org.opennms.netmgt.provision.persist.requisition; import java.io.Serializable; import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.bind.ValidationException; 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.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.commons.lang.builder.ToStringBuilder; import org.opennms.core.utils.LogUtils; import org.opennms.core.xml.ValidateUsing; import org.opennms.netmgt.provision.persist.OnmsNodeRequisition; import org.opennms.netmgt.provision.persist.RequisitionVisitor; /** * <p>Requisition class.</p> * * @author ranger * @version $Id: $ */ @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name="model-import") @ValidateUsing("model-import.xsd") public class Requisition implements Serializable, Comparable<Requisition> { private static final long serialVersionUID = 2099710942679236239L; @XmlTransient private Map<String, OnmsNodeRequisition> m_nodeReqs = new LinkedHashMap<String, OnmsNodeRequisition>(); @XmlElement(name="node") protected List<RequisitionNode> m_nodes = new ArrayList<RequisitionNode>(); @XmlAttribute(name="date-stamp") protected XMLGregorianCalendar m_dateStamp; @XmlAttribute(name="foreign-source") protected String m_foreignSource = "imported:"; @XmlAttribute(name="last-import") protected XMLGregorianCalendar m_lastImport; /** * <p>getNode</p> * * @param foreignId a {@link java.lang.String} object. * @return a {@link org.opennms.netmgt.provision.persist.requisition.RequisitionNode} object. */ public RequisitionNode getNode(String foreignId) { if (m_nodes != null) { for (RequisitionNode n : m_nodes) { if (n.getForeignId().equals(foreignId)) { LogUtils.debugf(this, "returning node '%s' for foreign id '%s'", n, foreignId); return n; } } } return null; } /** * <p>removeNode</p> * * @param node a {@link org.opennms.netmgt.provision.persist.requisition.RequisitionNode} object. */ public void deleteNode(RequisitionNode node) { if (m_nodes != null) { Iterator<RequisitionNode> i = m_nodes.iterator(); while (i.hasNext()) { RequisitionNode n = i.next(); if (n.getForeignId().equals(node.getForeignId())) { i.remove(); break; } } } } /** * <p>deleteNode</p> * * @param foreignId a {@link java.lang.String} object. */ public void deleteNode(final String foreignId) { if (m_nodes != null) { final Iterator<RequisitionNode> i = m_nodes.iterator(); while (i.hasNext()) { final RequisitionNode n = i.next(); if (n.getForeignId().equals(foreignId)) { i.remove(); break; } } } } /* backwards-compat with ModelImport */ /** * <p>getNode</p> * * @return an array of {@link org.opennms.netmgt.provision.persist.requisition.RequisitionNode} objects. */ @XmlTransient public RequisitionNode[] getNode() { return getNodes().toArray(new RequisitionNode[] {}); } /** * <p>getNodes</p> * * @return a {@link java.util.List} object. */ public List<RequisitionNode> getNodes() { return m_nodes; } /** * <p>setNodes</p> * * @param nodes a {@link java.util.List} object. */ public void setNodes(final List<RequisitionNode> nodes) { m_nodes = nodes; updateNodeCache(); } /** * <p>insertNode</p> * * @param node a {@link org.opennms.netmgt.provision.persist.requisition.RequisitionNode} object. */ public void insertNode(final RequisitionNode node) { updateNodeCacheIfNecessary(); if (m_nodeReqs.containsKey(node.getForeignId())) { final RequisitionNode n = m_nodeReqs.get(node.getForeignId()).getNode(); m_nodes.remove(n); } m_nodes.add(0, node); m_nodeReqs.put(node.getForeignId(), new OnmsNodeRequisition(getForeignSource(), node)); } /** * <p>putNode</p> * * @param node a {@link org.opennms.netmgt.provision.persist.requisition.RequisitionNode} object. */ public void putNode(final RequisitionNode node) { updateNodeCacheIfNecessary(); if (m_nodeReqs.containsKey(node.getForeignId())) { final RequisitionNode n = m_nodeReqs.get(node.getForeignId()).getNode(); m_nodes.remove(n); } m_nodes.add(node); m_nodeReqs.put(node.getForeignId(), new OnmsNodeRequisition(getForeignSource(), node)); } /** * <p>getDateStamp</p> * * @return a {@link javax.xml.datatype.XMLGregorianCalendar} object. */ public XMLGregorianCalendar getDateStamp() { return m_dateStamp; } /** * <p>setDateStamp</p> * * @param value a {@link javax.xml.datatype.XMLGregorianCalendar} object. */ public void setDateStamp(final XMLGregorianCalendar value) { m_dateStamp = value; } /** * <p>updateDateStamp</p> */ public void updateDateStamp() { try { m_dateStamp = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()); } catch (final DatatypeConfigurationException e) { LogUtils.warnf(this, e, "unable to update datestamp"); } } /** * <p>getForeignSource</p> * * @return a {@link java.lang.String} object. */ public String getForeignSource() { if (m_foreignSource == null) { return "imported:"; } else { return m_foreignSource; } } /** * <p>setForeignSource</p> * * @param value a {@link java.lang.String} object. */ public void setForeignSource(final String value) { m_foreignSource = value; } /** * <p>getLastImport</p> * * @return a {@link javax.xml.datatype.XMLGregorianCalendar} object. */ public XMLGregorianCalendar getLastImport() { return m_lastImport; } /** * <p>setLastImport</p> * * @param value a {@link javax.xml.datatype.XMLGregorianCalendar} object. */ public void setLastImport(final XMLGregorianCalendar value) { m_lastImport = value; } /** * Update the last imported stamp to the current date and time */ public void updateLastImported() { try { m_lastImport = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()); } catch (final DatatypeConfigurationException e) { LogUtils.warnf(this, e, "unable to update last import datestamp"); } } // Exists only to be compatible with old (1.6!) imports XSD @XmlAttribute(name="non-ip-interfaces") public boolean getNonIpInterfaces() { return false; } public void setNonIpInterfaces(final boolean nii) { LogUtils.warnf(this, "The non-ip-interfaces field was deprecated in 1.6, and removed in 1.8. Ignored."); } // Exists only to be compatible with old (1.6!) imports XSD @XmlAttribute(name="non-ip-snmp-primary") public String getNonIpSnmpPrimary() { return "N"; } public void setNonIpSnmpPrimary(final String nisp) { LogUtils.warnf(this, "The non-ip-snmp-primary field was deprecated in 1.6, and removed in 1.8. Ignored."); } /* Start non-JAXB methods */ /** * <p>Constructor for Requisition.</p> */ public Requisition() { updateNodeCache(); updateDateStamp(); } /** * <p>Constructor for Requisition.</p> * * @param foreignSource a {@link java.lang.String} object. */ public Requisition(final String foreignSource) { this(); m_foreignSource = foreignSource; } private void updateNodeCache() { m_nodeReqs.clear(); if (m_nodes != null) { for (final RequisitionNode n : m_nodes) { m_nodeReqs.put(n.getForeignId(), new OnmsNodeRequisition(getForeignSource(), n)); } } } private void updateNodeCacheIfNecessary() { if (m_nodes != null && m_nodeReqs.size() != m_nodes.size()) { updateNodeCache(); } } /** * <p>visit</p> * * @param visitor a {@link org.opennms.netmgt.provision.persist.RequisitionVisitor} object. */ public void visit(final RequisitionVisitor visitor) { updateNodeCacheIfNecessary(); if (visitor == null) { LogUtils.warnf(this, "no visitor specified!"); return; } visitor.visitModelImport(this); for (final OnmsNodeRequisition nodeReq : m_nodeReqs.values()) { nodeReq.visit(visitor); } visitor.completeModelImport(this); } /** * <p>getNodeRequistion</p> * * @param foreignId a {@link java.lang.String} object. * @return a {@link org.opennms.netmgt.provision.persist.OnmsNodeRequisition} object. */ public OnmsNodeRequisition getNodeRequistion(final String foreignId) { updateNodeCacheIfNecessary(); return m_nodeReqs.get(foreignId); } /** * <p>getNodeCount</p> * * @return a int. */ @XmlTransient public int getNodeCount() { return (m_nodes == null) ? 0 : m_nodes.size(); } /** {@inheritDoc} */ @Override public String toString() { return new ToStringBuilder(this) .append("foreign-source", getForeignSource()) .append("date-stamp", getDateStamp()) .append("last-import", getLastImport()) .append("nodes", getNodes()) .toString(); } /** * <p>compareTo</p> * * @param obj a {@link org.opennms.netmgt.provision.persist.requisition.Requisition} object. * @return a int. */ @Override public int compareTo(final Requisition obj) { return getForeignSource().compareTo(obj.getForeignSource()); } /** {@inheritDoc} */ @Override public boolean equals(Object obj) { if (obj instanceof Requisition) { final Requisition other = (Requisition) obj; return getForeignSource().equals(other.getForeignSource()); } return false; } /** {@inheritDoc} */ @Override public int hashCode() { return getForeignSource().hashCode(); } /** * Make sure that no data in the requisition is inconsistent. Nodes should be unique, * interfaces should be unique per node, etc. */ public void validate() throws ValidationException { final Map<String,Integer> foreignSourceCounts = new HashMap<String,Integer>(); final Set<String> errors = new HashSet<String>(); for (final RequisitionNode node : m_nodes) { final String foreignId = node.getForeignId(); Integer count = foreignSourceCounts.get(foreignId); foreignSourceCounts.put(foreignId, count == null? 1 : ++count); } for (final String foreignId : foreignSourceCounts.keySet()) { final Integer count = foreignSourceCounts.get(foreignId); if (count > 1) { errors.add( foreignId + " (" + count + " found)"); } } if (errors.size() > 0) { final StringBuilder sb = new StringBuilder(); sb.append("Duplicate nodes found on foreign source ").append(getForeignSource()).append(": "); final Iterator<String> it = errors.iterator(); while (it.hasNext()) { final String error = it.next(); sb.append(error); if (it.hasNext()) { sb.append(", "); } } throw new ValidationException(sb.toString()); } } }