/**
   * Splits a full name composed according to the Korean tradition:
   *
   * <pre>
   *   [family name] given name(s)
   * </pre>
   */
  private void splitKoreanName(Name name, String fullName) {
    StringTokenizer tokenizer = new StringTokenizer(fullName);
    if (tokenizer.countTokens() > 1) {
      // Each name can be identified by separators.
      while (tokenizer.hasMoreTokens()) {
        String token = tokenizer.nextToken();
        if (name.givenNames == null) {
          name.givenNames = token;
        } else if (name.familyName == null) {
          name.familyName = name.givenNames;
          name.givenNames = token;
        } else {
          name.givenNames += " " + token;
        }
      }
    } else {
      // There is no separator. Try to guess family name.
      // The length of most family names is 1.
      int familyNameLength = 1;

      // Compare with 2-length family names.
      for (String twoLengthFamilyName : KOREAN_TWO_CHARCTER_FAMILY_NAMES) {
        if (fullName.startsWith(twoLengthFamilyName)) {
          familyNameLength = 2;
          break;
        }
      }

      name.familyName = fullName.substring(0, familyNameLength);
      if (fullName.length() > familyNameLength) {
        name.givenNames = fullName.substring(familyNameLength);
      }
    }
  }
  private void parseLastName(Name name, NameTokenizer tokens) {
    if (tokens.mStartPointer == tokens.mEndPointer) {
      return;
    }

    // If the first word is followed by a comma, assume that it's the family name
    if (tokens.hasComma(tokens.mStartPointer)) {
      name.familyName = tokens.mTokens[tokens.mStartPointer];
      tokens.mStartPointer++;
      return;
    }

    // If the second word is followed by a comma and the first word
    // is a last name prefix as in "de Sade" and "von Cliburn", treat
    // the first two words as the family name.
    if (tokens.mStartPointer + 1 < tokens.mEndPointer
        && tokens.hasComma(tokens.mStartPointer + 1)
        && isFamilyNamePrefix(tokens.mTokens[tokens.mStartPointer])) {
      String familyNamePrefix = tokens.mTokens[tokens.mStartPointer];
      if (tokens.hasDot(tokens.mStartPointer)) {
        familyNamePrefix += '.';
      }
      name.familyName = familyNamePrefix + " " + tokens.mTokens[tokens.mStartPointer + 1];
      tokens.mStartPointer += 2;
      return;
    }

    // Finally, assume that the last word is the last name
    name.familyName = tokens.mTokens[tokens.mEndPointer - 1];
    tokens.mEndPointer--;

    // Take care of last names like "de Sade" and "von Cliburn"
    if ((tokens.mEndPointer - tokens.mStartPointer) > 0) {
      String lastNamePrefix = tokens.mTokens[tokens.mEndPointer - 1];
      if (isFamilyNamePrefix(lastNamePrefix)) {
        if (tokens.hasDot(tokens.mEndPointer - 1)) {
          lastNamePrefix += '.';
        }
        name.familyName = lastNamePrefix + " " + name.familyName;
        tokens.mEndPointer--;
      }
    }
  }
 /**
  * Splits a full name composed according to the Japanese tradition:
  *
  * <pre>
  *   [family name] given name(s)
  * </pre>
  */
 private void splitJapaneseName(Name name, String fullName) {
   StringTokenizer tokenizer = new StringTokenizer(fullName);
   while (tokenizer.hasMoreTokens()) {
     String token = tokenizer.nextToken();
     if (name.givenNames == null) {
       name.givenNames = token;
     } else if (name.familyName == null) {
       name.familyName = name.givenNames;
       name.givenNames = token;
     } else {
       name.givenNames += " " + token;
     }
   }
 }
  private void splitChineseName(Name name, String fullName) {
    StringTokenizer tokenizer = new StringTokenizer(fullName);
    while (tokenizer.hasMoreTokens()) {
      String token = tokenizer.nextToken();
      if (name.givenNames == null) {
        name.givenNames = token;
      } else if (name.familyName == null) {
        name.familyName = name.givenNames;
        name.givenNames = token;
      } else if (name.middleName == null) {
        name.middleName = name.givenNames;
        name.givenNames = token;
      } else {
        name.middleName = name.middleName + name.givenNames;
        name.givenNames = token;
      }
    }

    // If a single word parse that word up.
    if (name.givenNames != null && name.familyName == null && name.middleName == null) {
      int length = fullName.length();
      if (hasDoubleLastName(fullName).equals("")) {
        if (length == 2) {
          name.familyName = fullName.substring(0, 1);
          name.givenNames = fullName.substring(1);
        } else if (length == 3) {
          name.familyName = fullName.substring(0, 1);
          name.middleName = fullName.substring(1, 2);
          name.givenNames = fullName.substring(2, length);
        } else if (length >= 4) {
          name.familyName = fullName.substring(0, 2);
          name.middleName = fullName.substring(2, 3);
          name.givenNames = fullName.substring(3, length);
        }
      } else {
        if (length == 2) {
          name.givenNames = fullName;
        } else if (length == 3) {
          name.familyName = fullName.substring(0, 2);
          name.givenNames = fullName.substring(2, 3);
        } else if (length >= 4) {
          name.familyName = fullName.substring(0, 2);
          name.middleName = fullName.substring(2, 3);
          name.givenNames = fullName.substring(3, length);
        }
      }
    }
  }