public static StrictFieldProjectionFilter fromSemicolonDelimitedString(String columnsToKeepGlobs) {
    return new StrictFieldProjectionFilter(parseSemicolonDelimitedString(columnsToKeepGlobs));
  }
@Test
  public void testFromSemicolonDelimitedString() {
    List<String> globs = StrictFieldProjectionFilter.parseSemicolonDelimitedString(";x.y.z;*.a.b.c*;;foo;;;;bar;");
    assertEquals(Arrays.asList("x.y.z", "*.a.b.c*", "foo", "bar"), globs);

    try {
      StrictFieldProjectionFilter.parseSemicolonDelimitedString(";;");
      fail("this should throw");
    } catch (ThriftProjectionException e) {
      assertEquals("Semicolon delimited string ';;' contains 0 glob strings", e.getMessage());
    }
  }