{"id":37028119,"url":"https://github.com/udger/udger-java","last_synced_at":"2026-01-14T03:21:22.244Z","repository":{"id":5316306,"uuid":"51546413","full_name":"udger/udger-java","owner":"udger","description":"Java agent string parser based on Udger https://udger.com/products/local_parser ","archived":false,"fork":false,"pushed_at":"2023-05-23T20:15:50.000Z","size":333,"stargazers_count":26,"open_issues_count":3,"forks_count":19,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-07-18T09:58:29.866Z","etag":null,"topics":["bot-detection","device-detector","mobile-detection","user-agent-parser"],"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/udger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-02-11T20:55:38.000Z","updated_at":"2023-11-25T04:25:59.000Z","dependencies_parsed_at":"2022-07-24T20:16:32.257Z","dependency_job_id":null,"html_url":"https://github.com/udger/udger-java","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/udger/udger-java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/udger%2Fudger-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/udger%2Fudger-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/udger%2Fudger-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/udger%2Fudger-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/udger","download_url":"https://codeload.github.com/udger/udger-java/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/udger%2Fudger-java/sbom","scorecard":{"id":906850,"data":{"date":"2025-08-11","repo":{"name":"github.com/udger/udger-java","commit":"c055a6d7f23de6e4e1a478386b0b413e2683b99e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":1,"reason":"Found 4/23 approved changesets -- score normalized to 1","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":"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":"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":"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":"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":"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:0","Info: FSF or OSI recognized license: MIT License: LICENSE: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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 11 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-6phf-6h5g-97j2"],"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-24T17:40:00.229Z","repository_id":5316306,"created_at":"2025-08-24T17:40:00.229Z","updated_at":"2025-08-24T17:40:00.229Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408825,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"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":["bot-detection","device-detector","mobile-detection","user-agent-parser"],"created_at":"2026-01-14T03:21:18.931Z","updated_at":"2026-01-14T03:21:22.239Z","avatar_url":"https://github.com/udger.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Udger client for Java (data ver. 3)\nLocal parser is very fast and accurate useragent string detection solution. Enables developers to locally install and integrate a highly-scalable product.\nWe provide the detection of the devices (personal computer, tablet, Smart TV, Game console etc.), operating system and client SW type (browser, e-mail client etc.).\nIt also provides information about IP addresses (Public proxies, VPN services, Tor exit nodes, Fake crawlers, Web scrapers .. etc.)\n\n\n- Tested with more the 50.000 unique user agents.\n- Up to date data provided by https://udger.com/\n- Support for \u003e=Java6\n\n### Performance\nUdger java parser uses LRU cache for last N requests. The size of cache can be defined in constructor, default size is 10000 requests. Parser's performance is tuned continuously, currently it reaches following rates:\n\n- \u003e100.000 requests per second if LRU is hitted\n- 2.000 requests per second without caching\n\nUsing the in memory DB option will even make it faster.\n\n### Compile from git repo\n\n```sh\n    $ git clone https://github.com/udger/udger-java\n    $ cd udger-java/\n    $ maven package\n```\n\n### Requirements\nUdger data is stored in SQLite database file. Udger-java connects to SqLite using JDBC driver. SQLiteJDBC jdbc driver is recommended. If you are using Maven2, add the following XML fragments into your pom.xml file:\n\n```xml\n    \u003cdependency\u003e\n      \u003cgroupId\u003eorg.xerial\u003c/groupId\u003e\n      \u003cartifactId\u003esqlite-jdbc\u003c/artifactId\u003e\n      \u003cversion\u003e3.8.11.2\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\n### Usage\n\n#### How to Specify Udger Database\n\nExample how to create UdgerParser from udger db file `C:\\work\\udgerdb_v3.dat` (in Windows)\n\n```java\n    UdgerParser.ParserDbData parserDbData = new UdgerParser.ParserDbData(\"C:/work/udgerdb_v3.dat\");\n    UdgerParser up = = new UdgerParser(parserDbData);\n    ...\n    up.close();\n```\n\nand from a UNIX (Linux, Mac OS X, etc) udger db file `/home/john/work/udgerdb_v3.dat`\n\n```java\n    UdgerParser.ParserDbData parserDbData = new UdgerParser.ParserDbData(\"/home/john/work/udgerdb_v3.dat\");\n    UdgerParser up = = new UdgerParser(parserDbData);\n    ...\n    up.close();\n```\n\nUdgerParser implements Closeable interface, therefore it must be either opened in `try (...)` statement or explicitly closed.\nSince the SQLite connection creating is time consuming task, it is recommended to keep the UdgerParser's instances in\nan instance pool. UdgerParser is not thread safe object, therefore it can't be used from multiple thread simultaneously.\n\nIntention of class `UdgerParser.ParserDbData` is to keep precalculated DB-specific data and then improve instantiation\nof `UdgerParser`. Using `UdgerParser.ParserDbData` the Udger database can be switched in runtime.\n\n\n#### How to make use of In Memory feature\n\nThe Udger client supports the SQLite DB transactions with the database being in memory. Enabling this feature will make the parser even faster to parse the user agents. Internally the client will re-create the Udger SQLite database from the file into the systems main memory and perform all transactions to it. Since this will require additional memory for operation, it needs to be used carefully with object pools. During pooling with multiple parsers in the pool, this feature will create a separate in memory DB for each new parser and have a single connection to it. This will further allow more concurrency since all connections (from all pooled parsers) now have their own copy of the database.\nTo enable in memory feature simply use the below constructor and pass inMemoryEnabled as `true`. The internal LRU cache can be used by setting a size \u003e 0 or disabled by passing 0 for the third argument.\n\nExample:\n\n```java\n    UdgerParser.ParserDbData parserDbData = new UdgerParser.ParserDbData(\"/home/john/work/udgerdb_v3.dat\");\n    UdgerParser up = new UdgerParser(parserDbData, true, 10000);\n    ...\n    uo.close();\n```\n\n### Usage with maven\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.udger.parser\u003c/groupId\u003e\n    \u003cartifactId\u003eudger-parser\u003c/artifactId\u003e\n    \u003cversion\u003e1.1.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n#### Sample.java\n\n```java\n    public class Sample {\n      public static void main(String[] args) {\n        UdgerParser.ParserDbData parserDbData = new UdgerParser.ParserDbData(\"/home/john/work/udgerdb_v3.dat\");\n        try (UdgerParser up = new UdgerParser(parserDbData)) {\n            UdgerUaResult uaRet = up.parseUa(\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9\");\n            UdgerIpResult ipRet = up.parseIp(\"108.61.199.93\");\n        } catch (SQLException e) {\n            e.printStackTrace();\n        } catch (UnknownHostException e) {\n            e.printStackTrace();\n        }\n      }\n    }\n```\n\n### Automatic updates download\n- for auto-update data use Udger data updater (https://udger.com/support/documentation/?doc=62)\n\n### Documentation for programmers\n- https://udger.com/pub/documentation/parser/JAVA/html/\n\n### Author\nThe Udger.com Team (info@udger.com)\n\n### old v1 format\nIf you still use the previous format of the db (v1), you can use https://github.com/adhar1985/DIUASparser\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fudger%2Fudger-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fudger%2Fudger-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fudger%2Fudger-java/lists"}