Hexagonal pattern: Added Mongo based banking adapter and bound it in Guice production module
This commit is contained in:
		@@ -0,0 +1,134 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014 Ilkka Seppälä
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
package com.iluwatar.hexagonal.banking;
 | 
			
		||||
 | 
			
		||||
import com.mongodb.MongoClient;
 | 
			
		||||
import com.mongodb.client.MongoCollection;
 | 
			
		||||
import com.mongodb.client.MongoDatabase;
 | 
			
		||||
import com.mongodb.client.model.UpdateOptions;
 | 
			
		||||
import org.bson.Document;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Mongo based banking adapter
 | 
			
		||||
 */
 | 
			
		||||
public class MongoBank implements WireTransfers {
 | 
			
		||||
 | 
			
		||||
  private static final String DEFAULT_HOST = "localhost";
 | 
			
		||||
  private static final int DEFAULT_PORT = 27017;
 | 
			
		||||
  private static final String DEFAULT_DB = "lotteryDB";
 | 
			
		||||
  private static final String DEFAULT_ACCOUNTS_COLLECTION = "accounts";
 | 
			
		||||
 | 
			
		||||
  private MongoClient mongoClient;
 | 
			
		||||
  private MongoDatabase database;
 | 
			
		||||
  private MongoCollection<Document> accountsCollection;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Constructor
 | 
			
		||||
   */
 | 
			
