/**
  * Returns a list of project names referenced in the team project set <code>input</code> for the
  * provider <code>prooviderType</code>.
  *
  * @throws CoreException
  */
 public static List<String> readProjectReferences(
     InputStream input, RepositoryProviderType providerType) throws CoreException {
   try {
     List<String> referenceStrings = new ArrayList<String>();
     XmlMemento[] providers = importProjectSet(input);
     for (XmlMemento provider : providers) {
       if (provider.getString("id").equals(providerType.getID())) { // $NON-NLS-1$
         XmlMemento[] projects = provider.getChildren("project"); // $NON-NLS-1$
         for (XmlMemento project : projects) {
           referenceStrings.add(project.getString("reference")); // $NON-NLS-1$
         }
       }
     }
     return referenceStrings;
   } catch (Exception e) {
     throw new CoreException(
         new Status(
             IStatus.ERROR,
             ScmInternal.ID_PLUGIN,
             "Unexpected error reading project sets.",
             e)); //$NON-NLS-1$
   }
 }
  /**
   * 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
        }
      }
    }
  }