WorkingSetContentUpdater.java

package com.codeaffine.extras.workingset.internal;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.ui.IWorkingSet;

class WorkingSetContentUpdater {

  private final IWorkingSet workingSet;
  private final ProjectsProvider projectsProvider;
  private final ProjectPatternMatcher projectPatternMatcher;

  WorkingSetContentUpdater( IWorkingSet workingSet ) {
    this( workingSet, new WorkspaceProjectsProvider() );
  }

  WorkingSetContentUpdater( IWorkingSet workingSet, ProjectsProvider projectsProvider ) {
    this.workingSet = workingSet;
    this.projectsProvider = projectsProvider;
    this.projectPatternMatcher = new ProjectPatternMatcher( workingSet.getName() );
  }

  void updateElements() {
    Set<IProject> matchingProjects = new HashSet<>();
    for( IProject project : projectsProvider.getProjects() ) {
      if( projectPatternMatcher.matches( project ) ) {
        matchingProjects.add( project );
      }
    }
    if( elementsChanged( matchingProjects ) ) {
      workingSet.setElements( matchingProjects.toArray( new IProject[ matchingProjects.size() ] ) );
    }
  }

  private boolean elementsChanged( Set<IProject> newElements ) {
    IAdaptable[] oldElements = workingSet.getElements();
    if( oldElements.length != newElements.size() ) {
      return true;
    }
    for( IAdaptable oldElement : oldElements ) {
      if( !newElements.contains( oldElement ) ) {
        return true;
      }
    }
    return false;
  }
}