Validator.java

package com.codeaffine.extras.workingset.internal;

import static com.codeaffine.extras.workingset.internal.ValidationStatus.Severity.ERROR;

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

import com.codeaffine.extras.workingset.internal.ValidationStatus.Severity;


public class Validator {

  static final String MSG_NAME_EMPTY = "Please enter a name for the working set";
  static final String MSG_NAME_EXISTS = "A working set with the same name already exists";
  static final String MSG_PATTERN_EMPTY = "Please enter a regular expression pattern";
  static final String MSG_PATTERN_INVALID = "The regular expression is not valid";
  static final String MSG_JDT_RESTRICTION
    = "Due to a restriction in the Java Tools, working "
    + "sets that are initially empty are not shown in the Package Explorer.";

  private final WorkingSetsProvider workingSetsProvider;
  private final ProjectsProvider projectsProvider;
  private final JdtFeature jdtFeature;

  public Validator( ProjectsProvider projectsProvider, JdtFeature jdtFeature ) {
    this( new WorbenchWorkingSetsProvider(), projectsProvider, jdtFeature );
  }

  public Validator( WorkingSetsProvider workingSetsProvider,
                    ProjectsProvider projectsProvider,
                    JdtFeature jdtFeature )
  {
    this.workingSetsProvider = workingSetsProvider;
    this.projectsProvider = projectsProvider;
    this.jdtFeature = jdtFeature;
  }

  public ValidationStatus validate( IWorkingSet editedWorkingSet, String name, String pattern ) {
    if( name.isEmpty() ) {
      return new ValidationStatus( ERROR, MSG_NAME_EMPTY );
    }
    if( pattern.isEmpty() ) {
      return new ValidationStatus( ERROR, MSG_PATTERN_EMPTY );
    }
    if( !isPatternValid( pattern ) ) {
      return new ValidationStatus( ERROR, MSG_PATTERN_INVALID );
    }
    if( nameExists( editedWorkingSet, name ) ) {
      return new ValidationStatus( Severity.WARNING, MSG_NAME_EXISTS );
    }
    if( !pattern.isEmpty() && jdtFeature.isInstalled() && !patternMatchesAnyProject( pattern ) ) {
      return new ValidationStatus( Severity.WARNING, MSG_JDT_RESTRICTION );
    }
    return new ValidationStatus( Severity.NONE, "" );
  }

  private boolean patternMatchesAnyProject( String pattern ) {
    boolean result = false;
    ProjectPatternMatcher projectPatternMatcher = new ProjectPatternMatcher( pattern );
    IProject[] projects = projectsProvider.getProjects();
    for( int i = 0; !result && i < projects.length; i++ ) {
      IProject project = projects[ i ];
      if( projectPatternMatcher.matches( project ) ) {
        result = true;
      }
    }
    return result;
  }

  private static boolean isPatternValid( String pattern ) {
    return new ProjectPatternMatcher( pattern ).isPatternValid();
  }

  private boolean nameExists( IWorkingSet editedWorkingSet, String name ) {
    IWorkingSet[] workingSets = workingSetsProvider.getWorkingSets();
    for( IWorkingSet workingSet : workingSets ) {
      if( !workingSet.equals( editedWorkingSet ) && name.equals( workingSet.getLabel() ) ) {
        return true;
      }
    }
    return false;
  }

}