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 }