23
23
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24
24
* POSSIBILITY OF SUCH DAMAGE.
25
25
*/
26
-
27
26
package com .salesforce .omakase .tools ;
28
27
29
28
import java .io .IOException ;
29
+ import java .io .InputStream ;
30
30
import java .net .URL ;
31
31
import java .net .URLConnection ;
32
+ import java .util .ArrayList ;
32
33
import java .util .Collections ;
33
34
import java .util .List ;
34
35
import java .util .Map ;
35
36
import java .util .regex .Matcher ;
36
37
import java .util .regex .Pattern ;
37
38
38
39
import com .fasterxml .jackson .databind .ObjectMapper ;
40
+ import com .fasterxml .jackson .module .afterburner .AfterburnerModule ;
39
41
import com .google .common .base .Joiner ;
40
42
import com .google .common .base .Splitter ;
43
+ import com .google .common .collect .ImmutableList ;
41
44
import com .google .common .collect .Iterables ;
42
- import com .google .common .collect .Lists ;
43
45
import com .salesforce .omakase .data .Browser ;
44
46
import com .salesforce .omakase .data .Prefix ;
45
47
55
57
* @author nmcwilliams
56
58
*/
57
59
@ SuppressWarnings ({"rawtypes" , "unchecked" })
58
- public class GenerateBrowserEnum {
60
+ public final class GenerateBrowserEnum {
59
61
private static final String BROWSERS_ENDPOINT = "https://raw.github.com/Fyrd/caniuse/master/data.json" ;
60
62
61
63
public static void main (String [] args ) throws Exception {
62
- new GenerateBrowserEnum (). run ();
64
+ run ();
63
65
}
64
66
65
- public boolean run () throws IOException , TemplateException {
67
+ public static boolean run () throws IOException , TemplateException {
66
68
System .out .println ("downloading browser data from caniuse.com [https://github.com/Fyrd/caniuse]..." );
67
69
URLConnection connection = new URL (BROWSERS_ENDPOINT ).openConnection ();
68
70
connection .setUseCaches (false );
69
- Map map = new ObjectMapper ().readValue (connection .getInputStream (), Map .class );
71
+ final Map map ;
72
+ try (final InputStream is = connection .getInputStream ()) {
73
+ map = new ObjectMapper ()
74
+ // This adds support for using byte code to perform
75
+ // deserialization:
76
+ // https://github.com/FasterXML/jackson-modules-base/tree/master/afterburner
77
+ // Need to set setUseValueClassLoader to false to fix a class
78
+ // loader issue in Java 9
79
+ // https://github.com/FasterXML/jackson-modules-base/issues/37
80
+ // This means it will only look at public properties.
81
+ .registerModule (new AfterburnerModule ().setUseValueClassLoader (false ))
82
+ .readValue (is , Map .class );
83
+ }
70
84
71
85
String earliestString = (String )Iterables .get (((Map )map .get ("eras" )).keySet (), 0 );
72
86
Matcher matcher = Pattern .compile ("e-([0-9]+)" ).matcher (earliestString );
@@ -75,8 +89,6 @@ public boolean run() throws IOException, TemplateException {
75
89
76
90
Map agents = (Map )map .get ("agents" );
77
91
78
- List <BrowserInfo > browsers = Lists .newArrayList ();
79
-
80
92
Map ie = (Map )agents .get ("ie" );
81
93
Map edge = (Map )agents .get ("edge" );
82
94
Map opera = (Map )agents .get ("opera" );
@@ -87,34 +99,35 @@ public boolean run() throws IOException, TemplateException {
87
99
Map ieMobile = (Map )agents .get ("ie_mob" );
88
100
Map iosSafari = (Map )agents .get ("ios_saf" );
89
101
90
- browsers .add (new BrowserInfo ("ie" , "IE" , "Internet Explorer" , Prefix .MS , versions (ie , earliest )));
91
- browsers .add (new BrowserInfo ("edge" , "EDGE" , "Microsoft Edge" , Prefix .MS , versions (edge , earliest )));
92
- browsers .add (new BrowserInfo ("opera" , "OPERA" , "Opera" , Prefix .WEBKIT , versions (opera , earliest )));
93
- browsers .add (new BrowserInfo ("chrome" , "CHROME" , "Google Chrome" , Prefix .WEBKIT , versions (chrome , earliest )));
94
- browsers .add (new BrowserInfo ("safari" , "SAFARI" , "Safari" , Prefix .WEBKIT , versions (safari , earliest )));
95
- browsers .add (new BrowserInfo ("firefox" , "FIREFOX" , "Firefox" , Prefix .MOZ , versions (firefox , earliest )));
96
- browsers .add (new BrowserInfo ("android" , "ANDROID" , "Android Browser" , Prefix .WEBKIT , versions (android , earliest )));
97
- browsers .add (new BrowserInfo ("ie_mob" , "IE_MOBILE" , "IE Mobile" , Prefix .MS , versions (ieMobile , earliest )));
98
- browsers .add (new BrowserInfo ("ios_saf" , "IOS_SAFARI" , "Safari on iOS" , Prefix .WEBKIT , versions (iosSafari , earliest )));
99
-
100
- SourceWriter writer = new SourceWriter ();
101
-
102
- writer .generator (GenerateBrowserEnum .class );
103
- writer .classToWrite (Browser .class );
104
- writer .template ("browser-enum.ftl" );
105
- writer .data ("browsers" , browsers );
102
+ final List <BrowserInfo > browsers = ImmutableList .of (
103
+ new BrowserInfo ("ie" , "IE" , "Internet Explorer" , Prefix .MS , versions (ie , earliest )),
104
+ new BrowserInfo ("edge" , "EDGE" , "Microsoft Edge" , Prefix .MS , versions (edge , earliest )),
105
+ new BrowserInfo ("opera" , "OPERA" , "Opera" , Prefix .WEBKIT , versions (opera , earliest )),
106
+ new BrowserInfo ("chrome" , "CHROME" , "Google Chrome" , Prefix .WEBKIT , versions (chrome , earliest )),
107
+ new BrowserInfo ("safari" , "SAFARI" , "Safari" , Prefix .WEBKIT , versions (safari , earliest )),
108
+ new BrowserInfo ("firefox" , "FIREFOX" , "Firefox" , Prefix .MOZ , versions (firefox , earliest )),
109
+ new BrowserInfo ("android" , "ANDROID" , "Android Browser" , Prefix .WEBKIT , versions (android , earliest )),
110
+ new BrowserInfo ("ie_mob" , "IE_MOBILE" , "IE Mobile" , Prefix .MS , versions (ieMobile , earliest )),
111
+ new BrowserInfo ("ios_saf" , "IOS_SAFARI" , "Safari on iOS" , Prefix .WEBKIT , versions (iosSafari , earliest ))
112
+ );
113
+
114
+ SourceWriter writer = new SourceWriter ()
115
+ .generator (GenerateBrowserEnum .class )
116
+ .classToWrite (Browser .class )
117
+ .template ("browser-enum.ftl" )
118
+ .data ("browsers" , browsers );
106
119
107
120
return writer .write ();
108
121
}
109
122
110
- private String versions (Map browser , int indexOfCurrent ) {
123
+ private static String versions (Map browser , int indexOfCurrent ) {
111
124
List <String > all = (List <String >)browser .get ("versions" );
112
- List <Double > filtered = Lists . newArrayList ();
125
+ List <Double > filtered = new ArrayList <> ();
113
126
114
127
for (int i = 0 ; i <= indexOfCurrent ; i ++) { // skip the last two, as they are "future" versions
115
128
if (all .get (i ) != null ) {
116
- for (String s : Splitter .on ("-" ).split (all .get (i ))) {
117
- if (s .indexOf ("." ) == s .lastIndexOf ("." )) { // hacky deal with something like Android 4.4.3. Just skip for now
129
+ for (String s : Splitter .on ('-' ).split (all .get (i ))) {
130
+ if (s .indexOf ("." ) == s .lastIndexOf ('.' )) { // hacky deal with something like Android 4.4.3. Just skip for now
118
131
filtered .add (Double .valueOf (s ));
119
132
}
120
133
}
@@ -147,7 +160,7 @@ public String getKey() {
147
160
}
148
161
149
162
public String getPrefix () {
150
- return String . format ( "Prefix.%s" , prefix .name () );
163
+ return "Prefix." + prefix .name ();
151
164
}
152
165
153
166
public String getEnumName () {
0 commit comments