private void closeSolution(String slnId) {

    if (slnId == null) {
      return;
    }

    Map<String, IProject> projectMap = getProjectMap();

    SolutionEntry solutionEntry = session.getSolutions().get(session.getCurrentSolution());
    LinkedHashSet<String> openProjects = new LinkedHashSet<String>();
    Set<String> projectNames = solutionEntry.getProjectNames();
    for (String pName : projectNames) {
      if (projectMap.get(pName).isOpen()) {
        openProjects.add(pName);
      }
    }
    solutionEntry.setOpenProjects(openProjects.toArray(new String[0]));

    for (String pName : openProjects) {
      IProject p = projectMap.get(pName);
      try {
        p.close(null);
      } catch (CoreException e) {
        e.printStackTrace();
      }
    }
  }
  @Override
  public void switchToSolution(String id) {

    IWorkbenchPage activePage = getWorkbench().getActiveWorkbenchWindow().getActivePage();

    // store the state of the current solution
    closeSolution(session.getCurrentSolution());

    IWorkingSetManager wsManager = getWorkbench().getWorkingSetManager();
    Map<String, IWorkingSet> workingSetMap = getWorkingSetMap();

    IAggregateWorkingSet solutionSet = (IAggregateWorkingSet) workingSetMap.get(id);
    Assert.isNotNull(solutionSet, "Solution set is null: " + id);

    //		IWorkingSet[] windowSet = new IWorkingSet[]{solutionSet};
    IWorkingSet[] windowSet = solutionSet.getComponents();
    // HACK: currently the ProcjectExplorer>WorkingSetDialog does
    //	strange things with working sets, i.e., caches aggregate sets that can
    //	get invalid as these are not updated, properly
    //  workaround: delete these aggregate sets when you can :)
    String eclispeAggId = getAggregateIdForSets(windowSet);
    if (workingSetMap.containsKey(eclispeAggId)) {
      wsManager.removeWorkingSet(workingSetMap.get(eclispeAggId));
    }

    activePage.setWorkingSets(windowSet);

    openSolution(id);
    session.setCurrentSolution(id);
  }
  @Override
  public void registerSolution(String path, boolean openProjects) throws IOException {

    Solution sln = readSolutionFile(path);

    SolutionEntry entry = new SolutionEntry(sln);
    session.getSolutions().put(entry.getId(), entry);
    reloadSolution(entry.getId(), openProjects);
  }
  public List<WorkbenchCommand> createSolutionCommands(String id, boolean openProjects)
      throws IOException {

    SolutionEntry solutionEntry = session.getSolutions().get(id);
    SolutionEntry sln = new SolutionEntry(readSolutionFile(solutionEntry.getFile()));

    // load projects if necessary
    List<WorkbenchCommand> commands = new LinkedList<WorkbenchCommand>();

    // update tracking information
    commands.add(new WorkbenchCommandImpl.UpdateTrackingInformation(id));

    /*
     *  - find out which projects are not yet imported and create ImportCommands
     *  - compare old set of project ids for the case that some projects have been removed from
     */
    Project[] projectSpecs = sln.getProjects();
    Map<String, IProject> projectMap = getProjectMap();
    Map<String, IWorkingSet> workingSetMap = getWorkingSetMap();

    // import/open new projects
    for (Project project : projectSpecs) {
      commands.add(
          new WorkbenchCommandImpl.ImportProject(
              project.getName(), project.getProjectFile(), openProjects));
    }

    // create working sets
    Set<String> createdWorkingSets = new HashSet<String>();
    Map<String, Set<String>> workingSetTable = getWorkingSetTable();
    List<WorkbenchCommand> addProjectsToWS = new LinkedList<WorkbenchCommand>();

    for (Project p : projectSpecs) {
      String wsId = p.getWorkingSet();
      if (!createdWorkingSets.contains(wsId)) {
        commands.add(new WorkbenchCommandImpl.CreateWorkingSet(wsId));
        // track which working set has been created already
        createdWorkingSets.add(wsId);
      }
      addProjectsToWS.add(new WorkbenchCommandImpl.AddProjectToWorkingSet(p.getName(), wsId));
    }

    // add projects to working sets
    commands.addAll(addProjectsToWS);

    // create/update solution working set
    if (workingSetMap.containsKey(sln.getId())) {
      commands.add(new WorkbenchCommandImpl.UpdateSolutionWorkingSet(sln));
    } else {
      commands.add(new WorkbenchCommandImpl.CreateSolutionWorkingSet(sln));
    }

    return commands;
  }
  private void openSolution(String slnId) {
    Map<String, IProject> projectMap = getProjectMap();

    // close all projects that do not belong to this solution
    SolutionEntry solutionEntry = session.getSolutions().get(slnId);
    Set<String> openProjects = new HashSet<String>(Arrays.asList(solutionEntry.getOpenProjects()));
    for (String pName : openProjects) {
      IProject p = projectMap.get(pName);
      if (!p.isOpen()) {
        try {
          projectMap.get(pName).open(null);
        } catch (CoreException e) {
          e.printStackTrace();
        }
      }
    }
  }
  public List<WorkbenchCommand> removeSolutionCommands(String id) {

    // Note: everything that changes the (persistent) state of this plugin shall be encapsulated in
    // Commands
    //       to allow cancellation and roll backs
    SolutionEntry entry = session.getSolutions().get(id);

    Map<String, IProject> projectMap = getProjectMap();
    Set<String> projectIds = entry.getProjectNames();
    Map<String, Set<String>> wsTable = getWorkingSetTable();

    List<WorkbenchCommand> commands = new LinkedList<WorkbenchCommand>();

    // remove solution and corresponding working set
    commands.add(new WorkbenchCommandImpl.UnregisterSolution(id));

    // remove projects
    Project[] projects = entry.getProjects();
    for (Project p : projects) {
      if (projectMap.containsKey(p.getName())) {
        IProject project = projectMap.get(p.getName());
        commands.add(
            new WorkbenchCommandImpl.RemoveProjectFromWorkingSet(p.getName(), p.getWorkingSet()));
        commands.add(new WorkbenchCommandImpl.RemoveProject(project));
      }
    }

    // remove associated working sets
    if (wsTable.containsKey(id)) {
      Set<String> wsIds = wsTable.get(id);
      for (String wsId : wsIds) {
        commands.add(new WorkbenchCommandImpl.RemoveWorkingSet(wsId));
      }
    }

    commands.add(new WorkbenchCommandImpl.RemoveSolutionWorkingSet(id));

    return commands;
  }
 public List<Solution> getSolutions() {
   LinkedList<Solution> solutions = new LinkedList<Solution>();
   solutions.addAll(session.getSolutions().values());
   return solutions;
 }
 @Override
 public Set<String> getSolutionNames() {
   return session.getSolutions().keySet();
 }