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);
}
}
|