1 20 21 22 package org.snmp4j.agent.mo; 23 24 import org.snmp4j.smi.*; 25 26 35 public class MOTableIndex implements MOTableIndexValidator { 36 37 public static final int MAX_INDEX_OID_LENGTH = 127; 38 39 private MOTableSubIndex[] subindexes; 40 private boolean impliedLength = false; 41 private MOTableIndexValidator validator; 42 43 44 49 public MOTableIndex(MOTableSubIndex[] subIndexes) { 50 if ((subIndexes == null) || (subIndexes.length < 1)) { 51 throw new IllegalArgumentException ( 52 "Index definition must have at least one sub-index"); 53 } 54 this.subindexes = subIndexes; 55 } 56 57 66 public MOTableIndex(MOTableSubIndex[] subIndexes, boolean impliedLength) { 67 this(subIndexes); 68 this.impliedLength = impliedLength; 69 } 70 71 83 public MOTableIndex(MOTableSubIndex[] subIndexes, boolean impliedLength, 84 MOTableIndexValidator validator) { 85 this(subIndexes, impliedLength); 86 this.validator = validator; 87 } 88 89 96 public MOTableSubIndex getIndex(int index) { 97 return this.subindexes[index]; 98 } 99 100 public boolean isImpliedLength() { 101 return impliedLength; 102 } 103 104 110 public MOTableIndexValidator getValidator() { 111 return validator; 112 } 113 114 119 public void setValidator(MOTableIndexValidator validator) { 120 this.validator = validator; 121 } 122 123 128 public int size() { 129 return subindexes.length; 130 } 131 132 private static boolean checkIndexBytes(OID index, long start, long end) { 133 if ((start < 0) || (start > MOTableIndex.MAX_INDEX_OID_LENGTH) || 134 (end < 0) || (end > MOTableIndex.MAX_INDEX_OID_LENGTH)) { 135 return false; 136 } 137 for (int i=(int)start; ((i<index.size()) && (i<end)); i++) { 138 if (index.getUnsigned(i) > 255) { 139 return false; 140 } 141 } 142 return true; 143 } 144 145 private static boolean isStringSyntax(int smiSyntax) { 146 switch (smiSyntax) { 147 case SMIConstants.SYNTAX_OCTET_STRING: 148 case SMIConstants.SYNTAX_IPADDRESS: 149 case SMIConstants.SYNTAX_OPAQUE: { 150 return true; 151 } 152 } 153 return false; 154 } 155 156 164 public boolean isValidIndex(OID index) { 165 if (index.size() > MOTableIndex.MAX_INDEX_OID_LENGTH) { 166 return false; 167 } 168 int l = 0; 169 int i; 170 for (i=0; ((i<size()) && (l < index.size())); i++) { 171 MOTableSubIndex subIndex = getIndex(i); 172 if ((i+1 == size()) && (isImpliedLength())) { 173 int type = subIndex.getSmiSyntax(); 174 switch (type) { 175 case SMIConstants.SYNTAX_OCTET_STRING: 176 case SMIConstants.SYNTAX_IPADDRESS: 177 if (!checkIndexBytes(index, l, index.size())) { 178 return false; 179 } 180 break; 181 } 182 return true; 183 } 184 else if ((subIndex.getMinLength() != subIndex.getMaxLength())) { 185 if (index.size() < index.get(l)+1) { 186 return false; 187 } 188 if ((index.get(l) < subIndex.getMinLength()) || 189 (index.get(l) > subIndex.getMaxLength())) { 190 return false; 191 } 192 if (isStringSyntax(subIndex.getSmiSyntax())) { 193 if (!checkIndexBytes(index, l, l+index.getUnsigned(l)+1)) { 194 return false; 195 } 196 } 197 l += index.getUnsigned(l)+1; 198 } 199 else { 200 if (isStringSyntax(subIndex.getSmiSyntax())) { 201 if (!checkIndexBytes(index, l, l+subIndex.getMaxLength())) { 202 return false; 203 } 204 } 205 l += subIndex.getMaxLength(); 207 } 208 } 209 return (((index.size() == l) && (i >= size())) && 210 ((validator == null) || (validator.isValidIndex(index)))); 211 } 212 213 private static Variable getIndexVariable(MOTableSubIndex subIndexDef, 214 OID subIndex, 215 boolean impliedLength) { 216 switch (subIndexDef.getSmiSyntax()) { 217 case SMIConstants.SYNTAX_OCTET_STRING: { 218 if ((impliedLength) || 219 (subIndexDef.getMinLength() == subIndexDef.getMaxLength())) { 220 OctetString s = new OctetString(subIndex.toByteArray()); 221 return s; 222 } 223 OID suffix = new OID(subIndex.getValue(), 1, subIndex.size() - 1); 224 return new OctetString(suffix.toByteArray()); 225 } 226 case SMIConstants.SYNTAX_OBJECT_IDENTIFIER: { 227 if ((impliedLength) || 228 (subIndexDef.getMinLength() == subIndexDef.getMaxLength())) { 229 return subIndex; 230 } 231 OID suffix = new OID(subIndex.getValue(), 1, subIndex.size() - 1); 232 return suffix; 233 } 234 case SMIConstants.SYNTAX_UNSIGNED_INTEGER32: { 235 return new Gauge32(subIndex.get(subIndex.size()-1)); 236 } 237 case SMIConstants.SYNTAX_TIMETICKS: { 238 return new TimeTicks(subIndex.get(subIndex.size()-1)); 239 } 240 case SMIConstants.SYNTAX_INTEGER: { 241 return new Integer32(subIndex.get(subIndex.size()-1)); 242 } 243 case SMIConstants.SYNTAX_IPADDRESS: { 244 return new IpAddress(subIndex.toString()); 245 } 246 252 } 253 return null; 254 } 255 256 269 public OID[] getIndexOIDs(OID index) { 270 OID[] r = new OID[size()]; 271 int[] ind = index.getValue(); 272 int pos = 0; 273 for (int i = 0; i < subindexes.length; i++) { 274 if ((i+1 == size()) && (isImpliedLength())) { 275 r[i] = new OID(ind, pos, index.size()-pos); 276 break; 277 } 278 else if ((subindexes[i].getMinLength() != subindexes[i].getMaxLength())) { 279 r[i] = new OID(ind, pos, index.get(pos) + 1); 280 } 281 else { 282 r[i] = new OID(index.getValue(), pos, subindexes[i].getMaxLength()); 283 } 284 pos += r[i].size(); 285 } 286 return r; 287 } 288 289 297 public Variable[] getIndexValues(OID index) { 298 OID[] oids = getIndexOIDs(index); 299 Variable[] values = new Variable[oids.length]; 300 for (int i=0; i<oids.length; i++) { 301 boolean implied = ((isImpliedLength()) && (i+1 == size())); 302 values[i] = getIndexVariable(subindexes[i], oids[i], implied); 303 } 304 return values; 305 } 306 307 316 public OID getIndexOID(Variable[] indexValues) { 317 if (indexValues.length != size()) { 318 throw new IllegalArgumentException ("Index value length != size()"); 319 } 320 OID index = new OID(); 321 for (int i=0; i<indexValues.length; i++) { 322 if (indexValues[i].getSyntax() == this.subindexes[i].getSmiSyntax()) { 323 index.append(indexValues[i].toSubIndex((i + 1 == indexValues.length) && 324 impliedLength)); 325 } 326 else { 327 throw new IllegalArgumentException ("Syntax of index value #"+i+ 328 " = "+ 329 indexValues[i].getSyntaxString()+ 330 " does not match index definition "+ 331 AbstractVariable.getSyntaxString( 332 this.subindexes[i].getSmiSyntax())); 333 } 334 } 335 return index; 336 } 337 } 338 | Popular Tags |