Skip to content

Commit faa7d9c

Browse files
committed
re-use matcher set creation
1 parent 46a22d0 commit faa7d9c

File tree

2 files changed

+19
-32
lines changed

2 files changed

+19
-32
lines changed

src/main/java/cz/mallat/uasparser/MultithreadedUASparser.java

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
import java.io.IOException;
44
import java.io.InputStream;
5-
import java.util.LinkedHashMap;
65
import java.util.Map;
76
import java.util.Map.Entry;
87
import java.util.Set;
98

109
import jregex.Matcher;
11-
import jregex.Pattern;
1210

1311
/**
1412
* This parser creates a Matcher set per-Thread using a ThreadLocal<Map>. It is faster than
@@ -22,9 +20,7 @@
2220
public class MultithreadedUASparser extends SingleThreadedUASparser {
2321

2422
private ThreadLocal<Map<Matcher, Long>> compiledBrowserMatcherMapT;
25-
2623
private ThreadLocal<Map<Matcher, Long>> compiledOsMatcherMapT;
27-
2824
private ThreadLocal<Map<Matcher, Long>> compiledDeviceMatcherMapT;
2925

3026
public MultithreadedUASparser(InputStream inputStreamToDefinitionFile) throws IOException {
@@ -40,12 +36,7 @@ protected void preCompileBrowserRegMap() {
4036
compiledBrowserMatcherMapT = new ThreadLocal<Map<Matcher, Long>>() {
4137
@Override
4238
protected Map<Matcher, Long> initialValue() {
43-
LinkedHashMap<Matcher, Long> tmpMap = new LinkedHashMap<Matcher, Long>(browserRegMap.size());
44-
for (Map.Entry<String, Long> entry : browserRegMap.entrySet()) {
45-
Pattern pattern = new Pattern(entry.getKey(), Pattern.IGNORE_CASE | Pattern.DOTALL);
46-
tmpMap.put(pattern.matcher(), entry.getValue());
47-
}
48-
return tmpMap;
39+
return preCompileBrowserMatcherMap();
4940
}
5041
};
5142
}
@@ -55,13 +46,7 @@ protected void preCompileOsRegMap() {
5546
compiledOsMatcherMapT = new ThreadLocal<Map<Matcher, Long>>() {
5647
@Override
5748
protected Map<Matcher, Long> initialValue() {
58-
LinkedHashMap<Matcher, Long> tmpMap = new LinkedHashMap<Matcher, Long>(osRegMap.size());
59-
for (Map.Entry<String, Long> entry : osRegMap.entrySet()) {
60-
Pattern pattern = new Pattern(entry.getKey(), Pattern.IGNORE_CASE | Pattern.DOTALL);
61-
tmpMap.put(pattern.matcher(), entry.getValue());
62-
}
63-
64-
return tmpMap;
49+
return preCompileOsMatcherMap();
6550
}
6651
};
6752
}
@@ -71,17 +56,7 @@ protected void preCompileDeviceRegMap() {
7156
compiledDeviceMatcherMapT = new ThreadLocal<Map<Matcher,Long>>() {
7257
@Override
7358
protected Map<Matcher, Long> initialValue() {
74-
if (deviceRegMap == null) {
75-
return null; // skip for older ini files
76-
}
77-
LinkedHashMap<Matcher, Long> compiledDeviceMatcherMap =
78-
new LinkedHashMap<Matcher, Long>(deviceRegMap.size());
79-
80-
for (Map.Entry<String, Long> entry : deviceRegMap.entrySet()) {
81-
Pattern pattern = new Pattern(entry.getKey(), Pattern.IGNORE_CASE | Pattern.DOTALL);
82-
compiledDeviceMatcherMap.put(pattern.matcher(), entry.getValue());
83-
}
84-
return compiledDeviceMatcherMap;
59+
return preCompileDeviceMatcherMap();
8560
}
8661
};
8762
}

src/main/java/cz/mallat/uasparser/SingleThreadedUASparser.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,38 +38,50 @@ public SingleThreadedUASparser(String localDefinitionFilename) throws IOExceptio
3838
*/
3939
@Override
4040
protected void preCompileBrowserRegMap() {
41+
this.compiledBrowserMatcherMap = preCompileBrowserMatcherMap();
42+
}
43+
44+
protected LinkedHashMap<Matcher, Long> preCompileBrowserMatcherMap() {
4145
LinkedHashMap<Matcher, Long> compiledBrowserMatcherMap =
4246
new LinkedHashMap<Matcher, Long>(browserRegMap.size());
4347

4448
for (Map.Entry<String, Long> entry : browserRegMap.entrySet()) {
4549
Pattern pattern = new Pattern(entry.getKey(), Pattern.IGNORE_CASE | Pattern.DOTALL);
4650
compiledBrowserMatcherMap.put(pattern.matcher(), entry.getValue());
4751
}
48-
this.compiledBrowserMatcherMap = compiledBrowserMatcherMap;
52+
return compiledBrowserMatcherMap;
4953
}
5054

5155
/**
5256
* Precompile OS regexes
5357
*/
5458
@Override
5559
protected void preCompileOsRegMap() {
60+
this.compiledOsMatcherMap = preCompileOsMatcherMap();
61+
}
62+
63+
protected LinkedHashMap<Matcher, Long> preCompileOsMatcherMap() {
5664
LinkedHashMap<Matcher, Long> compiledOsMatcherMap =
5765
new LinkedHashMap<Matcher, Long>(osRegMap.size());
5866

5967
for (Map.Entry<String, Long> entry : osRegMap.entrySet()) {
6068
Pattern pattern = new Pattern(entry.getKey(), Pattern.IGNORE_CASE | Pattern.DOTALL);
6169
compiledOsMatcherMap.put(pattern.matcher(), entry.getValue());
6270
}
63-
this.compiledOsMatcherMap = compiledOsMatcherMap;
71+
return compiledOsMatcherMap;
6472
}
6573

6674
/**
6775
* Precompile device regexes
6876
*/
6977
@Override
7078
protected void preCompileDeviceRegMap() {
79+
this.compiledDeviceMatcherMap = preCompileDeviceMatcherMap();
80+
}
81+
82+
protected LinkedHashMap<Matcher, Long> preCompileDeviceMatcherMap() {
7183
if (deviceRegMap == null) {
72-
return; // skip for older ini files
84+
return null; // skip for older ini files
7385
}
7486
LinkedHashMap<Matcher, Long> compiledDeviceMatcherMap =
7587
new LinkedHashMap<Matcher, Long>(deviceRegMap.size());
@@ -78,7 +90,7 @@ protected void preCompileDeviceRegMap() {
7890
Pattern pattern = new Pattern(entry.getKey(), Pattern.IGNORE_CASE | Pattern.DOTALL);
7991
compiledDeviceMatcherMap.put(pattern.matcher(), entry.getValue());
8092
}
81-
this.compiledDeviceMatcherMap = compiledDeviceMatcherMap;
93+
return compiledDeviceMatcherMap;
8294
}
8395

8496
/**

0 commit comments

Comments
 (0)