Commit 216d1f97 authored by drnull03's avatar drnull03

Finished the homework

parent af35c965
.
├── bank-api-service/ # The "Producer" service. Handles Fraud Detection logic and Redis lookups.
├── account-manager/ # Consumer service for 'valid-transactions'. Handles fund transfers.
├── reporting-service/ # Consumer service for both topics. Generates audit logs and statements.
├── user-notification-service/ # Consumer service for 'suspicious-transactions'. Alerts users of fraud.
├── conf/ # Kafka and Zookeeper configuration files (server.properties, etc.).
├── docs/ # Generated HTML documentation (Open index.html to view).
├── latex/ # Generated LaTeX source and PDF documentation (refman.pdf).
├── reports/ # Output directory where the Reporting Service persists data.
├── notifications/ # Output directory where the Notification Service persists alerts.
├── HomeworkReport/ # Final submission report and analysis documents.
├── Doxyfile # Configuration file for Doxygen documentation generation.
├── gitlab.txt # Repository and submission metadata.
└── README.md # Project overview and layout (This file).
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <project xmlns="http://maven.apache.org/POM/4.0.0"
~ MIT License xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
~ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
~ Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java http://maven.apache.org/xsd/maven-4.0.0.xsd">
~
~ Permission is hereby granted, free of charge, to any person obtaining a copy
~ of this software and associated documentation files (the "Software"), to deal
~ in the Software without restriction, including without limitation the rights
~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
~ copies of the Software, and to permit persons to whom the Software is
~ furnished to do so, subject to the following conditions:
~
~ The above copyright notice and this permission notice shall be included in all
~ copies or substantial portions of the Software.
~
~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
~ SOFTWARE.
-->
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>distributed.systems</groupId> <groupId>distributed.systems</groupId>
...@@ -34,40 +12,52 @@ ...@@ -34,40 +12,52 @@
<build> <build>
<plugins> <plugins>
<!-- Java compiler -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version> <version>3.11.0</version>
<configuration> <configuration>
<release>11</release> <release>11</release>
</configuration> </configuration>
</plugin> </plugin>
<!-- Create runnable jar with dependencies -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId> <artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<executions> <executions>
<execution> <execution>
<id>make-assembly</id>
<phase>package</phase> <phase>package</phase>
<goals> <goals>
<goal>single</goal> <goal>single</goal>
</goals> </goals>
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<archive> <archive>
<manifest> <manifest>
<mainClass>Application</mainClass> <mainClass>Application</mainClass>
</manifest> </manifest>
</archive> </archive>
<descriptorRefs> <descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef> <descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs> </descriptorRefs>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.apache.kafka</groupId> <groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId> <artifactId>kafka-clients</artifactId>
...@@ -80,6 +70,7 @@ ...@@ -80,6 +70,7 @@
<version>1.7.6</version> <version>1.7.6</version>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>log4j</groupId> <groupId>log4j</groupId>
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>
...@@ -87,7 +78,6 @@ ...@@ -87,7 +78,6 @@
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId> <artifactId>jackson-core</artifactId>
...@@ -99,5 +89,7 @@ ...@@ -99,5 +89,7 @@
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
<version>2.10.1</version> <version>2.10.1</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
/* /**
* MIT License * @file Application.java
* * @brief Implementation of the Account Manager Service.
* Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/ */
import org.apache.kafka.clients.consumer.*; import org.apache.kafka.clients.consumer.*;
...@@ -29,10 +10,28 @@ import java.time.Duration; ...@@ -29,10 +10,28 @@ import java.time.Duration;
import java.util.Collections; import java.util.Collections;
import java.util.Properties; import java.util.Properties;
/**
* @class Application
* @brief Consumer service that manages and authorizes valid financial transactions.
*
* The Account Manager service subscribes to the "valid-transactions" Kafka topic.
* Its primary responsibility is to simulate the final authorization of funds
* and ensure that transactions are processed reliably using manual offset commits.
*/
public class Application { public class Application {
/** @brief The Kafka topic containing transactions cleared by the Banking API. */
private static final String VALID_TRANSACTIONS_TOPIC = "valid-transactions"; private static final String VALID_TRANSACTIONS_TOPIC = "valid-transactions";
private static final String BOOTSTRAP_SERVERS = "localhost:9092,localhost:9093,localhost:9094";
/** @brief Comma-separated list of Kafka broker addresses. */
private static final String BOOTSTRAP_SERVERS = "localhost:9092,localhost:9093";
/**
* @brief Application entry point.
*
* Initializes the consumer group and starts the infinite message consumption loop.
* @param args Command line arguments (not used).
*/
public static void main(String[] args) { public static void main(String[] args) {
String consumerGroup = "account-manager"; String consumerGroup = "account-manager";
...@@ -43,35 +42,82 @@ public class Application { ...@@ -43,35 +42,82 @@ public class Application {
consumeMessages(VALID_TRANSACTIONS_TOPIC, kafkaConsumer); consumeMessages(VALID_TRANSACTIONS_TOPIC, kafkaConsumer);
} }
/**
* @brief Subscription and processing loop for Kafka messages.
*
* This method subscribes to the specified topic, polls Kafka for new records,
* processes them by calling @ref approveTransaction, and manually commits
* offsets to ensure data consistency.
*
* @param topic The name of the topic to subscribe to.
* @param kafkaConsumer The initialized Kafka consumer instance.
*/
public static void consumeMessages(String topic, Consumer<String, Transaction> kafkaConsumer) { public static void consumeMessages(String topic, Consumer<String, Transaction> kafkaConsumer) {
kafkaConsumer.subscribe(Collections.singletonList(topic)); kafkaConsumer.subscribe(Collections.singletonList(topic));
while (true) { while (true) {
/** // Poll for a batch of records
* Fill in the code here ConsumerRecords<String, Transaction> records = kafkaConsumer.poll(Duration.ofMillis(100));
* Check if there are new transaction to read from Kafka.
* Approve the incoming transactions for (ConsumerRecord<String, Transaction> record : records) {
*/ Transaction transaction = record.value();
if (transaction != null) {
approveTransaction(transaction);
}
}
/**
* @note Manual offset management: We commit offsets only after
* the batch has been successfully processed to prevent data loss.
*/
kafkaConsumer.commitAsync(); kafkaConsumer.commitAsync();
} }
} }
/**
* @brief Configures and initializes a Kafka Consumer.
*
* Sets up deserializers for @ref Transaction objects and disables auto-commit
* to allow for manual offset management.
*
* @param bootstrapServers The list of Kafka brokers.
* @param consumerGroup The ID of the consumer group this instance belongs to.
* @return Consumer<String, Transaction> A configured Kafka consumer instance.
*/
public static Consumer<String, Transaction> createKafkaConsumer(String bootstrapServers, String consumerGroup) { public static Consumer<String, Transaction> createKafkaConsumer(String bootstrapServers, String consumerGroup) {
Properties properties = new Properties(); Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, /** Fill in your code here **/); properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, /** Fill in your code here **/); properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, /** Fill in your code here **/); properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, Transaction.TransactionDeserializer.class.getName());
properties.put(ConsumerConfig.GROUP_ID_CONFIG, /** Fill in your code here **/); properties.put(ConsumerConfig.GROUP_ID_CONFIG, consumerGroup);
/**
* @details Manual offset management is enabled by setting auto-commit to false.
* 'earliest' ensures the consumer reads from the start of the topic if no offset exists.
*/
properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
return new KafkaConsumer<>(properties); return new KafkaConsumer<>(properties);
} }
/**
* @brief Simulates the authorization and fund transfer process.
*
* In a real system, this would interact with a core banking ledger to
* move money from the user's account to the merchant.
*
* @param transaction The valid transaction to be approved.
*/
private static void approveTransaction(Transaction transaction) { private static void approveTransaction(Transaction transaction) {
System.out.println(String.format("Authorizing transaction for user %s, in the amount of $%.2f", System.out.println("----------------------------------------------------------------");
transaction.getUser(), transaction.getAmount())); System.out.println(String.format("Authorizing transaction for user: %s", transaction.getUser()));
System.out.println(String.format("Action: Transferring $%.2f from User Account to the Merchant at %s",
transaction.getAmount(),
transaction.getTransactionLocation()));
System.out.println("Status: SUCCESS - Funds Dispatched.");
System.out.println("----------------------------------------------------------------");
} }
}
} \ No newline at end of file
/* /**
* MIT License * @file Transaction.java
* * @brief Definition of the Transaction data model and its Kafka Deserializer.
* Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/ */
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.kafka.common.serialization.Deserializer; import org.apache.kafka.common.serialization.Deserializer;
/**
* @class Transaction
* @brief Data model representing a financial purchase event.
*
* This class is shared across all microservices (Banking API, Account Manager,
* Notification, and Reporting) to represent a credit card transaction.
*/
public class Transaction { public class Transaction {
/** @brief The unique identifier or username of the bank customer. */
private String user; private String user;
/** @brief The monetary amount of the purchase. */
private double amount; private double amount;
/** @brief The country or location where the transaction was initiated. */
private String transactionLocation; private String transactionLocation;
/**
* @brief Default constructor.
* Required by Jackson ObjectMapper for JSON deserialization.
*/
public Transaction() {}
/**
* @brief Gets the username associated with the transaction.
* @return String The user ID.
*/
public String getUser() { public String getUser() {
return user; return user;
} }
/**
* @brief Gets the transaction amount.
* @return double The purchase amount.
*/
public double getAmount() { public double getAmount() {
return amount; return amount;
} }
/**
* @brief Gets the location where the transaction occurred.
* @return String The transaction location.
*/
public String getTransactionLocation() { public String getTransactionLocation() {
return transactionLocation; return transactionLocation;
} }
/**
* @brief Sets the username for the transaction.
* @param user The user ID to set.
*/
public void setUser(String user) { public void setUser(String user) {
this.user = user; this.user = user;
} }
/**
* @brief Sets the monetary amount for the transaction.
* @param amount The value to set.
*/
public void setAmount(double amount) { public void setAmount(double amount) {
this.amount = amount; this.amount = amount;
} }
/**
* @brief Sets the location for the transaction.
* @param transactionLocation The country/location string.
*/
public void setTransactionLocation(String transactionLocation) { public void setTransactionLocation(String transactionLocation) {
this.transactionLocation = transactionLocation; this.transactionLocation = transactionLocation;
} }
/**
* @brief Returns a string representation of the Transaction object.
* @return String Formatted transaction details.
*/
@Override @Override
public String toString() { public String toString() {
return "Transaction{" + return "Transaction{" +
...@@ -64,11 +92,20 @@ public class Transaction { ...@@ -64,11 +92,20 @@ public class Transaction {
} }
/** /**
* Kafka Deserializer implementation. * @class TransactionDeserializer
* Deserializes a Transaction from JSON to a {@link Transaction} object * @brief Custom Kafka Deserializer implementation for Transaction objects.
*
* This inner class provides the logic to convert raw JSON bytes received
* from a Kafka topic back into a Java @ref Transaction object.
*/ */
public static class TransactionDeserializer implements Deserializer<Transaction> { public static class TransactionDeserializer implements Deserializer<Transaction> {
/**
* @brief Deserializes a byte array into a Transaction object using Jackson.
* @param topic The name of the Kafka topic.
* @param data The raw byte data from Kafka.
* @return Transaction The deserialized object, or null if an error occurs.
*/
@Override @Override
public Transaction deserialize(String topic, byte[] data) { public Transaction deserialize(String topic, byte[] data) {
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
...@@ -76,10 +113,10 @@ public class Transaction { ...@@ -76,10 +113,10 @@ public class Transaction {
try { try {
transaction = mapper.readValue(data, Transaction.class); transaction = mapper.readValue(data, Transaction.class);
} catch (Exception e) { } catch (Exception e) {
// In production, consider logging this via a proper Logger (SLF4J)
e.printStackTrace(); e.printStackTrace();
} }
return transaction; return transaction;
} }
} }
} }
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
~ MIT License
~
~ Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
~
~ Permission is hereby granted, free of charge, to any person obtaining a copy
~ of this software and associated documentation files (the "Software"), to deal
~ in the Software without restriction, including without limitation the rights
~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
~ copies of the Software, and to permit persons to whom the Software is
~ furnished to do so, subject to the following conditions:
~
~ The above copyright notice and this permission notice shall be included in all
~ copies or substantial portions of the Software.
~
~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
~ SOFTWARE.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>distributed.systems</groupId> <groupId>distributed.systems</groupId>
<artifactId>banking-api-service</artifactId> <artifactId>bank-api-service</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build> <build>
<plugins> <plugins>
<!-- Java compiler -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version> <version>3.11.0</version>
<configuration> <configuration>
<release>11</release> <release>11</release>
</configuration> </configuration>
</plugin> </plugin>
<!-- Create runnable jar with dependencies -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId> <artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<executions> <executions>
<execution> <execution>
<id>make-assembly</id>
<phase>package</phase> <phase>package</phase>
<goals> <goals>
<goal>single</goal> <goal>single</goal>
</goals> </goals>
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<archive> <archive>
<manifest> <manifest>
<mainClass>Application</mainClass> <mainClass>Application</mainClass>
</manifest> </manifest>
</archive> </archive>
<descriptorRefs> <descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef> <descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs> </descriptorRefs>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<dependencies> <dependencies>
<!-- Kafka Clients -->
<dependency> <dependency>
<groupId>org.apache.kafka</groupId> <groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId> <artifactId>kafka-clients</artifactId>
<version>3.7.0</version> <version>3.7.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <!-- Redis Client (Jedis) -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>redis.clients</groupId>
<artifactId>jackson-core</artifactId> <artifactId>jedis</artifactId>
<version>2.10.1</version> <version>4.4.3</version>
</dependency> </dependency>
<dependency> <!-- Logging -->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId> <artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version> <version>1.7.6</version>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>log4j</groupId> <groupId>log4j</groupId>
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>
<version>1.2.17</version> <version>1.2.17</version>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<!-- JSON Serialization/Deserialization -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
/* /**
* MIT License * @file Application.java
* * @brief Main entry point for the Banking API Service.
* Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/ */
import org.apache.kafka.clients.producer.*; import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
/** /**
* Banking API Service * @class Application
* @brief The central orchestrator of the distributed banking system.
*
* The Banking API Service acts as the primary Producer. It receives incoming
* credit card transactions, performs a fraud check by querying a Redis-backed
* @ref UserResidenceDatabase, and routes the data to either the 'valid' or
* 'suspicious' Kafka topics.
*/ */
public class Application { public class Application {
private static final String SUSPICIOUS_TRANSACTIONS_TOPIC = "suspicious-transactions";
private static final String VALID_TRANSACTIONS_TOPIC = "valid-transactions"; /** @brief Topic name for transactions flagged as suspicious/fraudulent. */
private static final String SUSPICIOUS_TOPIC = "suspicious-transactions";
private static final String BOOTSTRAP_SERVERS = "localhost:9092,localhost:9093,localhost:9094";
/** @brief Topic name for transactions cleared for processing. */
private static final String VALID_TOPIC = "valid-transactions";
/** @brief Comma-separated list of Kafka broker connection strings. */
private static final String BOOTSTRAP_SERVERS = "localhost:9092,localhost:9093";
/**
* @brief Main method to start the Banking API Service.
*
* Initializes the Kafka producer and begins processing the transaction stream.
* Ensures the producer is flushed and closed gracefully on shutdown.
*
* @param args Command line arguments.
*/
public static void main(String[] args) { public static void main(String[] args) {
Producer<String, Transaction> kafkaProducer = createKafkaProducer(BOOTSTRAP_SERVERS); Producer<String, Transaction> kafkaProducer = createKafkaProducer(BOOTSTRAP_SERVERS);
try { try {
processTransactions(new IncomingTransactionsReader(), new UserResidenceDatabase(), kafkaProducer); processTransactions(new IncomingTransactionsReader(), new UserResidenceDatabase(), kafkaProducer);
} catch (ExecutionException | InterruptedException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
// Cleanly close resources
kafkaProducer.flush(); kafkaProducer.flush();
kafkaProducer.close(); kafkaProducer.close();
} }
} }
public static void processTransactions(IncomingTransactionsReader incomingTransactionsReader, /**
UserResidenceDatabase userResidenceDatabase, * @brief Orchestrates the flow from transaction ingestion to Kafka production.
Producer<String, Transaction> kafkaProducer) throws ExecutionException, InterruptedException { *
* This method implements the core fraud detection logic:
* 1. Retrieve the user's home country from Redis.
* 2. Compare it to the transaction's reported location.
* 3. Route the message to the appropriate topic using the user ID as the Kafka Key.
*
* @details Robustness: If a user is missing from the database (e.g., 'Sara'),
* the method catches the @ref RuntimeException, logs an error, and continues
* processing the next transaction to prevent service downtime.
*
* @param reader The source providing incoming transaction objects.
* @param db The Redis-based residence database for fraud checks.
* @param producer The Kafka producer used for message routing.
*/
public static void processTransactions(IncomingTransactionsReader reader,
UserResidenceDatabase db,
Producer<String, Transaction> producer) {
while (reader.hasNext()) {
Transaction transaction = reader.next();
try {
// Step 1: Data Enrichment via Redis
String residence = db.getUserResidence(transaction.getUser());
while (incomingTransactionsReader.hasNext()) { // Step 2: Fraud Detection Decision
Transaction transaction = incomingTransactionsReader.next(); String topic = transaction.getTransactionLocation().equals(residence) ? VALID_TOPIC : SUSPICIOUS_TOPIC;
/**
* @note Key-Based Routing: Passing transaction.getUser() as the Key
* ensures all transactions for the same user land in the same
* Kafka partition, guaranteeing processing order.
*/
ProducerRecord<String, Transaction> record = new ProducerRecord<>(topic, transaction.getUser(), transaction);
producer.send(record);
/** System.out.println("Successfully processed transaction for: " + transaction.getUser());
* Fill in you code here.
* Send the transaction to the right topic based on the origin of the transaction and the user's residence data } catch (RuntimeException e) {
*/ // Skip malformed or unknown user data
System.err.println("SKIPPING TRANSACTION: " + e.getMessage());
}
} }
} }
/**
* @brief Configures and initializes a high-reliability Kafka Producer.
*
* Applies settings for Exactly-Once Semantics (EOS) to prevent double-charging
* or duplicate records in the event of network retries.
*
* @param bootstrapServers The addresses of the Kafka cluster.
* @return Producer<String, Transaction> A configured Kafka producer instance.
*/
public static Producer<String, Transaction> createKafkaProducer(String bootstrapServers) { public static Producer<String, Transaction> createKafkaProducer(String bootstrapServers) {
Properties properties = new Properties(); Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ProducerConfig.CLIENT_ID_CONFIG, "banking-api-service");
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); /**
properties.put(ProducerConfig.CLIENT_ID_CONFIG, "banking-api-service"); * @details Exactly-Once Semantics (EOS):
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, /** Fill in your code **/); * - Idempotence: Assigns sequence numbers to prevent duplicates.
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, /** Fill in your code **/); * - Acks=all: Ensures all replicas acknowledge the write.
*/
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");
props.put(ProducerConfig.ACKS_CONFIG, "all");
return new KafkaProducer<>(properties); // Serializers for Key (String) and Value (Transaction)
} props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, Transaction.TransactionSerializer.class.getName());
} return new KafkaProducer<>(props);
}
}
\ No newline at end of file
/* /**
* MIT License * @file IncomingTransactionsReader.java
* * @brief Logic for simulating real-time transaction ingestion.
* Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/ */
import java.io.InputStream; import java.io.InputStream;
import java.util.*; import java.util.*;
/** /**
* Mocks an HTTP server that receives purchase transactions in real time * @class IncomingTransactionsReader
* @brief Mocks an external data source (like an HTTP server) providing real-time transactions.
*
* This class implements the @c Iterator interface. It reads transaction data from a
* resource file on the classpath, parses the content, and provides an interface
* to stream these transactions into the system for processing.
*
* @implements Iterator<Transaction>
*/ */
public class IncomingTransactionsReader implements Iterator<Transaction> { public class IncomingTransactionsReader implements Iterator<Transaction> {
/** @brief The name of the file containing the mock transaction data. */
private static final String INPUT_TRANSACTIONS_FILE = "user-transactions.txt"; private static final String INPUT_TRANSACTIONS_FILE = "user-transactions.txt";
/** @brief Internal list to hold all loaded transaction objects. */
private final List<Transaction> transactions; private final List<Transaction> transactions;
/** @brief Iterator used to provide transactions one by one to the caller. */
private final Iterator<Transaction> transactionIterator; private final Iterator<Transaction> transactionIterator;
/**
* @brief Constructor for IncomingTransactionsReader.
*
* Initializes the reader by loading all transactions from the specified
* text file into an internal list.
*/
public IncomingTransactionsReader(){ public IncomingTransactionsReader(){
this.transactions = loadTransactions(); this.transactions = loadTransactions();
this.transactionIterator = transactions.iterator(); this.transactionIterator = transactions.iterator();
} }
/**
* @brief Loads and parses transaction data from a classpath resource.
*
* Reads the @c user-transactions.txt file. Each line is expected to be
* space-separated in the format: "User Location Amount".
*
* @details This method uses a @c Scanner to iterate through lines and
* constructs new @ref Transaction instances.
*
* @return List<Transaction> An unmodifiable list of all transactions found in the file.
*/
private List<Transaction> loadTransactions() { private List<Transaction> loadTransactions() {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(INPUT_TRANSACTIONS_FILE); InputStream inputStream = getClass().getClassLoader().getResourceAsStream(INPUT_TRANSACTIONS_FILE);
if (inputStream == null) {
System.err.println("Critical Error: " + INPUT_TRANSACTIONS_FILE + " not found!");
return Collections.emptyList();
}
Scanner scanner = new Scanner(inputStream); Scanner scanner = new Scanner(inputStream);
List<Transaction> transactions = new ArrayList<>(); List<Transaction> transactions = new ArrayList<>();
while (scanner.hasNextLine()) { while (scanner.hasNextLine()) {
String[] transaction = scanner.nextLine().split(" "); String line = scanner.nextLine();
String user = transaction[0]; String[] parts = line.split(" ");
String transactionLocation = transaction[1];
double amount = Double.valueOf(transaction[2]); if (parts.length >= 3) {
transactions.add(new Transaction(user, amount, transactionLocation)); String user = parts[0];
String transactionLocation = parts[1];
double amount = Double.valueOf(parts[2]);
transactions.add(new Transaction(user, amount, transactionLocation));
}
} }
return Collections.unmodifiableList(transactions); return Collections.unmodifiableList(transactions);
} }
/**
* @brief Checks if there are more transactions available in the stream.
* @return boolean True if another transaction exists, false otherwise.
*/
@Override @Override
public boolean hasNext() { public boolean hasNext() {
return transactionIterator.hasNext(); return transactionIterator.hasNext();
} }
/**
* @brief Retrieves the next available transaction.
* @return Transaction The next transaction in the sequence.
*/
@Override @Override
public Transaction next() { public Transaction next() {
return transactionIterator.next(); return transactionIterator.next();
} }
} }
\ No newline at end of file
/* /**
* MIT License * @file Transaction.java
* * @brief Definition of the Transaction data model and its Kafka Serializer.
* Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/ */
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.kafka.common.serialization.Serializer; import org.apache.kafka.common.serialization.Serializer;
/**
* @class Transaction
* @brief Data model representing a financial purchase event for the producer service.
*
* In the Banking API service, this class is used to model incoming raw
* transactions. It provides the structure required to perform fraud detection
* and is then serialized into JSON format to be published to Kafka topics.
*/
public class Transaction { public class Transaction {
/** @brief The unique identifier of the user initiating the purchase. */
private String user; private String user;
/** @brief The monetary value of the purchase transaction. */
private double amount; private double amount;
/** @brief The geographical location (country) where the purchase was made. */
private String transactionLocation; private String transactionLocation;
/**
* @brief Constructor to initialize a Transaction with specific data.
*
* @param user The customer's username or ID.
* @param amount The cost of the items purchased.
* @param transactionLocation The country where the credit card was used.
*/
public Transaction(String user, double amount, String transactionLocation) { public Transaction(String user, double amount, String transactionLocation) {
this.user = user; this.user = user;
this.amount = amount; this.amount = amount;
this.transactionLocation = transactionLocation; this.transactionLocation = transactionLocation;
} }
/**
* @brief Gets the username associated with this transaction.
* @return String The user identifier.
*/
public String getUser() { public String getUser() {
return user; return user;
} }
/**
* @brief Gets the monetary amount of the transaction.
* @return double The transaction value.
*/
public double getAmount() { public double getAmount() {
return amount; return amount;
} }
/**
* @brief Gets the location of the transaction.
* @return String The country name/code.
*/
public String getTransactionLocation() { public String getTransactionLocation() {
return transactionLocation; return transactionLocation;
} }
/**
* @brief Provides a string-based representation of the transaction data.
* @return String A formatted debug string containing user, amount, and location.
*/
@Override @Override
public String toString() { public String toString() {
return "Transaction{" + return "Transaction{" +
...@@ -58,10 +76,27 @@ public class Transaction { ...@@ -58,10 +76,27 @@ public class Transaction {
} }
/** /**
* Kafka Serializer implementation. * @class TransactionSerializer
* Serializes a Transaction to JSON so it can be sent to a Kafka Topic * @brief Custom Kafka Serializer implementation for the @ref Transaction class.
*
* This inner class allows Kafka Producers to convert high-level Java
* @ref Transaction objects into JSON byte arrays that can be transmitted
* across the network to Kafka brokers.
*
* @implements Serializer<Transaction>
*/ */
public static class TransactionSerializer implements Serializer<Transaction> { public static class TransactionSerializer implements Serializer<Transaction> {
/**
* @brief Converts a Transaction object into a JSON byte array.
*
* @details Uses the Jackson @c ObjectMapper to perform the conversion.
* If serialization fails, the method logs the error and returns @c null.
*
* @param topic The name of the destination Kafka topic.
* @param data The Transaction instance to be serialized.
* @return byte[] The JSON byte array representation of the object.
*/
@Override @Override
public byte[] serialize(String topic, Transaction data) { public byte[] serialize(String topic, Transaction data) {
byte[] serializedData = null; byte[] serializedData = null;
...@@ -69,9 +104,10 @@ public class Transaction { ...@@ -69,9 +104,10 @@ public class Transaction {
try { try {
serializedData = objectMapper.writeValueAsString(data).getBytes(); serializedData = objectMapper.writeValueAsString(data).getBytes();
} catch (Exception e) { } catch (Exception e) {
// Log serialization failures
e.printStackTrace(); e.printStackTrace();
} }
return serializedData; return serializedData;
} }
} }
} }
\ No newline at end of file
/* /**
* MIT License * @file UserResidenceDatabase.java
* * @brief Management of user residence data via Redis.
* Copyright (c) 2019 Michael Pogrebinsky - Distributed Systems & Cloud Computing with Java
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/ */
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner; import java.util.Scanner;
/** /**
* Mock database that contains a map from a user to its country of residence * @class UserResidenceDatabase
* @brief High-performance database wrapper for user residence lookups using Redis.
*
* This class interacts with a Redis instance to store and retrieve the home
* country of bank users. It is a critical component of the fraud detection
* system, allowing the Banking API to quickly compare transaction locations
* against a user's verified residence.
*/ */
public class UserResidenceDatabase { public class UserResidenceDatabase {
/** @brief The hostname of the Redis server. */
private static final String REDIS_HOST = "localhost";
/** @brief The network port on which the Redis server is listening. */
private static final int REDIS_PORT = 6379;
/** @brief The text file used to populate Redis with initial data. */
private static final String USER_RESIDENCE_FILE = "user-residence.txt"; private static final String USER_RESIDENCE_FILE = "user-residence.txt";
private final Map<String, String> userToResidenceMap;
/**
* @brief A pool of Redis connections.
* @details Using a JedisPool is thread-safe and more efficient than opening
* a new connection for every request.
*/
private final JedisPool jedisPool;
public UserResidenceDatabase(){ /**
this.userToResidenceMap = loadUsersResidenceFromFile(); * @brief Constructor for UserResidenceDatabase.
*
* Initializes the Redis connection pool and triggers the automatic
* seeding of data from the local @ref USER_RESIDENCE_FILE.
*/
public UserResidenceDatabase() {
this.jedisPool = new JedisPool(REDIS_HOST, REDIS_PORT);
seedRedisFromFile();
} }
/** /**
* Returns the user's country of residence * @brief Fetches a user's home country from the Redis database.
*
* This method performs an O(1) lookup in Redis.
*
* @param user The username or ID of the customer.
* @return String The country string representing the user's residence.
* @throws RuntimeException if the user key does not exist in Redis.
*/ */
public String getUserResidence(String user) { public String getUserResidence(String user) {
if (!userToResidenceMap.containsKey(user)) { try (Jedis jedis = jedisPool.getResource()) {
throw new RuntimeException("user " + user + " doesn't exist"); String residence = jedis.get(user);
/** @note Absence of a user in the DB is treated as a critical data error. */
if (residence == null) {
throw new RuntimeException("User " + user + " doesn't exist in Redis database");
}
return residence;
} }
return userToResidenceMap.get(user);
} }
private Map<String, String> loadUsersResidenceFromFile() { /**
Map<String, String> userToResidence = new HashMap<>(); * @brief Populates the Redis instance with data from the local resource file.
*
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(USER_RESIDENCE_FILE); * Reads the @c user-residence.txt file and performs a @c SET operation in
* Redis for every "User Location" pair found.
Scanner scanner = new Scanner(inputStream); *
* @details This allows the system to be "reset" or initialized with known
* user data during the startup phase of the Banking API.
*/
private void seedRedisFromFile() {
try (Jedis jedis = jedisPool.getResource()) {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(USER_RESIDENCE_FILE);
if (inputStream == null) {
System.err.println("Seeding failed: " + USER_RESIDENCE_FILE + " not found.");
return;
}
while (scanner.hasNextLine()) { Scanner scanner = new Scanner(inputStream);
String line = scanner.nextLine(); while (scanner.hasNextLine()) {
String []userResidencePair = line.split(" "); String line = scanner.nextLine();
userToResidence.put(userResidencePair[0], userResidencePair[1]); String[] userResidencePair = line.split(" ");
if (userResidencePair.length >= 2) {
// Store in Redis: Key = Username, Value = Country
jedis.set(userResidencePair[0], userResidencePair[1]);
}
}
System.out.println("Redis database seeded successfully from file.");
scanner.close();
} }
return Collections.unmodifiableMap(userToResidence);
} }
}
\ No newline at end of file
}
john1967 Germany 110 john1967 Germany 110.00
msmith2015 California 50 msmith2015 California 50.00
tom_stevens12 England 1000 tom_stevens12 England 1000.00
jimliang1988 Ireland 70 jimliang1988 Ireland 70.00
arthur_wilson India 5.99 arthur_wilson India 5.99
mary_johson98 Japan 44.50 mary_johson98 Japan 44.50
smith_teresa Spain 800 smith_teresa Spain 800.00
andrewb1999 Turkey 745.70 andrewb1999 Turkey 745.70
cameron-dion Florida 100 cameron-dion Florida 100.00
arjun4444 Canada 99.95 arjun4444 Canada 99.95
rehansh_jk2001 Netherlands 7.50 rehansh_jk2001 Netherlands 7.50
mia_fisher Italy 150 mia_fisher Italy 150.00
annabecker_1997 Brazil 90 annabecker_1997 Brazil 90.00
\ No newline at end of file john1967 Germany 45.00
john1967 France 200.00
msmith2015 Oregon 12.99
msmith2015 Oregon 150.00
tom_stevens12 England 20.00
tom_stevens12 USA 5000.00
sara_lee China 88.00
pablo_g Mexico 15.50
yuki_tanaka Japan 300.00
fatima_h Egypt 50.00
oliver_twist UK 12.00
john1967 Germany 10.00
msmith2015 Oregon 85.00
arthur_wilson India 100.00
arthur_wilson UK 250.00
mary_johson98 Germany 14.00
smith_teresa Spain 50.00
andrewb1999 Turkey 120.00
cameron-dion Texas 30.00
arjun4444 Canada 15.00
rehansh_jk2001 Netherlands 22.00
mia_fisher Italy 9.99
annabecker_1997 Sweden 100.00
sara_lee China 500.00
sara_lee Italy 45.00
pablo_g Mexico 200.00
yuki_tanaka Japan 1000.00
fatima_h Egypt 5.00
fatima_h UAE 150.00
oliver_twist UK 45.00
john1967 Germany 30.00
msmith2015 Oregon 200.00
msmith2015 Oregon 10.00
tom_stevens12 England 15.00
jimliang1988 Ireland 200.00
arthur_wilson India 45.00
mary_johson98 Germany 90.00
smith_teresa Spain 10.00
andrewb1999 Turkey 30.00
cameron-dion Texas 150.00
arjun4444 Canada 200.00
rehansh_jk2001 Netherlands 100.00
mia_fisher Italy 45.00
annabecker_1997 Sweden 15.00
sara_lee China 20.00
pablo_g Mexico 80.00
yuki_tanaka Japan 55.00
\ No newline at end of file
john1967 Germany 110 john1967 Germany 110.00
msmith2015 California 50 msmith2015 California 50.00
tom_stevens12 England 1000 tom_stevens12 England 1000.00
jimliang1988 Ireland 70 jimliang1988 Ireland 70.00
arthur_wilson India 5.99 arthur_wilson India 5.99
mary_johson98 Japan 44.50 mary_johson98 Japan 44.50
smith_teresa Spain 800 smith_teresa Spain 800.00
andrewb1999 Turkey 745.70 andrewb1999 Turkey 745.70
cameron-dion Florida 100 cameron-dion Florida 100.00
arjun4444 Canada 99.95 arjun4444 Canada 99.95
rehansh_jk2001 Netherlands 7.50 rehansh_jk2001 Netherlands 7.50
mia_fisher Italy 150 mia_fisher Italy 150.00
annabecker_1997 Brazil 90 annabecker_1997 Brazil 90.00
\ No newline at end of file john1967 Germany 45.00
john1967 France 200.00
msmith2015 Oregon 12.99
msmith2015 Oregon 150.00
tom_stevens12 England 20.00
tom_stevens12 USA 5000.00
sara_lee China 88.00
pablo_g Mexico 15.50
yuki_tanaka Japan 300.00
fatima_h Egypt 50.00
oliver_twist UK 12.00
john1967 Germany 10.00
msmith2015 Oregon 85.00
arthur_wilson India 100.00
arthur_wilson UK 250.00
mary_johson98 Germany 14.00
smith_teresa Spain 50.00
andrewb1999 Turkey 120.00
cameron-dion Texas 30.00
arjun4444 Canada 15.00
rehansh_jk2001 Netherlands 22.00
mia_fisher Italy 9.99
annabecker_1997 Sweden 100.00
sara_lee China 500.00
sara_lee Italy 45.00
pablo_g Mexico 200.00
yuki_tanaka Japan 1000.00
fatima_h Egypt 5.00
fatima_h UAE 150.00
oliver_twist UK 45.00
john1967 Germany 30.00
msmith2015 Oregon 200.00
msmith2015 Oregon 10.00
tom_stevens12 England 15.00
jimliang1988 Ireland 200.00
arthur_wilson India 45.00
mary_johson98 Germany 90.00
smith_teresa Spain 10.00
andrewb1999 Turkey 30.00
cameron-dion Texas 150.00
arjun4444 Canada 200.00
rehansh_jk2001 Netherlands 100.00
mia_fisher Italy 45.00
annabecker_1997 Sweden 15.00
sara_lee China 20.00
pablo_g Mexico 80.00
yuki_tanaka Japan 55.00
\ No newline at end of file
cd /opt/kafka
# Create Valid Transactions Topic
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 2 --partitions 2 --topic valid-transactions
# Create Suspicious Transactions Topic
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 2 --partitions 2 --topic suspicious-transactions
############################# Server Basics #############################
broker.id=0
############################# Socket Server Settings #############################
# Set explicit port 9092
listeners=PLAINTEXT://:9092
############################# Log Basics #############################
# Use a specific directory for this broker
log.dirs=/tmp/kafka-logs-0
# Set default partitions to 2 (as requested)
num.partitions=2
############################# Internal Topic Settings #############################
# Since we have 2 brokers, we can set replication to 2
offsets.topic.replication.factor=2
transaction.state.log.replication.factor=2
transaction.state.log.min.isr=1
############################# Zookeeper #############################
zookeeper.connect=localhost:2181
############################# Server Basics #############################
# MUST BE UNIQUE
broker.id=1
############################# Socket Server Settings #############################
# MUST BE UNIQUE PORT
listeners=PLAINTEXT://:9093
############################# Log Basics #############################
# MUST BE UNIQUE DIRECTORY
log.dirs=/tmp/kafka-logs-1
# Set default partitions to 2
num.partitions=2
############################# Internal Topic Settings #############################
offsets.topic.replication.factor=2
transaction.state.log.replication.factor=2
transaction.state.log.min.isr=1
############################# Zookeeper #############################
# Same Zookeeper
zookeeper.connect=localhost:2181
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
# Disable the adminserver by default to avoid port conflicts.
# Set the port to something non-conflicting if choosing to enable this
admin.enableServer=false
# admin.serverPort=8080
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: bank-api-service/src/main/java/IncomingTransactionsReader.java File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_91969309850165d799ea66b81288e22e.html">bank-api-service</a></li><li class="navelem"><a class="el" href="dir_79d72b961d0dccd15151b888018fbf37.html">src</a></li><li class="navelem"><a class="el" href="dir_dffd421bc3d70d00e87a48b7b3597a8c.html">main</a></li><li class="navelem"><a class="el" href="dir_d2958cc73cb4c4e471c029cab39c1580.html">java</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> </div>
<div class="headertitle"><div class="title">IncomingTransactionsReader.java File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Logic for simulating real-time transaction ingestion.
<a href="#details">More...</a></p>
<div class="textblock"><code>import java.io.InputStream;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for IncomingTransactionsReader.java:</div>
<div class="dyncontent">
<div class="center"><img src="IncomingTransactionsReader_8java__incl.png" border="0" usemap="#abank-api-service_2src_2main_2java_2IncomingTransactionsReader_8java" alt=""/></div>
<map name="abank-api-service_2src_2main_2java_2IncomingTransactionsReader_8java" id="abank-api-service_2src_2main_2java_2IncomingTransactionsReader_8java">
<area shape="rect" title="Logic for simulating real&#45;time transaction ingestion." alt="" coords="5,5,220,60"/>
<area shape="rect" title=" " alt="" coords="45,108,180,133"/>
<area shape="poly" title=" " alt="" coords="115,60,115,94,110,94,110,60"/>
</map>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classIncomingTransactionsReader.html">IncomingTransactionsReader</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Mocks an external data source (like an HTTP server) providing real-time transactions. <a href="classIncomingTransactionsReader.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Logic for simulating real-time transaction ingestion. </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="bank&#45;api&#45;service/src/main/java/IncomingTransactionsReader.java" name="bank&#45;api&#45;service/src/main/java/IncomingTransactionsReader.java">
<area shape="rect" id="Node000001" title="Logic for simulating real&#45;time transaction ingestion." alt="" coords="5,5,220,60"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="45,108,180,133"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="115,60,115,94,110,94,110,60"/>
</map>
3afdb5b3df9e2fecaf1d619d0023e7a8
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: bank-api-service/src/main/java/UserResidenceDatabase.java File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_91969309850165d799ea66b81288e22e.html">bank-api-service</a></li><li class="navelem"><a class="el" href="dir_79d72b961d0dccd15151b888018fbf37.html">src</a></li><li class="navelem"><a class="el" href="dir_dffd421bc3d70d00e87a48b7b3597a8c.html">main</a></li><li class="navelem"><a class="el" href="dir_d2958cc73cb4c4e471c029cab39c1580.html">java</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> </div>
<div class="headertitle"><div class="title">UserResidenceDatabase.java File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Management of user residence data via Redis.
<a href="#details">More...</a></p>
<div class="textblock"><code>import redis.clients.jedis.Jedis;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for UserResidenceDatabase.java:</div>
<div class="dyncontent">
<div class="center"><img src="UserResidenceDatabase_8java__incl.png" border="0" usemap="#abank-api-service_2src_2main_2java_2UserResidenceDatabase_8java" alt=""/></div>
<map name="abank-api-service_2src_2main_2java_2UserResidenceDatabase_8java" id="abank-api-service_2src_2main_2java_2UserResidenceDatabase_8java">
<area shape="rect" title="Management of user residence data via Redis." alt="" coords="5,5,265,45"/>
<area shape="rect" title=" " alt="" coords="56,93,215,119"/>
<area shape="poly" title=" " alt="" coords="138,46,138,79,133,79,133,46"/>
</map>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classUserResidenceDatabase.html">UserResidenceDatabase</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">High-performance database wrapper for user residence lookups using Redis. <a href="classUserResidenceDatabase.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Management of user residence data via Redis. </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="bank&#45;api&#45;service/src/main/java/UserResidenceDatabase.java" name="bank&#45;api&#45;service/src/main/java/UserResidenceDatabase.java">
<area shape="rect" id="Node000001" title="Management of user residence data via Redis." alt="" coords="5,5,265,45"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="56,93,215,119"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="138,46,138,79,133,79,133,46"/>
</map>
3a84af38ff99c33c42609c48e9679d1d
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: account-manager/src/main/java/Application.java File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_2d8c6b0e1e44d5b16de02fd7df3d0791.html">account-manager</a></li><li class="navelem"><a class="el" href="dir_6f32b85996071883bae376b89a1656d4.html">src</a></li><li class="navelem"><a class="el" href="dir_349637fa6705b26e99d8095b1cab6529.html">main</a></li><li class="navelem"><a class="el" href="dir_7f750279f2243a5c74c151222e6d17e5.html">java</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> </div>
<div class="headertitle"><div class="title">Application.java File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Implementation of the Account Manager Service.
<a href="#details">More...</a></p>
<div class="textblock"><code>import org.apache.kafka.clients.consumer;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for Application.java:</div>
<div class="dyncontent">
<div class="center"><img src="account-manager_2src_2main_2java_2Application_8java__incl.png" border="0" usemap="#aaccount-manager_2src_2main_2java_2Application_8java" alt=""/></div>
<map name="aaccount-manager_2src_2main_2java_2Application_8java" id="aaccount-manager_2src_2main_2java_2Application_8java">
<area shape="rect" title="Implementation of the Account Manager Service." alt="" coords="29,5,207,45"/>
<area shape="rect" title=" " alt="" coords="5,93,231,119"/>
<area shape="poly" title=" " alt="" coords="121,46,121,79,115,79,115,46"/>
</map>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApplication.html">Application</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Consumer service that manages and authorizes valid financial transactions. <a href="classApplication.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Implementation of the Account Manager Service. </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="account&#45;manager/src/main/java/Application.java" name="account&#45;manager/src/main/java/Application.java">
<area shape="rect" id="Node000001" title="Implementation of the Account Manager Service." alt="" coords="29,5,207,45"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="5,93,231,119"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="121,46,121,79,115,79,115,46"/>
</map>
166b4535fc62ead2abc010942d176804
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: account-manager/src/main/java/Transaction.java File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_2d8c6b0e1e44d5b16de02fd7df3d0791.html">account-manager</a></li><li class="navelem"><a class="el" href="dir_6f32b85996071883bae376b89a1656d4.html">src</a></li><li class="navelem"><a class="el" href="dir_349637fa6705b26e99d8095b1cab6529.html">main</a></li><li class="navelem"><a class="el" href="dir_7f750279f2243a5c74c151222e6d17e5.html">java</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> </div>
<div class="headertitle"><div class="title">Transaction.java File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Definition of the <a class="el" href="classTransaction.html" title="Data model representing a financial purchase event.">Transaction</a> data model and its Kafka Deserializer.
<a href="#details">More...</a></p>
<div class="textblock"><code>import com.fasterxml.jackson.databind.ObjectMapper;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for Transaction.java:</div>
<div class="dyncontent">
<div class="center"><img src="account-manager_2src_2main_2java_2Transaction_8java__incl.png" border="0" usemap="#aaccount-manager_2src_2main_2java_2Transaction_8java" alt=""/></div>
<map name="aaccount-manager_2src_2main_2java_2Transaction_8java" id="aaccount-manager_2src_2main_2java_2Transaction_8java">
<area shape="rect" title="Definition of the Transaction data model and its Kafka Deserializer." alt="" coords="19,5,202,45"/>
<area shape="rect" title=" " alt="" coords="5,93,216,133"/>
<area shape="poly" title=" " alt="" coords="113,46,113,79,108,79,108,46"/>
</map>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTransaction.html">Transaction</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Data model representing a financial purchase event. <a href="classTransaction.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><b>Transaction.TransactionDeserializer</b></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom Kafka Deserializer implementation for <a class="el" href="classTransaction.html" title="Data model representing a financial purchase event.">Transaction</a> objects. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Definition of the <a class="el" href="classTransaction.html" title="Data model representing a financial purchase event.">Transaction</a> data model and its Kafka Deserializer. </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="account&#45;manager/src/main/java/Transaction.java" name="account&#45;manager/src/main/java/Transaction.java">
<area shape="rect" id="Node000001" title="Definition of the Transaction data model and its Kafka Deserializer." alt="" coords="19,5,202,45"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="5,93,216,133"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="113,46,113,79,108,79,108,46"/>
</map>
7cbd246f1f319e7956bd97bed13732a2
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: Class List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">Class List</div></div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
<table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classApplication.html" target="_self">Application</a></td><td class="desc">Consumer service that manages and authorizes valid financial transactions </td></tr>
<tr id="row_1_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classIncomingTransactionsReader.html" target="_self">IncomingTransactionsReader</a></td><td class="desc">Mocks an external data source (like an HTTP server) providing real-time transactions </td></tr>
<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classTransaction.html" target="_self">Transaction</a></td><td class="desc">Data model representing a financial purchase event </td></tr>
<tr id="row_3_" class="odd"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classUserResidenceDatabase.html" target="_self">UserResidenceDatabase</a></td><td class="desc">High-performance database wrapper for user residence lookups using Redis </td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: bank-api-service/src/main/java/Application.java File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_91969309850165d799ea66b81288e22e.html">bank-api-service</a></li><li class="navelem"><a class="el" href="dir_79d72b961d0dccd15151b888018fbf37.html">src</a></li><li class="navelem"><a class="el" href="dir_dffd421bc3d70d00e87a48b7b3597a8c.html">main</a></li><li class="navelem"><a class="el" href="dir_d2958cc73cb4c4e471c029cab39c1580.html">java</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> </div>
<div class="headertitle"><div class="title">Application.java File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Main entry point for the Banking API Service.
<a href="#details">More...</a></p>
<div class="textblock"><code>import org.apache.kafka.clients.producer;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for Application.java:</div>
<div class="dyncontent">
<div class="center"><img src="bank-api-service_2src_2main_2java_2Application_8java__incl.png" border="0" usemap="#abank-api-service_2src_2main_2java_2Application_8java" alt=""/></div>
<map name="abank-api-service_2src_2main_2java_2Application_8java" id="abank-api-service_2src_2main_2java_2Application_8java">
<area shape="rect" title="Main entry point for the Banking API Service." alt="" coords="25,5,204,45"/>
<area shape="rect" title=" " alt="" coords="5,93,224,119"/>
<area shape="poly" title=" " alt="" coords="117,46,117,79,112,79,112,46"/>
</map>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApplication.html">Application</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Consumer service that manages and authorizes valid financial transactions. <a href="classApplication.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Main entry point for the Banking API Service. </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="bank&#45;api&#45;service/src/main/java/Application.java" name="bank&#45;api&#45;service/src/main/java/Application.java">
<area shape="rect" id="Node000001" title="Main entry point for the Banking API Service." alt="" coords="25,5,204,45"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="5,93,224,119"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="117,46,117,79,112,79,112,46"/>
</map>
2ba767fcad2e8558d086f2ecac46c464
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: bank-api-service/src/main/java/Transaction.java File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_91969309850165d799ea66b81288e22e.html">bank-api-service</a></li><li class="navelem"><a class="el" href="dir_79d72b961d0dccd15151b888018fbf37.html">src</a></li><li class="navelem"><a class="el" href="dir_dffd421bc3d70d00e87a48b7b3597a8c.html">main</a></li><li class="navelem"><a class="el" href="dir_d2958cc73cb4c4e471c029cab39c1580.html">java</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> </div>
<div class="headertitle"><div class="title">Transaction.java File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Definition of the <a class="el" href="classTransaction.html" title="Data model representing a financial purchase event.">Transaction</a> data model and its Kafka Serializer.
<a href="#details">More...</a></p>
<div class="textblock"><code>import com.fasterxml.jackson.databind.ObjectMapper;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for Transaction.java:</div>
<div class="dyncontent">
<div class="center"><img src="bank-api-service_2src_2main_2java_2Transaction_8java__incl.png" border="0" usemap="#abank-api-service_2src_2main_2java_2Transaction_8java" alt=""/></div>
<map name="abank-api-service_2src_2main_2java_2Transaction_8java" id="abank-api-service_2src_2main_2java_2Transaction_8java">
<area shape="rect" title="Definition of the Transaction data model and its Kafka Serializer." alt="" coords="19,5,202,45"/>
<area shape="rect" title=" " alt="" coords="5,93,216,133"/>
<area shape="poly" title=" " alt="" coords="113,46,113,79,108,79,108,46"/>
</map>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTransaction.html">Transaction</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Data model representing a financial purchase event. <a href="classTransaction.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><b>Transaction.TransactionSerializer</b></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom Kafka Serializer implementation for the <a class="el" href="classTransaction.html">Transaction</a> class. <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Definition of the <a class="el" href="classTransaction.html" title="Data model representing a financial purchase event.">Transaction</a> data model and its Kafka Serializer. </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="bank&#45;api&#45;service/src/main/java/Transaction.java" name="bank&#45;api&#45;service/src/main/java/Transaction.java">
<area shape="rect" id="Node000001" title="Definition of the Transaction data model and its Kafka Serializer." alt="" coords="19,5,202,45"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="5,93,216,133"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="113,46,113,79,108,79,108,46"/>
</map>
ed491b9924785dab614382e03641b330
\ No newline at end of file
docs/bc_s.png

676 Bytes

docs/bc_sd.png

635 Bytes

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">Application Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classApplication.html">Application</a>, including all inherited members.</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classApplication.html#a6c5cb69f6356037259e4536f4b42622b">consumeMessages</a>(String topic, Consumer&lt; String, Transaction &gt; kafkaConsumer)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classApplication.html#a0e52c9f9039021956225a27bdc25cf59">consumeMessages</a>(List&lt; String &gt; topics, Consumer&lt; String, Transaction &gt; kafkaConsumer)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classApplication.html#a6c5cb69f6356037259e4536f4b42622b">consumeMessages</a>(String topic, Consumer&lt; String, Transaction &gt; kafkaConsumer)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classApplication.html#ac70adb9fd8fc7a0e37b30444e4bc9c08">createKafkaConsumer</a>(String bootstrapServers, String consumerGroup)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classApplication.html#ac70adb9fd8fc7a0e37b30444e4bc9c08">createKafkaConsumer</a>(String bootstrapServers, String consumerGroup)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classApplication.html#ac70adb9fd8fc7a0e37b30444e4bc9c08">createKafkaConsumer</a>(String bootstrapServers, String consumerGroup)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classApplication.html#a0dd0f12a03b8d6390f412e5e7f166e7f">createKafkaProducer</a>(String bootstrapServers)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classApplication.html#a64d4bdb810895ffc94d6df6545333417">main</a>(String[] args)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classApplication.html#a64d4bdb810895ffc94d6df6545333417">main</a>(String[] args)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classApplication.html#a64d4bdb810895ffc94d6df6545333417">main</a>(String[] args)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classApplication.html#a64d4bdb810895ffc94d6df6545333417">main</a>(String[] args)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classApplication.html#a125cab15b7a5d17022e5af86a8773e8a">processTransactions</a>(IncomingTransactionsReader reader, UserResidenceDatabase db, Producer&lt; String, Transaction &gt; producer)</td><td class="entry"><a class="el" href="classApplication.html">Application</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
</table></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
This diff is collapsed.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">IncomingTransactionsReader Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classIncomingTransactionsReader.html">IncomingTransactionsReader</a>, including all inherited members.</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classIncomingTransactionsReader.html#aba170c8bbde1e8cf07220085202f78f9">hasNext</a>()</td><td class="entry"><a class="el" href="classIncomingTransactionsReader.html">IncomingTransactionsReader</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classIncomingTransactionsReader.html#a5373a4a62befe48c5aa4a271a65a0c71">IncomingTransactionsReader</a>()</td><td class="entry"><a class="el" href="classIncomingTransactionsReader.html">IncomingTransactionsReader</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classIncomingTransactionsReader.html#a719fa1896fe4e87ecbf61b097745d8dc">next</a>()</td><td class="entry"><a class="el" href="classIncomingTransactionsReader.html">IncomingTransactionsReader</a></td><td class="entry"></td></tr>
</table></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
This diff is collapsed.
<map id="IncomingTransactionsReader" name="IncomingTransactionsReader">
<area shape="rect" id="Node000001" title="Mocks an external data source (like an HTTP server) providing real&#45;time transactions." alt="" coords="7,79,199,104"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="5,5,68,31"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="59,39,94,77,91,80,55,43"/>
<area shape="rect" id="Node000003" title=" " alt="" coords="93,5,247,31"/>
<area shape="poly" id="edge2_Node000001_Node000003" title=" " alt="" coords="151,43,116,80,112,77,148,39"/>
</map>
08798c5cf989f9bcefa0935d4490ec20
\ No newline at end of file
<map id="IncomingTransactionsReader" name="IncomingTransactionsReader">
<area shape="rect" id="Node000001" title="Mocks an external data source (like an HTTP server) providing real&#45;time transactions." alt="" coords="7,79,199,104"/>
<area shape="rect" id="Node000002" title=" " alt="" coords="5,5,68,31"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="59,39,94,77,91,80,55,43"/>
<area shape="rect" id="Node000003" title=" " alt="" coords="93,5,247,31"/>
<area shape="poly" id="edge2_Node000001_Node000003" title=" " alt="" coords="151,43,116,80,112,77,148,39"/>
</map>
08798c5cf989f9bcefa0935d4490ec20
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">UserResidenceDatabase Member List</div></div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classUserResidenceDatabase.html">UserResidenceDatabase</a>, including all inherited members.</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classUserResidenceDatabase.html#ac7e73ffcfc9177fa717fc648668fcb5e">getUserResidence</a>(String user)</td><td class="entry"><a class="el" href="classUserResidenceDatabase.html">UserResidenceDatabase</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classUserResidenceDatabase.html#a683f593e517452cac560bbd1a5fb9811">UserResidenceDatabase</a>()</td><td class="entry"><a class="el" href="classUserResidenceDatabase.html">UserResidenceDatabase</a></td><td class="entry"></td></tr>
</table></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: UserResidenceDatabase Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classUserResidenceDatabase-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">UserResidenceDatabase Class Reference</div></div>
</div><!--header-->
<div class="contents">
<p>High-performance database wrapper for user residence lookups using Redis.
<a href="classUserResidenceDatabase.html#details">More...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a683f593e517452cac560bbd1a5fb9811" id="r_a683f593e517452cac560bbd1a5fb9811"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classUserResidenceDatabase.html#a683f593e517452cac560bbd1a5fb9811">UserResidenceDatabase</a> ()</td></tr>
<tr class="memdesc:a683f593e517452cac560bbd1a5fb9811"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor for <a class="el" href="classUserResidenceDatabase.html" title="High-performance database wrapper for user residence lookups using Redis.">UserResidenceDatabase</a>. <br /></td></tr>
<tr class="separator:a683f593e517452cac560bbd1a5fb9811"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac7e73ffcfc9177fa717fc648668fcb5e" id="r_ac7e73ffcfc9177fa717fc648668fcb5e"><td class="memItemLeft" align="right" valign="top">String&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classUserResidenceDatabase.html#ac7e73ffcfc9177fa717fc648668fcb5e">getUserResidence</a> (String user)</td></tr>
<tr class="memdesc:ac7e73ffcfc9177fa717fc648668fcb5e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Fetches a user's home country from the Redis database. <br /></td></tr>
<tr class="separator:ac7e73ffcfc9177fa717fc648668fcb5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>High-performance database wrapper for user residence lookups using Redis. </p>
<p>This class interacts with a Redis instance to store and retrieve the home country of bank users. It is a critical component of the fraud detection system, allowing the Banking API to quickly compare transaction locations against a user's verified residence. </p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a683f593e517452cac560bbd1a5fb9811" name="a683f593e517452cac560bbd1a5fb9811"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a683f593e517452cac560bbd1a5fb9811">&#9670;&#160;</a></span>UserResidenceDatabase()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">UserResidenceDatabase.UserResidenceDatabase </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Constructor for <a class="el" href="classUserResidenceDatabase.html" title="High-performance database wrapper for user residence lookups using Redis.">UserResidenceDatabase</a>. </p>
<p>Initializes the Redis connection pool and triggers the automatic seeding of data from the local USER_RESIDENCE_FILE. </p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="ac7e73ffcfc9177fa717fc648668fcb5e" name="ac7e73ffcfc9177fa717fc648668fcb5e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac7e73ffcfc9177fa717fc648668fcb5e">&#9670;&#160;</a></span>getUserResidence()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">String UserResidenceDatabase.getUserResidence </td>
<td>(</td>
<td class="paramtype">String&#160;</td>
<td class="paramname"><em>user</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Fetches a user's home country from the Redis database. </p>
<p>This method performs an O(1) lookup in Redis.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">user</td><td>The username or ID of the customer. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>String The country string representing the user's residence. </dd></dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">RuntimeException</td><td>if the user key does not exist in Redis. </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>Absence of a user in the DB is treated as a critical data error.</dd></dl>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>bank-api-service/src/main/java/<a class="el" href="UserResidenceDatabase_8java.html">UserResidenceDatabase.java</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: Class Index</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">Class Index</div></div>
</div><!--header-->
<div class="contents">
<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_I">I</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_U">U</a></div>
<div class="classindex">
<dl class="classindex even">
<dt class="alphachar"><a id="letter_A" name="letter_A">A</a></dt>
<dd><a class="el" href="classApplication.html">Application</a></dd></dl>
<dl class="classindex odd">
<dt class="alphachar"><a id="letter_I" name="letter_I">I</a></dt>
<dd><a class="el" href="classIncomingTransactionsReader.html">IncomingTransactionsReader</a></dd></dl>
<dl class="classindex even">
<dt class="alphachar"><a id="letter_T" name="letter_T">T</a></dt>
<dd><a class="el" href="classTransaction.html">Transaction</a></dd></dl>
<dl class="classindex odd">
<dt class="alphachar"><a id="letter_U" name="letter_U">U</a></dt>
<dd><a class="el" href="classUserResidenceDatabase.html">UserResidenceDatabase</a></dd></dl>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: user-notification-service/src Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_408cef0a3a196093c68a3a55b6a68f53.html">user-notification-service</a></li><li class="navelem"><a class="el" href="dir_03545c71cf066eaf372147f958123b26.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">src Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for src:</div>
<div class="dyncontent">
<div class="center"><img src="dir_03545c71cf066eaf372147f958123b26_dep.png" border="0" usemap="#adir__03545c71cf066eaf372147f958123b26__dep" alt="user-notification-service/src"/></div>
<map name="adir__03545c71cf066eaf372147f958123b26__dep" id="adir__03545c71cf066eaf372147f958123b26__dep">
<area shape="rect" href="dir_f2d362cf46b2da6abfcc2b7f412461f1.html" title="main" alt="" coords="39,63,89,88"/>
<area shape="rect" href="dir_03545c71cf066eaf372147f958123b26.html" alt="" coords="28,52,164,99"/>
<area shape="rect" href="dir_408cef0a3a196093c68a3a55b6a68f53.html" title="user&#45;notification&#45;service" alt="" coords="16,16,176,109"/>
</map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="iconfclosed"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_f2d362cf46b2da6abfcc2b7f412461f1.html">main</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="user&#45;notification&#45;service/src" name="user&#45;notification&#45;service/src">
<area shape="rect" id="node2" href="dir_f2d362cf46b2da6abfcc2b7f412461f1.html" title="main" alt="" coords="39,63,89,88"/>
<area shape="rect" id="clust2" href="dir_03545c71cf066eaf372147f958123b26.html" alt="" coords="28,52,164,99"/>
<area shape="rect" id="clust1" href="dir_408cef0a3a196093c68a3a55b6a68f53.html" title="user&#45;notification&#45;service" alt="" coords="16,16,176,109"/>
</map>
e1d6569661c46b4fe092177c7b6677d1
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: reporting-service/src/main Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_3490ef5bd07645d4194a7f9da4371448.html">reporting-service</a></li><li class="navelem"><a class="el" href="dir_e6aff6571896dbe77545a2da8a98f7a7.html">src</a></li><li class="navelem"><a class="el" href="dir_1c8eeb082b5dcd44d76578a8794c8a77.html">main</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">main Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for main:</div>
<div class="dyncontent">
<div class="center"><img src="dir_1c8eeb082b5dcd44d76578a8794c8a77_dep.png" border="0" usemap="#adir__1c8eeb082b5dcd44d76578a8794c8a77__dep" alt="reporting-service/src/main"/></div>
<map name="adir__1c8eeb082b5dcd44d76578a8794c8a77__dep" id="adir__1c8eeb082b5dcd44d76578a8794c8a77__dep">
<area shape="rect" href="dir_93bb062b2d2ba5d428ca3635b0383335.html" title="java" alt="" coords="38,63,85,88"/>
<area shape="rect" href="dir_1c8eeb082b5dcd44d76578a8794c8a77.html" alt="" coords="27,52,171,99"/>
<area shape="rect" href="dir_e6aff6571896dbe77545a2da8a98f7a7.html" title="src" alt="" coords="16,16,181,109"/>
</map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="iconfclosed"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_93bb062b2d2ba5d428ca3635b0383335.html">java</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<map id="reporting&#45;service/src/main" name="reporting&#45;service/src/main">
<area shape="rect" id="node2" href="dir_93bb062b2d2ba5d428ca3635b0383335.html" title="java" alt="" coords="38,63,85,88"/>
<area shape="rect" id="clust2" href="dir_1c8eeb082b5dcd44d76578a8794c8a77.html" alt="" coords="27,52,171,99"/>
<area shape="rect" id="clust1" href="dir_e6aff6571896dbe77545a2da8a98f7a7.html" title="src" alt="" coords="16,16,181,109"/>
</map>
84503613e4dbbb05231575f3ed424d01
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: account-manager Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_2d8c6b0e1e44d5b16de02fd7df3d0791.html">account-manager</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">account-manager Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="iconfclosed"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_6f32b85996071883bae376b89a1656d4.html">src</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>My Project: reporting-service Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">My Project
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_3490ef5bd07645d4194a7f9da4371448.html">reporting-service</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">reporting-service Directory Reference</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="subdirs" name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><span class="iconfclosed"></span>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_e6aff6571896dbe77545a2da8a98f7a7.html">src</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>
This diff is collapsed.
<map id="account&#45;manager/src/main" name="account&#45;manager/src/main">
<area shape="rect" id="node2" href="dir_7f750279f2243a5c74c151222e6d17e5.html" title="java" alt="" coords="38,63,85,88"/>
<area shape="rect" id="clust2" href="dir_349637fa6705b26e99d8095b1cab6529.html" alt="" coords="27,52,171,99"/>
<area shape="rect" id="clust1" href="dir_6f32b85996071883bae376b89a1656d4.html" title="src" alt="" coords="16,16,181,109"/>
</map>
ce8a8ce684094701cd24904cf6b5c13d
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<map id="account&#45;manager/src" name="account&#45;manager/src">
<area shape="rect" id="node2" href="dir_349637fa6705b26e99d8095b1cab6529.html" title="main" alt="" coords="37,63,88,88"/>
<area shape="rect" id="clust2" href="dir_6f32b85996071883bae376b89a1656d4.html" alt="" coords="27,52,163,99"/>
<area shape="rect" id="clust1" href="dir_2d8c6b0e1e44d5b16de02fd7df3d0791.html" title="account&#45;manager" alt="" coords="16,16,173,109"/>
</map>
85cbadb5f3bbed7e27ea8df455cab693
\ No newline at end of file
This diff is collapsed.
<map id="bank&#45;api&#45;service/src" name="bank&#45;api&#45;service/src">
<area shape="rect" id="node2" href="dir_dffd421bc3d70d00e87a48b7b3597a8c.html" title="main" alt="" coords="37,63,88,88"/>
<area shape="rect" id="clust2" href="dir_79d72b961d0dccd15151b888018fbf37.html" alt="" coords="27,52,163,99"/>
<area shape="rect" id="clust1" href="dir_91969309850165d799ea66b81288e22e.html" title="bank&#45;api&#45;service" alt="" coords="16,16,173,109"/>
</map>
6c2280977b0bf5452a1fb5e96101e0c6
\ No newline at end of file
This diff is collapsed.
<map id="account&#45;manager/src/main/java" name="account&#45;manager/src/main/java">
<area shape="rect" id="node1" href="dir_7f750279f2243a5c74c151222e6d17e5.html" title="java" alt="" coords="27,52,74,77"/>
<area shape="rect" id="clust1" href="dir_349637fa6705b26e99d8095b1cab6529.html" title="main" alt="" coords="16,16,85,88"/>
</map>
3999b3decaca1a3b6b1fbeb47878df0e
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<map id="reporting&#45;service/src/main/java" name="reporting&#45;service/src/main/java">
<area shape="rect" id="node1" href="dir_93bb062b2d2ba5d428ca3635b0383335.html" title="java" alt="" coords="27,52,74,77"/>
<area shape="rect" id="clust1" href="dir_1c8eeb082b5dcd44d76578a8794c8a77.html" title="main" alt="" coords="16,16,85,88"/>
</map>
e72801c7edbe12a19af8c0db5913a72a
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment