@Override
    protected IStatus run(IProgressMonitor monitor) {
      // roots
      String[] rootIds = Client.getRootsArray();

      Root[] roots = new Root[rootIds.length];
      for (int i = 0; i < roots.length; i++) {
        roots[i] = new Root(rootIds[i], FETCHING_SUBS);
      }

      new FetchJob2(roots).schedule();

      rootsCache = roots;

      refresh();

      return Status.OK_STATUS;
    }
    @Override
    protected IStatus run(IProgressMonitor monitor) {

      for (Sub sub : subs) {
        String[] leafIds = Client.getLeavesArray(sub.id());

        Leaf[] leaves = new Leaf[leafIds.length];
        for (int i = 0; i < leafIds.length; i++) {
          leaves[i] = new Leaf(leafIds[i]);
        }
        sub.leaves(leaves);
      }

      synchronized (refreshList) {
        fetched = true;
      }

      refresh();

      return Status.OK_STATUS;
    }
    @Override
    protected IStatus run(IProgressMonitor monitor) {
      // subs
      ArrayList<Sub> allSubs = new ArrayList<Sub>();

      for (Root root : roots) {
        String[] subIds = Client.getSubsArray(root.id());

        Sub[] subs = new Sub[subIds.length];
        for (int i = 0; i < subIds.length; i++) {
          Sub sub = new Sub(subIds[i], FETCHING_LEAVES);
          subs[i] = sub;
          allSubs.add(sub);
        }

        root.subs(subs);
      }

      new FetchJob3(allSubs).schedule();

      refresh();

      return Status.OK_STATUS;
    }