{"id":32991128,"url":"https://github.com/vaimee/SEPA","last_synced_at":"2025-11-15T10:01:08.042Z","repository":{"id":37385227,"uuid":"92935344","full_name":"vaimee/SEPA","owner":"vaimee","description":"Get notifications about changes in your SPARQL endpoint. ","archived":false,"fork":false,"pushed_at":"2025-07-25T20:43:02.000Z","size":36446,"stargazers_count":30,"open_issues_count":18,"forks_count":10,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-07-26T00:17:07.069Z","etag":null,"topics":["events","internet-of-things","interoperability","java","publish-subscribe","push-notifications","rdf","rdf-store","rdf-triples","semantic-web","sparql","sparql-endpoints","sparql-query","web-of-things"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vaimee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-05-31T10:36:01.000Z","updated_at":"2025-07-25T20:34:19.000Z","dependencies_parsed_at":"2024-03-26T11:46:52.766Z","dependency_job_id":"661e6f9a-2de5-4619-8d72-0f7cd05bf9a9","html_url":"https://github.com/vaimee/SEPA","commit_stats":null,"previous_names":["vaimee/sepa","arces-wot/sepa"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/vaimee/SEPA","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaimee%2FSEPA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaimee%2FSEPA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaimee%2FSEPA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaimee%2FSEPA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vaimee","download_url":"https://codeload.github.com/vaimee/SEPA/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaimee%2FSEPA/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284538091,"owners_count":27022334,"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-11-15T02:00:06.050Z","response_time":57,"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":["events","internet-of-things","interoperability","java","publish-subscribe","push-notifications","rdf","rdf-store","rdf-triples","semantic-web","sparql","sparql-endpoints","sparql-query","web-of-things"],"created_at":"2025-11-13T09:00:33.277Z","updated_at":"2025-11-15T10:01:08.016Z","avatar_url":"https://github.com/vaimee.png","language":"Java","funding_links":[],"categories":["SPARQL"],"sub_categories":["Streaming SPARQL"],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/vaimee/SEPA\"\u003e\n    \u003cimg width=\"300px\" src=\"img/logo.png\"\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://travis-ci.org/arces-wot/SEPA\"\u003e\n    \u003cimg  src=\"https://travis-ci.org/arces-wot/SEPA.svg?branch=master\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://bintray.com/arces-wot/sepa-java-libs/client-api\"\u003e\n    \u003cimg  src=\"https://img.shields.io/badge/client%20api-latest-cyan.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/vaimee/SEPA/releases\"\u003e\n    \u003cimg  src=\"https://img.shields.io/github/downloads/arces-wot/SEPA/total.svg?colorB=blue\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/vaimee/SEPA/tree/dev\"\u003e\n    \u003cimg  src=\"https://img.shields.io/badge/unstable-dev-violet.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://gitter.im/sepa_dev/Lobby#\"\u003e\n    \u003cimg  src=\"https://img.shields.io/badge/chat-on%20gitter-red.svg\"\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n   \u003ca href=\"https://www.gnu.org/licenses/gpl-3.0\"\u003e\n    \u003cimg  src=\"https://img.shields.io/badge/License-GPLv3-blue.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"hhttps://www.gnu.org/licenses/lgpl-3.0\"\u003e\n    \u003cimg  src=\"https://img.shields.io/badge/License-LGPL%20v3-blue.svg\"\u003e\n  \u003c/a\u003e\n  \n\u003c/div\u003e\n\n## Table of Contents\n- [Introduction](#introduction)\n- [Demo](#demo)\n- [Quick start](#quick-start)\n- [Configuration](#configuration)\n- [Usage](#usage)\n- [Contributing](#contributing)\n- [History](#history)\n- [Credits](#credits)\n\n## Introduction\nSEPA (**S**PARQL **E**vent **P**rocessing **A**rchitecture) is a publish-subscribe architecture designed to support information level interoperability. The architecture is built on top of generic SPARQL endpoints (conformant with [SPARQL 1.1 protocol](https://www.w3.org/TR/sparql11-protocol/)) where publishers and subscribers use standard **SPARQL 1.1** [Updates](https://www.w3.org/TR/sparql11-update/) and [Queries](https://www.w3.org/TR/sparql11-query/). Notifications about events (i.e., changes in the **RDF** knowledge base) are expressed in terms of added and removed SPARQL binding results since the previous notification. To know more about SEPA architecture and vision please refer to this [paper](https://www.mdpi.com/1999-5903/10/4/36/htm). SEPA proposal has been formalized in the following *unofficial dratfs*:\n- [SPARQL Event Processing Architecture (SEPA)](https://vaimee.org/TR/sepa.html) contribute [here](https://github.com/vaimee/SEPA/blob/master/TR/sepa.html)\n- [SPARQL 1.1 Secure Event Protocol](https://vaimee.org/TR/sparql11-se-protocol.html) contribute [here](https://github.com/vaimee/SEPA/blob/master/TR/sparql11-se-protocol.html)\n- [SPARQL 1.1 Subscribe Language](http://vaimee.org/TR/sparql11-subscribe.html) contribute [here](https://github.com/vaimee/SEPA/blob/master/TR/sparql11-subscribe.html)\n- [JSON SPARQL Application Profile (JSAP)](http://vaimee.org/TR/jsap.html) contribute [here](https://github.com/vaimee/SEPA/blob/master/TR/jsap.html)\n\n## Demo\n\n![Demo showing subscription and notifications](img/SEPADemo.gif)\n\n## Quick start\n\n- Download the [SEPA Engine](https://github.com/vaimee/SEPA/releases/latest) and run it: `java -jar engine-x.y.z.jar`\n\n- Download [Blazegraph](https://github.com/blazegraph/database/releases/latest) (or use any other SPARQL 1.1 Protocol compliant service) and run it as shown [here](https://wiki.blazegraph.com/wiki/index.php/Quick_Start) \n\n- Use the [SEPA Playground](https://studio.sepa.vaimee.com) to check basic functionalities of the engine.\n\n### For Hackers 💻👩‍💻👨‍💻\n\u003ca href=\"https://asciinema.org/a/251211\"\u003e\n  \u003cimg width=\"300px\" src=\"https://asciinema.org/a/251211.svg\"\u003e\n\u003c/a\u003e\n\n## Configuration\nThe SEPA engine can be used with different SPARQL endpoints which must support SPARQL 1.1 protocol. The endpoint can be configured using\na JSON file `endpoint.jpar`. Furthermore, the engine has various parameters that can be used to configure the standard behavior; they\ncan be set using another JSON file called `engine.jpar`.  \nIn the repository, you will find some versions of `endpoint-{something}.jpar` file. According to your underlying SPARQL endpoint, you have to rename the correct file to `endpoint.jpar`.\nThe default version of `endpoint.jpar` configures the engine to use use a local running instance of Blazegraph as [SPARQL 1.1 Protocol Service](https://www.w3.org/TR/sparql11-protocol/).\n\n```json\n{\n\"host\":\"localhost\",\n\"sparql11protocol\":{\n  \"protocol\":\"http\",\n  \"port\":9999,\n  \"query\":{\n    \"path\":\"/blazegraph/namespace/kb/sparql\",\n    \"method\":\"POST\",\n    \"format\":\"JSON\"},\n  \"update\":{\n    \"path\":\"/blazegraph/namespace/kb/sparql\",\n    \"method\":\"POST\",\n    \"format\":\"JSON\"}}}\n```\nThe default version of  `engine.jpar` configures the engine to listen for incoming [SPARQL 1.1 SE Protocol](http://vaimee.org/TR/sparql11-se-protocol/) requests at the following URLs:\n\n1. Query: http://localhost:8000/query\n2. Update: http://localhost:8000/update\n3. Subscribe/Unsubscribe: ws://localhost:9000/subscribe\n4. SECURE Query: https://localhost:8443/secure/query\n5. SECURE Update: https://localhost:8443/secure/update\n6. SECURE Subscribe/Unsubscribe: wss://localhost:9443/secure/subscribe \n7. Registration: https://localhost:8443/oauth/register\n8. Token request: https://localhost:8443/oauth/token\n```json\n{\"parameters\":{\n  \"scheduler\":{\n   \"queueSize\":100,\n   \"timeout\":5000},\n  \"processor\":{\n   \"updateTimeout\":5000,\n   \"queryTimeout\":5000,\n   \"maxConcurrentRequests\":5,\n   \"reliableUpdate\":true},\n  \"spu\":{\"timeout\":5000},\n  \"gates\":{\n   \"security\":{\n    \"tls\":false,\n    \"enabled\":false,\n    \"type\":\"local\"},\n   \"paths\":{\n    \"secure\":\"/secure\",\n    \"update\":\"/update\",\n    \"query\":\"/query\",\n    \"subscribe\":\"/subscribe\",\n    \"unsubscribe\":\"/unsubscribe\",\n    \"register\":\"/oauth/register\",\n    \"tokenRequest\":\"/oauth/token\"},\n   \"ports\":{\n    \"http\":8000,\n    \"https\":8443,\n    \"ws\":9000,\n    \"wss\":9443}}}}\n```\n### Logging\nSEPA uses [log4j2](http://logging.apache.org/log4j/2.x/) by Apache. A default configuration is stored in the file log4j2.xml provided with the distribution. If the file resides in the engine folder, but it is not used, add the following JVM directive to force using it:\n\njava `-Dlog4j.configurationFile=./log4j2.xml` -jar engine-x.y.z.jar\n\n### Security\nBy default, the engine implements a simple in-memory [OAuth 2.0 client-credential flow](https://auth0.com/docs/flows/client-credentials-flow). It uses a JKS for storing the keys and certificates for [SSL](http://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6ek/index.html) and [JWT](https://tools.ietf.org/html/rfc7519) signing/verification. A default `sepa.jks` is provided including a single X.509 certificate (the password for both the store and the key is: `sepa2017`). If you face problems using the provided JKS, please delete the `sepa.jks` file and create a new one as follows: `keytool -genkey -keyalg RSA -alias sepakey -keystore sepa.jks -storepass sepa2017 -validity 360 -keysize 2048`\nRun `java -jar engine-x.y.z.jar -help` for a list of options. The Java [Keytool](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html) can be used to create, access and modify a JKS. \nSEPA also implements other two security mechanisms:\n- LDAP: it extends the default one by storing clients's information into an LDAP server (tested with [Apache Directory](https://directory.apache.org/))\n- KEYCLOAK: authentication based on OpenID Connect in managed by [Keycloak](https://www.keycloak.org/)\n\nSecurity is configured within the `engine.jpar` as follows:\n```json\n{\"gates\":{\n  \"security\":{\n    \"tls\": false,\n    \"enabled\": true,\n    \"type\": \"local\"\n}}}\n```\nwhere \n- `type` can assume one of the following values: `local`,`ldap`,`keycloak`\n- `tls` is used when `type`=`ldap` to enable or not LDAP StartTLS\n\n### JMX monitoring\nThe SEPA engine is also distributed with a default [JMX](http://www.oracle.com/technetwork/articles/java/javamanagement-140525.html) configuration `jmx.properties` (including the `jmxremote.password` and `jmxremote.access` files for password and user grants). Remember to change password file permissions using: `chmod 600 jmxremote.password`. To enable remote JMX, the engine must be run as follows: `java -Dcom.sun.management.config.file=jmx.properties -jar engine-x.y.z.jar`. Using [`jconsole`](http://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html) is possible to monitor and control the most important engine parameters. By default, the port is `5555` and the `root:root` credentials grant full control (read/write).\n\n### Usage\nThe SEPA engine can be configured from the command line. Run `java -jar engine-x.y.z.jar -help` for the list of available settings.\n\n`java [JMX] [JVM] [LOG4J] -jar SEPAEngine_X.Y.Z.jar [-help] [-secure=true] [-engine=engine.jpar] [-endpoint=endpoint.jpar] [JKS OPTIONS] [LDAP OPTIONS] [ISQL OPTIONS]`\n\n- `secure` : overwrite the current secure option of engine.jpar\n- `engine` : can be used to specify the JSON configuration parameters for the engine (default: engine.jpar)\n- `endpoint` : can be used to specify the JSON configuration parameters for the endpoint (default: endpoint.jpar)\n- `help` : to print this help\n\n[JMX]\n- `Dcom.sun.management.config.file=jmx.properties` : to enable JMX remote managment\n\n[JVM]\n- `XX:+UseG1GC`\n\n[LOG4J]\n- `Dlog4j.configurationFile=path/to/log4j2.xml`\n\n[JKS OPTIONS]\n- `sslstore` \u003cjks\u003e : JKS for SSL CA      \t\t\t(default: ssl.jks)\n- `sslpass` \u003cpwd\u003e : password of the JKS        \t(default: sepastore)\n- `jwtstore` \u003cjks\u003e : JKS for the JWT key       \t(default: jwt.jks)\n- `jwtalias` \u003calias\u003e : alias for the JWT key   \t(default: jwt)\n- `jwtstorepass` \u003cpwd\u003e : password for the JKS  \t(default: sepakey)\n- `jwtaliaspass` \u003cpwd\u003e : password for the JWT key  (default: sepakey)\n\t\t\n[LDAP OPTIONS]\n- `ldaphost` \u003cname\u003e : host     \t\t         (default: localhost)\n- `ldapport` \u003cport\u003e : port                      (default: 10389)\n- `ldapdn` \u003cdn\u003e : domain                        (default: dc=sepatest,dc=com)\n- `ldapusersdn` \u003cdn\u003e : domain                   (default: null)\n- `ldapuser` \u003cusr\u003e : username                   (default: null)\n- `ldappwd` \u003cpwd\u003e : password                    (default: null)\n\t\t\n[ISQL OPTIONS]\n- `isqlpath` \u003cpath\u003e : location of isql     \t\t (default: /usr/local/virtuoso-opensource/bin/)\n- `isqlhost` \u003chost\u003e : host of Virtuoso     \t\t (default: localhost)\n- `isqluser` \u003cuser\u003e : user of Virtuoso     \t\t (default: dba)\n- `isqlpass` \u003cpass\u003e : password of Virtuoso     \t (default: dba)\n\n## Contributing\nYou are very welcome to be part of SEPA community. If you find any bug feel free to open an issue here on GitHub, but also feel free to\nask any question. For more details check [Contributing guidelines](CONTRIBUTING.md). Besides, if you want to help the SEPA development follow this simple steps:\n\n1. Fork it!\n2. Create your feature branch: `git checkout -b my-new-feature`\n3. Check some IDE specific instruction below\n4. Do your stuff\n5. Provide tests for your features if applicable\n5. Commit your changes: `git commit -am 'Add some feature'`\n6. Push to the branch: `git push origin my-new-feature`\n7. Submit a pull request :D\n\nPull request with unit tests have an higher likelihood to be accepted, but we are not to restrictive. So do not be afraid to send your contribution!\n\n### Clone in Eclipse\nThere is no particular restriction in your IDE choice. Here we provide a short guide to import the GitHub cloned project inside Eclipse. Any \nother IDEs work fine. \n\n1. Open Eclipse\n2. File \u003e Import \u003e Maven\n3. Choose \"Check out Maven Projects from SCM\"\n4. In the field SCM URL choose 'git' and add the clone address from Github. If 'git' is not found, tap into \"Find more SCM connectors in the m2e Marketplace\"\n5. go on...\nThe project is cloned. Enjoy!\n\n### Build with Maven\nSEPA engine is a Maven project composed by four sub-projects:\n- Client-api\n- Engine\n- Dashboard\n- Chat\n\nAs first, you need to build client-api skipping JUnit tests:\n```bash\nmvn install -DskipTests\n```\nIn fact, clien-api JUnit tests include integration tests that require a SEPA engine running\n\nThen you can build the engine with this command:\n```bash\nmvn install\n```\nThat create an executable inside the target directory. To know more about Maven please refer to the [official documentation](https://maven.apache.org/).\n\n## History\n\nSEPA has been inspired and influenced by [Smart-M3](https://sourceforge.net/projects/smart-m3/). SEPA authors have been involved in the development of Smart-M3 since its [origin](https://artemis-ia.eu/project/4-sofia.html). \n\nThe main differences beetween SEPA and Smart-M3 are the protocol (now compliant with the [SPARQL 1.1 Protocol](https://www.w3.org/TR/sparql11-protocol/)) and the introduction of a security layer (based on TLS and JSON Web Token for client authentication). \n\nAll the SEPA software components have been implemented from scratch.\n\n## Credits\n\nSEPA stands for *SPARQL Event Processing Architecture*. SEPA is promoted and maintained by the [**Dynamic linked data and Web of Things Research Group**](https://site.unibo.it/wot/en) @ [**ARCES**](http://www.arces.unibo.it), the *Advanced Research Center on Electronic Systems \"Ercole De Castro\"* of the [**University of Bologna**](http://www.unibo.it).\n\n## License\n\nSEPA Engine is released under the [GNU GPL](https://github.com/arces-wot/SEPA/blob/master/engine/LICENSE), SEPA APIs are released under the  [GNU LGPL](https://github.com/arces-wot/SEPA/blob/master/client-api/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaimee%2FSEPA","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvaimee%2FSEPA","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaimee%2FSEPA/lists"}