9
9
import org .apache .lucene .util .automaton .Automaton ;
10
10
import org .apache .lucene .util .automaton .CharacterRunAutomaton ;
11
11
import org .apache .lucene .util .automaton .RegExp ;
12
+ import org .elasticsearch .common .settings .Setting ;
13
+ import org .elasticsearch .common .settings .Settings ;
12
14
13
15
import java .util .ArrayList ;
14
16
import java .util .Arrays ;
25
27
26
28
public final class Automatons {
27
29
30
+ public static final Setting <Integer > MAX_DETERMINIZED_STATES_SETTING =
31
+ Setting .intSetting ("xpack.security.automata.max_determinized_states" , 100000 , DEFAULT_MAX_DETERMINIZED_STATES ,
32
+ Setting .Property .NodeScope );
28
33
public static final Automaton EMPTY = Automata .makeEmpty ();
29
34
public static final Automaton MATCH_ALL = Automata .makeAnyString ();
30
35
36
+ // this value is not final since we allow it to be set at runtime
37
+ private static int maxDeterminizedStates = 100000 ;
38
+
31
39
static final char WILDCARD_STRING = '*' ; // String equality with support for wildcards
32
40
static final char WILDCARD_CHAR = '?' ; // Char equality with support for wildcards
33
41
static final char WILDCARD_ESCAPE = '\\' ; // Escape character
@@ -49,13 +57,12 @@ public static Automaton patterns(Collection<String> patterns) {
49
57
if (patterns .isEmpty ()) {
50
58
return EMPTY ;
51
59
}
52
- Automaton automaton = null ;
60
+ List < Automaton > automata = new ArrayList <>( patterns . size ()) ;
53
61
for (String pattern : patterns ) {
54
- final Automaton patternAutomaton = minimize ( pattern (pattern ), DEFAULT_MAX_DETERMINIZED_STATES );
55
- automaton = automaton == null ? patternAutomaton : unionAndMinimize ( Arrays . asList ( automaton , patternAutomaton ) );
62
+ final Automaton patternAutomaton = pattern (pattern );
63
+ automata . add ( patternAutomaton );
56
64
}
57
- // the automaton is always minimized and deterministic
58
- return automaton ;
65
+ return unionAndMinimize (automata );
59
66
}
60
67
61
68
/**
@@ -111,12 +118,12 @@ static Automaton wildcard(String text) {
111
118
112
119
public static Automaton unionAndMinimize (Collection <Automaton > automata ) {
113
120
Automaton res = union (automata );
114
- return minimize (res , DEFAULT_MAX_DETERMINIZED_STATES );
121
+ return minimize (res , maxDeterminizedStates );
115
122
}
116
123
117
124
public static Automaton minusAndMinimize (Automaton a1 , Automaton a2 ) {
118
- Automaton res = minus (a1 , a2 , DEFAULT_MAX_DETERMINIZED_STATES );
119
- return minimize (res , DEFAULT_MAX_DETERMINIZED_STATES );
125
+ Automaton res = minus (a1 , a2 , maxDeterminizedStates );
126
+ return minimize (res , maxDeterminizedStates );
120
127
}
121
128
122
129
public static Predicate <String > predicate (String ... patterns ) {
@@ -131,8 +138,17 @@ public static Predicate<String> predicate(Automaton automaton) {
131
138
return predicate (automaton , "Predicate for " + automaton );
132
139
}
133
140
141
+ public static void updateMaxDeterminizedStates (Settings settings ) {
142
+ maxDeterminizedStates = MAX_DETERMINIZED_STATES_SETTING .get (settings );
143
+ }
144
+
145
+ // accessor for testing
146
+ static int getMaxDeterminizedStates () {
147
+ return maxDeterminizedStates ;
148
+ }
149
+
134
150
private static Predicate <String > predicate (Automaton automaton , final String toString ) {
135
- CharacterRunAutomaton runAutomaton = new CharacterRunAutomaton (automaton , DEFAULT_MAX_DETERMINIZED_STATES );
151
+ CharacterRunAutomaton runAutomaton = new CharacterRunAutomaton (automaton , maxDeterminizedStates );
136
152
return new Predicate <String >() {
137
153
@ Override
138
154
public boolean test (String s ) {
0 commit comments