/**
   * 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);
      }
    }
  }
 /**
  * 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);
        }
      }
    }
  }
  private void parseGivenNames(Name name, NameTokenizer tokens) {
    if (tokens.mStartPointer == tokens.mEndPointer) {
      return;
    }

    if ((tokens.mEndPointer - tokens.mStartPointer) == 1) {
      name.givenNames = tokens.mTokens[tokens.mStartPointer];
    } else {
      StringBuilder sb = new StringBuilder();
      for (int i = tokens.mStartPointer; i < tokens.mEndPointer; i++) {
        if (i != tokens.mStartPointer) {
          sb.append(' ');
        }
        sb.append(tokens.mTokens[i]);
        if (tokens.hasDot(i)) {
          sb.append('.');
        }
      }
      name.givenNames = sb.toString();
    }
  }
  /**
   * Splits a full name composed according to the Western tradition:
   *
   * <pre>
   *   [prefix] given name(s) [[middle name] family name] [, suffix]
   *   [prefix] family name, given name [middle name] [,suffix]
   * </pre>
   */
  private void splitWesternName(Name name, String fullName) {
    NameTokenizer tokens = new NameTokenizer(fullName);
    parsePrefix(name, tokens);

    // If the name consists of just one or two tokens, treat them as first/last name,
    // not as suffix.  Example: John Ma; Ma is last name, not "M.A.".
    if (tokens.mEndPointer > 2) {
      parseSuffix(name, tokens);
    }

    if (name.prefix == null && tokens.mEndPointer - tokens.mStartPointer == 1) {
      name.givenNames = tokens.mTokens[tokens.mStartPointer];
    } else {
      parseLastName(name, tokens);
      parseMiddleName(name, tokens);
      parseGivenNames(name, tokens);
    }
  }