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;
  }
  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;
  }