1 package org.apache.turbine.util; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import net.sf.uadetector.OperatingSystem; 7 import net.sf.uadetector.ReadableUserAgent; 8 import net.sf.uadetector.UserAgentStringParser; 9 import net.sf.uadetector.VersionNumber; 10 import net.sf.uadetector.service.UADetectorServiceFactory; 11 12 /* 13 * Licensed to the Apache Software Foundation (ASF) under one 14 * or more contributor license agreements. See the NOTICE file 15 * distributed with this work for additional information 16 * regarding copyright ownership. The ASF licenses this file 17 * to you under the Apache License, Version 2.0 (the 18 * "License"); you may not use this file except in compliance 19 * with the License. You may obtain a copy of the License at 20 * 21 * http://www.apache.org/licenses/LICENSE-2.0 22 * 23 * Unless required by applicable law or agreed to in writing, 24 * software distributed under the License is distributed on an 25 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 26 * KIND, either express or implied. See the License for the 27 * specific language governing permissions and limitations 28 * under the License. 29 */ 30 31 /** 32 * This class parses the user agent string and provides getters for 33 * its parts. It uses UADetector (http://uadetector.sourceforge.net/) 34 * 35 * @author <a href="mailto:frank.kim@clearink.com">Frank Y. Kim</a> 36 * @author <a href="mailto:leon@clearink.com">Leon Atkisnon</a> 37 * @author <a href="mailto:mospaw@polk-county.com">Chris Mospaw</a> 38 * @author <a href="mailto:bgriffin@cddb.com">Benjamin Elijah Griffin</a> 39 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a> 40 */ 41 public class BrowserDetector 42 { 43 /** The user agent string. */ 44 private String userAgentString = ""; 45 46 /** The user agent cache. */ 47 private static volatile Map<String, ReadableUserAgent> userAgentCache = 48 new HashMap<String, ReadableUserAgent>(); 49 50 /** The user agent parser */ 51 private static UserAgentStringParser parser = 52 UADetectorServiceFactory.getCachingAndUpdatingParser(); 53 54 /** The browser name specified in the user agent string. */ 55 private String browserName = ""; 56 57 /** 58 * The browser version specified in the user agent string. If we 59 * can't parse the version just assume an old browser. 60 */ 61 private float browserVersion = (float) 1.0; 62 63 /** 64 * The browser platform specified in the user agent string. 65 */ 66 private String browserPlatform = "unknown"; 67 68 /** 69 * Constructor used to initialize this class. 70 * 71 * @param userAgentString A String with the user agent field. 72 */ 73 public BrowserDetector(String userAgentString) 74 { 75 this.userAgentString = userAgentString; 76 parse(); 77 } 78 79 /** 80 * Constructor used to initialize this class. 81 * 82 * @param data The Turbine RunData object. 83 */ 84 public BrowserDetector(RunData data) 85 { 86 this(data.getUserAgent()); 87 } 88 89 /** 90 * The browser name specified in the user agent string. 91 * 92 * @return A String with the browser name. 93 */ 94 public String getBrowserName() 95 { 96 return browserName; 97 } 98 99 /** 100 * The browser platform specified in the user agent string. 101 * 102 * @return A String with the browser platform. 103 */ 104 public String getBrowserPlatform() 105 { 106 return browserPlatform; 107 } 108 109 /** 110 * The browser version specified in the user agent string. 111 * 112 * @return A String with the browser version. 113 */ 114 public float getBrowserVersion() 115 { 116 return browserVersion; 117 } 118 119 /** 120 * The user agent string for this class. 121 * 122 * @return A String with the user agent. 123 */ 124 public String getUserAgentString() 125 { 126 return userAgentString; 127 } 128 129 /** 130 * The user agent for this class. 131 * 132 * @return A user agent. 133 */ 134 public ReadableUserAgent getUserAgent() 135 { 136 return userAgentCache.get(userAgentString); 137 } 138 139 /** 140 * Helper method to initialize this class. 141 */ 142 private void parse() 143 { 144 ReadableUserAgent userAgent = userAgentCache.get(userAgentString); 145 146 if (userAgent == null) 147 { 148 userAgent = parser.parse(userAgentString); 149 userAgentCache.put(userAgentString, userAgent); 150 } 151 152 // Get the browser name and version. 153 browserName = userAgent.getName(); 154 VersionNumber version = userAgent.getVersionNumber(); 155 browserVersion = toFloat(version.toVersionString()); 156 157 // Try to figure out what platform. 158 OperatingSystem os = userAgent.getOperatingSystem(); 159 browserPlatform = os.getFamilyName(); 160 } 161 162 /** 163 * Helper method to convert String to a float. 164 * 165 * @param s A String. 166 * @return The String converted to float. 167 */ 168 private static final float toFloat(String s) 169 { 170 return Float.parseFloat(s); 171 } 172 173 }