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 }