Coverage Report - org.apache.turbine.util.BrowserDetector
 
Classes in this File Line Coverage Branch Coverage Complexity
BrowserDetector
63%
59/93
34%
20/58
3,909
 
 1  
 package org.apache.turbine.util;
 2  
 
 3  
 /*
 4  
  * Licensed to the Apache Software Foundation (ASF) under one
 5  
  * or more contributor license agreements.  See the NOTICE file
 6  
  * distributed with this work for additional information
 7  
  * regarding copyright ownership.  The ASF licenses this file
 8  
  * to you under the Apache License, Version 2.0 (the
 9  
  * "License"); you may not use this file except in compliance
 10  
  * with the License.  You may obtain a copy of the License at
 11  
  *
 12  
  *   http://www.apache.org/licenses/LICENSE-2.0
 13  
  *
 14  
  * Unless required by applicable law or agreed to in writing,
 15  
  * software distributed under the License is distributed on an
 16  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 17  
  * KIND, either express or implied.  See the License for the
 18  
  * specific language governing permissions and limitations
 19  
  * under the License.
 20  
  */
 21  
 
 22  
 /**
 23  
  * This class parses the user agent string and sets javasciptOK and
 24  
  * cssOK following the rules described below.  If you want to check
 25  
  * for specific browsers/versions then use this class to parse the
 26  
  * user agent string and use the accessor methods in this class.
 27  
  *
 28  
  * JavaScriptOK means that the browser understands JavaScript on the
 29  
  * same level the Navigator 3 does.  Specifically, it can use named
 30  
  * images.  This allows easier rollovers.  If a browser doesn't do
 31  
  * this (Nav 2 or MSIE 3), then we just assume it can't do any
 32  
  * JavaScript.  Referencing images by load order is too hard to
 33  
  * maintain.
 34  
  *
 35  
  * CSSOK is kind of sketchy in that Nav 4 and MSIE work differently,
 36  
  * but they do seem to have most of the functionality.  MSIE 4 for the
 37  
  * Mac has buggy CSS support, so we let it do JavaScript, but no CSS.
 38  
  *
 39  
  * Ported from Leon's PHP code at
 40  
  * http://www.working-dogs.com/freetrade by Frank.
 41  
  *
 42  
  * @author <a href="mailto:frank.kim@clearink.com">Frank Y. Kim</a>
 43  
  * @author <a href="mailto:leon@clearink.com">Leon Atkisnon</a>
 44  
  * @author <a href="mailto:mospaw@polk-county.com">Chris Mospaw</a>
 45  
  * @author <a href="mailto:bgriffin@cddb.com">Benjamin Elijah Griffin</a>
 46  
  * @version $Id: BrowserDetector.java 1706239 2015-10-01 13:18:35Z tv $
 47  
  */
 48  
 public class BrowserDetector
 49  
 {
 50  
     /** Internet Explorer */
 51  
     public static final String MSIE = "MSIE";
 52  
     /** Opera */
 53  
     public static final String OPERA = "Opera";
 54  
     /** Mozilla, Firefox and friends */
 55  
     public static final String MOZILLA = "Mozilla";
 56  
 
 57  
     /** Running on Windows */
 58  
     public static final String WINDOWS = "Windows";
 59  
     /** Running on Unix */
 60  
     public static final String UNIX = "Unix";
 61  
     /** Running on Mac OS X */
 62  
     public static final String MACINTOSH = "Macintosh";
 63  
 
 64  
     /** The user agent string. */
 65  5
     private String userAgentString = "";
 66  
 
 67  
     /** The browser name specified in the user agent string. */
 68  5
     private String browserName = "";
 69  
 
 70  
     /**
 71  
      * The browser version specified in the user agent string.  If we
 72  
      * can't parse the version just assume an old browser.
 73  
      */
 74  5
     private float browserVersion = (float) 1.0;
 75  
 
 76  
     /**
 77  
      * The browser platform specified in the user agent string.
 78  
      */
 79  5
     private String browserPlatform = "unknown";
 80  
 
 81  
     /** Whether or not javascript works in this browser. */
 82  5
     private boolean javascriptOK = false;
 83  
 
 84  
     /** Whether or not CSS works in this browser. */
 85  5
     private boolean cssOK = false;
 86  
 
 87  
     /** Whether or not file upload works in this browser. */
 88  5
     private boolean fileUploadOK = false;
 89  
 
 90  
     /**
 91  
      * Constructor used to initialize this class.
 92  
      *
 93  
      * @param userAgentString A String with the user agent field.
 94  
      */
 95  
     public BrowserDetector(String userAgentString)
 96  5
     {
 97  5
         this.userAgentString = userAgentString;
 98  5
         parse();
 99  5
     }
 100  
 
 101  
     /**
 102  
      * Constructor used to initialize this class.
 103  
      *
 104  
      * @param data The Turbine RunData object.
 105  
      */
 106  
     public BrowserDetector(RunData data)
 107  0
     {
 108  0
         this.userAgentString = data.getUserAgent();
 109  0
         parse();
 110  0
     }
 111  
 
 112  
     /**
 113  
      * Whether or not CSS works in this browser.
 114  
      *
 115  
      * @return True if CSS works in this browser.
 116  
      */
 117  
     public boolean isCssOK()
 118  
     {
 119  0
         return cssOK;
 120  
     }
 121  
 
 122  
     /**
 123  
      * Whether or not file upload works in this browser.
 124  
      *
 125  
      * @return True if file upload works in this browser.
 126  
      */
 127  
     public boolean isFileUploadOK()
 128  
     {
 129  0
         return fileUploadOK;
 130  
     }
 131  
 
 132  
     /**
 133  
      * Whether or not Javascript works in this browser.
 134  
      *
 135  
      * @return True if Javascript works in this browser.
 136  
      */
 137  
     public boolean isJavascriptOK()
 138  
     {
 139  0
         return javascriptOK;
 140  
     }
 141  
 
 142  
     /**
 143  
      * The browser name specified in the user agent string.
 144  
      *
 145  
      * @return A String with the browser name.
 146  
      */
 147  
     public String getBrowserName()
 148  
     {
 149  5
         return browserName;
 150  
     }
 151  
 
 152  
     /**
 153  
      * The browser platform specified in the user agent string.
 154  
      *
 155  
      * @return A String with the browser platform.
 156  
      */
 157  
     public String getBrowserPlatform()
 158  
     {
 159  5
         return browserPlatform;
 160  
     }
 161  
 
 162  
     /**
 163  
      * The browser version specified in the user agent string.
 164  
      *
 165  
      * @return A String with the browser version.
 166  
      */
 167  
     public float getBrowserVersion()
 168  
     {
 169  5
         return browserVersion;
 170  
     }
 171  
 
 172  
     /**
 173  
      * The user agent string for this class.
 174  
      *
 175  
      * @return A String with the user agent.
 176  
      */
 177  
     public String getUserAgentString()
 178  
     {
 179  0
         return userAgentString;
 180  
     }
 181  
 
 182  
     /**
 183  
      * Helper method to initialize this class.
 184  
      */
 185  
     private void parse()
 186  
     {
 187  5
         int versionStartIndex = userAgentString.indexOf("/");
 188  5
         int versionEndIndex = userAgentString.indexOf(" ");
 189  
 
 190  
         // Get the browser name and version.
 191  5
         browserName = userAgentString.substring(0, versionStartIndex);
 192  
         try
 193  
         {
 194  
             // Not all user agents will have a space in the reported
 195  
             // string.
 196  5
             String agentSubstring = null;
 197  5
             if (versionEndIndex < 0)
 198  
             {
 199  0
                 agentSubstring
 200  
                         = userAgentString.substring(versionStartIndex + 1);
 201  
             }
 202  
             else
 203  
             {
 204  5
                 agentSubstring = userAgentString
 205  
                         .substring(versionStartIndex + 1, versionEndIndex);
 206  
             }
 207  5
             browserVersion = toFloat(agentSubstring);
 208  
         }
 209  0
         catch (NumberFormatException e)
 210  
         {
 211  
             // Just use the default value.
 212  5
         }
 213  
 
 214  
         // MSIE lies about its name.  Of course...
 215  5
         if (userAgentString.indexOf(MSIE) != -1)
 216  
         {
 217  
             // Ex: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
 218  3
             versionStartIndex = (userAgentString.indexOf(MSIE)
 219  
                     + MSIE.length() + 1);
 220  3
             versionEndIndex = userAgentString.indexOf(";", versionStartIndex);
 221  
 
 222  3
             browserName = MSIE;
 223  
             try
 224  
             {
 225  3
                 browserVersion = toFloat(userAgentString
 226  
                         .substring(versionStartIndex, versionEndIndex));
 227  
             }
 228  0
             catch (NumberFormatException e)
 229  
             {
 230  
                 // Just use the default value.
 231  3
             }
 232  
 
 233  
             // PHP code
 234  
             // $Browser_Name = "MSIE";
 235  
             // $Browser_Version = strtok("MSIE");
 236  
             // $Browser_Version = strtok(" ");
 237  
             // $Browser_Version = strtok(";");
 238  
         }
 239  
 
 240  
         // Opera isn't completely honest, either...
 241  
         // Modificaton by Chris Mospaw <mospaw@polk-county.com>
 242  5
         if (userAgentString.indexOf(OPERA) != -1)
 243  
         {
 244  
             // Ex: Mozilla/4.0 (Windows NT 4.0;US) Opera 3.61  [en]
 245  
             // Ex: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.02
 246  2
             versionStartIndex = (userAgentString.indexOf(OPERA)
 247  
                     + OPERA.length() + 1);
 248  2
             versionEndIndex = userAgentString.indexOf(" ", versionStartIndex);
 249  2
             if (versionEndIndex == -1)
 250  
             {
 251  1
                 versionEndIndex = userAgentString.length();
 252  
             }
 253  
 
 254  2
             browserName = OPERA;
 255  
             try
 256  
             {
 257  2
                 browserVersion = toFloat(userAgentString
 258  
                         .substring(versionStartIndex, versionEndIndex));
 259  
             }
 260  0
             catch (NumberFormatException e)
 261  
             {
 262  
                 // Just use the default value.
 263  2
             }
 264  
 
 265  
             // PHP code
 266  
             // $Browser_Name = "Opera";
 267  
             // $Browser_Version = strtok("Opera");
 268  
             // $Browser_Version = strtok("/");
 269  
             // $Browser_Version = strtok(";");
 270  
         }
 271  
 
 272  
 
 273  
         // Try to figure out what platform.
 274  5
         if ((userAgentString.indexOf("Windows") != -1)
 275  
                 || (userAgentString.indexOf("WinNT") != -1)
 276  
                 || (userAgentString.indexOf("Win98") != -1)
 277  
                 || (userAgentString.indexOf("Win95") != -1))
 278  
         {
 279  5
             browserPlatform = WINDOWS;
 280  
         }
 281  
 
 282  5
         if (userAgentString.indexOf("Mac") != -1)
 283  
         {
 284  0
             browserPlatform = MACINTOSH;
 285  
         }
 286  
 
 287  5
         if (userAgentString.indexOf("X11") != -1)
 288  
         {
 289  0
             browserPlatform = UNIX;
 290  
         }
 291  
 
 292  5
         if (browserPlatform == WINDOWS)
 293  
         {
 294  5
             if (browserName.equals(MOZILLA))
 295  
             {
 296  1
                 if (browserVersion >= 3.0)
 297  
                 {
 298  1
                     javascriptOK = true;
 299  1
                     fileUploadOK = true;
 300  
                 }
 301  1
                 if (browserVersion >= 4.0)
 302  
                 {
 303  1
                     cssOK = true;
 304  
                 }
 305  
             }
 306  4
             else if (browserName == MSIE)
 307  
             {
 308  2
                 if (browserVersion >= 4.0)
 309  
                 {
 310  2
                     javascriptOK = true;
 311  2
                     fileUploadOK = true;
 312  2
                     cssOK = true;
 313  
                 }
 314  
             }
 315  2
             else if (browserName == OPERA)
 316  
             {
 317  2
                 if (browserVersion >= 3.0)
 318  
                 {
 319  2
                     javascriptOK = true;
 320  2
                     fileUploadOK = true;
 321  2
                     cssOK = true;
 322  
                 }
 323  
             }
 324  
         }
 325  0
         else if (browserPlatform == MACINTOSH)
 326  
         {
 327  0
             if (browserName.equals(MOZILLA))
 328  
             {
 329  0
                 if (browserVersion >= 3.0)
 330  
                 {
 331  0
                     javascriptOK = true;
 332  0
                     fileUploadOK = true;
 333  
                 }
 334  0
                 if (browserVersion >= 4.0)
 335  
                 {
 336  0
                     cssOK = true;
 337  
                 }
 338  
             }
 339  0
             else if (browserName == MSIE)
 340  
             {
 341  0
                 if (browserVersion >= 4.0)
 342  
                 {
 343  0
                     javascriptOK = true;
 344  0
                     fileUploadOK = true;
 345  
                 }
 346  0
                 if (browserVersion > 4.0)
 347  
                 {
 348  0
                     cssOK = true;
 349  
                 }
 350  
             }
 351  
         }
 352  0
         else if (browserPlatform == UNIX)
 353  
         {
 354  0
             if (browserName.equals(MOZILLA))
 355  
             {
 356  0
                 if (browserVersion >= 3.0)
 357  
                 {
 358  0
                     javascriptOK = true;
 359  0
                     fileUploadOK = true;
 360  
                 }
 361  0
                 if (browserVersion >= 4.0)
 362  
                 {
 363  0
                     cssOK = true;
 364  
                 }
 365  
             }
 366  
         }
 367  5
     }
 368  
 
 369  
     /**
 370  
      * Helper method to convert String to a float.
 371  
      *
 372  
      * @param s A String.
 373  
      * @return The String converted to float.
 374  
      */
 375  
     private static final float toFloat(String s)
 376  
     {
 377  10
         return Float.valueOf(s).floatValue();
 378  
     }
 379  
 
 380  
 }