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 @@ test - org.mongodb - mongodb-driver - 3.12.1 + org.mockito + mockito-junit-jupiter + 3.12.4 + test + + + org.mockito + mockito-all + 1.10.19 + test org.mongodb - mongodb-driver-core - 3.0.4 - - - org.mongodb - bson - 3.0.4 + mongo-java-driver + 3.4.1 AppManager --> CacheStore/LRUCache/CachingPolicy --> - * DBManager} + * DBManager} *

* *

- * 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(() -> { - Optional userAccount = - Optional.ofNullable(dbManager.readFromDb(userId)); - userAccount.ifPresent(account -> cacheStore.set(userId, account)); - return userAccount; - }) - .orElse(null); + .or(() -> { + Optional userAccount = + Optional.ofNullable(dbManager.readFromDb(userId)); + userAccount.ifPresent(account -> cacheStore.set(userId, account)); + return userAccount; + }) + .orElse(null); } } diff --git a/caching/src/main/java/com/iluwatar/caching/CacheStore.java b/caching/src/main/java/com/iluwatar/caching/CacheStore.java index d9d2e900b..589e9eca0 100644 --- a/caching/src/main/java/com/iluwatar/caching/CacheStore.java +++ b/caching/src/main/java/com/iluwatar/caching/CacheStore.java @@ -166,6 +166,7 @@ public class CacheStore { .map(LruCache::getCacheDataInListForm) .orElse(List.of()) .forEach(dbManager::updateDb); + dbManager.disconnect(); } /** diff --git a/caching/src/main/java/com/iluwatar/caching/UserAccount.java b/caching/src/main/java/com/iluwatar/caching/UserAccount.java index 800f14c9e..1ec3af228 100644 --- a/caching/src/main/java/com/iluwatar/caching/UserAccount.java +++ b/caching/src/main/java/com/iluwatar/caching/UserAccount.java @@ -24,17 +24,17 @@ package com.iluwatar.caching; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.ToString; /** * Entity class (stored in cache and DB) used in the application. */ -@Setter -@Getter +@Data @AllArgsConstructor @ToString +@EqualsAndHashCode public class UserAccount { /** * User Id. diff --git a/caching/src/main/java/com/iluwatar/caching/database/DbManager.java b/caching/src/main/java/com/iluwatar/caching/database/DbManager.java index df6219e63..14d7247f8 100644 --- a/caching/src/main/java/com/iluwatar/caching/database/DbManager.java +++ b/caching/src/main/java/com/iluwatar/caching/database/DbManager.java @@ -1,7 +1,6 @@ package com.iluwatar.caching.database; import com.iluwatar.caching.UserAccount; -import com.iluwatar.caching.database.exceptions.DatabaseConnectionException; /** *

DBManager 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); - } -}