		||||
  public MongoBank() {
 | 
			
		||||
    connect();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Constructor accepting parameters
 | 
			
		||||
   */
 | 
			
		||||
  public MongoBank(String host, int port, String dbName, String accountsCollectionName) {
 | 
			
		||||
    connect(host, port, dbName, accountsCollectionName);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Connect to database with default parameters
 | 
			
		||||
   */
 | 
			
		||||
  public void connect() {
 | 
			
		||||
    connect(DEFAULT_HOST, DEFAULT_PORT, DEFAULT_DB, DEFAULT_ACCOUNTS_COLLECTION);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Connect to database with given parameters
 | 
			
		||||
   */
 | 
			
		||||
  public void connect(String host, int port, String dbName, String accountsCollectionName) {
 | 
			
		||||
    if (mongoClient != null) {
 | 
			
		||||
      mongoClient.close();
 | 
			
		||||
    }
 | 
			
		||||
    mongoClient = new MongoClient(host , port);
 | 
			
		||||
    database = mongoClient.getDatabase(dbName);
 | 
			
		||||
    accountsCollection = database.getCollection(accountsCollectionName);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return mongo client
 | 
			
		||||
   */
 | 
			
		||||
  public MongoClient getMongoClient() {
 | 
			
		||||
    return mongoClient;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   *
 | 
			
		||||
   * @return mongo database
 | 
			
		||||
   */
 | 
			
		||||
  public MongoDatabase getMongoDatabase() {
 | 
			
		||||
    return database;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   *
 | 
			
		||||
   * @return accounts collection
 | 
			
		||||
   */
 | 
			
		||||
  public MongoCollection<Document> getAccountsCollection() {
 | 
			
		||||
    return accountsCollection;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void setFunds(String bankAccount, int amount) {
 | 
			
		||||
    Document search = new Document("_id", bankAccount);
 | 
			
		||||
    Document update = new Document("_id", bankAccount).append("funds", amount);
 | 
			
		||||
    accountsCollection.updateOne(search, new Document("$set", update), new UpdateOptions().upsert(true));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public int getFunds(String bankAccount) {
 | 
			
		||||
    Document search = new Document("_id", bankAccount);
 | 
			
		||||
    ArrayList<Document> results = accountsCollection.find(search).limit(1).into(new ArrayList<Document>());
 | 
			
		||||
    if (results.size() > 0) {
 | 
			
		||||
      return results.get(0).getInteger("funds");
 | 
			
		||||
    } else {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public boolean transferFunds(int amount, String sourceBackAccount, String destinationBankAccount) {
 | 
			
		||||
    int sourceFunds = getFunds(sourceBackAccount);
 | 
			
		||||
    if (sourceFunds < amount) {
 | 
			
		||||
      return false;
 | 
			
		||||
    } else {
 | 
			
		||||
      int destFunds = getFunds(destinationBankAccount);
 | 
			
		||||
      setFunds(sourceBackAccount, sourceFunds - amount);
 | 
			
		||||
      setFunds(destinationBankAccount, destFunds + amount);
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
package com.iluwatar.hexagonal.module;
 | 
			
		||||
 | 
			
		||||
import com.google.inject.AbstractModule;
 | 
			
		||||
import com.iluwatar.hexagonal.banking.InMemoryBank;
 | 
			
		||||
import com.iluwatar.hexagonal.banking.MongoBank;
 | 
			
		||||
import com.iluwatar.hexagonal.banking.WireTransfers;
 | 
			
		||||
import com.iluwatar.hexagonal.database.LotteryTicketRepository;
 | 
			
		||||
import com.iluwatar.hexagonal.database.MongoTicketRepository;
 | 
			
		||||
@@ -38,6 +38,6 @@ public class LotteryModule extends AbstractModule {
 | 
			
		||||
  protected void configure() {
 | 
			
		||||
    bind(LotteryTicketRepository.class).to(MongoTicketRepository.class);
 | 
			
		||||
    bind(LotteryNotifications.class).to(StdOutNotifications.class);
 | 
			
		||||
    bind(WireTransfers.class).to(InMemoryBank.class);
 | 
			
		||||
    bind(WireTransfers.class).to(MongoBank.class);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ import org.junit.Test;
 | 
			
		||||
 * Tests for banking
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class WireTransfersTest {
 | 
			
		||||
public class InMemoryBankTest {
 | 
			
		||||
 | 
			
		||||
  private final WireTransfers bank = new InMemoryBank();
 | 
			
		||||
  
 | 
			
		||||
@@ -0,0 +1,68 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014 Ilkka Seppälä
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
package com.iluwatar.hexagonal.banking;
 | 
			
		||||
 | 
			
		||||
import com.mongodb.MongoClient;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Ignore;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for Mongo banking adapter
 | 
			
		||||
 */
 | 
			
		||||
@Ignore
 | 
			
		||||
public class MongoBankTest {
 | 
			
		||||
 | 
			
		||||
  private static final String TEST_HOST = "localhost";
 | 
			
		||||
  private static final int TEST_PORT = 27017;
 | 
			
		||||
  private static final String TEST_DB = "lotteryDBTest";
 | 
			
		||||
  private static final String TEST_ACCOUNTS_COLLECTION = "testAccounts";
 | 
			
		||||
 | 
			
		||||
  private MongoBank mongoBank;
 | 
			
		||||
 | 
			
		||||
  @Before
 | 
			
		||||
  public void init() {
 | 
			
		||||
    MongoClient mongoClient = new MongoClient(TEST_HOST, TEST_PORT);
 | 
			
		||||
    mongoClient.dropDatabase(TEST_DB);
 | 
			
		||||
    mongoClient.close();
 | 
			
		||||
    mongoBank = new MongoBank(TEST_HOST, TEST_PORT, TEST_DB, TEST_ACCOUNTS_COLLECTION);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testSetup() {
 | 
			
		||||
    assertEquals(0, mongoBank.getAccountsCollection().count());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testFundTransfers() {
 | 
			
		||||
    assertEquals(0, mongoBank.getFunds("000-000"));
 | 
			
		||||
    mongoBank.setFunds("000-000", 10);
 | 
			
		||||
    assertEquals(10, mongoBank.getFunds("000-000"));
 | 
			
		||||
    assertEquals(0, mongoBank.getFunds("111-111"));
 | 
			
		||||
    mongoBank.transferFunds(9, "000-000", "111-111");
 | 
			
		||||
    assertEquals(1, mongoBank.getFunds("000-000"));
 | 
			
		||||
    assertEquals(9, mongoBank.getFunds("111-111"));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -44,9 +44,9 @@ public class MongoTicketRepositoryTest {
 | 
			
		||||
 | 
			
		||||
  private static final String TEST_HOST = "localhost";
 | 
			
		||||
  private static final int TEST_PORT = 27017;
 | 
			
		||||
  private static final String TEST_DB = "lotteryDB";
 | 
			
		||||
  private static final String TEST_TICKETS_COLLECTION = "lotteryTickets";
 | 
			
		||||
  private static final String TEST_COUNTERS_COLLECTION = "counters";
 | 
			
		||||
  private static final String TEST_DB = "lotteryTestDB";
 | 
			
		||||
  private static final String TEST_TICKETS_COLLECTION = "lotteryTestTickets";
 | 
			
		||||
  private static final String TEST_COUNTERS_COLLECTION = "testCounters";
 | 
			
		||||
 | 
			
		||||
  private MongoTicketRepository repository;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user