KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sslexplorer > core > BrowserChecker


1 package com.sslexplorer.core;
2
3 import java.io.BufferedReader JavaDoc;
4 import java.io.IOException JavaDoc;
5 import java.io.InputStream JavaDoc;
6 import java.io.InputStreamReader JavaDoc;
7 import java.net.URL JavaDoc;
8 import java.util.ArrayList JavaDoc;
9 import java.util.List JavaDoc;
10
11 import javax.servlet.jsp.tagext.BodyTagSupport JavaDoc;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15
16 import com.sslexplorer.boot.Util;
17
18 public class BrowserChecker extends BodyTagSupport JavaDoc {
19     
20     final static Log log = LogFactory.getLog(BrowserChecker.class);
21
22     public static final String JavaDoc BROWSER_IE = "IE";
23     public static final String JavaDoc BROWSER_OPERA = "Opera";
24     public static final String JavaDoc BROWSER_SAFARI = "Safari";
25     public static final String JavaDoc BROWSER_FIREFOX = "Firefox";
26     
27     static List JavaDoc<Browser> browsers = new ArrayList JavaDoc<Browser>();
28     static {
29         URL JavaDoc u = BrowserChecker.class.getResource("/META-INF/userAgents.properties");
30         if(u == null) {
31             log.error("Failed to find /META-INF/userAgents.txt, cannot detect browser.");
32         }
33         else {
34             InputStream JavaDoc in = null;
35             try {
36                 in = u.openStream();
37                 BufferedReader JavaDoc r = new BufferedReader JavaDoc(new InputStreamReader JavaDoc(in));
38                 String JavaDoc line;
39                 while ( ( line = r.readLine() ) != null) {
40                     line = line.trim();
41                     if(!line.startsWith("#") && line.length() != 0) {
42                         try {
43                             browsers.add(new Browser(line));
44                         }
45                         catch(Exception JavaDoc e) {
46                             log.error("Syntax error '" + line + "'.");
47                         }
48                     }
49                 }
50             }
51             catch(IOException JavaDoc ioe) {
52                 log.error("Failed to load /META-INF/userAgents.txt", ioe);
53             }
54             finally {
55                 Util.closeStream(in);
56             }
57         }
58     }
59
60     private Browser browser;
61
62     public BrowserChecker() {
63     }
64
65     public BrowserChecker(String JavaDoc userAgent) {
66         setUserAgent(userAgent);
67     }
68     
69     public void setUserAgent(String JavaDoc userAgent) {
70         for(Browser b : browsers) {
71             if(userAgent.contains(b.getUserAgentPattern())) {
72                 browser = b;
73                 break;
74             }
75         }
76         
77     }
78     
79     public Browser getBrowser() {
80         return browser;
81     }
82     
83     public boolean isBrowserVersion(String JavaDoc name, int version) {
84         return isBrowserVersionExpression(name, version == -1 ? "*" : "=" + version);
85     }
86     
87     public boolean isBrowserVersionExpression(String JavaDoc name, String JavaDoc versionExpression) {
88         return isBrowser(name) && isVersionExpression(versionExpression);
89     }
90     
91     private boolean isBrowser(String JavaDoc name) {
92         return browser != null && browser.getName().equalsIgnoreCase(name);
93     }
94     
95     private boolean isVersion(int version) {
96         return isVersionExpression("=" + version);
97     }
98     
99     private boolean isVersionExpression(String JavaDoc versionExpression) {
100         
101         boolean not = false;
102         
103         // Parse the expression
104
if(versionExpression.startsWith("!")) {
105             not = true;
106             versionExpression = versionExpression.substring(1);
107         }
108         boolean gt = false;
109         if(versionExpression.startsWith("+")) {
110             gt = true;
111             versionExpression = versionExpression.substring(1);
112         }
113         boolean lt = false;
114         if(versionExpression.startsWith("-")) {
115             lt = true;
116             versionExpression = versionExpression.substring(1);
117         }
118         boolean eq = false;
119         if(versionExpression.startsWith("=")) {
120             eq = true;
121             versionExpression = versionExpression.substring(1);
122         }
123         
124         boolean ok = false;
125         
126         // Test if any version
127
if(versionExpression.equals("*")) {
128             ok = true;
129         }
130         else {
131             int version = Integer.parseInt(versionExpression);
132             
133             // Test if version matches expression
134
if(eq) {
135                 ok = lt ? browser.getVersion() <= version : ( gt ? browser.getVersion() >= version : ( browser.getVersion() == version ) );
136             }
137             else {
138                 ok = lt ? browser.getVersion() < version : ( gt ? browser.getVersion() > version : false );
139             }
140         }
141         
142         // Negate?
143

144         if(not) {
145             ok = !ok;
146         }
147         
148         return ok;
149     }
150     
151     public static class Browser {
152         String JavaDoc userAgentPattern;
153         String JavaDoc name;
154         int version = -1;
155         
156         Browser(String JavaDoc line) {
157             String JavaDoc[] arr = line.split(",");
158             userAgentPattern = arr[0];
159             name = arr[1];
160             if(arr.length > 2) {
161                 version = arr[2].equals("") ? -1 : Integer.parseInt(arr[2]);
162             }
163         }
164
165         public String JavaDoc getUserAgentPattern() {
166             return userAgentPattern;
167         }
168
169         public String JavaDoc getName() {
170             return name;
171         }
172         
173         public int getVersion() {
174             return version;
175         }
176         
177     }
178
179 }
180
Popular Tags