diff --git a/caching/docker-compose.yml b/caching/docker-compose.yml
new file mode 100644
index 000000000..6b6494690
--- /dev/null
+++ b/caching/docker-compose.yml
@@ -0,0 +1,11 @@
+version: '3.7'
+services:
+ mongodb_container:
+ image: mongo:latest
+ environment:
+ MONGO_INITDB_ROOT_USERNAME: root
+ MONGO_INITDB_ROOT_PASSWORD: rootpassword
+ ports:
+ - 27017:27017
+ volumes:
+ - ./mongo-data/:/data/db
\ No newline at end of file
diff --git a/caching/pom.xml b/caching/pom.xml
index 0491bb4e1..e56da709f 100644
--- a/caching/pom.xml
+++ b/caching/pom.xml
@@ -39,19 +39,21 @@
- * To run the application with MongoDb, just start it with parameter --mongo - * Example: java -jar app.jar --mongo + * To run the application with MongoDb, just start it with parameter --mongo + * Example: java -jar app.jar --mongo *
* * @see CacheStore @@ -65,6 +65,7 @@ public class App { /** * Constructor of current App. + * * @param isMongo boolean */ public App(final boolean isMongo) { @@ -97,6 +98,7 @@ public class App { /** * Check the input parameters. if + * * @param args input params * @return true if there is "--mongo" parameter in arguments */ diff --git a/caching/src/main/java/com/iluwatar/caching/AppManager.java b/caching/src/main/java/com/iluwatar/caching/AppManager.java index 19773f6ad..53489c83b 100644 --- a/caching/src/main/java/com/iluwatar/caching/AppManager.java +++ b/caching/src/main/java/com/iluwatar/caching/AppManager.java @@ -24,10 +24,9 @@ package com.iluwatar.caching; import com.iluwatar.caching.database.DbManager; -import com.iluwatar.caching.database.exceptions.DatabaseConnectionException; + import java.util.Optional; -import lombok.Data; import lombok.extern.slf4j.Slf4j; /** @@ -39,7 +38,6 @@ import lombok.extern.slf4j.Slf4j; * appropriate function in the CacheStore class. */ @Slf4j -@Data public class AppManager { /** * Caching Policy. @@ -56,6 +54,7 @@ public class AppManager { /** * Constructor. + * * @param newDbManager database manager */ public AppManager(final DbManager newDbManager) { @@ -69,15 +68,12 @@ public class AppManager { * to (temporarily) store the data/objects during runtime. */ public void initDb() { - try { - dbManager.connect(); - } catch (DatabaseConnectionException e) { - LOGGER.error("Could not connect to DB: {}", e.getMessage()); - } + dbManager.connect(); } /** * Initialize caching policy. + * * @param policy is a {@link CachingPolicy} */ public void initCachingPolicy(final CachingPolicy policy) { @@ -90,6 +86,7 @@ public class AppManager { /** * Find user account. + * * @param userId String * @return {@link UserAccount} */ @@ -108,6 +105,7 @@ public class AppManager { /** * Save user account. + * * @param userAccount {@link UserAccount} */ public void save(final UserAccount userAccount) { @@ -125,6 +123,7 @@ public class AppManager { /** * Returns String. + * * @return String */ public String printCacheContent() { @@ -133,6 +132,7 @@ public class AppManager { /** * Cache-Aside save user account helper. + * * @param userAccount {@link UserAccount} */ private void saveAside(final UserAccount userAccount) { @@ -142,17 +142,18 @@ public class AppManager { /** * Cache-Aside find user account helper. + * * @param userId String * @return {@link UserAccount} */ private UserAccount findAside(final String userId) { return Optional.ofNullable(cacheStore.get(userId)) - .or(() -> { - OptionalDBManager handles the communication with the underlying data store i.e. @@ -12,10 +11,16 @@ public interface DbManager { /** * Connect to DB. */ - void connect() throws DatabaseConnectionException; + void connect(); + + /** + * Disconnect from DB. + */ + void disconnect(); /** * Read from DB. + * * @param userId {@link String} * @return {@link UserAccount} */ @@ -23,6 +28,7 @@ public interface DbManager { /** * Write to DB. + * * @param userAccount {@link UserAccount} * @return {@link UserAccount} */ @@ -30,6 +36,7 @@ public interface DbManager { /** * Update record. + * * @param userAccount {@link UserAccount} * @return {@link UserAccount} */ @@ -37,6 +44,7 @@ public interface DbManager { /** * Update record or Insert if not exists. + * * @param userAccount {@link UserAccount} * @return {@link UserAccount} */ diff --git a/caching/src/main/java/com/iluwatar/caching/database/MongoDb.java b/caching/src/main/java/com/iluwatar/caching/database/MongoDb.java index 1993e01d8..a9dd006f8 100644 --- a/caching/src/main/java/com/iluwatar/caching/database/MongoDb.java +++ b/caching/src/main/java/com/iluwatar/caching/database/MongoDb.java @@ -7,10 +7,13 @@ import static com.iluwatar.caching.constants.CachingConstants.USER_NAME; import com.iluwatar.caching.UserAccount; import com.iluwatar.caching.constants.CachingConstants; -import com.iluwatar.caching.database.exceptions.DatabaseConnectionException; import com.mongodb.MongoClient; +import com.mongodb.MongoClientOptions; +import com.mongodb.MongoCredential; +import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.UpdateOptions; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.bson.Document; @@ -20,18 +23,28 @@ import org.bson.Document; */ @Slf4j public class MongoDb implements DbManager { - private static final String DATABASE_NAME = "test"; + private static final String DATABASE_NAME = "admin"; + private static final String MONGO_USER = "root"; + private static final String MONGO_PASSWORD = "rootpassword"; + private MongoClient client; + private MongoDatabase db; /** * Connect to Db. Check th connection */ @Override - public void connect() throws DatabaseConnectionException { - try (MongoClient mongoClient = new MongoClient()) { - mongoClient.getDatabase("test"); - } catch (NoClassDefFoundError e) { - throw new DatabaseConnectionException("Could not connect to DB."); - } + public void connect() { + MongoCredential mongoCredential = MongoCredential.createCredential(MONGO_USER, + DATABASE_NAME, + MONGO_PASSWORD.toCharArray()); + MongoClientOptions options = MongoClientOptions.builder().build(); + client = new MongoClient(new ServerAddress(), List.of(mongoCredential), options); + db = client.getDatabase(DATABASE_NAME); + } + + @Override + public void disconnect() { + client.close(); } /** @@ -42,22 +55,19 @@ public class MongoDb implements DbManager { */ @Override public UserAccount readFromDb(final String userId) { - try (MongoClient mongoClient = new MongoClient()) { - MongoDatabase db = mongoClient.getDatabase(DATABASE_NAME); - var iterable = db - .getCollection(CachingConstants.USER_ACCOUNT) - .find(new Document(USER_ID, userId)); - if (iterable.first() == null) { - return null; - } - Document doc = iterable.first(); - if (doc != null) { - String userName = doc.getString(USER_NAME); - String appInfo = doc.getString(ADD_INFO); - return new UserAccount(userId, userName, appInfo); - } else { - return null; - } + var iterable = db + .getCollection(CachingConstants.USER_ACCOUNT) + .find(new Document(USER_ID, userId)); + if (iterable.first() == null) { + return null; + } + Document doc = iterable.first(); + if (doc != null) { + String userName = doc.getString(USER_NAME); + String appInfo = doc.getString(ADD_INFO); + return new UserAccount(userId, userName, appInfo); + } else { + return null; } } @@ -69,15 +79,12 @@ public class MongoDb implements DbManager { */ @Override public UserAccount writeToDb(final UserAccount userAccount) { - try (MongoClient mongoClient = new MongoClient()) { - MongoDatabase db = mongoClient.getDatabase(DATABASE_NAME); - db.getCollection(USER_ACCOUNT).insertOne( - new Document(USER_ID, userAccount.getUserId()) - .append(USER_NAME, userAccount.getUserName()) - .append(ADD_INFO, userAccount.getAdditionalInfo()) - ); - return userAccount; - } + db.getCollection(USER_ACCOUNT).insertOne( + new Document(USER_ID, userAccount.getUserId()) + .append(USER_NAME, userAccount.getUserName()) + .append(ADD_INFO, userAccount.getAdditionalInfo()) + ); + return userAccount; } /** @@ -88,15 +95,12 @@ public class MongoDb implements DbManager { */ @Override public UserAccount updateDb(final UserAccount userAccount) { - try (MongoClient mongoClient = new MongoClient()) { - MongoDatabase db = mongoClient.getDatabase(DATABASE_NAME); - Document id = new Document(USER_ID, userAccount.getUserId()); - Document dataSet = new Document(USER_NAME, userAccount.getUserName()) - .append(ADD_INFO, userAccount.getAdditionalInfo()); - db.getCollection(CachingConstants.USER_ACCOUNT) - .updateOne(id, new Document("$set", dataSet)); - return userAccount; - } + Document id = new Document(USER_ID, userAccount.getUserId()); + Document dataSet = new Document(USER_NAME, userAccount.getUserName()) + .append(ADD_INFO, userAccount.getAdditionalInfo()); + db.getCollection(CachingConstants.USER_ACCOUNT) + .updateOne(id, new Document("$set", dataSet)); + return userAccount; } /** @@ -107,21 +111,18 @@ public class MongoDb implements DbManager { */ @Override public UserAccount upsertDb(final UserAccount userAccount) { - try (MongoClient mongoClient = new MongoClient()) { - MongoDatabase db = mongoClient.getDatabase(DATABASE_NAME); - String userId = userAccount.getUserId(); - String userName = userAccount.getUserName(); - String additionalInfo = userAccount.getAdditionalInfo(); - db.getCollection(CachingConstants.USER_ACCOUNT).updateOne( - new Document(USER_ID, userId), - new Document("$set", - new Document(USER_ID, userId) - .append(USER_NAME, userName) - .append(ADD_INFO, additionalInfo) - ), - new UpdateOptions().upsert(true) - ); - return userAccount; - } + String userId = userAccount.getUserId(); + String userName = userAccount.getUserName(); + String additionalInfo = userAccount.getAdditionalInfo(); + db.getCollection(CachingConstants.USER_ACCOUNT).updateOne( + new Document(USER_ID, userId), + new Document("$set", + new Document(USER_ID, userId) + .append(USER_NAME, userName) + .append(ADD_INFO, additionalInfo) + ), + new UpdateOptions().upsert(true) + ); + return userAccount; } } diff --git a/caching/src/main/java/com/iluwatar/caching/database/VirtualDb.java b/caching/src/main/java/com/iluwatar/caching/database/VirtualDb.java index 283dda47a..0c9a14ec9 100644 --- a/caching/src/main/java/com/iluwatar/caching/database/VirtualDb.java +++ b/caching/src/main/java/com/iluwatar/caching/database/VirtualDb.java @@ -23,6 +23,11 @@ public class VirtualDb implements DbManager { db = new HashMap<>(); } + @Override + public void disconnect() { + db = null; + } + /** * Read from Db. * diff --git a/caching/src/main/java/com/iluwatar/caching/database/exceptions/DatabaseConnectionException.java b/caching/src/main/java/com/iluwatar/caching/database/exceptions/DatabaseConnectionException.java deleted file mode 100644 index 971ee9e09..000000000 --- a/caching/src/main/java/com/iluwatar/caching/database/exceptions/DatabaseConnectionException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iluwatar.caching.database.exceptions; - -public class DatabaseConnectionException extends Exception { - public DatabaseConnectionException(String s) { - super(s); - } -}