in ingestion-beam/src/main/java/com/mozilla/telemetry/decoder/ParseUserAgent.java [167:240]
public PubsubMessage apply(PubsubMessage message) {
// Prevent null pointer exception
message = PubsubConstraints.ensureNonNull(message);
// Copy attributes
Map<String, String> attributes = new HashMap<String, String>(message.getAttributeMap());
// Remove and record user agent if present
String agent = attributes.remove(Attribute.USER_AGENT);
// Parse user agent
if (agent != null) {
// Search agent for matches using regular expressions
Matcher search = SEARCH.matcher(agent);
// initialize state
Browser browser = null;
String version = null;
String slashVersion = null;
Os os = null;
// Loop until we haven't found any matches
while (search.find()) {
if (search.group("browser") != null) {
// Get Browser for detected browser
Browser value = BROWSER_MAP.get(search.group("browser"));
if (browser == null || value.ordinal() < browser.ordinal()) {
// Update browser with better match
browser = value;
// Update version or set null
version = search.group("version");
} else if (value == browser && version == null) {
// Add missing version from repeat match
version = search.group("version");
}
}
if (search.group("os") != null) {
// Get Os for detected os
Os value = OS_MAP.get(search.group("os"));
if (os == null || value.ordinal() < os.ordinal()) {
// Update os with better match
os = value;
}
}
}
if (browser != null) {
// put browser attribute
attributes.put(Attribute.USER_AGENT_BROWSER, browser.value);
if (browser.version != null) {
// put version attribute from browser
attributes.put(Attribute.USER_AGENT_VERSION, browser.version);
} else if (browser.separator == LAST_SLASH) {
// search for this pattern as late as possible because it's slow
search = LAST_SLASH_VERSION.matcher(agent);
if (search.find()) {
// put version attribute from search
attributes.put(Attribute.USER_AGENT_VERSION, search.group("version"));
}
} else if (version != null) {
// put version attribute
attributes.put(Attribute.USER_AGENT_VERSION, version);
}
}
if (browser != null && browser.os != null) {
// put os attribute from browser
attributes.put(Attribute.USER_AGENT_OS, browser.os);
} else if (os != null) {
// put os attribute
attributes.put(Attribute.USER_AGENT_OS, os.value);
}
}
// Return new message
return new PubsubMessage(message.getPayload(), attributes);
}