1 package com.sslexplorer.core; 2 3 import java.io.BufferedReader ; 4 import java.io.IOException ; 5 import java.io.InputStream ; 6 import java.io.InputStreamReader ; 7 import java.net.URL ; 8 import java.util.ArrayList ; 9 import java.util.List ; 10 11 import javax.servlet.jsp.tagext.BodyTagSupport ; 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 { 19 20 final static Log log = LogFactory.getLog(BrowserChecker.class); 21 22 public static final String BROWSER_IE = "IE"; 23 public static final String BROWSER_OPERA = "Opera"; 24 public static final String BROWSER_SAFARI = "Safari"; 25 public static final String BROWSER_FIREFOX = "Firefox"; 26 27 static List <Browser> browsers = new ArrayList <Browser>(); 28 static { 29 URL 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 in = null; 35 try { 36 in = u.openStream(); 37 BufferedReader r = new BufferedReader (new InputStreamReader (in)); 38 String 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 e) { 46 log.error("Syntax error '" + line + "'."); 47 } 48 } 49 } 50 } 51 catch(IOException 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 userAgent) { 66 setUserAgent(userAgent); 67 } 68 69 public void setUserAgent(String 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 name, int version) { 84 return isBrowserVersionExpression(name, version == -1 ? "*" : "=" + version); 85 } 86 87 public boolean isBrowserVersionExpression(String name, String versionExpression) { 88 return isBrowser(name) && isVersionExpression(versionExpression); 89 } 90 91 private boolean isBrowser(String 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 versionExpression) { 100 101 boolean not = false; 102 103 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 if(versionExpression.equals("*")) { 128 ok = true; 129 } 130 else { 131 int version = Integer.parseInt(versionExpression); 132 133 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 144 if(not) { 145 ok = !ok; 146 } 147 148 return ok; 149 } 150 151 public static class Browser { 152 String userAgentPattern; 153 String name; 154 int version = -1; 155 156 Browser(String line) { 157 String [] 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 getUserAgentPattern() { 166 return userAgentPattern; 167 } 168 169 public String getName() { 170 return name; 171 } 172 173 public int getVersion() { 174 return version; 175 } 176 177 } 178 179 } 180
| Popular Tags
|