public PubsubMessage apply()

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