View Javadoc
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 }