aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildFilter.java
blob: 230432ddb8ce8ad70d19b47c66a048617006658d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package bitbucketpullrequestbuilder.bitbucketpullrequestbuilder;

import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;

/**
 * Mutable wrapper
 */
class Mutable<T> {
  private T value;
  public Mutable() { this.value = null; }
  public Mutable(T value) { this.value = value; }
  T get() { return this.value; }
  void set(T value) { this.value = value; }
}

abstract class Filter {
  protected static final Logger logger = Logger.getLogger(BitbucketBuildTrigger.class.getName());
  
  public static final String RX_FILTER_FLAG = "r";
  public static final String RX_FILTER_FLAG_SINGLE = RX_FILTER_FLAG + ":";
  
  abstract public boolean apply(String filter, BitbucketCause cause);
  abstract public boolean check(String filter);
}

class EmptyFilter extends Filter {
  @Override
  public boolean apply(String filter, BitbucketCause cause) { return true; }
  @Override
  public boolean check(String filter) { return true; }
}

class AnyFlag extends Filter {  
  @Override
  public boolean apply(String filter, BitbucketCause cause) { return true; }
  @Override
  public boolean check(String filter) { return filter.isEmpty() || filter.contains("*") || filter.toLowerCase().contains("any"); }
}

class OnlyDestFlag extends Filter {  
  @Override
  public boolean apply(String filter, BitbucketCause cause) { 
    return Pattern.compile(
      filter.startsWith(RX_FILTER_FLAG_SINGLE) ? filter.substring(RX_FILTER_FLAG_SINGLE.length()) : Pattern.quote(filter),
    Pattern.CASE_INSENSITIVE).matcher(cause.getTargetBranch()).find();
  } 
  @Override
  public boolean check(String filter) { 
    return !(Pattern.matches("(s:)|(d:)", filter));
  }
}

class SourceDestFlag extends Filter {  
  @Override
  public boolean apply(String filter, BitbucketCause cause) { 
    return false;
  } 
  @Override
  public boolean check(String filter) { 
    return Pattern.matches("(s:)|(d:)", filter);
  }
}

/**
 * Created by maxvodo
 */
public class BitbucketBuildFilter {  
  private static final Logger logger = Logger.getLogger(BitbucketBuildTrigger.class.getName());
  
  private final String filter;
  private Filter currFilter = null;
  private static final List<Filter> AvailableFilters;
  
  static {
    ArrayList<Filter> filters = new ArrayList<Filter>();
    filters.add(new AnyFlag());
    filters.add(new OnlyDestFlag());
    filters.add(new EmptyFilter());
    AvailableFilters = filters;
  }
  
  public BitbucketBuildFilter(String f) {
    this.filter = f != null ? f : "";
    this.buildFilter(this.filter);
  }
  
  private void buildFilter(String filter) {
    logger.log(Level.INFO, "Build filter by phrase: {0}", filter);
    for(Filter f : AvailableFilters) {
      if (f.check(filter)) {
        this.currFilter = f;
        logger.log(Level.INFO, "Using filter: {0}", f.getClass().getSimpleName());
        break;
      }
    }  
  }
  
  public boolean approved(BitbucketCause cause) {    
    logger.log(Level.INFO, "Approve cause: {0}", cause.toString());
    return this.currFilter.apply(this.filter, cause);
  }  
}