public static int getLength(ByteArray bytes, int index, int headerWord) {
    // FIXME: WE NEED TO SUPPORT CONSTRAINTS HERE TOO, so need to look at headerWord, and return
    // diff
    // size if it's a constraint (or even same size) e.g. for Boolean.
    boolean isConstraint = CompactAttrCodec.getAttrFunction(headerWord) == AttrFunction.constraint;
    switch (AttrDefinitionMgr.getAttrType(headerWord)) {
      case booleanValue:
        return isConstraint ? BooleanConstraintCodec.BOOLEAN_SIZE : BooleanCodec.BOOLEAN_SIZE;
      case enumExclusiveValue:
        return isConstraint ? bytes.getByte(index + LENGTH_OFFSET) : EnumCodec.EXCLUSIVE_ENUM_SIZE;
      case floatValue:
        return isConstraint ? bytes.getByte(index + LENGTH_OFFSET) : FloatCodec.FLOAT_SIZE;

      case floatRangePrefValue: // could have fixed size
        // FALLTHRU
      case enumMultiValue: // could have fixed size
        // FALLTHRU
      default: // all remainder have variable size
        int length = bytes.getByte(index + LENGTH_OFFSET);
        return length;
    }
  }
 /**
  * Find the location of a given attribute within the given ByteArray.
  *
  * @return -1 if not found, index of start of attribute if found
  */
 public static int findAttrInBuf(ByteArray bytes, int attrId) {
   int i = 0;
   while (i < bytes.size()) {
     int headerWord = getHeaderWord(bytes, i);
     int length = getLength(bytes, i, headerWord);
     if (length
         == 0) { // shouldn't be needed, but was in past.  Would be good to remove this. FIXME For
       // now, just log
       LogFactory.getLogger(CompactAttrCodec.class).error("Got zero length. Wasn't expecting it");
       break;
     }
     int bufAttrId = getAttrId(headerWord);
     if (attrId == bufAttrId) {
       return i;
     }
     i += length;
   }
   return NOT_FOUND; // not found
 }
 public static void setAttrId(ByteArray bytes, int index, int attrId) {
   assert (attrId < 65536);
   bytes.putShort(index + ATTR_ID_OFFSET, (short) (attrId | FN_ATTRIBUTE));
 }
 public static int getHeaderWord(ByteArray bytes, int index) {
   int header = bytes.getShort(index + ATTR_ID_OFFSET);
   return header;
 }