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