{"id":22941352,"url":"https://github.com/islandora/alpaca","last_synced_at":"2025-09-04T00:06:15.440Z","repository":{"id":8506132,"uuid":"58654569","full_name":"Islandora/Alpaca","owner":"Islandora","description":"Event driven middleware based on Apache Camel for Islandora","archived":false,"fork":false,"pushed_at":"2022-12-02T20:54:24.000Z","size":1269,"stargazers_count":7,"open_issues_count":2,"forks_count":20,"subscribers_count":24,"default_branch":"2.x","last_synced_at":"2025-07-25T04:18:11.486Z","etag":null,"topics":["islandora"],"latest_commit_sha":null,"homepage":"http://islandora.ca","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/Islandora.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-05-12T15:38:27.000Z","updated_at":"2022-09-08T19:15:25.000Z","dependencies_parsed_at":"2023-01-13T14:50:25.428Z","dependency_job_id":null,"html_url":"https://github.com/Islandora/Alpaca","commit_stats":null,"previous_names":["islandora-claw/alpaca"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/Islandora/Alpaca","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Islandora%2FAlpaca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Islandora%2FAlpaca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Islandora%2FAlpaca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Islandora%2FAlpaca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Islandora","download_url":"https://codeload.github.com/Islandora/Alpaca/tar.gz/refs/heads/2.x","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Islandora%2FAlpaca/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273529557,"owners_count":25121829,"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-09-03T02:00:09.631Z","response_time":76,"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":["islandora"],"created_at":"2024-12-14T13:39:02.721Z","updated_at":"2025-09-04T00:06:15.394Z","avatar_url":"https://github.com/Islandora.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![Alpaca](https://cloud.githubusercontent.com/assets/2371345/15409648/16c140b4-1dec-11e6-81d9-41929bc83b1f.png) Alpaca\n[![Build Status](https://github.com/islandora/Alpaca/actions/workflows/build-2.x.yml/badge.svg)](https://github.com/Islandora/Alpaca/actions)\n[![Contribution Guidelines](http://img.shields.io/badge/CONTRIBUTING-Guidelines-blue.svg)](./CONTRIBUTING.md)\n[![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](./LICENSE)\n[![codecov](https://codecov.io/gh/Islandora/Alpaca/branch/2.x/graphs/badge.svg)](https://app.codecov.io/gh/Islandora/Alpaca/tree/2.x)\n\n## Introduction\n\nEvent-driven middleware based on [Apache Camel](http://camel.apache.org/) that synchronizes a Fedora repository with a Drupal instance.\n\n## Requirements\n\nThis project requires Java 11 and can be built with [Gradle](https://gradle.org).\n\nTo build and test locally, clone this repository and then change into the Alpaca directory.\nNext run `./gradlew clean build shadowJar`.\n\nThe main executable jar is available in the `islandora-alpaca-app/build/libs` directory, with the classifier `-all`.\n\nie.\n\u003e islandora-alpaca-app/build/libs/islandora-alpaca-app-2.0.0-all.jar\n\n## Configuration\n\nAlpaca is made up of several services, each of these can be enabled or disabled individually.\n\nAlpaca takes an external file to configure its behaviour.\n\nLook at the [`example.properties`](example.properties) file to see some example settings.\n\nThe properties are:\n\n```\n# Common options\nerror.maxRedeliveries=4\n```\nThis defines how many times to retry a message before failing completely.\n\nThere are also common ActiveMQ properties to setup the connection.\n\n```\n# ActiveMQ options\njms.brokerUrl=tcp://localhost:61616\n```\n\nThis defines the url to the ActiveMQ broker.\n\n```\njms.username=\njms.password=\n```\nThis defines the login credentials (if required)\n\n```\njms.connections=10\n```\nThis defines the pool of connections to the ActiveMQ instance.\n\n```\njms.concurrent-consumers=1\n```\nThis defines how many messages to process simultaneously.\n\n### islandora-indexing-fcrepo\n\nThis service manages a Drupal node into a corresponding Fedora resource.\n\nIt's properties are:\n\n```\n# Fcrepo indexer options\nfcrepo.indexer.enabled=true\n```\n\nThis defines whether the Fedora indexer is enabled or not.\n\n```\nfcrepo.indexer.node=queue:islandora-indexing-fcrepo-content\nfcrepo.indexer.delete=queue:islandora-indexing-fcrepo-delete\nfcrepo.indexer.media=queue:islandora-indexing-fcrepo-media\nfcrepo.indexer.external=queue:islandora-indexing-fcrepo-file-external\n```\n\nThese define the various queues to listen on for the indexing/deletion\nmessages. The part after `queue:` should match your Islandora instance \"Actions\".\n\n```\nfcrepo.indexer.milliner.baseUrl=http://localhost:8000/milliner\n```\nThis defines the location of your Milliner microservice.\n\n```\nfcrepo.indexer.concurrent-consumers=1\nfcrepo.indexer.max-concurrent-consumers=1\n```\nThese define the default number of concurrent consumers and maximum number of concurrent\nconsumers working off your ActiveMQ instance.\nA value of `-1` means no setting is applied.\n\n```\nfcrepo.indexer.async-consumer=true\n```\n\nThis property allows the concurrent consumers to process concurrently; otherwise, the consumers will wait to the previous message has been processed before executing.\n\n### islandora-indexing-triplestore\n\nThis service indexes the Drupal node into the configured triplestore\n\nIt's properties are:\n\n```\n# Triplestore indexer options\ntriplestore.indexer.enabled=false\n```\n\nThis defines whether the Triplestore indexer is enabled or not.\n\n```\ntriplestore.index.stream=queue:islandora-indexing-triplestore-index\ntriplestore.delete.stream=queue:islandora-indexing-triplestore-delete\n```\n\nThese define the various queues to listen on for the indexing/deletion\nmessages. The part after `queue:` should match your Islandora instance \"Actions\".\n\n```\ntriplestore.baseUrl=http://localhost:8080/bigdata/namespace/kb/sparql\n```\n\nThis defines the location of your triplestore's SPARQL update endpoint.\n\n```\ntriplestore.indexer.concurrent-consumers=1\ntriplestore.indexer.max-concurrent-consumers=1\n```\n\nThese define the default number of concurrent consumers and maximum number of concurrent\nconsumers working off your ActiveMQ instance.\nA value of `-1` means no setting is applied.\n\n\n```\ntriplestore.indexer.async-consumer=true\n```\n\nThis property allows the concurrent consumers to process concurrently; otherwise, the consumers will wait to the previous message has been processed before executing.\n\n### islandora-connector-derivative\n\nThis service is used to configure an external microservice. This service will deploy multiple copies of its routes\nwith different configured inputs and outputs based on properties.\n\nThe routes to be configured are defined with the property `derivative.systems.installed` which expects\na comma separated list. Each item in the list defines a new route and must also define 3 additional properties.\n\n```\nderivative.\u003citem\u003e.enabled=true\n```\n\nThis defines if the `item` service is enabled.\n\n```\nderivative.\u003citem\u003e.in.stream=queue:islandora-item-connector.index\n```\n\nThis is the input queue for the derivative microservice.\nThe part after `queue:` should match your Islandora instance \"Actions\".\n\n```\nderivative.\u003citem\u003e.service.url=http://example.org/derivative/convert\n```\n\nThis is the microservice URL to process the request.\n\n```\nderivative.\u003citem\u003e.concurrent-consumers=1\nderivative.\u003citem\u003e.max-concurrent-consumers=1\n```\n\nThese define the default number of concurrent consumers and maximum number of concurrent\nconsumers working off your ActiveMQ instance.\nA value of `-1` means no setting is applied.\n\n\n```\nderivative.\u003citem\u003e.async-consumer=true\n```\n\nThis property allows the concurrent consumers to process concurrently; otherwise, the consumers will wait to the previous message has been processed before executing.\n\nFor example, with two services defined (houdini and crayfits) my configuration would have\n\n```\nderivative.systems.installed=houdini,fits\n\nderivative.houdini.enabled=true\nderivative.houdini.in.stream=queue:islandora-connector-houdini\nderivative.houdini.service.url=http://127.0.0.1:8000/houdini/convert\nderivative.houdini.concurrent-consumers=1\nderivative.houdini.max-concurrent-consumers=4\nderivative.houdini.async-consumer=true\n\nderivative.fits.enabled=true\nderivative.fits.in.stream=queue:islandora-connector-fits\nderivative.fits.service.url=http://127.0.0.1:8000/crayfits\nderivative.fits.concurrent-consumers=2\nderivative.fits.max-concurrent-consumers=2\nderivative.fits.async-consumer=false\n```\n\n### Customizing HTTP client timeouts\n\nYou can alter the HTTP client from the defaults for its request, connection and socket timeouts.\nTo do this you want to enable the request configurer.\n\n```shell\nrequest.configurer.enabled=true\n```\n\nThen set the next 3 timeouts (measured in milliseconds) to the desired timeout.\n\n```shell\nrequest.timeout=-1\nconnection.timeout=-1\nsocket.timeout=-1\n```\n\nThe default for all three is `-1` which indicates no timeout.\n\n### Alter HTTP options\n\nBy default, Alpaca uses two settings for the HTTP component, these are\n* disableStreamCache=true\n* connectionClose=true\n\nIf you want to send additional [configuration parameters](https://camel.apache.org/components/3.18.x/http-component.html#_query_parameters) or alter the existing defaults. You can \nadd them as a comma separated list of key=value pairs.\n\nFor example\n```shell\nhttp.additional_options=authMethod=Basic,authUsername=Jim,authPassword=1234\n```\n\nThese will be added to ALL http endpoint requests.\n\n**Note**: We are currently running Camel 3.7.6, some configuration parameters on the above linked page might not be supported.\n\n## Deploying/Running\n\nYou can see the options by passing the `-h|--help` flag\n\n```shell\n\u003e java -jar  islandora-alpaca-app/build/libs/islandora-alpaca-app-2.0.0-all.jar -h\nUsage: alpaca [-hV] [-c=\u003cconfigurationFilePath\u003e]\n  -h, --help      Show this help message and exit.\n  -V, --version   Print version information and exit.\n  -c, --config=\u003cconfigurationFilePath\u003e\n                  The path to the configuration file\n```\n\nUsing the `-V|--version` flag will just return the current version of the application.\n\n```shell\n\u003e java -jar  islandora-alpaca-app/build/libs/islandora-alpaca-app-2.0.0-all.jar -v\n2.0.0\n```\n\nTo start Alpaca you would pass the external property file with the `-c|--config` flag.\n\nFor example if you are using an external properties file located at `/opt/my.properties`,\nyou would run:\n\n```shell\njava -jar islandora-alpaca-app-2.0.0-all.jar -c /opt/my.properties\n```\n\n## Debugging/Troubleshooting\n\nLogging is done to the console, and defaults to the INFO level. To get more verbose logging you\ncan use the Java property `islandora.alpaca.log`\n\ni.e.\n\n```shell\njava -Dislandora.alpaca.log=DEBUG -jar islandora-alpaca-app-2.0.0-all.jar -c /opt/my.properties\n```\n\n## Documentation\n\nFurther documentation for this module is available on the [Islandora documentation site](https://islandora.github.io/documentation/).\n\n## Troubleshooting/Issues\n\nHaving problems or solved a problem? Check out the Islandora google groups for a solution.\n\n* [Islandora Group](https://groups.google.com/forum/?hl=en\u0026fromgroups#!forum/islandora) * [Islandora Dev Group](https://groups.google.com/forum/?hl=en\u0026fromgroups#!forum/islandora-dev)\n\n## Current Maintainers\n\n* [Jared Whiklo](https://github.com/whikloj)\n\n## Sponsors\n\n* Discoverygarden\n* LYRASIS\n* York University\n* McMaster University\n* University of Prince Edward Island\n* University of Manitoba\n* University of Limerick\n* Simon Fraser University\n* PALS\n\n## Development\n\nIf you would like to contribute, please get involved by attending our weekly [Tech Call](https://github.com/Islandora/documentation/wiki). We love to hear from you!\n\nIf you would like to contribute code to the project, you need to be covered by an Islandora Foundation [Contributor License Agreement](http://islandora.ca/sites/default/files/islandora_cla.pdf) or [Corporate Contributor License Agreement](http://islandora.ca/sites/default/files/islandora_ccla.pdf). Please see the [Contributors](http://islandora.ca/resources/contributors) pages on Islandora.ca for more information.\n\nWe recommend using the [islandora-playbook](https://github.com/Islandora-Devops/islandora-playbook) to get started.\n\n## Licensing\n[MIT](/License)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fislandora%2Falpaca","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fislandora%2Falpaca","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fislandora%2Falpaca/lists"}