code: private static synchronized ProductInfo generateProductInfo() {
          ProductInfo result = new ProductInfo();
          boolean foundJar = false;
          String[] pathEntries = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
          Map<String, Attributes> products = new TreeMap<>(Collections.reverseOrder());
          HashSet<String> removals = new HashSet<>(7);
  
          for (String pathEntry : pathEntries) {
              if (!pathEntry.contains("gateway.server")) {
                  continue;
              }
              if (LOG.isTraceEnabled()) {
                  LOG.trace(format("Found product entry: %s", pathEntry));
              }
              Attributes attrs = readAttributes(pathEntry);
              if((readProduct(attrs, products) || readRemovals(attrs, removals)))
                  foundJar = true;
          }
          // remove any products that depend on other products
          for (String removal : removals) {
              products.remove(removal);
          }
  
          if (foundJar && products.size() != 0) {
              // The remaining values in 'products' are the real top-level product names.
              Attributes attrs = products.entrySet().iterator().next().getValue();
              result.setTitle(attrs.getValue(IMPLEMENTATION_TITLE));
              result.setVersion(attrs.getValue(IMPLEMENTATION_VERSION));
              result.setEdition(attrs.getValue(KAAZING_PRODUCT));
              result.setDependencies(attrs.getValue(KAAZING_DEPENDENCIES));
          }
  
          return result;
      }
docs: Find the product information from the server JAR MANIFEST files and store it
  in static variables here for later retrieval.