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