{"id":40418286,"url":"https://github.com/qbicsoftware/compass","last_synced_at":"2026-01-20T15:01:03.679Z","repository":{"id":328783968,"uuid":"1108267235","full_name":"qbicsoftware/compass","owner":"qbicsoftware","description":"A Java library to validate FAIR signposting profiles of web links.","archived":false,"fork":false,"pushed_at":"2026-01-12T15:53:18.000Z","size":151,"stargazers_count":0,"open_issues_count":11,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-12T21:42:07.114Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Groovy","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qbicsoftware.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.CFF","codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-02T08:45:31.000Z","updated_at":"2026-01-07T11:58:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/qbicsoftware/compass","commit_stats":null,"previous_names":["qbicsoftware/compass"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/qbicsoftware/compass","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qbicsoftware%2Fcompass","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qbicsoftware%2Fcompass/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qbicsoftware%2Fcompass/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qbicsoftware%2Fcompass/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qbicsoftware","download_url":"https://codeload.github.com/qbicsoftware/compass/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qbicsoftware%2Fcompass/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28605916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T14:45:23.139Z","status":"ssl_error","status_checked_at":"2026-01-20T14:44:16.929Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-01-20T15:00:47.060Z","updated_at":"2026-01-20T15:01:03.667Z","avatar_url":"https://github.com/qbicsoftware.png","language":"Groovy","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Compass\n\nJava library for FAIR Signposting validation of RFC 8288 Web Links. \n\n\n[![Build Maven Package](https://github.com/qbicsoftware/compass/actions/workflows/build_package.yml/badge.svg)](https://github.com/qbicsoftware/compass/actions/workflows/build_package.yml)\n[![Run Maven Tests](https://github.com/qbicsoftware/compass/actions/workflows/run_tests.yml/badge.svg)](https://github.com/qbicsoftware/compass/actions/workflows/run_tests.yml)\n[![CodeQL](https://github.com/qbicsoftware/compass/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/qbicsoftware/compass/actions/workflows/codeql-analysis.yml)\n[![release](https://img.shields.io/github/v/release/qbicsoftware/compass?include_prereleases)](https://github.com/qbicsoftware/compass/releases)\n[![license](https://img.shields.io/github/license/qbicsoftware/compass)](https://github.com/qbicsoftware/compass/blob/main/LICENSE)\n\n[![codecov](https://codecov.io/github/qbicsoftware/compass/graph/badge.svg?token=DAR8MZLF4R)](https://codecov.io/github/qbicsoftware/compass)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=qbicsoftware_compass\u0026metric=code_smells)](https://sonarcloud.io/summary/new_code?id=qbicsoftware_compass)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=qbicsoftware_compass\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=qbicsoftware_compass)\n\n\u003c/div\u003e\n\n---\n\n## ⚠️ Development Status\n\nThis repository is in an **early and experimental stage**.\n\n- APIs may change or be removed without prior notice\n- Documentation may be incomplete or outdated\n- Backward compatibility is **not guaranteed**\n\nUse at your own risk, but provide feedback and suggestions in an issue or contribution in form of a pull-request.\n\n---\n\n# Quick start\n\n## Resolve dependency\n\n```xml\n\u003c!-- You might want to check for the latest version --\u003e\n\u003cgroupId\u003elife.qbic\u003c/groupId\u003e\n\u003cartifactId\u003ecompass\u003c/artifactId\u003e\n\u003cversion\u003e1.0.0\u003c/version\u003e\n```\n\nCheck the latest component version on [Maven Central](https://central.sonatype.com/artifact/life.qbic/compass/).\n\n## Example: Level 1 FAIR Signposting Profile validation\n\n```bash\ncurl -I https://zenodo.org/records/17179862\n```\n\nA simple HTTP GET request to the [Zenodo record](https://zenodo.org/records/17179862) will result in the following HTTP header:\n\n\u003cdetails\u003e\n\u003csummary\u003eFull HTTP Link header returned by Zenodo (real-world example)\u003c/summary\u003e\n    \n```http\nHTTP/1.1 200 OK\nserver: nginx\ndate: Mon, 01 Dec 2025 12:14:33 GMT\ncontent-type: text/html; charset=utf-8\ncontent-length: 85404\nvary: Accept-Encoding\nlink: \u003chttps://orcid.org/0009-0006-0929-9338\u003e ; rel=\"author\" , \u003chttps://ror.org/00v34f693\u003e ; rel=\"author\" , \u003chttps://ror.org/03a1kwz48\u003e ; rel=\"author\" , \u003chttps://doi.org/10.5281/zenodo.17179862\u003e ; rel=\"cite-as\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/dcat+xml\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/json\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/ld+json\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/ld+json;profile=\"https://datapackage.org/profiles/2.0/datapackage.json\"\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/marcxml+xml\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/vnd.citationstyles.csl+json\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/vnd.datacite.datacite+json\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/vnd.datacite.datacite+xml\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/vnd.geo+json\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/vnd.inveniordm.v1+json\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/vnd.inveniordm.v1.full+csv\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/vnd.inveniordm.v1.simple+csv\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/x-bibtex\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/x-dc+xml\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"text/x-bibliography\" , \u003chttps://zenodo.org/records/17179862/files/22-09-2025_13-National-Biobanken-Symposium_FAIR-IN-Biobanking_SG.pdf\u003e ; rel=\"item\" ; type=\"application/pdf\" , \u003chttps://zenodo.org/records/17179862/files/22-09-2025_13-National-Biobanken-Symposium_FAIR-IN-Biobanking_SG.odp\u003e ; rel=\"item\" ; type=\"application/octet-stream\" , \u003chttps://zenodo.org/records/17179862/files/22-09-2025_13-National-Biobanken-Symposium_FAIR-IN-Biobanking_SG.pptx\u003e ; rel=\"item\" ; type=\"application/octet-stream\" , \u003chttps://creativecommons.org/licenses/by/4.0/legalcode\u003e ; rel=\"license\" , \u003chttps://schema.org/PresentationDigitalDocument\u003e ; rel=\"type\" , \u003chttps://schema.org/AboutPage\u003e ; rel=\"type\" , \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"linkset\" ; type=\"application/linkset+json\"\n```\n\u003c/details\u003e\n\nFor the sake of simplicity and to show the FAIR signposting use case Level 1, we use only\nsome of the link targets:\n\n- the author\n- the citation\n- the record API endpoint for additional meta-data\n\n```java\nimport life.qbic.compass.SignPostingProcessor;\nimport life.qbic.compass.model.SignPostingView;\nimport life.qbic.linksmith.core.WebLinkProcessor;\nimport life.qbic.linksmith.spi.WebLinkValidator.ValidationResult;\n\n// Raw header of an HTTP response with link attribute\n// 'link: \u003chttps://orcid.org/0009-0006-0929-9338\u003e ; rel=\"author\" , \u003chttps://ror.org/00v34f693\u003e ; rel=\"author\"'\nString rawHeader =\n    '\u003chttps://orcid.org/0009-0006-0929-9338\u003e ; rel=\"author\" , \u003chttps://doi.org/10.5281/zenodo.17179862\u003e ; rel=\"cite-as\" ,  \u003chttps://zenodo.org/api/records/17179862\u003e ; rel=\"describedby\" ; type=\"application/json\"';\n\nWebLinkProcessor webLinkProcessor = new WebLinkProcessor.Builder().build();\nValidationResult result = webLinkProcessor.process(rawHeader);\n\n// Investigate the validation result\n// ...\n\n// Fetch the weblinks and let compass process them\n// Default builds to FAIR Signposting Level 1 validation\nSignPostingProcessor processor = new SignPostingProcessor.Builder().build();\nSignPostingResult signPostResult = processor.process(result.weblinks());\n\nif(signPostResult.containsIssues()){\n    // Retrieve the report\n    var report = result.report();\n    // Investigate the report \n    // ...\n    return;\n}\n\nSignPostingView view = signPostResult.signPostingView();\n\n// Access to cite-as typed WebLinks\nList\u003cWebLink\u003e citeAs = view.citeAs();\n\n// Access to describedby typed WebLinks\nList\u003cWebLink\u003e metadata = view.describedBy();\n\n// Access to author typed WebLinks\nList\u003cWebLink\u003e authors = view.author();\n```\n\n## What is Compass?\n\n**Compass** is a lightweight Java library for **validating and interpreting FAIR Signposting**.\nIt builds on [Linksmith](https://github.com/qbicsoftware/linksmith) and adds:\n\n- defensive [RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288) *model-level* validation,\n- [FAIR Signposting](https://signposting.org/FAIR/) Level 1 and Level 2 recipe validation,\n- semantic views and Link Set ([RFC 9264](https://www.rfc-editor.org/rfc/rfc9264.html)) processing.\n\nCompass operates entirely **in memory**, performs **no network requests**,  \nand works with `WebLink` objects regardless of how they were created.\n\n## Why Compass?\n\n| Without Compass | With Compass |\n|-----------------|--------------|\n| Assume WebLinks are well-formed | Defensive validation of RFC 8288 *model invariants* |\n| Validation tied to parsing strategy | Validation independent of how WebLinks were created |\n| Manual inspection of `rel` values and parameters | Semantic views for Landing Pages, Metadata Resources, and Content Resources |\n| No clear distinction between Level 1 and Level 2 Signposting | Explicit validators for Level 1 and Level 2 recipes |\n| Link Sets parsed and interpreted ad-hoc | Ready-to-use parsers for RFC 9264 Link Set formats |\n| Ambiguous handling of multiple Link Sets | Pluggable aggregation strategies with defined semantics |\n| Validation logic scattered across client code | Centralized, reusable Signposting validation pipeline |\n\n\n## How Compass fits in\n\nCompass is designed to complement — not replace — Linksmith:\n\n- **Linksmith**\n  - Parses Web Linking syntax\n  - Validates [RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288) during parsing\n  - Produces `WebLink` model objects\n\n- **Compass**\n  - Does not assume how `WebLink`s were produced\n  - Validates [RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288) *model-level constraints* defensively\n  - Applies [FAIR Signposting](https://signposting.org/FAIR/) semantics and recipes\n  - Interprets Level 2 Link Sets ([RFC 9264](https://www.rfc-editor.org/rfc/rfc9264.html))\n\nTogether, they form a clean separation of concerns:\n\n- *Linksmith*: “Is this syntactically valid Web Linking?”\n- *Compass*: “Is this WebLink model sound, and what does it mean for FAIR Signposting?”\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqbicsoftware%2Fcompass","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqbicsoftware%2Fcompass","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqbicsoftware%2Fcompass/lists"}