code: private void createTasks(ChildTaskContainer parent, String parentName, List<Row> rows)
     {
        for (Row row : rows)
        {
           boolean rowIsBar = (row.getInteger("BARID") != null);
  
           //
           // Don't export hammock tasks.
           //
           if (rowIsBar && row.getChildRows().isEmpty())
           {
              continue;
           }
  
           Task task = parent.addTask();
  
           //
           // Do we have a bar, task, or milestone?
           //
           if (rowIsBar)
           {
              //
              // If the bar only has one child task, we skip it and add the task directly
              //
              if (skipBar(row))
              {
                 populateLeaf(row.getString("NAMH"), row.getChildRows().get(0), task);
              }
              else
              {
                 populateBar(row, task);
                 createTasks(task, task.getName(), row.getChildRows());
              }
           }
           else
           {
              populateLeaf(parentName, row, task);
           }
  
           m_eventManager.fireTaskReadEvent(task);
        }
     }
docs: Recursively descend through  the hierarchy creating tasks.
  
  @param parent parent task
  @param parentName parent name
  @param rows rows to add as tasks to this parent