blob: 30aa42bf157e71ff9af9f06069967b2b495ec47d [file] [log] [blame]
package org.apache.turbine.util;
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* This class parses the user agent string and sets javasciptOK and
* cssOK following the rules described below. If you want to check
* for specific browsers/versions then use this class to parse the
* user agent string and use the accessor methods in this class.
*
* JavaScriptOK means that the browser understands JavaScript on the
* same level the Navigator 3 does. Specifically, it can use named
* images. This allows easier rollovers. If a browser doesn't do
* this (Nav 2 or MSIE 3), then we just assume it can't do any
* JavaScript. Referencing images by load order is too hard to
* maintain.
*
* CSSOK is kind of sketchy in that Nav 4 and MSIE work differently,
* but they do seem to have most of the functionality. MSIE 4 for the
* Mac has buggy CSS support, so we let it do JavaScript, but no CSS.
*
* Ported from Leon's PHP code at
* http://www.working-dogs.com/freetrade by Frank.
*
* @author <a href="mailto:frank.kim@clearink.com">Frank Y. Kim</a>
* @author <a href="mailto:leon@clearink.com">Leon Atkisnon</a>
* @author <a href="mailto:mospaw@polk-county.com">Chris Mospaw</a>
* @author <a href="mailto:bgriffin@cddb.com">Benjamin Elijah Griffin</a>
* @version $Id$
*/
public class BrowserDetector
{
public static final String MSIE = "MSIE";
public static final String OPERA = "Opera";
public static final String MOZILLA = "Mozilla";
public static final String WINDOWS = "Windows";
public static final String UNIX = "Unix";
public static final String MACINTOSH = "Macintosh";
/** The user agent string. */
private String userAgentString = "";
/** The browser name specified in the user agent string. */
private String browserName = "";
/**
* The browser version specified in the user agent string. If we
* can't parse the version just assume an old browser.
*/
private float browserVersion = (float) 1.0;
/**
* The browser platform specified in the user agent string.
*/
private String browserPlatform = "unknown";
/** Whether or not javascript works in this browser. */
private boolean javascriptOK = false;
/** Whether or not CSS works in this browser. */
private boolean cssOK = false;
/** Whether or not file upload works in this browser. */
private boolean fileUploadOK = false;
/**
* Constructor used to initialize this class.
*
* @param userAgentString A String with the user agent field.
*/
public BrowserDetector(String userAgentString)
{
this.userAgentString = userAgentString;
parse();
}
/**
* Constructor used to initialize this class.
*
* @param data The Turbine RunData object.
*/
public BrowserDetector(RunData data)
{
this.userAgentString = data.getUserAgent();
parse();
}
/**
* Whether or not CSS works in this browser.
*
* @return True if CSS works in this browser.
*/
public boolean isCssOK()
{
return cssOK;
}
/**
* Whether or not file upload works in this browser.
*
* @return True if file upload works in this browser.
*/
public boolean isFileUploadOK()
{
return fileUploadOK;
}
/**
* Whether or not Javascript works in this browser.
*
* @return True if Javascript works in this browser.
*/
public boolean isJavascriptOK()
{
return javascriptOK;
}
/**
* The browser name specified in the user agent string.
*
* @return A String with the browser name.
*/
public String getBrowserName()
{
return browserName;
}
/**
* The browser platform specified in the user agent string.
*
* @return A String with the browser platform.
*/
public String getBrowserPlatform()
{
return browserPlatform;
}
/**
* The browser version specified in the user agent string.
*
* @return A String with the browser version.
*/
public float getBrowserVersion()
{
return browserVersion;
}
/**
* The user agent string for this class.
*
* @return A String with the user agent.
*/
public String getUserAgentString()
{
return userAgentString;
}
/**
* Helper method to initialize this class.
*/
private void parse()
{
int versionStartIndex = userAgentString.indexOf("/");
int versionEndIndex = userAgentString.indexOf(" ");
// Get the browser name and version.
browserName = userAgentString.substring(0, versionStartIndex);
try
{
// Not all user agents will have a space in the reported
// string.
String agentSubstring = null;
if (versionEndIndex < 0)
{
agentSubstring
= userAgentString.substring(versionStartIndex + 1);
}
else
{
agentSubstring = userAgentString
.substring(versionStartIndex + 1, versionEndIndex);
}
browserVersion = toFloat(agentSubstring);
}
catch (NumberFormatException e)
{
// Just use the default value.
}
// MSIE lies about its name. Of course...
if (userAgentString.indexOf(MSIE) != -1)
{
// Ex: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
versionStartIndex = (userAgentString.indexOf(MSIE)
+ MSIE.length() + 1);
versionEndIndex = userAgentString.indexOf(";", versionStartIndex);
browserName = MSIE;
try
{
browserVersion = toFloat(userAgentString
.substring(versionStartIndex, versionEndIndex));
}
catch (NumberFormatException e)
{
// Just use the default value.
}
// PHP code
// $Browser_Name = "MSIE";
// $Browser_Version = strtok("MSIE");
// $Browser_Version = strtok(" ");
// $Browser_Version = strtok(";");
}
// Opera isn't completely honest, either...
// Modificaton by Chris Mospaw <mospaw@polk-county.com>
if (userAgentString.indexOf(OPERA) != -1)
{
//Ex: Mozilla/4.0 (Windows NT 4.0;US) Opera 3.61 [en]
versionStartIndex = (userAgentString.indexOf(OPERA)
+ OPERA.length() + 1);
versionEndIndex = userAgentString.indexOf(" ", versionStartIndex);
browserName = OPERA;
try
{
browserVersion = toFloat(userAgentString
.substring(versionStartIndex, versionEndIndex));
}
catch (NumberFormatException e)
{
// Just use the default value.
}
// PHP code
// $Browser_Name = "Opera";
// $Browser_Version = strtok("Opera");
// $Browser_Version = strtok("/");
// $Browser_Version = strtok(";");
}
// Try to figure out what platform.
if ((userAgentString.indexOf("Windows") != -1)
|| (userAgentString.indexOf("WinNT") != -1)
|| (userAgentString.indexOf("Win98") != -1)
|| (userAgentString.indexOf("Win95") != -1))
{
browserPlatform = WINDOWS;
}
if (userAgentString.indexOf("Mac") != -1)
{
browserPlatform = MACINTOSH;
}
if (userAgentString.indexOf("X11") != -1)
{
browserPlatform = UNIX;
}
if (browserPlatform == WINDOWS)
{
if (browserName.equals(MOZILLA))
{
if (browserVersion >= 3.0)
{
javascriptOK = true;
fileUploadOK = true;
}
if (browserVersion >= 4.0)
{
cssOK = true;
}
}
else if (browserName == MSIE)
{
if (browserVersion >= 4.0)
{
javascriptOK = true;
fileUploadOK = true;
cssOK = true;
}
}
else if (browserName == OPERA)
{
if (browserVersion >= 3.0)
{
javascriptOK = true;
fileUploadOK = true;
cssOK = true;
}
}
}
else if (browserPlatform == MACINTOSH)
{
if (browserName.equals(MOZILLA))
{
if (browserVersion >= 3.0)
{
javascriptOK = true;
fileUploadOK = true;
}
if (browserVersion >= 4.0)
{
cssOK = true;
}
}
else if (browserName == MSIE)
{
if (browserVersion >= 4.0)
{
javascriptOK = true;
fileUploadOK = true;
}
if (browserVersion > 4.0)
{
cssOK = true;
}
}
}
else if (browserPlatform == UNIX)
{
if (browserName.equals(MOZILLA))
{
if (browserVersion >= 3.0)
{
javascriptOK = true;
fileUploadOK = true;
}
if (browserVersion >= 4.0)
{
cssOK = true;
}
}
}
}
/**
* Helper method to convert String to a float.
*
* @param s A String.
* @return The String converted to float.
*/
private static final float toFloat(String s)
{
return Float.valueOf(s).floatValue();
}
}