You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devicemap.apache.org by wk...@apache.org on 2016/06/19 02:27:23 UTC
svn commit: r1749123 - in /devicemap/trunk/clients/1.0/java: ./ client/
client/src/main/java/org/apache/devicemap/
client/src/main/java/org/apache/devicemap/loader/
client/src/main/java/org/apache/devicemap/loader/resource/ console/
Author: wkeil
Date: Sun Jun 19 02:27:23 2016
New Revision: 1749123
URL: http://svn.apache.org/viewvc?rev=1749123&view=rev
Log:
DMAP-111: Improve Web Examples
Task-Url: https://issues.apache.org/jira/browse/DMAP-111
Modified:
devicemap/trunk/clients/1.0/java/client/pom.xml
devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapClient.java
devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapFactory.java
devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/LoaderFactory.java
devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/resource/URLResource.java
devicemap/trunk/clients/1.0/java/console/pom.xml
devicemap/trunk/clients/1.0/java/pom.xml
Modified: devicemap/trunk/clients/1.0/java/client/pom.xml
URL: http://svn.apache.org/viewvc/devicemap/trunk/clients/1.0/java/client/pom.xml?rev=1749123&r1=1749122&r2=1749123&view=diff
==============================================================================
--- devicemap/trunk/clients/1.0/java/client/pom.xml (original)
+++ devicemap/trunk/clients/1.0/java/client/pom.xml Sun Jun 19 02:27:23 2016
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.devicemap</groupId>
<artifactId>devicemap-java</artifactId>
- <version>1.1.1-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
</parent>
<groupId>org.apache.devicemap</groupId>
Modified: devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapClient.java
URL: http://svn.apache.org/viewvc/devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapClient.java?rev=1749123&r1=1749122&r2=1749123&view=diff
==============================================================================
--- devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapClient.java (original)
+++ devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapClient.java Sun Jun 19 02:27:23 2016
@@ -34,187 +34,195 @@ import org.apache.devicemap.loader.Loade
/**
* @author Werner Keil
- * @version 1.0.12
+ * @version 1.0.13
*/
public class DeviceMapClient {
- private static final Logger LOG = Logger.getLogger(DeviceMapClient.class
- .getName());
- private static final java.util.regex.Pattern TEXT_SPLIT_PATTERN = java.util.regex.Pattern
- .compile(" |-|_|/|\\\\|\\[|\\]|\\(|\\)|;");
-
- private static long initCount = 0;
-
- // indexes
- private Map<String, DeviceType> devices;
- private Map<String, List<DeviceType>> patterns;
-
- private final Device unknown;
-
- public DeviceMapClient() {
- devices = null;
- patterns = null;
- Map<String, String> uAttributes = new HashMap<String, String>();
- uAttributes.put("id", Device.UNKNOWN_ID);
- uAttributes = Collections.unmodifiableMap(uAttributes);
- unknown = new Device(Device.UNKNOWN_ID, uAttributes);
- }
-
- public void initDeviceData(LoaderOption option) throws IOException {
- initDeviceData(option, null);
- }
-
- public synchronized void initDeviceData(LoaderOption option, String path)
- throws IOException {
- devices = LoaderFactory.getLoader(option, path).getData();
- initCount++;
-
- if (initCount % 1000 == 0) {
- LOG.log(Level.WARNING,
- "Possible device data over-initialization detected");
- }
-
- if (devices == null) {
- patterns = null;
- return;
- }
- createIndex();
- }
-
- private void createIndex() {
- patterns = new HashMap<String, List<DeviceType>>(8000);
-
- for (DeviceType device : devices.values()) {
- for (Pattern pattern : device.getPatternSet().getPatterns()) {
- for (int i = 0; i < pattern.getPatternParts().size(); i++) {
- String part = pattern.getPatternParts().get(i);
-
- // duplicate
- if (patterns.get(part) != null) {
- if (i == (pattern.getPatternParts().size() - 1)
- && !patterns.get(part).contains(device)) {
- patterns.get(part).add(device);
- }
- } else {
- List<DeviceType> single = new ArrayList<DeviceType>();
- single.add(device);
- patterns.put(part, single);
- }
- }
- }
- }
- }
-
- public Map<String, String> classify(String text) {
- if (devices == null) {
- throw new RuntimeException("Uninitialized device index");
- }
-
- if (text == null) {
- return null;
- }
-
- Set<String> hitPatterns = new HashSet<String>();
- Set<DeviceType> hitDevices = new HashSet<DeviceType>();
- DeviceType winner = null;
- Pattern winnerPattern = null;
- LOG.log(Level.FINE, "classify: ''{0}''", text);
- List<String> parts = split(text);
-
- // generate ngrams upto size 4
- for (int i = 0; i < parts.size(); i++) {
- String pattern = "";
- for (int j = 0; j < 4 && (j + i) < parts.size(); j++) {
- pattern += parts.get(i + j);
- List<DeviceType> dlist = patterns.get(pattern);
- if (dlist != null) {
- hitPatterns.add(pattern);
- hitDevices.addAll(dlist);
- for (DeviceType device : dlist) {
- LOG.log(Level.FINER,
- "Hit found: ''{0}'' => id: ''{1}'' {2}",
- new Object[] { pattern, device.getId(),
- device.getPatternSet() });
- }
- }
- }
- }
-
- // look for the strongest hit
- for (DeviceType device : hitDevices) {
- Pattern pattern = device.getPatternSet().isValid(hitPatterns);
- if (pattern == null) {
- continue;
+ private static final Logger LOG = Logger.getLogger(DeviceMapClient.class.getName());
+ private static final java.util.regex.Pattern TEXT_SPLIT_PATTERN = java.util.regex.Pattern
+ .compile(" |-|_|/|\\\\|\\[|\\]|\\(|\\)|;");
+
+ private static long initCount = 0;
+
+ // indexes
+ private Map<String, DeviceType> devices;
+ private Map<String, List<DeviceType>> patterns;
+
+ private final Device unknown;
+
+ public DeviceMapClient() {
+ devices = null;
+ patterns = null;
+ Map<String, String> uAttributes = new HashMap<String, String>();
+ uAttributes.put("id", Device.UNKNOWN_ID);
+ uAttributes = Collections.unmodifiableMap(uAttributes);
+ unknown = new Device(Device.UNKNOWN_ID, uAttributes);
+ }
+
+ public void initDeviceData(LoaderOption option, boolean snapshot) throws IOException {
+ initDeviceData(option, null, snapshot);
+ }
+
+ public void initDeviceData(LoaderOption option) throws IOException {
+ initDeviceData(option, false);
+ }
+
+ public synchronized void initDeviceData(LoaderOption option, String path,
+ boolean snapshot) throws IOException {
+ devices = LoaderFactory.getLoader(option, path, snapshot).getData();
+ initCount++;
+
+ if (initCount % 1000 == 0) {
+ LOG.log(Level.WARNING,
+ "Possible device data over-initialization detected");
+ }
+
+ if (devices == null) {
+ patterns = null;
+ return;
+ }
+ createIndex();
+ }
+
+ public void initDeviceData(LoaderOption option, String path)
+ throws IOException {
+ initDeviceData(option, path, false);
+ }
+
+ private void createIndex() {
+ patterns = new HashMap<String, List<DeviceType>>(8000);
+
+ for (DeviceType device : devices.values()) {
+ for (Pattern pattern : device.getPatternSet().getPatterns()) {
+ for (int i = 0; i < pattern.getPatternParts().size(); i++) {
+ String part = pattern.getPatternParts().get(i);
+
+ // duplicate
+ if (patterns.get(part) != null) {
+ if (i == (pattern.getPatternParts().size() - 1)
+ && !patterns.get(part).contains(device)) {
+ patterns.get(part).add(device);
}
-
+ } else {
+ List<DeviceType> single = new ArrayList<DeviceType>();
+ single.add(device);
+ patterns.put(part, single);
+ }
+ }
+ }
+ }
+ }
+
+ public Map<String, String> classify(String text) {
+ if (devices == null) {
+ throw new RuntimeException("Uninitialized device index");
+ }
+
+ if (text == null) {
+ return null;
+ }
+
+ Set<String> hitPatterns = new HashSet<String>();
+ Set<DeviceType> hitDevices = new HashSet<DeviceType>();
+ DeviceType winner = null;
+ Pattern winnerPattern = null;
+ LOG.log(Level.FINE, "classify: ''{0}''", text);
+ List<String> parts = split(text);
+
+ // generate ngrams upto size 4
+ for (int i = 0; i < parts.size(); i++) {
+ String pattern = "";
+ for (int j = 0; j < 4 && (j + i) < parts.size(); j++) {
+ pattern += parts.get(i + j);
+ List<DeviceType> dlist = patterns.get(pattern);
+ if (dlist != null) {
+ hitPatterns.add(pattern);
+ hitDevices.addAll(dlist);
+ for (DeviceType device : dlist) {
LOG.log(Level.FINER,
- "Hit candidate: ''{0}'' => ({1},{2})",
- new Object[] { device.getId(), pattern.getType(),
- pattern.getRank() });
-
- if (winnerPattern == null
- || pattern.getRank() > winnerPattern.getRank()) {
- winner = device;
- winnerPattern = pattern;
- }
- }
-
- if (winner != null) {
- LOG.log(Level.FINE, "Result: {0}", winner);
-
- UserAgent userAgent = UserAgent.of(text);
- LOG.log(Level.FINE, "User Agent: {0}", userAgent);
- // fixFromUserAgent(winner, userAgent);
- return fixFromUserAgent(winner, userAgent).getAttributes();
- } else {
- return null;
- }
- }
-
- private static List<String> split(String text) {
- String[] parts = TEXT_SPLIT_PATTERN.split(text);
- List<String> nonemptyParts = new ArrayList<String>();
- for (String part : parts) {
- String normalizedPart = Pattern.normalize(part);
- if (normalizedPart != null && !normalizedPart.isEmpty())
- nonemptyParts.add(normalizedPart);
- }
- return nonemptyParts;
- }
-
- public Device classifyDevice(String text) {
- Map<String, String> m = classify(text);
- if (m == null) {
- return unknown;
- }
- return new Device(m.get("id"), m);
- }
-
- public int getDeviceCount() {
- if (devices == null) {
- return -1;
- }
- return devices.size();
- }
-
- public int getPatternCount() {
- if (patterns == null) {
- return -1;
- }
- return patterns.size();
- }
-
- public long getNodeCount() {
- if (patterns == null) {
- return -1;
- }
- long count = 0;
- for (List<DeviceType> pDevices : patterns.values()) {
- count += pDevices.size();
- }
- return count;
- }
-
- Map<String, DeviceType> getDevices() {
- return devices;
- }
+ "Hit found: ''{0}'' => id: ''{1}'' {2}",
+ new Object[] { pattern, device.getId(),
+ device.getPatternSet() });
+ }
+ }
+ }
+ }
+
+ // look for the strongest hit
+ for (DeviceType device : hitDevices) {
+ Pattern pattern = device.getPatternSet().isValid(hitPatterns);
+ if (pattern == null) {
+ continue;
+ }
+
+ LOG.log(Level.FINER,
+ "Hit candidate: ''{0}'' => ({1},{2})",
+ new Object[] { device.getId(), pattern.getType(),
+ pattern.getRank() });
+
+ if (winnerPattern == null
+ || pattern.getRank() > winnerPattern.getRank()) {
+ winner = device;
+ winnerPattern = pattern;
+ }
+ }
+
+ if (winner != null) {
+ LOG.log(Level.FINE, "Result: {0}", winner);
+
+ UserAgent userAgent = UserAgent.of(text);
+ LOG.log(Level.FINE, "User Agent: {0}", userAgent);
+ // fixFromUserAgent(winner, userAgent);
+ return fixFromUserAgent(winner, userAgent).getAttributes();
+ } else {
+ return null;
+ }
+ }
+
+ private static List<String> split(String text) {
+ String[] parts = TEXT_SPLIT_PATTERN.split(text);
+ List<String> nonemptyParts = new ArrayList<String>();
+ for (String part : parts) {
+ String normalizedPart = Pattern.normalize(part);
+ if (normalizedPart != null && !normalizedPart.isEmpty())
+ nonemptyParts.add(normalizedPart);
+ }
+ return nonemptyParts;
+ }
+
+ public Device classifyDevice(String text) {
+ Map<String, String> m = classify(text);
+ if (m == null) {
+ return unknown;
+ }
+ return new Device(m.get("id"), m);
+ }
+
+ public int getDeviceCount() {
+ if (devices == null) {
+ return -1;
+ }
+ return devices.size();
+ }
+
+ public int getPatternCount() {
+ if (patterns == null) {
+ return -1;
+ }
+ return patterns.size();
+ }
+
+ public long getNodeCount() {
+ if (patterns == null) {
+ return -1;
+ }
+ long count = 0;
+ for (List<DeviceType> pDevices : patterns.values()) {
+ count += pDevices.size();
+ }
+ return count;
+ }
+
+ Map<String, DeviceType> getDevices() {
+ return devices;
+ }
}
Modified: devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapFactory.java
URL: http://svn.apache.org/viewvc/devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapFactory.java?rev=1749123&r1=1749122&r2=1749123&view=diff
==============================================================================
--- devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapFactory.java (original)
+++ devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/DeviceMapFactory.java Sun Jun 19 02:27:23 2016
@@ -21,11 +21,14 @@ package org.apache.devicemap;
import java.io.IOException;
import org.apache.devicemap.loader.LoaderOption;
-public class DeviceMapFactory {
-
+/**
+ * @author Werner Keil
+ * @version 1.1
+ */
+public final class DeviceMapFactory {
private static DeviceMapClient client = null;
private static volatile boolean initialized = false;
-
+
private static final LoaderOption DEFAULT = LoaderOption.JAR;
private DeviceMapFactory() {
@@ -35,17 +38,21 @@ public class DeviceMapFactory {
return getClient(DEFAULT, null);
}
+ public static DeviceMapClient getClient(LoaderOption option, boolean snapshot) {
+ return getClient(option, null, snapshot);
+ }
+
public static DeviceMapClient getClient(LoaderOption option) {
- return getClient(option, null);
+ return getClient(option, false);
}
- public static DeviceMapClient getClient(LoaderOption option, String path) {
+ public static DeviceMapClient getClient(LoaderOption option, String path, boolean snapshot) {
if (!initialized) {
synchronized (DeviceMapFactory.class) {
if (!initialized) {
client = new DeviceMapClient();
try {
- client.initDeviceData(option, path);
+ client.initDeviceData(option, path, snapshot);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
@@ -56,6 +63,10 @@ public class DeviceMapFactory {
return client;
}
+ public static DeviceMapClient getClient(LoaderOption option, String path) {
+ return getClient(option, path, false);
+ }
+
public static void resetClient() {
initialized = false;
}
Modified: devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/LoaderFactory.java
URL: http://svn.apache.org/viewvc/devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/LoaderFactory.java?rev=1749123&r1=1749122&r2=1749123&view=diff
==============================================================================
--- devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/LoaderFactory.java (original)
+++ devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/LoaderFactory.java Sun Jun 19 02:27:23 2016
@@ -26,9 +26,13 @@ import org.apache.devicemap.loader.impl.
import org.apache.devicemap.loader.resource.URLResource;
import org.apache.devicemap.loader.impl.UninitializedLoader;
-public class LoaderFactory {
+/**
+ * @author Werner Keil
+ * @version 1.1
+ */
+public abstract class LoaderFactory {
- public static Loader getLoader(LoaderOption option, String path) {
+ public static Loader getLoader(LoaderOption option, String path, boolean snapshot) {
switch (option) {
case JAR: {
return new DDRLoader(new JarResource(path));
@@ -42,7 +46,12 @@ public class LoaderFactory {
case NOOP: {
return new NoopLoader();
}
- }
- return new UninitializedLoader();
+ default:
+ return new UninitializedLoader();
+ }
+ }
+
+ public static Loader getLoader(LoaderOption option, String path) {
+ return getLoader(option, path, false);
}
-}
+}
\ No newline at end of file
Modified: devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/resource/URLResource.java
URL: http://svn.apache.org/viewvc/devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/resource/URLResource.java?rev=1749123&r1=1749122&r2=1749123&view=diff
==============================================================================
--- devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/resource/URLResource.java (original)
+++ devicemap/trunk/clients/1.0/java/client/src/main/java/org/apache/devicemap/loader/resource/URLResource.java Sun Jun 19 02:27:23 2016
@@ -24,25 +24,38 @@ import java.net.URL;
import org.apache.devicemap.loader.Resource;
+/**
+ * @author Werner Keil
+ * @version 1.1
+ */
public class URLResource implements Resource {
-
//TODO: put on CDN of some kind
- private static final String DEFAULT_PATH = "http://devicemap-vm.apache.org/data/latest";
+ private static final String LATEST_PATH = "http://devicemap-vm.apache.org/data/latest";
+ private static final String SNAPSHOT_PATH = "http://devicemap-vm.apache.org/data/snapshot";
private final String path;
-
- public URLResource(String path) {
+ private final boolean isSnapshot;
+
+ public URLResource(String path, boolean snapshot) {
+ this.isSnapshot = snapshot;
if (path == null) {
- this.path = DEFAULT_PATH;
+ if (isSnapshot) {
+ this.path = SNAPSHOT_PATH;
+ } else {
+ this.path = LATEST_PATH;
+ }
} else {
this.path = path;
}
}
+
+ public URLResource(String path) {
+ this(path, false);
+ }
@Override
public InputStream getResource(String file) throws IOException {
String rpath = path + "/" + file;
return new URL(rpath).openStream();
}
-
}
Modified: devicemap/trunk/clients/1.0/java/console/pom.xml
URL: http://svn.apache.org/viewvc/devicemap/trunk/clients/1.0/java/console/pom.xml?rev=1749123&r1=1749122&r2=1749123&view=diff
==============================================================================
--- devicemap/trunk/clients/1.0/java/console/pom.xml (original)
+++ devicemap/trunk/clients/1.0/java/console/pom.xml Sun Jun 19 02:27:23 2016
@@ -16,7 +16,7 @@
<parent>
<groupId>org.apache.devicemap</groupId>
<artifactId>devicemap-java</artifactId>
- <version>1.1.1-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
</parent>
<artifactId>devicemap-java-console</artifactId>
Modified: devicemap/trunk/clients/1.0/java/pom.xml
URL: http://svn.apache.org/viewvc/devicemap/trunk/clients/1.0/java/pom.xml?rev=1749123&r1=1749122&r2=1749123&view=diff
==============================================================================
--- devicemap/trunk/clients/1.0/java/pom.xml (original)
+++ devicemap/trunk/clients/1.0/java/pom.xml Sun Jun 19 02:27:23 2016
@@ -23,7 +23,7 @@
<groupId>org.apache.devicemap</groupId>
<artifactId>devicemap-java</artifactId>
<packaging>pom</packaging>
- <version>1.1.1-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<name>Apache DeviceMap for Java</name>
<description>Apache DeviceMap Java API</description>
<url>http://devicemap.apache.org/</url>