/**
   * Returns a team project set for <code>projects</code>.
   *
   * @param projects the projects to include
   * @return an XML document
   * @throws CoreException indicates that the team project set could not be created
   */
  public static ByteArrayOutputStream exportProjectSet(List<IProject> projects)
      throws CoreException {
    Map<String, Set<IProject>> map = new HashMap<String, Set<IProject>>();
    for (IProject project : projects) {
      RepositoryProvider provider = RepositoryProvider.getProvider(project);
      if (provider != null) {
        String id = provider.getID();
        Set<IProject> list = map.get(id);
        if (list == null) {
          list =
              new TreeSet<IProject>(
                  new Comparator<IProject>() {
                    public int compare(IProject o1, IProject o2) {
                      return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
                    }
                  });
          map.put(id, list);
        }
        list.add(project);
      }
    }

    BufferedWriter writer = null;
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    try {
      writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8")); // $NON-NLS-1$

      XmlMemento xmlMemento = getXMLMementoRoot();
      Iterator<String> it = map.keySet().iterator();
      while (it.hasNext()) {
        String id = it.next();
        XmlMemento memento = xmlMemento.createChild("provider"); // $NON-NLS-1$
        memento.putString("id", id); // $NON-NLS-1$
        Set<IProject> list = map.get(id);
        IProject[] projectArray = list.toArray(new IProject[list.size()]);
        RepositoryProviderType providerType = RepositoryProviderType.getProviderType(id);
        ProjectSetCapability serializer = providerType.getProjectSetCapability();
        ProjectSetCapability.ensureBackwardsCompatible(providerType, serializer);
        if (serializer != null) {
          String[] references = serializer.asReference(projectArray, null, null);
          for (String reference : references) {
            XmlMemento proj = memento.createChild("project"); // $NON-NLS-1$
            proj.putString("reference", reference); // $NON-NLS-1$
          }
        }
      }

      xmlMemento.save(writer);
      return output;
    } catch (Exception e) {
      throw new CoreException(
          new Status(
              IStatus.ERROR,
              ScmInternal.ID_PLUGIN,
              "Unexpected error exporting project sets.",
              e)); //$NON-NLS-1$
    } finally {
      if (writer != null) {
        try {
          writer.close();
        } catch (IOException e) {
          // ignore
        }
      }
    }
  }