code: package com.beijunyi.parallelgit.filesystem;
  
  import java.nio.file.Path;
  import java.nio.file.PathMatcher;
  import java.util.regex.Pattern;
  import javax.annotation.Nonnull;
  
  import com.beijunyi.parallelgit.filesystem.utils.GitGlobs;
  
  public class GfsPathMatcher implements PathMatcher {
  
    private static final String GLOB_SYNTAX = "glob";
    private static final String REGEX_SYNTAX = "regex";
  
    private final Pattern pattern;
  
    private GfsPathMatcher(Pattern pattern) {
      this.pattern = pattern;
    }
  
    @Nonnull
    public static GfsPathMatcher newMatcher(Pattern pattern) {
      return new GfsPathMatcher(pattern);
    }
  
    @Nonnull
    public static GfsPathMatcher newMatcher(String syntax, String pattern) {
      String expr;
      if(syntax.equals(GLOB_SYNTAX)) {
        expr = GitGlobs.toRegexPattern(pattern);
      } else {
        if(syntax.equals(REGEX_SYNTAX)) expr = pattern;
        else throw new UnsupportedOperationException("Syntax '" + syntax + "' not recognized");
      }
      return newMatcher(Pattern.compile(expr));
    }
  
    @Nonnull
    public static GfsPathMatcher newMatcher(String syntaxPattern) {
      int pos = syntaxPattern.indexOf(':');
      if(pos <= 0 || pos == syntaxPattern.length()) throw new IllegalArgumentException(syntaxPattern);
      String syntax = syntaxPattern.substring(0, pos);
      String pattern = syntaxPattern.substring(pos + 1);
      return newMatcher(syntax, pattern);
    }
  
    @Override
    public boolean matches(Path path) {
      return pattern.matcher(path.toString()).matches();
    }
  
  }
  