Added docker-compose for mongo db. MongoDb db work fixed.

This commit is contained in:
Victor Zalevskii 2021-09-02 15:24:08 +03:00
parent c0e4bf3d1d
commit 6adb27ca3d
10 changed files with 123 additions and 99 deletions

View File

@ -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

View File

@ -39,19 +39,21 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.12.1</version>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>3.12.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-core</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>3.0.4</version>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
<!--

View File

@ -40,12 +40,12 @@ import lombok.extern.slf4j.Slf4j;
* the preferred caching policy/strategy).
* <p>
* <i>{@literal App --> AppManager --> CacheStore/LRUCache/CachingPolicy -->
* DBManager} </i>
* DBManager} </i>
* </p>
*
* <p>
* 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
* </p>
*
* @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
*/

View File

@ -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> userAccount =
Optional.ofNullable(dbManager.readFromDb(userId));
userAccount.ifPresent(account -> cacheStore.set(userId, account));
return userAccount;
})
.orElse(null);
.or(() -> {
Optional<UserAccount> userAccount =
Optional.ofNullable(dbManager.readFromDb(userId));
userAccount.ifPresent(account -> cacheStore.set(userId, account));
return userAccount;
})
.orElse(null);
}
}

View File

@ -166,6 +166,7 @@ public class CacheStore {
.map(LruCache::getCacheDataInListForm)
.orElse(List.of())
.forEach(dbManager::updateDb);
dbManager.disconnect();
}
/**

View File

@ -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.

View File

@ -1,7 +1,6 @@
package com.iluwatar.caching.database;
import com.iluwatar.caching.UserAccount;
import com.iluwatar.caching.database.exceptions.DatabaseConnectionException;
/**
* <p>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}
*/

View File

@ -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;
}
}

View File

@ -23,6 +23,11 @@ public class VirtualDb implements DbManager {
db = new HashMap<>();
}
@Override
public void disconnect() {
db = null;
}
/**
* Read from Db.
*

View File

@ -1,7 +0,0 @@
package com.iluwatar.caching.database.exceptions;
public class DatabaseConnectionException extends Exception {
public DatabaseConnectionException(String s) {
super(s);
}
}