PageRenderTime 99ms CodeModel.GetById 35ms RepoModel.GetById 0ms app.codeStats 0ms

/Applet/UserAgentTools.java

http://ndt.googlecode.com/
Java | 449 lines | 411 code | 8 blank | 30 comment | 220 complexity | 9711608a7541de3f2d99be899eea025b MD5 | raw file
Possible License(s): Apache-2.0
  1. /* This class has code taken from
  2. * http://nerds.palmdrive.net/useragent/code.html
  3. *
  4. * Class used to obtain information about who is accessing a web-server.
  5. *
  6. * When a web browser accesses a web-server, it usually transmits a "User-Agent" string.
  7. * This is expected to include the name and versions of the browser and
  8. * the underlying Operating System. Though the information inside a user-agent string is not restricted to
  9. * these alone, currently, NDT uses this to get Browser OS only.
  10. *
  11. */
  12. public class UserAgentTools {
  13. public static String getFirstVersionNumber(String a_userAgent,
  14. int a_position, int numDigits) {
  15. String ver = getVersionNumber(a_userAgent, a_position);
  16. if (ver == null)
  17. return "";
  18. int i = 0;
  19. String res = "";
  20. while (i < ver.length() && i < numDigits) {
  21. res += String.valueOf(ver.charAt(i));
  22. i++;
  23. }
  24. return res;
  25. }
  26. public static String getVersionNumber(String a_userAgent, int a_position) {
  27. if (a_position < 0)
  28. return "";
  29. StringBuffer res = new StringBuffer();
  30. int status = 0;
  31. while (a_position < a_userAgent.length()) {
  32. char c = a_userAgent.charAt(a_position);
  33. switch (status) {
  34. case 0: // <SPAN class="codecomment"> No valid digits encountered
  35. // yet</span>
  36. if (c == ' ' || c == '/')
  37. break;
  38. if (c == ';' || c == ')')
  39. return "";
  40. status = 1;
  41. case 1: // <SPAN class="codecomment"> Version number in
  42. // progress</span>
  43. if (c == ';' || c == '/' || c == ')' || c == '(' || c == '[')
  44. return res.toString().trim();
  45. if (c == ' ')
  46. status = 2;
  47. res.append(c);
  48. break;
  49. case 2: // <SPAN class="codecomment"> Space encountered - Might need
  50. // to end the parsing</span>
  51. if ((Character.isLetter(c) && Character.isLowerCase(c))
  52. || Character.isDigit(c)) {
  53. res.append(c);
  54. status = 1;
  55. } else
  56. return res.toString().trim();
  57. break;
  58. }
  59. a_position++;
  60. }
  61. return res.toString().trim();
  62. }
  63. public static String[] getArray(String a, String b, String c) {
  64. String[] res = new String[3];
  65. res[0] = a;
  66. res[1] = b;
  67. res[2] = c;
  68. return res;
  69. }
  70. public static String[] getBotName(String userAgent) {
  71. userAgent = userAgent.toLowerCase();
  72. int pos = 0;
  73. String res = null;
  74. if ((pos = userAgent.indexOf("help.yahoo.com/")) > -1) {
  75. res = "Yahoo";
  76. pos += 7;
  77. } else if ((pos = userAgent.indexOf("google/")) > -1) {
  78. res = "Google";
  79. pos += 7;
  80. } else if ((pos = userAgent.indexOf("msnbot/")) > -1) {
  81. res = "MSNBot";
  82. pos += 7;
  83. } else if ((pos = userAgent.indexOf("googlebot/")) > -1) {
  84. res = "Google";
  85. pos += 10;
  86. } else if ((pos = userAgent.indexOf("webcrawler/")) > -1) {
  87. res = "WebCrawler";
  88. pos += 11;
  89. } else if ((pos = userAgent.indexOf("inktomi")) > -1) {
  90. // <SPAN class="codecomment"> The following two bots don't have any
  91. // version number in their User-Agent strings.</span>
  92. res = "Inktomi";
  93. pos = -1;
  94. } else if ((pos = userAgent.indexOf("teoma")) > -1) {
  95. res = "Teoma";
  96. pos = -1;
  97. }
  98. if (res == null)
  99. return null;
  100. return getArray(res, res, res + getVersionNumber(userAgent, pos));
  101. }
  102. public static String[] getOS(String userAgent) {
  103. if (getBotName(userAgent) != null)
  104. return getArray("Bot", "Bot", "Bot");
  105. String[] res = null;
  106. int pos;
  107. if ((pos = userAgent.indexOf("Windows-NT")) > -1) {
  108. res = getArray("Win", "WinNT",
  109. "Win" + getVersionNumber(userAgent, pos + 8));
  110. } else if (userAgent.indexOf("Windows NT") > -1) {
  111. // <SPAN class="codecomment"> The different versions of Windows NT
  112. // are decoded in the verbosity level 2</span>
  113. // <SPAN class="codecomment"> ie: Windows NT 5.1 = Windows XP</span>
  114. if ((pos = userAgent.indexOf("Windows NT 5.1")) > -1) {
  115. res = getArray("Win", "WinXP",
  116. "Win" + getVersionNumber(userAgent, pos + 7));
  117. } else if ((pos = userAgent.indexOf("Windows NT 6.0")) > -1) {
  118. res = getArray("Win", "Vista",
  119. "Vista" + getVersionNumber(userAgent, pos + 7));
  120. } else if ((pos = userAgent.indexOf("Windows NT 6.1")) > -1) {
  121. res = getArray("Win", "Seven",
  122. "Seven " + getVersionNumber(userAgent, pos + 7));
  123. } else if ((pos = userAgent.indexOf("Windows NT 5.0")) > -1) {
  124. res = getArray("Win", "Win2000",
  125. "Win" + getVersionNumber(userAgent, pos + 7));
  126. } else if ((pos = userAgent.indexOf("Windows NT 5.2")) > -1) {
  127. res = getArray("Win", "Win2003",
  128. "Win" + getVersionNumber(userAgent, pos + 7));
  129. } else if ((pos = userAgent.indexOf("Windows NT 4.0")) > -1) {
  130. res = getArray("Win", "WinNT4",
  131. "Win" + getVersionNumber(userAgent, pos + 7));
  132. } else if ((pos = userAgent.indexOf("Windows NT)")) > -1) {
  133. res = getArray("Win", "WinNT", "WinNT");
  134. } else if ((pos = userAgent.indexOf("Windows NT;")) > -1) {
  135. res = getArray("Win", "WinNT", "WinNT");
  136. } else {
  137. res = getArray("Win", "WinNT?", "WinNT?");
  138. }
  139. } else if (userAgent.indexOf("Win") > -1) {
  140. if (userAgent.indexOf("Windows") > -1) {
  141. if ((pos = userAgent.indexOf("Windows 98")) > -1) {
  142. res = getArray("Win", "Win98",
  143. "Win" + getVersionNumber(userAgent, pos + 7));
  144. } else if ((pos = userAgent.indexOf("Windows_98")) > -1) {
  145. res = getArray("Win", "Win98",
  146. "Win" + getVersionNumber(userAgent, pos + 8));
  147. } else if ((pos = userAgent.indexOf("Windows 2000")) > -1) {
  148. res = getArray("Win", "Win2000",
  149. "Win" + getVersionNumber(userAgent, pos + 7));
  150. } else if ((pos = userAgent.indexOf("Windows 95")) > -1) {
  151. res = getArray("Win", "Win95",
  152. "Win" + getVersionNumber(userAgent, pos + 7));
  153. } else if ((pos = userAgent.indexOf("Windows 9x")) > -1) {
  154. res = getArray("Win", "Win9x",
  155. "Win" + getVersionNumber(userAgent, pos + 7));
  156. } else if ((pos = userAgent.indexOf("Windows ME")) > -1) {
  157. res = getArray("Win", "WinME",
  158. "Win" + getVersionNumber(userAgent, pos + 7));
  159. } else if ((pos = userAgent.indexOf("Windows CE;")) > -1) {
  160. res = getArray("Win", "WinCE", "WinCE");
  161. } else if ((pos = userAgent.indexOf("Windows 3.1")) > -1) {
  162. res = getArray("Win", "Win31",
  163. "Win" + getVersionNumber(userAgent, pos + 7));
  164. }
  165. // <SPAN class="codecomment"> If no version was found, rely on
  166. // the following code to detect "WinXX"</span>
  167. // <SPAN class="codecomment"> As some User-Agents include two
  168. // references to Windows</span>
  169. // <SPAN class="codecomment"> Ex: Mozilla/5.0 (Windows; U;
  170. // Win98; en-US; rv:1.5)</span>
  171. }
  172. if (res == null) {
  173. if ((pos = userAgent.indexOf("Win98")) > -1) {
  174. res = getArray("Win", "Win98",
  175. "Win" + getVersionNumber(userAgent, pos + 3));
  176. } else if ((pos = userAgent.indexOf("Win31")) > -1) {
  177. res = getArray("Win", "Win31",
  178. "Win" + getVersionNumber(userAgent, pos + 3));
  179. } else if ((pos = userAgent.indexOf("Win95")) > -1) {
  180. res = getArray("Win", "Win95",
  181. "Win" + getVersionNumber(userAgent, pos + 3));
  182. } else if ((pos = userAgent.indexOf("Win 9x")) > -1) {
  183. res = getArray("Win", "Win9x",
  184. "Win" + getVersionNumber(userAgent, pos + 3));
  185. } else if ((pos = userAgent.indexOf("WinNT4.0")) > -1) {
  186. res = getArray("Win", "WinNT4",
  187. "Win" + getVersionNumber(userAgent, pos + 3));
  188. } else if ((pos = userAgent.indexOf("WinNT")) > -1) {
  189. res = getArray("Win", "WinNT",
  190. "Win" + getVersionNumber(userAgent, pos + 3));
  191. }
  192. }
  193. if (res == null) {
  194. if ((pos = userAgent.indexOf("Windows")) > -1) {
  195. res = getArray("Win", "Win?",
  196. "Win?" + getVersionNumber(userAgent, pos + 7));
  197. } else if ((pos = userAgent.indexOf("Win")) > -1) {
  198. res = getArray("Win", "Win?",
  199. "Win?" + getVersionNumber(userAgent, pos + 3));
  200. } else
  201. // <SPAN class="codecomment"> Should not happen at this
  202. // point</span>
  203. res = getArray("Win", "Win?", "Win?");
  204. }
  205. } else if ((pos = userAgent.indexOf("Mac OS X")) > -1) {
  206. if ((userAgent.indexOf("iPhone")) > -1) {
  207. pos = userAgent.indexOf("iPhone OS");
  208. if ((userAgent.indexOf("iPod")) > -1) {
  209. res = getArray(
  210. "iOS",
  211. "iOS-iPod",
  212. "iOS-iPod "
  213. + ((pos < 0) ? "" : getVersionNumber(
  214. userAgent, pos + 9)));
  215. } else {
  216. res = getArray(
  217. "iOS",
  218. "iOS-iPhone",
  219. "iOS-iPhone "
  220. + ((pos < 0) ? "" : getVersionNumber(
  221. userAgent, pos + 9)));
  222. }
  223. } else if ((userAgent.indexOf("iPad")) > -1) {
  224. pos = userAgent.indexOf("CPU OS");
  225. res = getArray("iOS", "iOS-iPad", "iOS-iPad "
  226. + ((pos < 0) ? ""
  227. : getVersionNumber(userAgent, pos + 6)));
  228. } else
  229. res = getArray("Mac", "MacOSX",
  230. "MacOS " + getVersionNumber(userAgent, pos + 8));
  231. } else if ((pos = userAgent.indexOf("Android")) > -1) {
  232. res = getArray("Linux", "Android",
  233. "Android " + getVersionNumber(userAgent, pos + 8));
  234. } else if ((pos = userAgent.indexOf("Mac_PowerPC")) > -1) {
  235. res = getArray("Mac", "MacPPC",
  236. "MacOS " + getVersionNumber(userAgent, pos + 3));
  237. } else if ((pos = userAgent.indexOf("Macintosh")) > -1) {
  238. if (userAgent.indexOf("PPC") > -1)
  239. res = getArray("Mac", "MacPPC", "Mac PPC");
  240. else
  241. res = getArray("Mac?", "Mac?", "MacOS?");
  242. } else if ((pos = userAgent.indexOf("FreeBSD")) > -1) {
  243. res = getArray("*BSD", "*BSD FreeBSD", "FreeBSD "
  244. + getVersionNumber(userAgent, pos + 7));
  245. } else if ((pos = userAgent.indexOf("OpenBSD")) > -1) {
  246. res = getArray("*BSD", "*BSD OpenBSD", "OpenBSD "
  247. + getVersionNumber(userAgent, pos + 7));
  248. } else if ((pos = userAgent.indexOf("Linux")) > -1) {
  249. String detail = "Linux " + getVersionNumber(userAgent, pos + 5);
  250. String med = "Linux";
  251. if ((pos = userAgent.indexOf("Ubuntu/")) > -1) {
  252. detail = "Ubuntu " + getVersionNumber(userAgent, pos + 7);
  253. med += " Ubuntu";
  254. }
  255. res = getArray("Linux", med, detail);
  256. } else if ((pos = userAgent.indexOf("CentOS")) > -1) {
  257. res = getArray("Linux", "Linux CentOS", "CentOS");
  258. } else if ((pos = userAgent.indexOf("NetBSD")) > -1) {
  259. res = getArray("*BSD", "*BSD NetBSD",
  260. "NetBSD " + getVersionNumber(userAgent, pos + 6));
  261. } else if ((pos = userAgent.indexOf("Unix")) > -1) {
  262. res = getArray("Linux", "Linux",
  263. "Linux " + getVersionNumber(userAgent, pos + 4));
  264. } else if ((pos = userAgent.indexOf("SunOS")) > -1) {
  265. res = getArray("Unix", "SunOS",
  266. "SunOS" + getVersionNumber(userAgent, pos + 5));
  267. } else if ((pos = userAgent.indexOf("IRIX")) > -1) {
  268. res = getArray("Unix", "IRIX",
  269. "IRIX" + getVersionNumber(userAgent, pos + 4));
  270. } else if ((pos = userAgent.indexOf("SonyEricsson")) > -1) {
  271. res = getArray("SonyEricsson", "SonyEricsson", "SonyEricsson"
  272. + getVersionNumber(userAgent, pos + 12));
  273. } else if ((pos = userAgent.indexOf("Nokia")) > -1) {
  274. res = getArray("Nokia", "Nokia",
  275. "Nokia" + getVersionNumber(userAgent, pos + 5));
  276. } else if ((pos = userAgent.indexOf("BlackBerry")) > -1) {
  277. res = getArray("BlackBerry", "BlackBerry", "BlackBerry"
  278. + getVersionNumber(userAgent, pos + 10));
  279. } else if ((pos = userAgent.indexOf("SymbianOS")) > -1) {
  280. res = getArray("SymbianOS", "SymbianOS", "SymbianOS"
  281. + getVersionNumber(userAgent, pos + 10));
  282. } else if ((pos = userAgent.indexOf("BeOS")) > -1) {
  283. res = getArray("BeOS", "BeOS", "BeOS");
  284. } else if ((pos = userAgent.indexOf("Nintendo Wii")) > -1) {
  285. res = getArray("Nintendo Wii", "Nintendo Wii", "Nintendo Wii"
  286. + getVersionNumber(userAgent, pos + 10));
  287. } else if ((pos = userAgent.indexOf("J2ME/MIDP")) > -1) {
  288. res = getArray("Java", "J2ME", "J2ME/MIDP");
  289. } else
  290. res = getArray("?", "?", "?");
  291. return res;
  292. }
  293. public static String[] getBrowser(String userAgent) {
  294. if (userAgent == null) {
  295. return getArray("?", "?", "?");
  296. }
  297. String[] botName;
  298. if ((botName = getBotName(userAgent)) != null)
  299. return botName;
  300. String[] res = null;
  301. int pos;
  302. if ((pos = userAgent.indexOf("Lotus-Notes/")) > -1) {
  303. res = getArray("LotusNotes", "LotusNotes", "LotusNotes"
  304. + getVersionNumber(userAgent, pos + 12));
  305. } else if ((pos = userAgent.indexOf("Opera")) > -1) {
  306. String ver = getVersionNumber(userAgent, pos + 5);
  307. res = getArray("Opera",
  308. "Opera" + getFirstVersionNumber(userAgent, pos + 5, 1),
  309. "Opera" + ver);
  310. if ((pos = userAgent.indexOf("Opera Mini/")) > -1) {
  311. String ver2 = getVersionNumber(userAgent, pos + 11);
  312. res = getArray("Opera", "Opera Mini", "Opera Mini " + ver2);
  313. } else if ((pos = userAgent.indexOf("Opera Mobi/")) > -1) {
  314. String ver2 = getVersionNumber(userAgent, pos + 11);
  315. res = getArray("Opera", "Opera Mobi", "Opera Mobi " + ver2);
  316. }
  317. } else if (userAgent.indexOf("MSIE") > -1) {
  318. if ((pos = userAgent.indexOf("MSIE 6.0")) > -1) {
  319. res = getArray("MSIE", "MSIE6",
  320. "MSIE" + getVersionNumber(userAgent, pos + 4));
  321. } else if ((pos = userAgent.indexOf("MSIE 5.0")) > -1) {
  322. res = getArray("MSIE", "MSIE5",
  323. "MSIE" + getVersionNumber(userAgent, pos + 4));
  324. } else if ((pos = userAgent.indexOf("MSIE 5.5")) > -1) {
  325. res = getArray("MSIE", "MSIE5.5",
  326. "MSIE" + getVersionNumber(userAgent, pos + 4));
  327. } else if ((pos = userAgent.indexOf("MSIE 5.")) > -1) {
  328. res = getArray("MSIE", "MSIE5.x",
  329. "MSIE" + getVersionNumber(userAgent, pos + 4));
  330. } else if ((pos = userAgent.indexOf("MSIE 4")) > -1) {
  331. res = getArray("MSIE", "MSIE4",
  332. "MSIE" + getVersionNumber(userAgent, pos + 4));
  333. } else if ((pos = userAgent.indexOf("MSIE 7")) > -1
  334. && userAgent.indexOf("Trident/4.0") < 0) {
  335. res = getArray("MSIE", "MSIE7",
  336. "MSIE" + getVersionNumber(userAgent, pos + 4));
  337. } else if ((pos = userAgent.indexOf("MSIE 8")) > -1
  338. || userAgent.indexOf("Trident/4.0") > -1) {
  339. res = getArray("MSIE", "MSIE8",
  340. "MSIE" + getVersionNumber(userAgent, pos + 4));
  341. } else if ((pos = userAgent.indexOf("MSIE 9")) > -1
  342. || userAgent.indexOf("Trident/4.0") > -1) {
  343. res = getArray("MSIE", "MSIE9",
  344. "MSIE" + getVersionNumber(userAgent, pos + 4));
  345. } else
  346. res = getArray(
  347. "MSIE",
  348. "MSIE?",
  349. "MSIE?"
  350. + getVersionNumber(userAgent,
  351. userAgent.indexOf("MSIE") + 4));
  352. } else if ((pos = userAgent.indexOf("Gecko/")) > -1) {
  353. res = getArray("Gecko", "Gecko",
  354. "Gecko" + getFirstVersionNumber(userAgent, pos + 5, 4));
  355. if ((pos = userAgent.indexOf("Camino/")) > -1) {
  356. res[1] += "(Camino)";
  357. res[2] += "(Camino" + getVersionNumber(userAgent, pos + 7)
  358. + ")";
  359. } else if ((pos = userAgent.indexOf("Chimera/")) > -1) {
  360. res[1] += "(Chimera)";
  361. res[2] += "(Chimera" + getVersionNumber(userAgent, pos + 8)
  362. + ")";
  363. } else if ((pos = userAgent.indexOf("Firebird/")) > -1) {
  364. res[1] += "(Firebird)";
  365. res[2] += "(Firebird" + getVersionNumber(userAgent, pos + 9)
  366. + ")";
  367. } else if ((pos = userAgent.indexOf("Phoenix/")) > -1) {
  368. res[1] += "(Phoenix)";
  369. res[2] += "(Phoenix" + getVersionNumber(userAgent, pos + 8)
  370. + ")";
  371. } else if ((pos = userAgent.indexOf("Galeon/")) > -1) {
  372. res[1] += "(Galeon)";
  373. res[2] += "(Galeon" + getVersionNumber(userAgent, pos + 7)
  374. + ")";
  375. } else if ((pos = userAgent.indexOf("Firefox/")) > -1) {
  376. res[1] += "(Firefox)";
  377. res[2] += "(Firefox" + getVersionNumber(userAgent, pos + 8)
  378. + ")";
  379. } else if ((pos = userAgent.indexOf("Netscape/")) > -1) {
  380. if ((pos = userAgent.indexOf("Netscape/6")) > -1) {
  381. res[1] += "(NS6)";
  382. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  383. + ")";
  384. } else if ((pos = userAgent.indexOf("Netscape/7")) > -1) {
  385. res[1] += "(NS7)";
  386. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  387. + ")";
  388. } else if ((pos = userAgent.indexOf("Netscape/8")) > -1) {
  389. res[1] += "(NS8)";
  390. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  391. + ")";
  392. } else if ((pos = userAgent.indexOf("Netscape/9")) > -1) {
  393. res[1] += "(NS9)";
  394. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  395. + ")";
  396. } else {
  397. res[1] += "(NS?)";
  398. res[2] += "(NS?"
  399. + getVersionNumber(userAgent,
  400. userAgent.indexOf("Netscape/") + 9) + ")";
  401. }
  402. }
  403. } else if ((pos = userAgent.indexOf("Netscape/")) > -1) {
  404. if ((pos = userAgent.indexOf("Netscape/4")) > -1) {
  405. res = getArray("NS", "NS4",
  406. "NS" + getVersionNumber(userAgent, pos + 9));
  407. } else
  408. res = getArray("NS", "NS?",
  409. "NS?" + getVersionNumber(userAgent, pos + 9));
  410. } else if ((pos = userAgent.indexOf("Chrome/")) > -1) {
  411. res = getArray("KHTML", "KHTML(Chrome)", "KHTML(Chrome"
  412. + getVersionNumber(userAgent, pos + 6) + ")");
  413. } else if ((pos = userAgent.indexOf("Safari/")) > -1) {
  414. res = getArray("KHTML", "KHTML(Safari)", "KHTML(Safari"
  415. + getVersionNumber(userAgent, pos + 6) + ")");
  416. } else if ((pos = userAgent.indexOf("Konqueror/")) > -1) {
  417. res = getArray("KHTML", "KHTML(Konqueror)", "KHTML(Konqueror"
  418. + getVersionNumber(userAgent, pos + 9) + ")");
  419. } else if ((pos = userAgent.indexOf("KHTML")) > -1) {
  420. res = getArray("KHTML", "KHTML?",
  421. "KHTML?(" + getVersionNumber(userAgent, pos + 5) + ")");
  422. } else if ((pos = userAgent.indexOf("NetFront")) > -1) {
  423. res = getArray("NetFront", "NetFront", "NetFront "
  424. + getVersionNumber(userAgent, pos + 8));
  425. } else if ((pos = userAgent.indexOf("BlackBerry")) > -1) {
  426. pos = userAgent.indexOf("/", pos + 2);
  427. res = getArray("BlackBerry", "BlackBerry", "BlackBerry"
  428. + getVersionNumber(userAgent, pos + 1));
  429. } else if (userAgent.indexOf("Mozilla/4.") == 0
  430. && userAgent.indexOf("Mozilla/4.0") < 0
  431. && userAgent.indexOf("Mozilla/4.5 ") < 0) {
  432. // <SPAN class="codecomment"> We will interpret Mozilla/4.x as
  433. // Netscape Communicator is and only if x</span>
  434. // <SPAN class="codecomment"> is not 0 or 5</span>
  435. res = getArray("Communicator", "Communicator", "Communicator"
  436. + getVersionNumber(userAgent, pos + 8));
  437. } else
  438. return getArray("?", "?", "?");
  439. return res;
  440. }
  441. }