// Get the list of InstallableUnits and all its requirements
  protected List<IServerExtension> getInstallableUnits(
      IMetadataRepository repo, IQuery<IInstallableUnit> query, URI url, IProgressMonitor monitor) {
    List<IServerExtension> list = new ArrayList<IServerExtension>();
    IQueryResult<IInstallableUnit> collector = repo.query(query, monitor);

    for (IInstallableUnit iu : collector.toUnmodifiableSet()) {
      Collection<IRequirement> req = iu.getRequirements();
      if (req != null) {
        for (IRequirement requirement : req) {
          IMatchExpression<IInstallableUnit> matches = requirement.getMatches();
          query = new ExpressionMatchQuery<IInstallableUnit>(IInstallableUnit.class, matches);

          IQueryResult<IInstallableUnit> collector2 = repo.query(query, monitor);
          Iterator<IInstallableUnit> iter2 = collector2.iterator();
          while (iter2.hasNext()) {
            IInstallableUnit iu2 = iter2.next();
            if (!list.contains(iu2)) {
              Extension ext = new Extension(iu2, url);
              list.add(ext);
            }
          }
        }
      }
    }
    return list;
  }