View Javadoc

1   /*
2    * FCKeditor - The text editor for Internet - http://www.fckeditor.net
3    * Copyright (C) 2004-2009 Frederico Caldeira Knabben
4    * 
5    * == BEGIN LICENSE ==
6    * 
7    * Licensed under the terms of any of the following licenses at your
8    * choice:
9    * 
10   *  - GNU General Public License Version 2 or later (the "GPL")
11   *    http://www.gnu.org/licenses/gpl.html
12   * 
13   *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
14   *    http://www.gnu.org/licenses/lgpl.html
15   * 
16   *  - Mozilla Public License Version 1.1 or later (the "MPL")
17   *    http://www.mozilla.org/MPL/MPL-1.1.html
18   * 
19   * == END LICENSE ==
20   */
21  package net.fckeditor.tool;
22  
23  import java.util.regex.Matcher;
24  import java.util.regex.Pattern;
25  
26  import javax.servlet.http.HttpServletRequest;
27  
28  import net.fckeditor.FCKeditor;
29  
30  /**
31   * Checks browser compatibility with the {@link FCKeditor editor}.
32   * 
33   * @version $Id: Compatibility.java 3595 2009-06-01 20:02:02Z mosipov $
34   */
35  public class Compatibility {
36  
37  	/**
38  	 * Checks if a browser's user agent string is compatible with the FCKeditor.
39  	 * 
40  	 * @param userAgentString
41  	 *            the user agent string of a browser
42  	 * @return <code>true</code> if compatible, else <code>false</code>
43  	 */
44  	public static boolean check(final String userAgentString) {
45  		if (Utils.isEmpty(userAgentString))
46  			return false;
47  
48  		String userAgentStr = userAgentString.toLowerCase();
49  
50  		// IE 5.5+, check special keys like 'Opera' and 'mac', because there are
51  		// some
52  		// other browsers, containing 'MSIE' in there agent string!
53  		if (userAgentStr.indexOf("opera") < 0
54  				&& userAgentStr.indexOf("mac") < 0
55  				&& getBrowserVersion(userAgentStr, ".*msie ([\\d]+.[\\d]+).*") >= 5.5f)
56  			return true;
57  
58  		// for all gecko based browsers
59  		if (getBrowserVersion(userAgentStr, ".*rv:([\\d]+.[\\d]+).*") > 1.7f)
60  			return true;
61  
62  		// Opera 9.5+
63  		if (getBrowserVersion(userAgentStr, "opera/([\\d]+.[\\d]+).*") >= 9.5f
64  				|| getBrowserVersion(userAgentStr, ".*opera ([\\d]+.[\\d]+)") >= 9.5f)
65  			return true;
66  
67  		// Safari 3+
68  		if (getBrowserVersion(userAgentStr, ".*applewebkit/([\\d]+).*") >= 522f)
69  			return true;
70  
71  		return false;
72  	}
73  
74  	/**
75  	 * Returns <code>true</code> if a browser is compatible by its request
76  	 * user-agent header.
77  	 * 
78  	 * @see #check(String)
79  	 * @param request
80  	 *            current user request instance
81  	 * @return <code>true</code> if a browser is compatible, else
82  	 *         <code>false</code>
83  	 */
84  	public static boolean isCompatibleBrowser(final HttpServletRequest request) {
85  		return (request == null) ? false : check(request
86  				.getHeader("user-agent"));
87  	}
88  
89  	/**
90  	 * Helper method to get the browser version from 'userAgent' with regex. The
91  	 * first matching group has to be the version number!
92  	 * 
93  	 * @param userAgentString
94  	 *            the user agent string of a browser
95  	 * @param regex
96  	 *            the pattern to retrieve the browser version
97  	 * @return the browser version, or -1f if version can't be determined
98  	 */
99  	private static float getBrowserVersion(final String userAgentString,
100 			final String regex) {
101 		Pattern pattern = Pattern.compile(regex);
102 		Matcher matcher = pattern.matcher(userAgentString);
103 		if (matcher.matches()) {
104 			try {
105 				return Float.parseFloat(matcher.group(1));
106 			} catch (NumberFormatException e) {
107 				return -1f;
108 			}
109 		}
110 		return -1f;
111 	}
112 
113 }