Author: cbrisson
Date: Sat Nov 5 01:39:24 2016
New Revision: 1768140
URL: http://svn.apache.org/viewvc?rev=1768140&view=rev
Log:
[tools] BrowserTool: do device parsing without relying on Apache DeviceMap
The initial plan was to rely on Apache DeviceMap to identify the kind of device
(among desktop, tablet, mobile, tv, robot), but DeviceMap is stalled and meant
to move to the Attic. So, implement a basic device type detection in
BrowserTool.
Added:
velocity/tools/trunk/velocity-tools-browser/src/test/resources/devices.txt
- copied, changed from r1765879,
velocity/tools/trunk/velocity-tools-browser/src/test/resources/robots.txt
Removed:
velocity/tools/trunk/velocity-tools-browser/src/test/resources/robots.txt
Modified:
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/BrowserTool.java
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/UAParser.java
velocity/tools/trunk/velocity-tools-browser/src/main/resources/org/apache/velocity/tools/view/ua-keywords.txt
velocity/tools/trunk/velocity-tools-browser/src/test/java/org/apache/velocity/tools/view/BrowserToolTests.java
velocity/tools/trunk/velocity-tools-browser/src/test/resources/operating_systems.txt
Modified:
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/BrowserTool.java
URL:
http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/BrowserTool.java?rev=1768140&r1=1768139&r2=1768140&view=diff
==============================================================================
---
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/BrowserTool.java
(original)
+++
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/BrowserTool.java
Sat Nov 5 01:39:24 2016
@@ -23,10 +23,6 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
-import org.apache.devicemap.DeviceMapClient;
-import org.apache.devicemap.DeviceMapFactory;
-import org.apache.devicemap.data.Device;
-import org.apache.devicemap.loader.LoaderOption;
import org.apache.velocity.exception.VelocityException;
import org.apache.velocity.tools.ConversionUtils;
import static org.apache.velocity.tools.view.UAParser.*;
@@ -47,7 +43,7 @@ import javax.servlet.http.HttpServletReq
* <p>All properties are boolean, excpet those in italic which are strings
(and major/minor versions which are integers)</p>
* <p>The following properties are available:</p>
* <ul>
- * <li><b>Device: </b><i>device</i> robot mobile tablet desktop</li>
+ * <li><b>Device: </b><i>device</i> robot mobile tablet desktop tv</li>
* <li><b>Features:</b>css3 dom3</li>
* <li><b>Browser:</b><i>userAgent.getBrowser().name
userAgent.getBrowser().majorVersion userAgent.getBrowser().minorVersion</i></li>
* <li><b>Rendering engine: </b><i>renderingEngine.name
renderingEngine.minorVersion renderingEngine.majorVersion</i></li>
@@ -63,6 +59,16 @@ import javax.servlet.http.HttpServletReq
* matching language, the tools defaut locale (or the first value of
languagesFilter) is returned.
* Their value is guarantied to belong to the set provided in languagesFilter,
if any.</p>
*
+ * <p>
+ * Notes on implementation:
+ * <ul>
+ * <li>The parsing algorithm is mainly empirical. Used rules are
rather generic, so shouldn't need recent updates to be accurate, but accuracy
remains far from guaranteed for new devices.</li>
+ * <li>Parsing should be fast, as the parser only uses a single regex
iteration on the user agent string.</li>
+ * <li>Game consoles, e-readers, etc... are for now classified as
<i>mobile</i> devices (but can sometimes be identified by their operating
system).</li>
+ * <li>Needless to say, the frontier between different device types
can be very thin...</li>
+ * </ul>
+ * </p>
+ *
* <p>Thanks to Lee Semel ([email protected]), the author of the
HTTP::BrowserDetect Perl module.</p>
* <p>See also:
* <ul>
@@ -75,9 +81,16 @@ import javax.servlet.http.HttpServletReq
*
<li>https://en.wikipedia.org/wiki/Comparison_of_layout_engines_(Cascading_Style_Sheets)</li>
*
<li>https://en.wikipedia.org/wiki/Comparison_of_layout_engines_(Document_Object_Model)</li>
* <li>http://www.webapps-online.com/online-tools/user-agent-strings</li>
- * <li>https://whichuserAgent.getBrowser().net/data/</li>
+ * <li>https://whichbrowser.net/data/</li>
* </ul>
* </p>
+ * <p>
+ * TODO:
+ * <ul>
+ * <li>parse X-Wap-Profile header if present</li>
+ * <li>parse X-Requested-With header if present</li>
+ * </ul>
+ * </p>
*
* @author <a href="mailto:[email protected]">Claude Brisson</a>
* @since VelocityTools 2.0
@@ -232,7 +245,7 @@ public class BrowserTool extends Browser
/**
* @Since VelocityTools 3.0
*/
- public String getDeviceType()
+ public String getDevice()
{
return userAgent == null ? null :
userAgent.getDeviceType().toString().toLowerCase();
}
@@ -267,6 +280,14 @@ public class BrowserTool extends Browser
}
/**
+ * @Since VelocityTools 3.0
+ */
+ public boolean isTV()
+ {
+ return userAgent == null && userAgent.getDeviceType() == DeviceType.TV;
+ }
+
+ /**
* @Since VelocityTools 3.0
*/
public UAEntity getBrowser()
Modified:
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/UAParser.java
URL:
http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/UAParser.java?rev=1768140&r1=1768139&r2=1768140&view=diff
==============================================================================
---
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/UAParser.java
(original)
+++
velocity/tools/trunk/velocity-tools-browser/src/main/java/org/apache/velocity/tools/view/UAParser.java
Sat Nov 5 01:39:24 2016
@@ -1,10 +1,8 @@
package org.apache.velocity.tools.view;
-import org.apache.devicemap.DeviceMapClient;
-import org.apache.devicemap.DeviceMapFactory;
-import org.apache.devicemap.data.Device;
-import org.apache.devicemap.loader.LoaderOption;
import org.apache.velocity.exception.VelocityException;
+import org.apache.velocity.shaded.commons.lang3.tuple.ImmutablePair;
+import org.apache.velocity.shaded.commons.lang3.tuple.Pair;
import org.apache.velocity.tools.ClassUtils;
import org.slf4j.Logger;
@@ -63,50 +61,17 @@ public class UAParser
}
}
- /* device */
+ /* device, in order of growing precedence */
public enum DeviceType
{
+ UNKNOWN,
DESKTOP,
MOBILE,
TABLET,
- ROBOT,
- UNKNOWN
+ TV,
+ ROBOT
};
- private static DeviceMapClient deviceMapClient = null;
-
- static
- {
- try
- {
- deviceMapClient = DeviceMapFactory.getClient(LoaderOption.JAR);
- }
- catch (Exception e)
- {
- /* no logging context yet, but a warning will be displayed at tool
initialization */
- }
- }
-
- /**
- * devicemap classification
- */
- private Device doDeviceMapParsing(String userAgentString)
- {
- Device device = null;
- if (deviceMapClient != null)
- {
- try
- {
- /* classify the userAgent */
- device =
deviceMapClient.classifyDevice(userAgentString.toLowerCase());
- }
- catch (Exception e)
- {
- LOG.error("BrowerTool: exception while querying DeviceMap:",
e);
- }
- }
- return device;
- }
private static Map<String,String> browserTranslationMap = null;
private static Map<String,String> osTranslationMap = null;
@@ -131,6 +96,8 @@ public class UAParser
osTranslationMap.put("kftt", "Kindle");
osTranslationMap.put("mac os x", "OS X");
osTranslationMap.put("macos x", "OS X");
+ osTranslationMap.put("nokiae", "Nokia");
+ osTranslationMap.put("nokiax2", "Nokia");
osTranslationMap.put("remi", "Fedora");
osTranslationMap.put("rhel", "Red Hat");
osTranslationMap.put("series40", "Symbian");
@@ -151,6 +118,7 @@ public class UAParser
osTranslationMap.put("unixware", "Unix");
osTranslationMap.put("webos", "WebOS");
osTranslationMap.put("windows nt", "Windows");
+ osTranslationMap.put("win98", "Windows");
}
public static class UserAgent
@@ -181,7 +149,6 @@ public class UAParser
protected void setBrowser(String entity, String major, String minor)
{
- if (deviceType == DeviceType.ROBOT) return;
String alternate = browserTranslationMap.get(entity.toLowerCase());
if (alternate != null) { entity = alternate; }
if ("Navigator".equals(entity)) { entity = "Netscape"; }
@@ -198,10 +165,6 @@ public class UAParser
protected void setDeviceType(DeviceType deviceType)
{
this.deviceType = deviceType;
- if (deviceType == DeviceType.ROBOT)
- {
- browser = renderingEngine = null;
- }
}
}
@@ -225,7 +188,7 @@ public class UAParser
private static final String UA_KEYWORDS =
"/org/apache/velocity/tools/view/ua-keywords.txt";
- private static Map<String, EntityType> entityMap = new HashMap<String,
EntityType>();
+ private static Map<String, Pair<EntityType, DeviceType>> entityMap = new
HashMap<String, Pair<EntityType, DeviceType>>();
static
{
@@ -244,8 +207,16 @@ public class UAParser
int eq = line.indexOf('=');
if (eq == -1) { throw new IOException("invalid line format in
ua-keywords.txt at line " + num); }
String key = line.substring(0, eq);
- EntityType value = EntityType.valueOf(line.substring(eq +
1).toUpperCase());
- entityMap.put(key, value);
+ String val = line.substring(eq + 1).toUpperCase();
+ int coma = val.indexOf(',');
+ DeviceType device = null;
+ if (coma != -1)
+ {
+ device = DeviceType.valueOf(val.substring(coma + 1));
+ val = val.substring(0, coma);
+ }
+ EntityType entity = val.length() > 0 ? EntityType.valueOf(val)
: null;
+ entityMap.put(key, new ImmutablePair<EntityType,
DeviceType>(entity , device));
++num;
}
}
@@ -261,7 +232,7 @@ public class UAParser
/* entity name */
"([a-z]+(?:(?=[;()@]|$)|(?:[0-9]+(?!\\.)[a-z]*)|(?:[!_+.\\-][a-z]+)+|(?=[/
,\\-:0-9+!_=])))" +
/* potential version */
- "(?:(?:[/ ,\\-:+_=])?(?:v?(\\d+)(?:\\.(\\d+))?[a-z+]*)?)",
+ "(?:([/ ,\\-:+_=])?(?:v?(\\d+)(?:\\.(\\d+))?[a-z+]*)?)",
Pattern.CASE_INSENSITIVE);
private static boolean isRobotToken(String token)
@@ -278,33 +249,6 @@ public class UAParser
{
ua = new UserAgent();
- Device device = doDeviceMapParsing(userAgentString);
- if (Boolean.valueOf(device.getAttribute("is_robot")))
- {
- ua.setDeviceType(DeviceType.ROBOT);
- }
- else if (Boolean.valueOf(device.getAttribute("is_tablet")))
- {
- ua.setDeviceType(DeviceType.TABLET);
- }
- else if
(Boolean.valueOf(device.getAttribute("is_wireless_device")))
- {
- ua.setDeviceType(DeviceType.MOBILE);
- }
- else if (Boolean.valueOf(device.getAttribute("is_desktop")))
- {
- ua.setDeviceType(DeviceType.DESKTOP);
- }
- else
- {
- ua.setDeviceType(DeviceType.UNKNOWN);
- }
-
- if ("Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT
Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile
Safari/535.19 Silk-Accelerated=true".equals(userAgentString))
- {
- LOG.debug("breakpoint");
- }
-
Matcher matcher = versionPattern.matcher(userAgentString);
String merge = null;
EntityType mergeTarget = null;
@@ -313,11 +257,13 @@ public class UAParser
boolean maybeRobot = false;
boolean forcedBrowser = false;
boolean forcedOS = false;
+
while (matcher.find())
{
String entity = matcher.group(1);
- String major = matcher.group(2);
- String minor = matcher.group(3);
+ String separator = matcher.group(2);
+ String major = matcher.group(3);
+ String minor = matcher.group(4);
char next = userAgentString.length() == matcher.end(1) ? ';' :
userAgentString.charAt(matcher.end(1));
if (entity != null)
{
@@ -330,7 +276,8 @@ public class UAParser
}
else
{
- EntityType mergedType =
entityMap.get(merged.toLowerCase());
+ Pair<EntityType,DeviceType> pair =
entityMap.get(merged.toLowerCase());
+ EntityType mergedType = pair == null ? null :
pair.getLeft();
if (mergedType != null && (
mergeTarget == mergedType ||
mergeTarget == EntityType.BROWSER
&& (mergedType == EntityType.MAYBE_BROWSER || mergedType ==
EntityType.FORCE_BROWSER) ||
@@ -358,7 +305,30 @@ public class UAParser
merge = null;
mergeTarget = null;
}
- EntityType entityType =
entityMap.get(entity.toLowerCase());
+ Pair<EntityType, DeviceType> identity =
entityMap.get(entity.toLowerCase());
+ EntityType entityType = null;
+ DeviceType deviceType = null;
+ if (identity == null)
+ {
+ /* try again with major version appended */
+ String alternateEntity = entity + separator + major;
+ identity = entityMap.get((entity + separator +
major).toLowerCase());
+ if (identity != null)
+ {
+ entity = alternateEntity;
+ }
+ }
+ if (identity != null)
+ {
+ entityType = identity.getLeft();
+ deviceType = identity.getRight();
+ DeviceType previousDeviceType = ua.getDeviceType();
+ /* only overwrite device types of lower precedence */
+ if (deviceType != null && (previousDeviceType == null
|| deviceType.compareTo(previousDeviceType) > 0))
+ {
+ ua.setDeviceType(deviceType); // may be
overwritten by 'robot' device type
+ }
+ }
if (entityType != null)
{
switch (entityType)
@@ -421,28 +391,23 @@ public class UAParser
if (ua.getBrowser() != null &&
ua.getBrowser().getName().equals("Mozilla"))
{
entity = "Mozilla";
- }
- else
+ } else
{
entity = null;
}
- }
- else if ("Version".equals(entity))
+ } else if ("Version".equals(entity))
{
if (ua.getBrowser() != null &&
ua.getBrowser().getName().startsWith("Opera"))
{
entity = ua.getBrowser().getName();
- }
- else if (ua.getBrowser() != null &&
ua.getBrowser().getName().equals("Mozilla"))
+ } else if (ua.getBrowser() != null &&
ua.getBrowser().getName().equals("Mozilla"))
{
entity = "Safari";
- }
- else
+ } else
{
entity = null;
}
- }
- else if ("Safari".equals(entity) &&
ua.getBrowser() != null && "Safari".equals(ua.getBrowser().getName()))
+ } else if ("Safari".equals(entity) &&
ua.getBrowser() != null && "Safari".equals(ua.getBrowser().getName()))
{
entity = null;
}
@@ -473,16 +438,14 @@ public class UAParser
if (nonMergeSep.indexOf(next) == -1)
{
merge = merge == null ? entity : merge
+ " " + entity;
- }
- else
+ } else
{
if ("Mobile".equals(entity) &&
ua.getOperatingSystem() != null)
{
if
(ua.getOperatingSystem().getName().equals("Ubuntu"))
{
ua.setOperatingSystem("Ubuntu
Mobile", String.valueOf(ua.getOperatingSystem().getMajorVersion()),
String.valueOf(ua.getOperatingSystem().getMinorVersion()));
- }
- else if
(ua.getOperatingSystem().getName().equals("Linux"))
+ } else if
(ua.getOperatingSystem().getName().equals("Linux"))
{
ua.setOperatingSystem("Android", null, null);
}
@@ -498,8 +461,7 @@ public class UAParser
if (major != null ||
nonMergeSep.indexOf(next) != -1)
{
ua.setBrowser(entity, major, minor);
- }
- else
+ } else
{
merge = entity;
mergeTarget = EntityType.BROWSER;
@@ -514,8 +476,7 @@ public class UAParser
if (major != null ||
nonMergeSep.indexOf(next) != -1)
{
ua.setOperatingSystem(entity, major,
minor);
- }
- else
+ } else
{
merge = entity;
mergeTarget = EntityType.OS;
@@ -542,7 +503,8 @@ public class UAParser
throw new VelocityException("BrowserTool:
unhandled case: " + entityType);
}
}
- } else
+ }
+ else
{
if (entity.startsWith("Linux") && !forcedOS)
{
@@ -552,6 +514,22 @@ public class UAParser
{
ua.setDeviceType(DeviceType.ROBOT);
}
+ else if (entity.startsWith("MID") &&
!entity.startsWith("MIDP") && (ua.getDeviceType() == null ||
DeviceType.TABLET.compareTo(ua.getDeviceType()) > 0 ))
+ {
+ ua.setDeviceType(DeviceType.TABLET);
+ }
+ else if (entity.startsWith("CoolPad") &&
(ua.getDeviceType() == null || DeviceType.MOBILE.compareTo(ua.getDeviceType())
> 0 ))
+ {
+ ua.setDeviceType(DeviceType.MOBILE);
+ }
+ else if (entity.startsWith("LG-") &&
(ua.getDeviceType() == null || DeviceType.MOBILE.compareTo(ua.getDeviceType())
> 0 ))
+ {
+ ua.setDeviceType(DeviceType.MOBILE);
+ }
+ else if (entity.startsWith("SonyEricsson"))
+ {
+ ua.setDeviceType(DeviceType.MOBILE);
+ }
}
}
}
@@ -568,14 +546,43 @@ public class UAParser
}
if (ua.getBrowser() == null)
{
- if (maybeRobot)
+ if (ua.getDeviceType() == DeviceType.ROBOT || maybeRobot)
{
+ ua.setBrowser("robot", "0", "0");
ua.setDeviceType(DeviceType.ROBOT);
}
else if (ua.getOperatingSystem() != null &&
ua.getOperatingSystem().getName().equals("Symbian"))
{
ua.setBrowser("Nokia Browser",
String.valueOf(ua.getOperatingSystem().getMajorVersion()),
String.valueOf(ua.getOperatingSystem().getMinorVersion()));
}
+ else
+ {
+ ua.setBrowser("unknown", "0", "0");
+ }
+ }
+ if (ua.getOperatingSystem() == null)
+ {
+ if (ua.getDeviceType() == DeviceType.ROBOT || maybeRobot)
+ {
+ ua.setOperatingSystem("robot", "0", "0");
+ ua.setDeviceType(DeviceType.ROBOT);
+ }
+ else
+ {
+ ua.setOperatingSystem("unknown", "0", "0");
+ }
+ }
+ if (ua.getDeviceType() == null)
+ {
+ if (ua.getOperatingSystem() != null &&
"Android".equals(ua.getOperatingSystem().getName()))
+ {
+ ua.setDeviceType(DeviceType.MOBILE);
+ }
+ else
+ {
+ /* make Desktop the default device */
+ ua.setDeviceType(DeviceType.DESKTOP);
+ }
}
}
catch (Exception e)
@@ -585,6 +592,4 @@ public class UAParser
}
return ua;
}
-
-
}
Modified:
velocity/tools/trunk/velocity-tools-browser/src/main/resources/org/apache/velocity/tools/view/ua-keywords.txt
URL:
http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-browser/src/main/resources/org/apache/velocity/tools/view/ua-keywords.txt?rev=1768140&r1=1768139&r2=1768140&view=diff
==============================================================================
---
velocity/tools/trunk/velocity-tools-browser/src/main/resources/org/apache/velocity/tools/view/ua-keywords.txt
(original)
+++
velocity/tools/trunk/velocity-tools-browser/src/main/resources/org/apache/velocity/tools/view/ua-keywords.txt
Sat Nov 5 01:39:24 2016
@@ -1,133 +1,158 @@
+# format:
+# keyword=[<entity>][,<device>]
+# where <entity> is one of:
+# - browser
+# - browser_os: browser and operating system
+# - engine: rendering engine
+# - force_browser: browser, with greater precedence
+# - force_os: operating system, with greater precedence
+# - ignore: keyword to be ignored
+# - maybe_browser: browser, with lesser precedence
+# - maybe_os: operating system, with lesser precedence
+# - maybe_robot: robot, with lesser precedence
+# - merge: keyword to be merged to the next one
+# - merge_or_browser: browser if followed by a version number, otherwise merge
to the next keyword
+# - merge_or_os: operating system if followed by a version number, otherwise
merge to the next keyword
+# - os: operating system
+# - robot
+# and <device> is one of:
+# - desktop,
+# - mobile,
+# - tablet,
+# - tv,
+# - robot
+# (with a growing precedence)
+
# browsers
-abrowse=browser
+abrowse=browser,desktop
acoo=merge
-acoo browser=browser
+acoo browser=browser,desktop
amaya=browser
america=merge
america online=merge
-america online browser=browser
+america online browser=browser,desktop
amigavoyager=browser
-aol=browser
-arora=browser
+aol=browser,desktop
+arora=browser,desktop
avant=merge
-avant browser=browser
-avantbrowser=browser
-beonex=browser
-blazer=browser
-bolt=browser
-browserng=browser
+avant browser=browser,desktop
+avantbrowser=browser,desktop
+beonex=browser,desktop
+blazer=browser,desktop
+bolt=browser,desktop
+browserng=browser,mobile
bunjalloo=browser
-camino=browser
+camino=browser,desktop
chrome=browser
chromeplus=browser
-cometbird=browser
-conkeror=browser
+cometbird=browser,desktop
+conkeror=browser,desktop
crazy=merge
-crazy browser=force_browser
+crazy browser=force_browser,desktop
deepnet=merge
-deepnet explorer=browser
+deepnet explorer=browser,desktop
dillo=browser
dooble=browser
doris=browser
dorothy=browser
-edge=browser
+edge=browser,desktop
element=merge
-element browser=browser
-elinks=browser
-enigmafox=browser
-epiphany=browser
-escape=browser
+element browser=browser,desktop
+elinks=browser,desktop
+enigmafox=browser,desktop
+epiphany=browser,desktop
+escape=browser,desktop
fennec=browser
firebird=browser
firefox=maybe_browser
fireweb=merge
-fireweb navigator=browser
-flock=force_browser
-fluid=browser
-galaxy=browser
-galeon=browser
+fireweb navigator=browser,desktop
+flock=force_browser,desktop
+fluid=browser,desktop
+galaxy=browser,mobile
+galeon=browser,desktop
gngr.info=browser
gobrowser=browser
-granparadiso=browser
-greenbrowser=browser
-hana=browser
+granparadiso=browser,desktop
+greenbrowser=browser,desktop
+hana=browser,desktop
ibrowse=browser
-icab=browser
-iceape=browser
-icecat=browser
-iceweasel=browser
-iemobile=browser
+icab=browser,desktop
+iceape=browser,desktop
+icecat=browser,desktop
+iceweasel=browser,desktop
+iemobile=browser,mobile
inet=merge
-inet browser=browser
-irider=browser
-iris=browser
+inet browser=browser,mobile
+irider=browser,desktop
+iris=browser,desktop
iron=force_browser
itunes=browser
k-meleon=browser
-k-ninja=browser
-kapiko=browser
-kazehakase=browser
-kkman=browser
-kmlite=browser
-konqueror=browser
+k-ninja=browser,desktop
+kapiko=browser,desktop
+kazehakase=browser,desktop
+kkman=browser,desktop
+kmlite=browser,desktop
+konqueror=browser,desktop
like=merge
like gecko=ignore
links=browser
lobo=browser
-lolifox=browser
-lunascape=browser
+lolifox=browser,desktop
+lunascape=browser,desktop
lynx=browser
maemo=merge
-maemo browser=browser
+maemo browser=browser,mobile
maxthon=browser
midori=browser
-minefield=browser
+minefield=browser,desktop
minimo=browser
-mobile=merge
-mobile safari=maybe_browser
+mobile=merge,mobile
+mobile safari=maybe_browser,mobile
mozilla=maybe_browser
msie=maybe_browser
-namoroka=browser
+namoroka=browser,desktop
navigator=browser
-netnewswire=browser
-netpositive=browser
+netnewswire=browser,desktop
+netpositive=browser,desktop
netscape=browser
netscape6=browser
-nokia5250=force_browser
+nokia5250=force_browser,mobile
omniweb=browser
opera=merge_or_browser
opera mini=force_browser
-opera mobi=browser
-orca=browser
+opera mobi=browser,mobile
+orca=browser,desktop
oregano=browser
-palemoon=browser
-prism=browser
-puffin=browser
+palemoon=browser,desktop
+prism=browser,desktop
+puffin=browser,mobile
qtweb=merge
qtweb internet=merge
-qtweb internet browser=browser
-rekonq=browser
+qtweb internet browser=browser,desktop
+rekonq=browser,desktop
retawq=browser
-rockmelt=force_browser
+rockmelt=force_browser,desktop
rv=maybe_browser
safari=maybe_browser
-samsungbrowser=browser
-seamonkey=browser
+samsungbrowser=browser,mobile
+seamonkey=browser,desktop
semc-browser=browser
-shiretoko=browser
-silk=browser
-skyfire=browser
+shiretoko=browser,desktop
+silk=browser,mobile
+skyfire=browser,desktop
sleipnir=browser
-slimbrowser=browser
-stainless=browser
+slimbrowser=browser,desktop
+stainless=browser,desktop
sundance=browser
-sunrise=browser
-sunrisebrowser=browser
-surf=browser
-sylera=force_browser
-teashark=browser
-teleca=browser
-thunderbird=browser
+sunrise=browser,desktop
+sunrisebrowser=browser,desktop
+surf=browser,desktop
+sylera=force_browser,desktop
+teashark=browser,desktop
+teleca=browser,desktop
+thunderbird=browser,desktop
tencenttraveler=browser
tenfourfox=browser
theworld=browser
@@ -141,7 +166,7 @@ w3m=browser
webpositive=force_browser
weltweitimnetzbrowser=browser
windows-media-player=robot
-wyzo=browser
+wyzo=browser,desktop
# robots (+everyone ending with 'bot', 'crawler', 'spider', 'agent' or
'validator')
amaya=robot
@@ -150,12 +175,15 @@ accoona-ai-agent=robot
arachmo=robot
b-l-i-t-z-b-o-t=robot
baiduspider+=robot
+bing=robot
binget=robot
+bingpreview=robot
bloglines=robot
boitho.com-dc=robot
cerberian=robot
charlotte=robot
cocoal.icio.us=browser
+control=robot
cosmos=robot
csscheck=robot
curl=robot
@@ -164,6 +192,7 @@ dataparksearch=robot
emailsiphon=robot
feedfetcher-google=robot
findlinks=robot
+google=robot
googlebot-image=robot
greatnews=robot
gregarius=robot
@@ -179,8 +208,11 @@ larbin=robot
lftp=robot
libwww=robot
libwww-perl=robot
+link=merge
+link checker=robot
+link valet=robot
+link validity=robot
linkwalker=robot
-link=robot
linkexaminer=robot
lwp-trivial=robot
magpierss=robot
@@ -189,6 +221,7 @@ metauri=robot
mnogosearch=robot
morning=merge
morning paper=robot
+mrchrome=robot
mvaclient=robot
netresearchserver=robot
netseer=merge
@@ -217,11 +250,16 @@ pycurl=robot
python-urllib=robot
qseero=robot
radian=robot
+reciprocal=merge
+reciprocal link=merge
+reciprocal link system=robot
sbider=robot
scoutjet=robot
+screenshot-generator=robot
scrubby=robot
searchsight=robot
semanticdiscovery=robot
+seznam=robot
shopwiki=robot
sitebar=robot
snappy=robot
@@ -232,11 +270,11 @@ stackrambler=robot
susie=robot
teoma=robot
tineye=robot
+tocrawl=robot
truwogps=robot
updated=robot
universalfeedparser=robot
urd-magpie=robot
-control=robot
vagabondo=robot
vortex=robot
voyager=robot
@@ -252,6 +290,7 @@ websquash.com=robot
webzip=robot
wget=robot
womlpefactory=robot
+xenu=robot
yacy=robot
yahoo=merge
yahoo slurp=robot
@@ -274,30 +313,31 @@ prince=engine
trident=engine
# operating systems
-amigaos=os
+amigaos=os,desktop
android=os
bada=force_os
bb10=force_os
-beos=os
-blackberry=force_os
-blackberry8100=force_os
-blackberry8300=force_os
-blackberry8520=force_os
-blackberry8700=force_os
-blackberry9100=force_os
-blackberry9300=force_os
-blackberry9320=force_os
-blackberry9360=force_os
-blackberry9380=force_os
-blackberry9500=force_os
-blackberry9700=force_os
-blackberry9780=force_os
-blackberry9790=force_os
-blackberry9860=force_os
-blackberry9900=force_os
-bsd=os
-centos=os
-cros=force_os
+beos=os,desktop
+blackberry=force_os,mobile
+blackberry8100=force_os,mobile
+blackberry8300=force_os,mobile
+blackberry8520=force_os,mobile
+blackberry8530=force_os,mobile
+blackberry8700=force_os,mobile
+blackberry9100=force_os,mobile
+blackberry9300=force_os,mobile
+blackberry9320=force_os,mobile
+blackberry9360=force_os,mobile
+blackberry9380=force_os,mobile
+blackberry9500=force_os,mobile
+blackberry9700=force_os,mobile
+blackberry9780=force_os,mobile
+blackberry9790=force_os,mobile
+blackberry9860=force_os,mobile
+blackberry9900=force_os,mobile
+bsd=os,desktop
+centos=os,desktop
+cros=force_os,desktop
cpu=merge
cpu like=merge
cpu like mac=merge
@@ -308,36 +348,30 @@ cpu like os x=ignore
cpu os=merge
cpu os x=ignore
darwin=os
-debian=os
+debian=os,desktop
elementary=merge
-elementary os=force_os
-fedora=force_os
+elementary os=force_os,desktop
+fedora=force_os,desktop
remi=force_os
-freebsd=os
+freebsd=os,desktop
fxos=force_os
-gentoo=force_os
-googletv=os
+gentoo=force_os,desktop
haiku=os
-hp-ux=os
+hp-ux=os,desktop
hpwos=os
ios=force_os
-ipad=maybe_os
-iphone=maybe_os
-ipod=maybe_os
-kfthwi=os
-kftt=os
-kindle=os
+kindle=maybe_os,tablet
like mac=merge
like mac os=merge
like mac os x=ignore
like os=merge
like os x=ignore
linux=maybe_os
-mint=os
+mint=os,desktop
tizen=os
mac=merge
mac os=merge
-mac os x=maybe_os
+mac os x=maybe_os,desktop
macos=merge
macos x=maybe_os
mandriva=force_os
@@ -346,7 +380,7 @@ netbsd=os
newstockrom=os
nintendo=merge
nintendo ds=os
-nokiae=os
+nokiae=os,mobile
openbsd=os
os=merge
os x=os
@@ -354,7 +388,7 @@ palm=merge
palm os=os
palmos=os
palmsource=os
-playbook=os
+playbook=os,tablet
playstation=browser_os
psp=browser_os
red=merge
@@ -366,11 +400,11 @@ sailfish=force_os
slackware=force_os
sonyericssonk=os
suse=os
-series=force_os
-series40=force_os
-series60=force_os
-series80=force_os
-series90=force_os
+series=force_os,mobile
+series40=force_os,mobile
+series60=force_os,mobile
+series80=force_os,mobile
+series90=force_os,mobile
startos=os
sunos=os
supergamer=os
@@ -380,18 +414,133 @@ symbianos=force_os
symbos=os
tigeros=os
tt=os
-ubuntu=os
-unicos=merge
+ubuntu=os,desktop
+unicos=merge,desktop
unicos lclinux=os
unix=merge_or_os
-unix bsd=os
-unixware=os
+unix bsd=os,desktop
+unixware=os,desktop
webos=os
-wii=merge
+wii=merge,mobile
wii libnup=browser_os
+win98=os,desktop
windows=merge_or_os
-windows nt=os
-windows xp=os
-windows phone=os
-windows mobile=os
-xbox=os
+windows nt=os,desktop
+windows xp=os,desktop
+windows phone=os,mobile
+windows mobile=os,mobile
+xbox=os,mobile
+
+# tvs
+apple=merge
+apple tv=,tv
+dlnadoc=,tv
+googletv=os,tv
+gtv100=,tv
+hbbtv=,tv
+iconbit=,tv
+itunes-appletv=,tv
+mk903v=,tv
+mt7001=,tv
+mx2=,tv
+pov_tv=,tv
+pov_tv-hdmi=,tv
+roku=,tv
+smart-tv=,tv
+smarttv=,tv
+tv=,tv
+
+# tablets
+allview=,tablet
+arc=,tablet
+at100=,tablet
+at10le=,tablet
+ax922=,tablet
+b1=,tablet
+cm_tenderloin=,tablet
+cyclops=,tablet
+elcano=,tablet
+f-01=,tablet
+freetab=,tablet
+gt-n=,tablet
+gt-p=,tablet
+gt-s=,tablet
+hp-tablet=,tablet
+huaweimediapad=,tablet
+ideatab=,tablet
+ideataba1000=,tablet
+ideataba1000l=,tablet
+ipad=maybe_os,tablet
+kfthwi=maybe_os,tablet
+kfjwi=maybe_os,tablet
+kftt=os,tablet
+lenovo=merge
+lenovo b8000=,tablet
+lenovo s5000=,tablet
+lenovoa3300=,tablet
+lg-v=,tablet
+lifetab_e=,tablet
+lifetab_p=,tablet
+lifetab_s=,tablet
+m785=,tablet
+me172v=,tablet
+me173x=,tablet
+me176c=,tablet
+me176cx=,tablet
+me269c=,tablet
+me301t=,tablet
+me302c=,tablet
+mp-1041=,tablet
+mz601=,tablet
+mz604=,tablet
+nettab=,tablet
+nexus 7=,tablet
+nexus 9=,tablet
+nexus 10=,tablet
+nookcolor=,tablet
+nookhd=,tablet
+pad=,tablet
+pc1038=,tablet
+pmp3670b=,tablet
+pov_tab=,tablet
+pov_tab-p=,tablet
+pov_tab-protab=,tablet
+prime=,tablet
+rct6077w=,tablet
+samsung-gt-s=,tablet
+sch-i=,tablet
+sgp311=,tablet
+sgp312=,tablet
+sgp321=,tablet
+sgp341=,tablet
+sh-06=,tablet
+sk-mtek=,tablet
+sm-p=,tablet
+sm-t=,tablet
+tab=,tablet
+tab10=,tablet
+tab465euk=,tablet
+tab9dualc=,tablet
+tablet=,tablet
+tb=,tablet
+transformer=,tablet
+x98=,tablet
+xoom=,tablet
+
+# mobiles
+apple-iphone=,mobile
+gt-i=,mobile
+htc=,mobile
+huawei=,mobile
+iphone=maybe_os,mobile
+ipod=maybe_os,mobile
+j2me=,mobile
+lenovo-a=,mobile
+nokia=,mobile
+nokia300=,mobile
+nokia5310xpressmusic=,mobile
+nokiax2=os,mobile
+samsung=,mobile
+smartphone=,mobile
+
+qt=,desktop
Modified:
velocity/tools/trunk/velocity-tools-browser/src/test/java/org/apache/velocity/tools/view/BrowserToolTests.java
URL:
http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-browser/src/test/java/org/apache/velocity/tools/view/BrowserToolTests.java?rev=1768140&r1=1768139&r2=1768140&view=diff
==============================================================================
---
velocity/tools/trunk/velocity-tools-browser/src/test/java/org/apache/velocity/tools/view/BrowserToolTests.java
(original)
+++
velocity/tools/trunk/velocity-tools-browser/src/test/java/org/apache/velocity/tools/view/BrowserToolTests.java
Sat Nov 5 01:39:24 2016
@@ -26,6 +26,8 @@ import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.PrintWriter;
import java.util.Map;
import java.util.TreeMap;
@@ -33,6 +35,7 @@ import static org.apache.velocity.tools.
import org.apache.velocity.tools.generic.MockLogger;
import org.junit.Test;
+import org.slf4j.Logger;
/**
* <p>Tests for BrowserTool</p>
@@ -85,20 +88,21 @@ public class BrowserToolTests {
}
}
String found = builder.toString();
- assertTrue("entry " + num + "/" + uas.size()+": wrong browser
detected: browser={"+expected+"}, found={"+found+"}, ua={"+ua+"}",
expected.toLowerCase().startsWith(found.toLowerCase()));
+ assertTrue("entry " + num + "/" + uas.size() + ": wrong browser
detected: browser={" + expected + "}, found={" + found + "}, ua={" + ua + "}",
expected.toLowerCase().startsWith(found.toLowerCase()));
}
}
- protected void checkRobots(BrowserTool tool, Map<String, String> uas)
+ protected void checkDevices(BrowserTool tool, Map<String, String> uas)
{
int num = 0;
for (Map.Entry<String, String> entry : uas.entrySet())
{
++num;
- String robot = entry.getValue();
+ String device = entry.getValue();
String ua = entry.getKey();
tool.setUserAgentString(ua);
- assertTrue("entry " + num + "/" + uas.size()+": robot not
detected: robot={"+robot+"}, ua={"+ua+"}", tool.isRobot());
+ String found = tool.getDevice();
+ assertTrue("entry " + num + "/" + uas.size() + ": wrong device
detected: device={" + device + "}, found={" + found + "}, ua={" + ua + "}",
device.equals(found));
}
}
@@ -113,7 +117,7 @@ public class BrowserToolTests {
tool.setUserAgentString(ua);
UAEntity os = tool.getOperatingSystem();
assertNotNull("entry " + num + "/" + uas.size()+": operating
system not detected: os={"+expected+"}, ua={" + ua + "}", os);
- assertEquals("entry " + num + "/" + uas.size()+": operating system
not correctly detected: os={" + expected + "}, found={" + os.getName() + "},
ua={"+ua+"}", expected.toLowerCase(), os.getName().toLowerCase());
+ assertEquals("entry " + num + "/" + uas.size()+": operating system
not correctly detected: os={" + expected + "}, found={" + os.getName() + "},
ua={" + ua + "}", expected.toLowerCase(), os.getName().toLowerCase());
}
}
@@ -137,12 +141,12 @@ public class BrowserToolTests {
checkBrowsers(tool, uas);
}
- public @Test void testRobotParsing() throws Exception
+ public @Test void testDeviceParsing() throws Exception
{
BrowserTool tool = new BrowserTool();
tool.setLog(new MockLogger(false, false));
- Map uas = readUAs("robots.txt");
- checkRobots(tool, uas);
+ Map uas = readUAs("devices.txt");
+ checkDevices(tool, uas);
}
public @Test void testOperatingSystemParsing() throws Exception
@@ -152,4 +156,5 @@ public class BrowserToolTests {
Map uas = readUAs("operating_systems.txt");
checkOperatingSystems(tool, uas);
}
+
}