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);
     }
+
 }



Reply via email to