You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devicemap.apache.org by re...@apache.org on 2013/06/23 06:56:18 UTC

svn commit: r1495793 [1/5] - in /incubator/devicemap/trunk/devicemapjava: ./ src/main/java/ src/main/java/org/apache/devicemap/client/ src/main/resources/

Author: rezan
Date: Sun Jun 23 04:56:17 2013
New Revision: 1495793

URL: http://svn.apache.org/r1495793
Log:
device map java client

Added:
    incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Device.java
    incubator/devicemap/trunk/devicemapjava/src/main/resources/BuilderDataSource.xml
    incubator/devicemap/trunk/devicemapjava/src/main/resources/BuilderDataSourcePatch.xml
    incubator/devicemap/trunk/devicemapjava/src/main/resources/DeviceDataSource.xml
    incubator/devicemap/trunk/devicemapjava/src/main/resources/DeviceDataSourcePatch.xml
Removed:
    incubator/devicemap/trunk/devicemapjava/BuilderDataSource.xml
    incubator/devicemap/trunk/devicemapjava/BuilderDataSourcePatch.xml
    incubator/devicemap/trunk/devicemapjava/DeviceDataSource.xml
    incubator/devicemap/trunk/devicemapjava/DeviceDataSourcePatch.xml
    incubator/devicemap/trunk/devicemapjava/test.bat
Modified:
    incubator/devicemap/trunk/devicemapjava/pom.xml
    incubator/devicemap/trunk/devicemapjava/src/main/java/Main.java
    incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/DeviceMapClient.java
    incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/FileLoader.java
    incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Loader.java
    incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Util.java
    incubator/devicemap/trunk/devicemapjava/test.sh

Modified: incubator/devicemap/trunk/devicemapjava/pom.xml
URL: http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava/pom.xml?rev=1495793&r1=1495792&r2=1495793&view=diff
==============================================================================
--- incubator/devicemap/trunk/devicemapjava/pom.xml (original)
+++ incubator/devicemap/trunk/devicemapjava/pom.xml Sun Jun 23 04:56:17 2013
@@ -34,14 +34,10 @@
     <description>DeviceMap Java Client</description>
     <url>http://incubator.apache.org/devicemap</url>
 
-    <prerequisites>
-        <maven>3.0.2</maven>
-    </prerequisites>
-  
     <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/incubator/devicemap/trunk/openddr/java</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/devicemap/trunk/openddr/java</developerConnection>
-        <url>http://svn.apache.org/viewvc/incubator/devicemap/trunk/openddr/java</url>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/incubator/devicemap/trunk/devicemapjava</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/devicemap/trunk/devicemapjava</developerConnection>
+        <url>http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava</url>
     </scm>
   
     <dependencies>

Modified: incubator/devicemap/trunk/devicemapjava/src/main/java/Main.java
URL: http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava/src/main/java/Main.java?rev=1495793&r1=1495792&r2=1495793&view=diff
==============================================================================
--- incubator/devicemap/trunk/devicemapjava/src/main/java/Main.java (original)
+++ incubator/devicemap/trunk/devicemapjava/src/main/java/Main.java Sun Jun 23 04:56:17 2013
@@ -1,3 +1,4 @@
+import java.util.Map;
 import org.apache.devicemap.client.DeviceMapClient;
 
 public class Main {
@@ -9,10 +10,26 @@ public class Main {
         
         long start=System.currentTimeMillis();
         
-        client.loadFromFolder(("."));
+        client.loadFromFolder(("src/main/resources"));
         
         long diff=System.currentTimeMillis()-start;
         
-        System.out.println("Loaded "+client.getDeviceCount()+" devices in "+diff+"ms");
+        System.out.println("Loaded "+client.getDeviceCount()+" devices with "+client.getPatternCount()+" patterns in "+diff+"ms");
+        
+        classify(client,"Mozilla/5.0 (Linux; U; Android 2.2; en; HTC Aria A6380 Build/ERE27) AppleWebKit/540.13+ (KHTML, like Gecko) Version/3.1 Mobile Safari/524.15.0");
+        classify(client,"Mozilla/5.0 (iPad; U; CPU OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8L1");
+        classify(client,"Mozilla/5.0 (BlackBerry; U; BlackBerry 9810; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.261 Mobile Safari/534.11+");
+        classify(client,"Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X; en-us) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/23.0.1271.91 Mobile/10A403 Safari/8536.25");
+        classify(client,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDC; .NET4.0C; IPH 1.1.21.4019; AskTbORJ/5.13.1.18107)");
+    }
+    
+    public static void classify(DeviceMapClient client, String text) {
+        long start=System.currentTimeMillis();
+        
+        Map<String,String> ret=client.classify(text);
+        
+        long diff=System.currentTimeMillis()-start;
+        
+        System.out.println("Result: "+ret.get("id")+" took "+diff+"ms");
     }
-}
\ No newline at end of file
+}

