Author: rezan
Date: Sun Aug 10 23:10:10 2014
New Revision: 1617177

URL: http://svn.apache.org/r1617177
Log:
DMAP-60 fixed

Modified:
    
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/DeviceMapClient.java
    
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/DeviceType.java
    
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/Pattern.java
    
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/PatternSet.java
    
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/loader/impl/DDRLoader.java
    
incubator/devicemap/trunk/devicemap/java/classifier/src/test/resources/uas.data

Modified: 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/DeviceMapClient.java
URL: 
http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/DeviceMapClient.java?rev=1617177&r1=1617176&r2=1617177&view=diff
==============================================================================
--- 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/DeviceMapClient.java
 (original)
+++ 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/DeviceMapClient.java
 Sun Aug 10 23:10:10 2014
@@ -36,13 +36,13 @@ import org.apache.devicemap.loader.Loade
 public class DeviceMapClient {
 
     private final static Logger LOG = 
Logger.getLogger(DeviceMapClient.class.getName());
-    
+
     private static long initCount = 0;
 
     //indexes
     private Map<String, DeviceType> devices;
     private Map<String, List<DeviceType>> patterns;
-    
+
     private final Device unknown;
 
     public DeviceMapClient() {
@@ -105,7 +105,7 @@ public class DeviceMapClient {
 
         Map<String, List<DeviceType>> hits = new HashMap<String, 
List<DeviceType>>(100);
         DeviceType winner = null;
-        String winnerStr = "";
+        Pattern winnerPattern = null;
 
         if (text == null) {
             return null;
@@ -122,7 +122,7 @@ public class DeviceMapClient {
                 if (parts[i + j].isEmpty()) {
                     continue;
                 }
-                
+
                 pattern += Pattern.normalize(parts[i + j]);
 
                 List<DeviceType> dlist = patterns.get(pattern);
@@ -140,24 +140,16 @@ public class DeviceMapClient {
         //look for the strongest hit
         for (String hit : hits.keySet()) {
             for (DeviceType device : hits.get(hit)) {
-                if (!device.getPatternSet().isValid(hits.keySet())) {
+                Pattern pattern = 
device.getPatternSet().isValid(hits.keySet());
+                if (pattern == null) {
                     continue;
                 }
 
-                LOG.log(Level.FINER, "Hit candidate: ''{0}'' => ''{1}'' 
({2})", new Object[]{hit, device.getId(), device.getType()});
+                LOG.log(Level.FINER, "Hit candidate: ''{0}'' => ''{1}'' 
({2},{3})", new Object[]{hit, device.getId(), pattern.getType(), 
pattern.getRank()});
 
-                if (winner != null) {
-                    if ("simple".equals(winner.getType()) && 
!"simple".equals(device.getType())) {
-                        winner = device;
-                        winnerStr = hit;
-                    } else if (hit.length() > winnerStr.length() &&
-                            (!"simple".equals(device.getType()) || 
device.getType().equals(winner.getType()))) {
-                        winner = device;
-                        winnerStr = hit;
-                    }
-                } else {
+                if (winnerPattern == null || pattern.getRank() > 
winnerPattern.getRank()) {
                     winner = device;
-                    winnerStr = hit;
+                    winnerPattern = pattern;
                 }
             }
         }
@@ -169,10 +161,10 @@ public class DeviceMapClient {
             return null;
         }
     }
-    
+
     public Device classifyDevice(String text) {
         Map<String, String> m = classify(text);
-        if(m == null) {
+        if (m == null) {
             return unknown;
         }
         return new Device(m.get("id"), m);
@@ -191,14 +183,14 @@ public class DeviceMapClient {
         }
         return patterns.size();
     }
-    
+
     public long getNodeCount() {
         if (patterns == null) {
             return -1;
         }
-        long count=0;
-        for(List<DeviceType> pDevices:patterns.values()) {
-            count+=pDevices.size();
+        long count = 0;
+        for (List<DeviceType> pDevices : patterns.values()) {
+            count += pDevices.size();
         }
         return count;
     }

Modified: 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/DeviceType.java
URL: 
http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/DeviceType.java?rev=1617177&r1=1617176&r2=1617177&view=diff
==============================================================================
--- 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/DeviceType.java
 (original)
+++ 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/DeviceType.java
 Sun Aug 10 23:10:10 2014
@@ -28,8 +28,6 @@ public class DeviceType {
 
     private String parentId;
 
-    private String type;
-
     private final PatternSet pattern;
 
     private Map<String, String> attributes;
@@ -41,15 +39,14 @@ public class DeviceType {
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        
+
         sb.append('{');
-        sb.append(JsonParser.outputKeyValue("id",id)).append(',');
-        sb.append(JsonParser.outputKeyValue("parentId",parentId)).append(',');
-        sb.append(JsonParser.outputKeyValue("type",type)).append(',');
+        sb.append(JsonParser.outputKeyValue("id", id)).append(',');
+        sb.append(JsonParser.outputKeyValue("parentId", parentId)).append(',');
         
sb.append(JsonParser.outputString("pattern")).append(':').append(pattern.toString()).append(',');
         
sb.append(JsonParser.outputString("attributes")).append(':').append(JsonParser.outputMap(attributes));
         sb.append('}');
-        
+
         return sb.toString();
     }
 
@@ -69,14 +66,6 @@ public class DeviceType {
         this.parentId = parentId;
     }
 
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
     public PatternSet getPatternSet() {
         return pattern;
     }
@@ -88,7 +77,7 @@ public class DeviceType {
     public void setAttributes(Map<String, String> attributes) {
         this.attributes = attributes;
     }
-    
+
     public void lockAttributes() {
         attributes = Collections.unmodifiableMap(attributes);
     }

Modified: 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/Pattern.java
URL: 
http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/Pattern.java?rev=1617177&r1=1617176&r2=1617177&view=diff
==============================================================================
--- 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/Pattern.java
 (original)
+++ 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/Pattern.java
 Sun Aug 10 23:10:10 2014
@@ -28,32 +28,57 @@ public class Pattern {
     private final List<String> pattern;
 
     private final String type;
+    
+    private final int boost;
 
-    public Pattern(String pattern, String type) {
-        this(Arrays.asList(pattern), type);
+    public Pattern(String pattern, String type, int boost) {
+        this(Arrays.asList(pattern), type, boost);
     }
 
-    public Pattern(List<String> pattern, String type) {
+    public Pattern(List<String> pattern, String type, int boost) {
         this.pattern = pattern;
         this.type = type;
+        this.boost = boost;
     }
-    
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        
+
         sb.append('{');
-        sb.append(JsonParser.outputKeyValue("type",type)).append(',');
+        sb.append(JsonParser.outputKeyValue("type", type)).append(',');
         
sb.append(JsonParser.outputString("pattern")).append(':').append(JsonParser.outputList(pattern,
 true));
         sb.append('}');
-        
+
         return sb.toString();
     }
-    
+
+    public int getRank() {
+        int rank = 0;
+
+        if ("weak".equals(type)) {
+            rank += 1000;
+        }
+
+        rank += pattern.size() * 100;
+
+        for (String part : pattern) {
+            rank += part.length();
+        }
+        
+        rank += boost;
+
+        return rank;
+    }
+
+    public String getType() {
+        return type;
+    }
+
     public List<String> getPatternParts() {
         return pattern;
     }
-    
+
     public boolean isValid(Set<String> patternsToMatch) {
         for (String part : pattern) {
             if (!patternsToMatch.contains(part)) {

Modified: 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/PatternSet.java
URL: 
http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/PatternSet.java?rev=1617177&r1=1617176&r2=1617177&view=diff
==============================================================================
--- 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/PatternSet.java
 (original)
+++ 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/data/PatternSet.java
 Sun Aug 10 23:10:10 2014
@@ -34,17 +34,17 @@ public class PatternSet {
     @Override
     public String toString() {
         List<String> orPatterns = new ArrayList<String>();
-        for(Pattern pattern:patterns) {
+        for (Pattern pattern : patterns) {
             orPatterns.add(pattern.toString());
         }
-        return JsonParser.outputList(orPatterns,false);
+        return JsonParser.outputList(orPatterns, false);
     }
 
     /*
      * add the patterns together as an inner list (AND)
      */
     public void setAndPattern(List<String> patterns, String type) {
-        this.patterns.add(new Pattern(patterns,type));
+        this.patterns.add(new Pattern(patterns, type, 0));
     }
 
     /*
@@ -60,7 +60,7 @@ public class PatternSet {
      * add a single pattern (OR)
      */
     public void setPattern(String pattern, String type) {
-        patterns.add(new Pattern(pattern, type));
+        patterns.add(new Pattern(pattern, type, 0));
     }
 
     public List<Pattern> getPatterns() {
@@ -70,16 +70,18 @@ public class PatternSet {
     /*
      * does a pattern match
      */
-    public boolean isValid(Set<String> patternsToMatch) {
-        boolean found = false;
+    public Pattern isValid(Set<String> patternsToMatch) {
+        Pattern winner = null;
+
         for (Pattern pattern : this.patterns) {
             if (!pattern.isValid(patternsToMatch)) {
                 continue;
             }
-            found = true;
-            break;
+            if (winner == null || pattern.getRank() > winner.getRank()) {
+                winner = pattern;
+            }
         }
 
-        return found;
+        return winner;
     }
 }

Modified: 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/loader/impl/DDRLoader.java
URL: 
http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/loader/impl/DDRLoader.java?rev=1617177&r1=1617176&r2=1617177&view=diff
==============================================================================
--- 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/loader/impl/DDRLoader.java
 (original)
+++ 
incubator/devicemap/trunk/devicemap/java/classifier/src/main/java/org/apache/devicemap/loader/impl/DDRLoader.java
 Sun Aug 10 23:10:10 2014
@@ -37,9 +37,9 @@ import org.apache.devicemap.loader.Resou
 import org.apache.devicemap.loader.parser.XMLParser;
 
 public class DDRLoader implements Loader {
-  
+
     private final static Logger LOG = 
Logger.getLogger(DDRLoader.class.getName());
-    
+
     private static final String DEVICE_DATA = "DeviceDataSource.xml";
     private static final String DEVICE_DATA_PATCH = 
"DeviceDataSourcePatch.xml";
     private static final String BUILDER_DATA = "BuilderDataSource.xml";
@@ -161,7 +161,7 @@ public class DDRLoader implements Loader
                 if (builder.lastIndexOf(".") >= 0) {
                     builder = builder.substring(builder.lastIndexOf(".") + 1);
                 }
-                
+
                 type = "weak";
                 if (builder.equals("SimpleDeviceBuilder")) {
                     type = "simple";
@@ -191,12 +191,6 @@ public class DDRLoader implements Loader
                     } else {
                         device.getPatternSet().setOrPattern(patterns, type);
                     }
-
-                    // TODO DMAP-60 - type is a pattern attribute
-                    if (device.getType() != null && 
!type.equals(device.getType())) {
-                        LOG.log(Level.FINE, "ERROR: changing type of ''{0}'' 
from {1} to {2}", new Object[]{id, device.getType(), type});
-                    }
-                    device.setType(type);
                 } else {
                     LOG.log(Level.FINE, "ERROR: device not found: ''{0}''", 
id);
                 }

Modified: 
incubator/devicemap/trunk/devicemap/java/classifier/src/test/resources/uas.data
URL: 
http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemap/java/classifier/src/test/resources/uas.data?rev=1617177&r1=1617176&r2=1617177&view=diff
==============================================================================
--- 
incubator/devicemap/trunk/devicemap/java/classifier/src/test/resources/uas.data 
(original)
+++ 
incubator/devicemap/trunk/devicemap/java/classifier/src/test/resources/uas.data 
Sun Aug 10 23:10:10 2014
@@ -439,7 +439,7 @@ Mozilla/5.0 (Linux; U; Android 2.3.3; en
 Mozilla/5.0 (Linux; U; Android 2.2.1; en-gb; GT-S5570 Build/FROYO) 
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1||GT-S5570
 Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; SCH-I510 4G Build/EP4) 
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1||SCH-I510
 Mozilla/5.0 (Linux; U; Android 2.2.3; en-us; Droid Build/FRK76) 
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1||Droid
-Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; T-Mobile myTouch 3G Slide 
Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile 
Safari/533.1||T-Mobile myTouch 3G
+Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; T-Mobile myTouch 3G Slide 
Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile 
Safari/533.1||T-Mobile myTouch 3G Slide
 Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; HTC-A9192/1.0 Build/FRG83D) 
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1||HTC-A9192
 Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; SCH-I500 Build/GINGERBREAD) 
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1||SCH-I500
 Mozilla/5.0 (Linux; U; Android 2.2.3; en-us; Droid Build/FRK76) 
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1||Droid
@@ -1154,3 +1154,6 @@ Mozilla/5.0 (Windows NT 6.0; WOW64; rv:1
 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/534.57.2 (KHTML, like Gecko) 
Version/5.1.7 Safari/534.57.2||desktopDevice
 Mozilla/5.0 (Windows NT 6.2; WOW64; ; NCLIENT50_AAP3D55829279C) 
AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 
Safari/537.14||desktopDevice
 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.9.2.10) Gecko/20100916 
Firefox/3.6.10||desktopDevice
+Mozilla/5.0 (Macintosh; ipad||desktopDevice
+Mozilla/5.0 (compatible; ipad||iPad
+Mozilla/5.0 (compatible)||desktopDevice


Reply via email to