public WritableByteArrayComparable build() {
   WritableByteArrayComparable comparator;
   switch (ComparatorType.valueOf(type)) {
     case BinaryComparator:
       comparator = new BinaryComparator(Base64.decode(value));
       break;
     case BinaryPrefixComparator:
       comparator = new BinaryPrefixComparator(Base64.decode(value));
       break;
     case BitComparator:
       comparator =
           new BitComparator(Base64.decode(value), BitComparator.BitwiseOp.valueOf(op));
       break;
     case NullComparator:
       comparator = new NullComparator();
       break;
     case RegexStringComparator:
       comparator = new RegexStringComparator(value);
       break;
     case SubstringComparator:
       comparator = new SubstringComparator(value);
       break;
     default:
       throw new RuntimeException("unhandled comparator type: " + type);
   }
   return comparator;
 }
 public WritableByteArrayComparableModel(WritableByteArrayComparable comparator) {
   String typeName = comparator.getClass().getSimpleName();
   ComparatorType type = ComparatorType.valueOf(typeName);
   this.type = typeName;
   switch (type) {
     case BinaryComparator:
     case BinaryPrefixComparator:
       this.value = Base64.encodeBytes(comparator.getValue());
       break;
     case BitComparator:
       this.value = Base64.encodeBytes(comparator.getValue());
       this.op = ((BitComparator) comparator).getOperator().toString();
       break;
     case NullComparator:
       break;
     case RegexStringComparator:
     case SubstringComparator:
       this.value = Bytes.toString(comparator.getValue());
       break;
     default:
       throw new RuntimeException("unhandled filter type: " + type);
   }
 }