Added: incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Device.java
URL: http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Device.java?rev=1495793&view=auto
==============================================================================
--- incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Device.java (added)
+++ incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Device.java Sun Jun 23 04:56:17 2013
@@ -0,0 +1,91 @@
+/*
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+ */
+
+package org.apache.devicemap.client;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author Reza Naghibi
+ */
+public class Device {
+    
+    private String id;
+    
+    private String parentId;
+    
+    private String builder;
+    
+    private List<String> patterns;
+    
+    private Map<String,String> attributes;
+    
+    public String toString() {
+        return "id='"+id+"'," +
+               "parentId='"+parentId+"',"+
+               "builder='"+builder+"',"+
+               "patterns="+patterns+","+
+               "attribytes="+attributes+".";
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getBuilder() {
+        return builder;
+    }
+
+    public void setBuilder(String builder) {
+        this.builder = builder;
+    }
+
+    public List<String> getPatterns() {
+        return patterns;
+    }
+
+    public void setPatterns(List<String> patterns) {
+        this.patterns = patterns;
+    }
+
+    public Map<String,String> getAttributes() {
+        return attributes;
+    }
+
+    public void setAttributes(Map<String,String> attributes) {
+        this.attributes = attributes;
+    }
+    
+    
+    
+}

Modified: incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/DeviceMapClient.java
URL: http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/DeviceMapClient.java?rev=1495793&r1=1495792&r2=1495793&view=diff
==============================================================================
--- incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/DeviceMapClient.java (original)
+++ incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/DeviceMapClient.java Sun Jun 23 04:56:17 2013
@@ -21,6 +21,7 @@ package org.apache.devicemap.client;
 
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -29,18 +30,94 @@ import java.util.Map;
  */
 public class DeviceMapClient {
     
-    Map<String,Map<String,String>> devices;
+    Map<String,Device> devices;
+    Map<String,Device> patterns;
     
     public DeviceMapClient() {
-        devices=new HashMap<String,Map<String,String>>();
+        devices=new HashMap<String,Device>();
+        patterns=new HashMap<String,Device>();
     }
     
     public void loadFromFolder(String folder) throws IOException {
         devices=FileLoader.dataFolder(folder);
+        
+        createIndex();
+    }
+    
+    private void createIndex() {
+        for(Device device:devices.values()) {
+            List<String> dpatterns=device.getPatterns();
+            
+            if(dpatterns==null) {
+                continue;
+            }
+            
+            for(String pattern:dpatterns) {
+                patterns.put(pattern, device);
+            }
+        }
+    }
+    
+    public Map<String,String> classify(String text) {
+        Map<String,Device> hits=new HashMap<String,Device>();
+        Device winner=null;
+        
+        if(text==null) {
+            return null;
+        }
+        
+        Util.log("classify: "+text+"'");
+        
+        String[] parts=text.split(" ");
+        
+        for(int i=0;i<parts.length;i++) {
+            String pattern="";
+            for(int j=0;j<3 && (j+i)<parts.length;j++) {
+                pattern+=Util.normalize(parts[i+j]);
+                
+                Device device=patterns.get(pattern);
+                
+                if(device!=null) {
+                    hits.put(pattern, device);
+                }
+            }
+        }
+        
+        hits:
+        for(String hit:hits.keySet()) {
+            Device device=hits.get(hit);
+            
+            if("TwoStepDeviceBuilder".equals(device.getBuilder())) {
+                for(String pattern:device.getPatterns()) {
+                    if(!hits.containsKey(pattern)) {
+                        continue hits;
+                    }
+                }
+            }
+            
+            Util.log("Hit candidate: "+device.getId());
+            
+            if(winner!=null) {
+                if("SimpleDeviceBuilder".equals(winner.getBuilder()) && !"SimpleDeviceBuilder".equals(device.getBuilder())) {
+                    winner=device;
+                }
+            } else {
+                winner=device;
+            }
+        }
+        
+        if(winner!=null) {
+            return winner.getAttributes();
+        } else {
+            return null;
+        }
     }
     
     public int getDeviceCount() {
-        return (devices==null)?-1:devices.size();
+        return devices.size();
     }
 
+    public int getPatternCount() {
+        return patterns.size();
+    }
 }

Modified: incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/FileLoader.java
URL: http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/FileLoader.java?rev=1495793&r1=1495792&r2=1495793&view=diff
==============================================================================
--- incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/FileLoader.java (original)
+++ incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/FileLoader.java Sun Jun 23 04:56:17 2013
@@ -38,7 +38,7 @@ public class FileLoader {
      * @return map of devices
      * @throws IOException 
      */
-    public static Map<String,Map<String,String>> dataFolder(String folder) throws IOException {
+    public static Map<String,Device> dataFolder(String folder) throws IOException {
         Loader loader=new Loader();
         
         String ddpath=folder+File.separatorChar+"DeviceDataSource.xml";

Modified: incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Loader.java
URL: http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Loader.java?rev=1495793&r1=1495792&r2=1495793&view=diff
==============================================================================
--- incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Loader.java (original)
+++ incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Loader.java Sun Jun 23 04:56:17 2013
@@ -16,10 +16,13 @@
    specific language governing permissions and limitations
    under the License.
  */
+
 package org.apache.devicemap.client;
 
 import java.io.InputStreamReader;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,10 +31,10 @@ import java.util.Map;
  */
 public class Loader {
     
-    private Map<String,Map<String,String>> devices;
+    private Map<String,Device> devices;
     
     public Loader() {
-        devices=new HashMap<String,Map<String,String>>();
+        devices=new HashMap<String,Device>();
     }
     
     /*
@@ -42,26 +45,22 @@ public class Loader {
         String tag;
         
         try {
-            String id="";
-            String parent="";
+            Device device=new Device();
             Map<String,String> attributes=new HashMap<String,String>();
             
             while(!(tag=parser.getNextTag()).isEmpty()) {
                 if(tag.startsWith("<device ")) {
-                    id=XMLParser.getAttribute(tag,"id");
-                    parent=XMLParser.getAttribute(tag,"parentId");
+                    device.setId(XMLParser.getAttribute(tag,"id"));
+                    device.setParentId(XMLParser.getAttribute(tag,"parentId"));
                 } else if(tag.equals("</device>")) {
-                    if(!parent.isEmpty()) {
-                        attributes.put("parentId", parent);
-                    }
                     
-                    if(!id.isEmpty()) {
-                        attributes.put("id", id);
-                        getDevices().put(id, attributes);
+                    if(device.getId()!=null && !device.getId().isEmpty()) {
+                        attributes.put("id", device.getId());
+                        device.setAttributes(attributes);
+                        devices.put(device.getId(), device);
                     }
                     
-                    id="";
-                    parent="";
+                    device=new Device();
                     attributes=new HashMap<String,String>();
                 } else if(tag.startsWith("<property ")) {
                     String key=XMLParser.getAttribute(tag,"name");
@@ -84,37 +83,39 @@ public class Loader {
         
         try {
             String builder="";
+            Device device=null;
             String id="";
-            String patterns="";
+            List<String> patterns=new ArrayList<String>();
             
             while(!(tag=parser.getNextTag()).isEmpty()) {
                 if(tag.startsWith("<builder ")) {
                     builder=XMLParser.getAttribute(tag,"class");
+                    
+                    if(builder.lastIndexOf(".")>=0) {
+                        builder=builder.substring(builder.lastIndexOf(".")+1);
+                    }
                 } else if(tag.startsWith("<device ")) {
-                    id=XMLParser.getAttribute(tag,"id");
+                    device=devices.get(XMLParser.getAttribute(tag,"id"));
                 } else if(tag.equals("</device>")) {
-                    if(!id.isEmpty() && !patterns.isEmpty()) {
-                        Map<String,String> device=devices.get(id);
-                        
-                        if(device!=null) {
-                            device.put("pattern",patterns);
-                            device.put("builder",builder);
-                        } else {
-                            Util.log("ERROR: device not found: '"+id+"'");
-                        }
+                    if(device!=null) {
+                        device.setPatterns(patterns);
+                        device.setBuilder(builder);
+                    } else {
+                        Util.log("ERROR: device not found: '"+id+"'");
                     }
                     
+                    device=null;
                     id="";
-                    patterns="";
+                    patterns=new ArrayList<String>();
                     
                 } else if(tag.equals("<value>")) {
-                    String pattern=parser.getTagValue();
+                    String pattern=Util.normalize(parser.getTagValue());
                     
-                    if(!patterns.isEmpty()) {
-                        patterns+=",";
+                    if(pattern.isEmpty()) {
+                        continue;
                     }
                     
-                    patterns+=pattern;
+                    patterns.add(pattern);
                 }
             }
         } catch(Exception ex) {
@@ -126,33 +127,31 @@ public class Loader {
      * Sets attributes from parents
      */
     public void setParentAttributes() {
-        for(String device:devices.keySet()) {
-            Map<String,String> attributes=devices.get(device);
-            
-            mergeParent(attributes);
+        for(Device device:devices.values()) {
+            mergeParent(device);
         }
     }
     
-    private void mergeParent(Map<String,String> attributes) {
-        String parentId=attributes.get("parentId");
+    private void mergeParent(Device device) {
+        String parentId=device.getParentId();
         
-        if(parentId==null || parentId.isEmpty()) {
+        if(parentId==null) {
             return;
         }
         
-        Map<String,String> parent=devices.get(parentId);
+        Device parent=devices.get(parentId);
         
-        if(parent==null || parent.isEmpty()) {
+        if(parent==null) {
             return;
         }
         
         mergeParent(parent);
         
-        for(String key:parent.keySet()) {
-            String value=parent.get(key);
+        for(String key:parent.getAttributes().keySet()) {
+            String value=parent.getAttributes().get(key);
             
-            if(!attributes.containsKey(key)) {
-                attributes.put(key, value);
+            if(!device.getAttributes().containsKey(key)) {
+                device.getAttributes().put(key, value);
             }
         }
     }
@@ -160,7 +159,7 @@ public class Loader {
     /**
      * @return the devices
      */
-    public Map<String,Map<String,String>> getDevices() {
+    public Map<String,Device> getDevices() {
         return devices;
     }
 }

Modified: incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Util.java
URL: http://svn.apache.org/viewvc/incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Util.java?rev=1495793&r1=1495792&r2=1495793&view=diff
==============================================================================
--- incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Util.java (original)
+++ incubator/devicemap/trunk/devicemapjava/src/main/java/org/apache/devicemap/client/Util.java Sun Jun 23 04:56:17 2013
@@ -16,6 +16,7 @@
    specific language governing permissions and limitations
    under the License.
  */
+
 package org.apache.devicemap.client;
 
 import java.text.SimpleDateFormat;
@@ -27,6 +28,30 @@ import java.util.Date;
  */
 public class Util {
     
+    /*
+     * normalizes a pattern
+     */
+    public static String normalize(String p) {
+        if(p==null) {
+            return p;
+        }
+        
+        p=p.toLowerCase().trim();
+        
+        p=p.replaceAll("\\[bb\\]","b");
+        
+        StringBuilder ret=new StringBuilder();
+        
+        for(int i=0;i<p.length();i++) {
+            Character c=p.charAt(i);
+            if(Character.isLetter(c) || Character.isDigit(c)) {
+                ret.append(c);
+            }
+        }
+        
+        return ret.toString();
+    }
+    
     public static void log(String msg) {
         log(msg, null);
     }