{"id":23318118,"url":"https://github.com/softwareag/adabas-user-targets","last_synced_at":"2026-01-28T18:33:02.557Z","repository":{"id":44456299,"uuid":"424533823","full_name":"SoftwareAG/adabas-user-targets","owner":"SoftwareAG","description":"This repository contains documentation and examples for Adabas Event Replicator Target Adapter User Targets","archived":false,"fork":false,"pushed_at":"2024-11-07T08:18:29.000Z","size":2800,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-06-06T08:04:49.758Z","etag":null,"topics":["adabas"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SoftwareAG.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-11-04T09:12:50.000Z","updated_at":"2024-11-07T08:14:27.000Z","dependencies_parsed_at":"2024-08-07T14:12:54.856Z","dependency_job_id":"eb590519-1051-4ad2-8c2c-2be94ebcdd40","html_url":"https://github.com/SoftwareAG/adabas-user-targets","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/SoftwareAG/adabas-user-targets","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SoftwareAG%2Fadabas-user-targets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SoftwareAG%2Fadabas-user-targets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SoftwareAG%2Fadabas-user-targets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SoftwareAG%2Fadabas-user-targets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SoftwareAG","download_url":"https://codeload.github.com/SoftwareAG/adabas-user-targets/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SoftwareAG%2Fadabas-user-targets/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28849160,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: 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":["adabas"],"created_at":"2024-12-20T17:15:33.860Z","updated_at":"2026-01-28T18:33:02.541Z","avatar_url":"https://github.com/SoftwareAG.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# User Targets\n\n## What's a User Target\nThe *Event Replicator Target Adapter* replicates the data from Adabas on Mainframes to popular SQL databases (like Microsoft SQL Server, Oracle, DB2, etc.), Adabas, JMS, and some other systems. For most use cases, the existing targets are sufficient. However, it was hard to get scenarios to properly work in which targets were natively not supported by the *Event Replicator Target Adapter* or required another data format.\n\nWith User Targets, the user can extend the *Event Replicator Target Adapter* with seamlessly integrated custom targets. User Targets have the same look and feel as the predefined targets.\n\n## How the User Target works\nThe *Event Replicator Server* writes the changes of the Adabas data to a messaging queue. This messaging queue is the source for the *Event Replicator Target Adapter*.\n\nThe data is processed by reading the replicated Adabas data, transforming the data, and sending the data to the target. When the target is a User Target, the processing is very similar, but instead of sending the data to the target, the *Event Replicator Target Adapter* passes the transformed data to the customized User Target, which is responsible for the further processing of the data. Depending on the operation in Adabas (insert, update or delete), different User Target methods are called.\n\n## Requirements\nUser Targets are available as of *Event Replicator Target Adapter* version 3.7 and above. Implementation of User Targets must be in Java. The provided examples use Gradle to build the User Targets.\n\n## Creating a User Targets\nThe *Event Replicator Target Adapter* requires User Targets to be a POJO (Plain Old Java Object). User Targets must implement a Java Interface with the name **IUserTarget**.\n\nTo ease the implementation, the abstract class **AbstractTarget** is available. If the User Target extends from this class, then only the required methods have to be overridden.\n\nFor details on how to create a User Target, check the Javadoc and the provided examples projects. \n\n### Constructor\nDuring the instantiation of the User Target by the *Event Replicator Target Adapter*, the parameterless constructor is called.\n\n### Parameter\nUser Targets may require additional parameters, for instance, a connection string to connect to a server or options that control the behavior of the User Target.\n\nParameter types:\n\n* String - input field\n* Number - input field that accepts only numeric values\n* Boolean - check box\n* File - file selection control\n* Directory - directory selection control\n* Group - parameter group\n    \nThe *Event Replicator Target Adapter Administration* reads the parameter and creates an editor for the User Target. The editor allows for parameters to be entered.\nThe following is an example that shows all parameter types:\n \n![User Targets parameter types](./images/user-targets-parameter.png \"Parameter Types\")\n \nLike the regular targets, the User Targets parameters are stored in the context.xml that Event *Replicator Target Adapter* reads during startup.\n\nWith the method **getMetadata** the User Target parameters can be defined.\n\nThe parameters for the User Target that are set in the configuration file and read by the *Event Replicator Target Adapter* during startup are passed over to the User Target by the method **setParameter.**\n\n### Properties\nProperties are another option for User Target parameters that resemble tables.\n\nThe following is an example for a User Target with Properties:\n\n![User Targets properties](./images/user-targets-properties.png \"Properties\")\n\nThese parameters are **not** stored in configuration files. Instead, they are written to a file in the directory located along with the User Target. The file extension is *.properties*. \nThe User Targets have to read these properties files to access the values.\n \n### Adabas events\nThe *Event Replicator Server* sends changes to the Adabas source data as events containing metadata and payload data to the *Event Replicator Target Adapter*. The metadata contains information concerning the transaction, i.e., file name, subscription, database number, file number, and operation.\n\n#### Operations\nOperations are the changes on the Adabas data sent to the Event Replicator Target Adapter. The different operations are\n* insert - an Adabas record has been inserted\n* update - an Adabas record has been updated\n* delete - an Adabas record has been deleted\n* populate - initial state data\n* create - metadata information for the file sent during an initial state\n\nFor each operation, a method can be implemented to handle changes of the data on the target.\n\n#### Data\nAdabas data is wrapped in a class capable of handling the Adabas-specific field types, multiple fields, and periodic groups. The class is called **AdabasObject**.\n\nThe following is an example of an Adabas record represented as an **AdabasObject**:\n\n```\n 1 ISN {class java.lang.Long}: 593\n 1 PERSONNEL_ID {class java.lang.String}: 20010600\n 1 FIRST_NAME {class java.lang.String}: DAN\n 1 MIDDLE_NAME {class java.lang.String}: M\n 1 NAME {class java.lang.String}: HENRY\n 1 MARSTAT {class java.lang.String}: M\n 1 SEX {class java.lang.String}: M\n 1 ADDRESS_LINE\n 1   [0] {class java.lang.String}: 101 MARINE AVENUE\n 1   [1] {class java.lang.String}: TULSA\n 1   [2] {class java.lang.String}: OK\n 1 CITY {class java.lang.String}: TULSA\n 1 POSTCODE {class java.lang.String}: 74150\n 1 COUNTRY {class java.lang.String}: USA\n 1 AREACODE {class java.lang.String}: 918\n 1 PHONE {class java.lang.String}: 703-4729\n 1 DEPT {class java.lang.String}: TECH10\n 1 JOBTITLE {class java.lang.String}: ANALYST\n 1 INCOME[0]: \n  2 CURRCODE {class java.lang.String}: USD\n  2 SALARY {class java.lang.Long}: 40000\n 1 INCOME[1]: \n  2 CURRCODE {class java.lang.String}: USD\n  2 SALARY {class java.lang.Long}: 36800\n 1 INCOME[2]: \n  2 CURRCODE {class java.lang.String}: USD\n  2 SALARY {class java.lang.Long}: 34200\n 1 INCOME[3]: \n  2 CURRCODE {class java.lang.String}: USD\n  2 SALARY {class java.lang.Long}: 32100\n 1 INCOME[4]: \n  2 CURRCODE {class java.lang.String}: USD\n  2 SALARY {class java.lang.Long}: 33440\n 1 LEAVE_DUE {class java.lang.Short}: 26\n 1 LEAVE_TAKEN {class java.lang.Short}: 4\n 1 LEAVE_BOOKED[0]: \n  2 LEAVE_START {class java.lang.Integer}: 19980112\n  2 LEAVE_END {class java.lang.Integer}: 19980112\n 1 LEAVE_BOOKED[1]: \n  2 LEAVE_START {class java.lang.Integer}: 19980605\n  2 LEAVE_END {class java.lang.Integer}: 19980607\n 1 LEAVE_BOOKED[2]: \n  2 LEAVE_START {class java.lang.Integer}: 19980916\n  2 LEAVE_END {class java.lang.Integer}: 19980918\n 1 LANG\n 1   [0] {class java.lang.String}: ENG\n 1   [1] {class java.lang.String}: CHI\n```\n\nRegular Adabas fields are Java standard types (String, Integer, Short, Long, etc.) that correspond to the Adabas type and length. Multiple Fields (like ADDRESS_LINE) are arrays of Java standard types, and Periodic groups (like INCOME) are arrays of **AdabasObject**.\n\n#### Transaction\nAdabas operations are based on transactions, meaning that multiple operations (such as insert, update, delete) can be grouped into one transaction. At the end of a transaction, the **commit** method of the User Target is called.\n\n#### Command\nSome actions of the *Event Replicator Server*, such as refresh file or start server, are sent to the *Event Replicator Target Adapter Administration* as commands. These commands are propagated to the User Targets by the **command** method to perform required actions.\n\n#### Status\nDuring startup, the *Event Replicator Target Adapter* checks the status of the User Target by calling the method **isServiceOkay**. The result is printed as the **State** in the *sqlrep.log*.\n\n### Close\nWhen the *Event Replicator Target Adapter* has shut down, the **close** method of each User Target is called. It allows the User Targets to clean up, for instance, to disconnect the server connection properly.\n\n### Icon\nThe User Targets can have an icon displayed in the tree-view and the editors. The icon must be in the *Portable Network Graphics (PNG)* or *Graphics Interchange (GIF)*-Format, with 16 by 16 size, have the same name as the User Target class, and be in the same directory as the User Target jar.\n\n### Javadoc\nThe SDK Javadoc is available as a zip file in the doc folder.\n\n## Installation\nUser Targets are installed from the *Event Replicator Target Adapter Administration*.\nStart the *Event Replicator Target Adapter Administration* and select from the menu\nWindow \u003e Preferences \u003e Target Adapter.\n\n*Note: The registered User Targets are environment-specific. If the User Target is required for multiple environments, it must be registered for each environment.*\n\nEdit the Target Adapter to specify you want to add the User Targets:\n\n![Target Adapter Environment](./images/user-targets-installation-1.png \"Target Adapter Environment\")\n\nRegister the User Target by clicking on the Register button of the User Targets group, and selecting the User Target jar:\n\n![Select User Target jar](./images/user-targets-installation-2.png \"Select User Target jar\")\n\nThe classes that implement the **IUserTargets** interface are found and listed.\n\nAfter saving the Target Adapter environment, the new registered User Target is available as Target:\n\n![User Target](./images/user-targets-installation-3.png \"User Target\")\n\nAll files required by the User Targets (User Target jar, dependent jars, images, etc.) must be in the same directory as the registered User Target jar. Otherwise, the *Event Replicator Target Adapter* may not find these files.\n  \n## Information at startup\nThe *Event Replicator Target Adapter* prints information on the User Targets during startup to the *sqlrep.log*:\n```\nART0411I: User/Generic Target information at startup:\n\nType                 : Console Dump\nName                 : Dump\nDescription          : Dump\nVersion              : 3.8 [2022-06-17 12:03:18]\nLicense Details\n  Serial Number      : 0000000000\n  License Key        : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n  Customer ID        : ADA RnD - Test ARTUT\n  Customer Name      : ADA RnD - Test ARTUT\n  Operating System   : Linux S390,Linux,win\n  Product Name       : Event Rep. Target Adapter for User Targ\n  Product Code       : ARTUT\n  Product Version    : 3.8\n  Expiration Date    : 2022/12/31 (93 days remaining)\nState                : Active\n```\n\n* Type - the type of the User Target, as listed in the *Administration* tree view\n* Name - the name of the User Target's instance\n* Description - description of User Target instance as entered in *Administration*\n* License Details - information about the license\n* Version - the version information derived from the *Bundle-Version* and the *Build-Date* of the **MANIFEST.MF** of the User Target jar\n* State - the result of the **isServiceOkay** call\n\n## Disclaimer\nUtilities and samples shown here are not official parts of the Software AG products. These utilities and samples are not eligible for technical assistance through Software AG Global Support. Software AG makes no guarantees pertaining to the functionality, scalability , robustness, or degree of testing of these utilities and samples. Customers are strongly advised to consider these utilities and samples as \"working examples\" from which they should build and test their own solutions. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoftwareag%2Fadabas-user-targets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoftwareag%2Fadabas-user-targets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoftwareag%2Fadabas-user-targets/lists"}