@Override
  public OrganizationalChart getOrganizationChart(String baseOu, OrganizationalChartType type) {

    List<OrganizationalPerson> ouMembers = null;
    List<OrganizationalUnit> units = null;

    // beginning node of the search
    String rootOu = (StringUtil.isDefined(baseOu)) ? baseOu : config.getRoot();

    // Parent definition = top of the chart
    String[] ous = rootOu.split(",");
    String[] firstOu = ous[0].split("=");
    OrganizationalUnit root = new OrganizationalUnit(firstOu[1], rootOu);
    if (StringUtil.isDefined(baseOu)) {
      root.setParentName("Racine");
      root.setParentOu(config.getRoot());
    }

    // get members
    ouMembers = getOUMembers(rootOu, type);
    root.setHasMembers(!ouMembers.isEmpty());

    // get sub organization units
    if (type == OrganizationalChartType.TYPE_UNITCHART) {
      units = getSubOrganizationUnits(rootOu);
    }

    boolean silverpeasUserLinkable = StringUtil.isDefined(config.getDomainId());

    OrganizationalChart chart = null;
    switch (type) {
      case TYPE_UNITCHART:
        chart = new OrganizationalChart(root, units, ouMembers, silverpeasUserLinkable);
        break;

      default:
        Set<PersonCategory> categories = getCategories(ouMembers);
        chart = new OrganizationalChart(root, ouMembers, categories, silverpeasUserLinkable);
        break;
    }

    return chart;
  }