private FTPClient createClient() throws FileSystemException {
    final GenericFileName rootName = getRoot();

    UserAuthenticationData authData = null;
    try {
      authData =
          UserAuthenticatorUtils.authenticate(
              fileSystemOptions, FtpFileProvider.AUTHENTICATOR_TYPES);

      return FtpClientFactory.createConnection(
          rootName.getHostName(),
          rootName.getPort(),
          UserAuthenticatorUtils.getData(
              authData,
              UserAuthenticationData.USERNAME,
              UserAuthenticatorUtils.toChar(rootName.getUserName())),
          UserAuthenticatorUtils.getData(
              authData,
              UserAuthenticationData.PASSWORD,
              UserAuthenticatorUtils.toChar(rootName.getPassword())),
          rootName.getPath(),
          getFileSystemOptions());
    } finally {
      UserAuthenticatorUtils.cleanup(authData);
    }
  }
  /** Tests parsing a URI into its parts. */
  public void testParseUri() throws Exception {
    // Simple name
    GenericFileName name = GenericFileName.parseUri("ftp://hostname/file", 21);
    assertEquals("ftp", name.getScheme());
    assertNull(name.getUserName());
    assertNull(name.getPassword());
    assertEquals("hostname", name.getHostName());
    assertEquals(21, name.getPort());
    assertEquals(name.getDefaultPort(), name.getPort());
    assertEquals("/file", name.getPath());
    assertEquals("ftp://hostname/", name.getRootURI());
    assertEquals("ftp://hostname/file", name.getURI());

    // Name with port
    name = GenericFileName.parseUri("ftp://*****:*****@hostname/file", 21);
    assertEquals("ftp", name.getScheme());
    assertEquals("user", name.getUserName());
    assertNull(name.getPassword());
    assertEquals("hostname", name.getHostName());
    assertEquals(21, name.getPort());
    assertEquals("/file", name.getPath());
    assertEquals("ftp://user@hostname/", name.getRootURI());
    assertEquals("ftp://user@hostname/file", name.getURI());

    // Name with username and password
    name = GenericFileName.parseUri("ftp://*****:*****@hostname/file", 21);
    assertEquals("ftp", name.getScheme());
    assertEquals("user", name.getUserName());
    assertEquals("password", name.getPassword());
    assertEquals("hostname", name.getHostName());
    assertEquals(21, name.getPort());
    assertEquals("/file", name.getPath());
    assertEquals("ftp://*****:*****@hostname/", name.getRootURI());
    assertEquals("ftp://*****:*****@hostname/file", name.getURI());

    // Encoded username and password
    name = GenericFileName.parseUri("ftp://%75ser%3A:%40@hostname", 21);
    assertEquals("ftp", name.getScheme());
    assertEquals("user:"******"@", name.getPassword());
    assertEquals("hostname", name.getHostName());
    assertEquals(21, name.getPort());
    assertEquals("/", name.getPath());
    assertEquals("ftp://user%3a:%40@hostname/", name.getRootURI());
    assertEquals("ftp://user%3a:%40@hostname/", name.getURI());
  }