public void openProject(Project project) {
    final ProjectImpl projectImpl = (ProjectImpl) project;
    final ProjectInformationImpl projectInformationImpl =
        projectImpl.getLookup().lookup(ProjectInformationImpl.class);
    final WorkspaceProviderImpl workspaceProviderImpl =
        project.getLookup().lookup(WorkspaceProviderImpl.class);

    if (projects.hasCurrentProject()) {
      closeCurrentProject();
    }
    projects.addProject(projectImpl);
    projects.setCurrentProject(projectImpl);
    projectInformationImpl.open();

    for (Workspace ws : project.getLookup().lookup(WorkspaceProviderImpl.class).getWorkspaces()) {
      fireWorkspaceEvent(EventType.INITIALIZE, ws);
    }

    if (!workspaceProviderImpl.hasCurrentWorkspace()) {
      if (workspaceProviderImpl.getWorkspaces().length == 0) {
        Workspace workspace = newWorkspace(project);
        openWorkspace(workspace);
      } else {
        Workspace workspace = workspaceProviderImpl.getWorkspaces()[0];
        openWorkspace(workspace);
      }
    } else {
      fireWorkspaceEvent(EventType.SELECT, workspaceProviderImpl.getCurrentWorkspace());
    }
  }
 @Override
 public void removeProject(Project project) {
   if (projects.getCurrentProject() == project) {
     closeCurrentProject();
   }
   projects.removeProject(project);
 }
  @Override
  public void closeCurrentProject() {
    if (projects.hasCurrentProject()) {
      ProjectImpl currentProject = projects.getCurrentProject();

      // Event
      if (currentProject.getLookup().lookup(WorkspaceProvider.class).hasCurrentWorkspace()) {
        fireWorkspaceEvent(
            EventType.UNSELECT,
            currentProject.getLookup().lookup(WorkspaceProvider.class).getCurrentWorkspace());
      }
      for (Workspace ws :
          currentProject.getLookup().lookup(WorkspaceProviderImpl.class).getWorkspaces()) {
        fireWorkspaceEvent(EventType.CLOSE, ws);
      }

      // Close
      currentProject.getLookup().lookup(ProjectInformationImpl.class).close();
      projects.closeCurrentProject();

      fireWorkspaceEvent(EventType.DISABLE, null);

      // Remove
      projects.removeProject(currentProject);
    }
  }
 @Override
 public void newProject() {
   closeCurrentProject();
   ProjectImpl project = new ProjectImpl(projects.nextProjectId());
   projects.addProject(project);
   openProject(project);
 }
 @Override
 public Workspace duplicateWorkspace(Workspace workspace) {
   if (projects.hasCurrentProject()) {
     Workspace duplicate = newWorkspace(projects.getCurrentProject());
     for (WorkspaceDuplicateProvider dp :
         Lookup.getDefault().lookupAll(WorkspaceDuplicateProvider.class)) {
       dp.duplicate(workspace, duplicate);
     }
     openWorkspace(duplicate);
     return duplicate;
   }
   return null;
 }
 @Override
 public WorkspaceImpl getCurrentWorkspace() {
   if (projects.hasCurrentProject()) {
     return getCurrentProject()
         .getLookup()
         .lookup(WorkspaceProviderImpl.class)
         .getCurrentWorkspace();
   }
   return null;
 }
 @Override
 public ProjectImpl getCurrentProject() {
   return projects.getCurrentProject();
 }