{"id":15043780,"url":"https://github.com/sheinbergon/useragent-analyzer","last_synced_at":"2026-03-16T08:04:38.682Z","repository":{"id":57740683,"uuid":"105747600","full_name":"sheinbergon/useragent-analyzer","owner":"sheinbergon","description":"User-Agent analysis for the JVM","archived":false,"fork":false,"pushed_at":"2017-11-21T03:49:24.000Z","size":166,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-29T06:43:27.879Z","etag":null,"topics":["asynchronous","caffeine","j2v8","java-8","ua-parser-js","user-agent-analysis","useragent"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sheinbergon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-10-04T08:43:27.000Z","updated_at":"2017-11-08T09:16:18.000Z","dependencies_parsed_at":"2022-08-25T19:20:42.874Z","dependency_job_id":null,"html_url":"https://github.com/sheinbergon/useragent-analyzer","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sheinbergon/useragent-analyzer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheinbergon%2Fuseragent-analyzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheinbergon%2Fuseragent-analyzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheinbergon%2Fuseragent-analyzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheinbergon%2Fuseragent-analyzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sheinbergon","download_url":"https://codeload.github.com/sheinbergon/useragent-analyzer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheinbergon%2Fuseragent-analyzer/sbom","scorecard":{"id":817422,"data":{"date":"2025-08-11","repo":{"name":"github.com/sheinbergon/useragent-analyzer","commit":"03d67501e3b7edde751dc6b9c6db67f2444b5ff5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"71 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h46c-h94j-95f3","Warn: Project is vulnerable to: GHSA-wf8f-6423-gfxg","Warn: Project is vulnerable to: GHSA-27xj-rqx5-2255","Warn: Project is vulnerable to: GHSA-288c-cq4h-88gq","Warn: Project is vulnerable to: GHSA-4gq5-ch57-c2mg","Warn: Project is vulnerable to: GHSA-4w82-r329-3q67","Warn: Project is vulnerable to: GHSA-57j2-w4cx-62h2","Warn: Project is vulnerable to: GHSA-58pp-9c76-5625","Warn: Project is vulnerable to: GHSA-5949-rw7g-wx7w","Warn: Project is vulnerable to: GHSA-5p34-5m6p-p58g","Warn: Project is vulnerable to: GHSA-5r5r-6hpj-8gg9","Warn: Project is vulnerable to: GHSA-5ww9-j83m-q7qx","Warn: Project is vulnerable to: GHSA-645p-88qh-w398","Warn: Project is vulnerable to: GHSA-6fpp-rgj9-8rwc","Warn: Project is vulnerable to: GHSA-6wqp-v4v6-c87c","Warn: Project is vulnerable to: GHSA-758m-v56v-grj4","Warn: Project is vulnerable to: GHSA-85cw-hj65-qqv9","Warn: Project is vulnerable to: GHSA-89qr-369f-5m5x","Warn: Project is vulnerable to: GHSA-8c4j-34r4-xr8g","Warn: Project is vulnerable to: GHSA-8w26-6f25-cm9x","Warn: Project is vulnerable to: GHSA-95cm-88f5-f2c7","Warn: Project is vulnerable to: GHSA-9gph-22xh-8x98","Warn: Project is vulnerable to: GHSA-9m6f-7xcq-8vf8","Warn: Project is vulnerable to: GHSA-9mxf-g3x6-wv74","Warn: Project is vulnerable to: GHSA-9vvp-fxw6-jcxr","Warn: Project is vulnerable to: GHSA-c265-37vj-cwcc","Warn: Project is vulnerable to: GHSA-c2q3-4qrh-fm48","Warn: Project is vulnerable to: GHSA-c8hm-7hpq-7jhg","Warn: Project is vulnerable to: GHSA-cf6r-3wgc-h863","Warn: Project is vulnerable to: GHSA-cggj-fvv3-cqwv","Warn: Project is vulnerable to: GHSA-cjjf-94ff-43w7","Warn: Project is vulnerable to: GHSA-cmfg-87vq-g5g4","Warn: Project is vulnerable to: GHSA-cvm9-fjm9-3572","Warn: Project is vulnerable to: GHSA-f3j5-rmmp-3fc5","Warn: Project is vulnerable to: GHSA-f9hv-mg5h-xcw9","Warn: Project is vulnerable to: GHSA-f9xh-2qgp-cq57","Warn: Project is vulnerable to: GHSA-fmmc-742q-jg75","Warn: Project is vulnerable to: GHSA-fqwf-pjwf-7vqv","Warn: Project is vulnerable to: GHSA-gjmw-vf9h-g25v","Warn: Project is vulnerable to: GHSA-gwp4-hfv6-p7hw","Warn: Project is vulnerable to: GHSA-gww7-p5w4-wrfv","Warn: Project is vulnerable to: GHSA-h3cw-g4mq-c5x2","Warn: Project is vulnerable to: GHSA-h4rc-386g-6m85","Warn: Project is vulnerable to: GHSA-h592-38cm-4ggp","Warn: Project is vulnerable to: GHSA-h822-r4r5-v8jg","Warn: Project is vulnerable to: GHSA-j823-4qch-3rgm","Warn: Project is vulnerable to: GHSA-jjjh-jjxp-wpff","Warn: Project is vulnerable to: GHSA-m6x4-97wx-4q27","Warn: Project is vulnerable to: GHSA-mc6h-4qgp-37qh","Warn: Project is vulnerable to: GHSA-mph4-vhrx-mv67","Warn: Project is vulnerable to: GHSA-mx7p-6679-8g3q","Warn: Project is vulnerable to: GHSA-mx9v-gmh4-mgqw","Warn: Project is vulnerable to: GHSA-p43x-xfjf-5jhr","Warn: Project is vulnerable to: GHSA-q93h-jc49-78gg","Warn: Project is vulnerable to: GHSA-qjw2-hr98-qgfh","Warn: Project is vulnerable to: GHSA-qmqc-x3r4-6v39","Warn: Project is vulnerable to: GHSA-qr7j-h6gg-jmgc","Warn: Project is vulnerable to: GHSA-r3gr-cxrf-hg25","Warn: Project is vulnerable to: GHSA-r695-7vr9-jgc2","Warn: Project is vulnerable to: GHSA-rf6r-2c4q-2vwg","Warn: Project is vulnerable to: GHSA-rfx6-vp9g-rh7v","Warn: Project is vulnerable to: GHSA-rgv9-q543-rqg4","Warn: Project is vulnerable to: GHSA-rpr3-cw39-3pxh","Warn: Project is vulnerable to: GHSA-v3xw-c963-f5hc","Warn: Project is vulnerable to: GHSA-v585-23hc-c647","Warn: Project is vulnerable to: GHSA-vfqx-33qm-g869","Warn: Project is vulnerable to: GHSA-w3f4-3q6j-rh82","Warn: Project is vulnerable to: GHSA-wh8g-3j2c-rqj5","Warn: Project is vulnerable to: GHSA-x2w5-5m2g-7h5m","Warn: Project is vulnerable to: GHSA-78wr-2p64-hpwj","Warn: Project is vulnerable to: GHSA-gwrp-pvrq-jmwv"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T14:33:10.810Z","repository_id":57740683,"created_at":"2025-08-23T14:33:10.810Z","updated_at":"2025-08-23T14:33:10.810Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28077916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-27T02:00:05.897Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asynchronous","caffeine","j2v8","java-8","ua-parser-js","user-agent-analysis","useragent"],"created_at":"2024-09-24T20:49:35.214Z","updated_at":"2025-12-27T11:11:13.402Z","avatar_url":"https://github.com/sheinbergon.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# useragent-analyzer\n[![Build Status](https://travis-ci.org/sheinbergon/useragent-analyzer.svg?branch=master)](https://travis-ci.org/sheinbergon/useragent-analyzer) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Maven metadata URI](https://img.shields.io/maven-metadata/v/http/central.maven.org/maven2/org/sheinbergon/useragent-analyzer/maven-metadata.xml.svg)](https://mvnrepository.com/artifact/org.sheinbergon) [![GitHub release](https://img.shields.io/github/release/sheinbergon/useragent-analyzer.svg)](https://github.com/sheinbergon/useragent-analyzer/releases) [![Coverage Status](https://coveralls.io/repos/github/sheinbergon/useragent-analyzer/badge.svg?branch=master)](https://coveralls.io/github/sheinbergon/useragent-analyzer)\n\nA non-opinionated User-Agent analysis proxy written in Java 8.\n\n## Introduction\nThe purpose of this project is to encapsulate several popular useragent analysis frameworks for the JVM (and other languages) under a single facade/interface, allowing developers to easily move between frameworks/implementations in any case some becomes obsolete/updated or simply doesn't quite fit the accuracy needs of the task at hand\n\n## Key concepts\n- Provides both synchronous \u0026 fully asynchronous APIs.  \n- Pluggable architecture for both caching \u0026 processing(parsing) modules.\n\n## Getting Started\n\n### Dependencies\n\nSimply add the 'useragent-analyzer-dist' dependency.\n\nNote that this distribution jar relies on the user providing the j2v8 jar for the targeted architecture.\nThe following examples targets 64 bit linux execution environments, but other operating systems are\nsupported as well. See [Maven Central](https://mvnrepository.com/artifact/com.eclipsesource.j2v8) for additional information. \n\n#### Maven\n```xml\n\u003cdependencies\u003e\n    ...\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.sheinbergon\u003c/groupId\u003e\n        \u003cartifactId\u003euseragent-analyzer-dist\u003c/artifactId\u003e\n        \u003cversion\u003e0.0.1\u003c/version\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.eclipsesource.j2v8\u003c/groupId\u003e\n        \u003cartifactId\u003ej2v8_linux_x86_64\u003c/artifactId\u003e\n        \u003cversion\u003e4.8.0\u003c/version\u003e\n    \u003c/dependency\u003e    \n    ...\n\u003c/dependencies\u003e\n\n```\n#### Gradle\n```groovy\n    compile group: 'com.eclipsesource.j2v8', name: 'j2v8_linux_x86_64', version: '4.8.0'\n    compile group: 'org.sheinbergon', name: 'useragent-analyzer-dist', version: '0.0.1'\n```\n### Simple setup\n##### Setting-up a synchronous analyzer\n```java\n UserAgentAnalyzer analyzer = UserAgentAnalyzer.builder()\n                .processor(UaParserJsProcessor.builder().build())\n                .build();\n\nUserAgentIngredients ingredients = analyzer.analyze(\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1\")\ningredients.getOsName() // iOS\ningredients.getDeviceType() // MOBILE\n```\n##### Setting-up an asynchronous analyzer\n```java\nAsyncUserAgentAnalyzer analyzer = AsyncUserAgentAnalyzer.builder()\n                .processor(UaParserJsAsyncProcessor.builder().build())\n                .build();\n\nanalyzer.analyze(\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1\")\n                .thenApply(UserAgentIngredients::getDeviceModel)\n                ...               \n```\n##### Lifecycle management/shutdown\n```java\nanalyzer.teardown();\n```\n\n### Advanced setup\n\nSee Implementation Specs below\n\n\n## Implemntation Specs\n### Processors\n#### ua-paresr-js\n- Uses the popular javascript useragent parsing library [ua-parser.js](https://github.com/faisalman/ua-parser-js)\n- Javascript code is executed using [J2V8](https://github.com/eclipsesource/J2V8)\n- Requires an explicit J2V8 dependency defintion per operating system/architecture. See supported architectures [here](https://mvnrepository.com/artifact/com.eclipsesource.j2v8)\n- As V8Engine instances are not thread-safe, an object-pool is used to acheive thread-safety with concurrency, supporting confiugrable pool size \u0026 allocation timeout\n- Async version also supports executor pools size for V8 Engine allocation and ingestion\n```java\n// Sync\nUserAgentAnalyzer.builder()\n    .processor(UaParserJsProcessor.builder()\n        .v8AllocationTimeout(1000L)\n        .v8PoolSize(5)\n        .build())\n    ...\n\n// Async\nAsyncUserAgentAnalyzer.builder()\n    .processor(UaParserJsAsyncProcessor.builder()           \n        .ingestionConcurrency(4)\n        .v8AllocationConcurrency(16)\n        .v8AllocationTimeout(1000L)\n        .v8PoolSize(5)\n        .build())\n    ...\n```\n\n### Caches\n#### psuedo\n- Default cache implementation, never caches anything (always misses)\n#### caffeine\n- Caching module implemented on top of [caffeine](https://github.com/ben-manes/caffeine)\n- Supports max entries configuration\n```java\n// Sync\nUserAgentAnalyzer.builder()\n    .cache(CaffeineCache.builder()\n        .maxEntries(100000)\n        .build())\n    ...\n\n// Async\nAsyncUserAgentAnalyzer.builder()\n    .cache(CaffeineAsyncCache.builder()\n        .maxEntries(100000)\n        .build())\n    ...\n```\n\n## Future plans:\n- Add concurrency tests \n- Add more cache implementations - [guava](https://github.com/google/guava/wiki/CachesExplained)\n- Add more processor implementations - [woothee](https://github.com/woothee/woothee), [yauaa](https://github.com/nielsbasjes/yauaa)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsheinbergon%2Fuseragent-analyzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsheinbergon%2Fuseragent-analyzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsheinbergon%2Fuseragent-analyzer/lists"}