1 /*
   2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 
  27 package com.sun.jmx.snmp.agent;
  28 
  29 
  30 
  31 // java imports
  32 //
  33 import java.io.Serializable;
  34 import java.util.Vector;
  35 import java.util.Enumeration;
  36 
  37 // jmx imports
  38 //
  39 import com.sun.jmx.snmp.SnmpOid;
  40 
  41 /**
  42  * Represents a SNMP index.
  43  * An <CODE>SnmpIndex</CODE> is represented as a <CODE>Vector</CODE> of <CODE>SnmpOid</CODE>.
  44  * <P>
  45  * This class is used internally and by the classes generated by <CODE>mibgen</CODE>.
  46  * You should not need to use this class directly.
  47  *
  48  * <p><b>This API is a Sun Microsystems internal API  and is subject
  49  * to change without notice.</b></p>
  50  */
  51 
  52 public class SnmpIndex implements Serializable {
  53     private static final long serialVersionUID = 8712159739982192146L;
  54 
  55     /**
  56      * Initializes an <CODE>SnmpIndex</CODE> using a vector of object identifiers.
  57      * <P>Following the RFC recommendations, every syntax that is used as a
  58      * table index should have an object identifier representation. There are
  59      * some guidelines on how to map the different syntaxes into an object identifier.
  60      * In the different <CODE>SnmpValue</CODE> classes provided, there is a <CODE>toOid</CODE> method to get
  61      * the object identifier of the value.
  62      *
  63      * @param oidList The list of Object Identifiers.
  64      */
  65     public SnmpIndex(SnmpOid[] oidList) {
  66         size= oidList.length;
  67         for(int i= 0; i <size; i++) {
  68             // The order is important ...
  69             //
  70             oids.addElement(oidList[i]);
  71         }
  72     }
  73 
  74     /**
  75      * Initializes an <CODE>SnmpIndex</CODE> using the specified Object Identifier.
  76      *
  77      * @param oid The Object Identifier.
  78      */
  79     public SnmpIndex(SnmpOid oid) {
  80         oids.addElement(oid);
  81         size= 1;
  82     }
  83 
  84     /**
  85      * Gets the number of Object Identifiers the index is made of.
  86      *
  87      * @return The number of Object Identifiers.
  88      */
  89     public int getNbComponents() {
  90         return size;
  91     }
  92 
  93     /**
  94      * Gets the index as a vector of Object Identifiers.
  95      *
  96      * @return The index as a vector.
  97      */
  98     public Vector<SnmpOid> getComponents() {
  99         return oids;
 100     }
 101 
 102     /**
 103      * Compares two indexes for equality.
 104      *
 105      * @param index The index to compare <CODE>this</CODE> with.
 106      *
 107      * @return <CODE>true</CODE> if the two indexes are equal, <CODE>false</CODE> otherwise.
 108      */
 109     public boolean equals(SnmpIndex index) {
 110 
 111         if (size != index.getNbComponents())
 112             return false;
 113 
 114         // The two vectors have the same length.
 115         // Compare each single element ...
 116         //
 117         SnmpOid oid1;
 118         SnmpOid oid2;
 119         Vector<SnmpOid> components= index.getComponents();
 120         for(int i=0; i <size; i++) {
 121             oid1= oids.elementAt(i);
 122             oid2= components.elementAt(i);
 123             if (oid1.equals(oid2) == false)
 124                 return false;
 125         }
 126         return true;
 127     }
 128 
 129     /**
 130      * Compares two indexes.
 131      *
 132      * @param index The index to compare <CODE>this</CODE> with.
 133      *
 134      * @return The value 0 if the two OID vectors have the same elements, another value otherwise.
 135      */
 136     public int compareTo(SnmpIndex index) {
 137 
 138         int length= index.getNbComponents();
 139         Vector<SnmpOid> components= index.getComponents();
 140         SnmpOid oid1;
 141         SnmpOid oid2;
 142         int comp;
 143         for(int i=0; i < size; i++) {
 144             if ( i > length) {
 145                 // There is no more element in the index
 146                 //
 147                 return 1;
 148             }
 149             // Access the element ...
 150             //
 151             oid1= oids.elementAt(i);
 152             oid2= components.elementAt(i);
 153             comp= oid1.compareTo(oid2);
 154             if (comp == 0)
 155                 continue;
 156             return comp;
 157         }
 158         return 0;
 159     }
 160 
 161     /**
 162      * Returns a <CODE>String</CODE> representation of the index.
 163      * The different elements are separated by "//".
 164      *
 165      * @return A string representation of the index.
 166      */
 167     @Override
 168     public String toString() {
 169         final StringBuilder msg= new StringBuilder();
 170         for(Enumeration<SnmpOid> e= oids.elements(); e.hasMoreElements(); ) {
 171             SnmpOid val= e.nextElement();
 172             msg.append("//").append( val.toString());
 173         }
 174         return msg.toString();
 175     }
 176 
 177     // PRIVATE VARIABLES
 178     //------------------
 179 
 180     /**
 181      * The list of OIDs.
 182      * @serial
 183      */
 184     private Vector<SnmpOid> oids = new Vector<>();
 185 
 186     /**
 187      * The number of elements in the index.
 188      * @serial
 189      */
 190     private int size = 0;
 191 }