Added delivery being stored in DB.

This commit is contained in:
marcins78
2012-11-23 18:06:37 +00:00
parent 669dc7cfcc
commit b810fde82f
8 changed files with 206 additions and 44 deletions

View File

@@ -151,7 +151,7 @@ public class CollectionsManager {
try {
setPlayerCollection(player, collectionType.getCode(), cardCollection);
if (cardCollection.getAll().size() > 0)
addPackage(player, collectionType, cardCollection);
addPackage(player, "New collection", collectionType, cardCollection);
} finally {
_readWriteLock.writeLock().unlock();
}
@@ -189,7 +189,7 @@ public class CollectionsManager {
final CardCollection packContents = mutableCardCollection.openPack(packId, selection, packsStorage);
if (packContents != null) {
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
addPackage(player, collectionType, packContents);
addPackage(player, "Opened pack", collectionType, packContents);
}
return packContents;
} finally {
@@ -210,7 +210,7 @@ public class CollectionsManager {
}
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
addPackage(player, collectionType, addedCards);
addPackage(player, "Items added to collection", collectionType, addedCards);
}
} finally {
_readWriteLock.writeLock().unlock();
@@ -234,6 +234,12 @@ public class CollectionsManager {
mutableCardCollection.addItem(blueprintId2, count2);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
DefaultCardCollection newCards = new DefaultCardCollection();
newCards.addItem(blueprintId2, count2);
addPackage(player, "Trading items", collectionType, newCards);
return true;
}
return false;
@@ -253,6 +259,11 @@ public class CollectionsManager {
mutableCardCollection.addItem(blueprintId, 1);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
DefaultCardCollection newCards = new DefaultCardCollection();
newCards.addItem(blueprintId, 1);
addPackage(player, "Items bought", collectionType, newCards);
return true;
}
return false;
@@ -272,6 +283,10 @@ public class CollectionsManager {
mutableCardCollection.addCurrency(currency);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
DefaultCardCollection newCurrency = new DefaultCardCollection();
newCurrency.addCurrency(currency);
addPackage(player, "Selling items", collectionType, newCurrency);
return true;
}
return false;
@@ -280,22 +295,29 @@ public class CollectionsManager {
}
}
public void addCurrencyToPlayerCollection(String player, CollectionType collectionType, int currency) {
addCurrencyToPlayerCollection(_playerDAO.getPlayer(player), collectionType, currency);
public void addCurrencyToPlayerCollection(String player, String reason, CollectionType collectionType, int currency) {
addCurrencyToPlayerCollection(_playerDAO.getPlayer(player), reason, collectionType, currency);
}
public void addCurrencyToPlayerCollection(Player player, CollectionType collectionType, int currency) {
_readWriteLock.writeLock().lock();
try {
final CardCollection playerCollection = getPlayerCollection(player, collectionType.getCode());
if (playerCollection != null) {
MutableCardCollection mutableCardCollection = new DefaultCardCollection(playerCollection);
mutableCardCollection.addCurrency(currency);
public void addCurrencyToPlayerCollection(Player player, String reason, CollectionType collectionType, int currency) {
if (currency > 0) {
_readWriteLock.writeLock().lock();
try {
final CardCollection playerCollection = getPlayerCollection(player, collectionType.getCode());
if (playerCollection != null) {
MutableCardCollection mutableCardCollection = new DefaultCardCollection(playerCollection);
mutableCardCollection.addCurrency(currency);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
DefaultCardCollection newCurrency = new DefaultCardCollection();
newCurrency.addCurrency(currency);
addPackage(player, reason, collectionType, newCurrency);
}
} finally {
_readWriteLock.writeLock().unlock();
}
} finally {
_readWriteLock.writeLock().unlock();
}
}
@@ -316,7 +338,7 @@ public class CollectionsManager {
}
}
private void addPackage(Player player, CollectionType collectionType, CardCollection cards) {
_deliveryService.addPackage(player, collectionType.getFullName(), cards);
private void addPackage(Player player, String reason, CollectionType collectionType, CardCollection cards) {
_deliveryService.addPackage(player, reason, collectionType.getFullName(), cards);
}
}

View File

@@ -0,0 +1,11 @@
package com.gempukku.lotro.collection;
import com.gempukku.lotro.game.CardCollection;
import java.util.Map;
public interface DeliveryDAO {
public boolean hasUndeliveredPackages(String player);
public void addPackage(String player, String reason, String name, CardCollection itemCollection);
public Map<String, ? extends CardCollection> consumeUndeliveredPackages(String player);
}

View File

@@ -1,38 +1,25 @@
package com.gempukku.lotro.collection;
import com.gempukku.lotro.game.CardCollection;
import com.gempukku.lotro.game.DefaultCardCollection;
import com.gempukku.lotro.game.MutableCardCollection;
import com.gempukku.lotro.game.Player;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class DeliveryService {
private Map<String, Map<String, MutableCardCollection>> _undeliveredDeliverables = new HashMap<String, Map<String, MutableCardCollection>>();
private DeliveryDAO _deliveryDAO;
private ReadWriteLock _deliveryLock = new ReentrantReadWriteLock(false);
public void addPackage(Player player, String packageName, CardCollection itemCollection) {
public DeliveryService(DeliveryDAO deliveryDAO) {
_deliveryDAO = deliveryDAO;
}
public void addPackage(Player player, String reason, String packageName, CardCollection itemCollection) {
_deliveryLock.writeLock().lock();
try {
Map<String, MutableCardCollection> playerDeliverables = _undeliveredDeliverables.get(player.getName());
if (playerDeliverables == null) {
playerDeliverables = new HashMap<String, MutableCardCollection>();
_undeliveredDeliverables.put(player.getName(), playerDeliverables);
}
MutableCardCollection deliverablesInCollection = playerDeliverables.get(packageName);
if (deliverablesInCollection == null) {
deliverablesInCollection = new DefaultCardCollection();
playerDeliverables.put(packageName, deliverablesInCollection);
}
for (Map.Entry<String, CardCollection.Item> itemToAdd : itemCollection.getAll().entrySet()) {
String blueprintId = itemToAdd.getKey();
int count = itemToAdd.getValue().getCount();
deliverablesInCollection.addItem(blueprintId, count);
}
_deliveryDAO.addPackage(player.getName(), reason, packageName, itemCollection);
} finally {
_deliveryLock.writeLock().unlock();
}
@@ -41,7 +28,7 @@ public class DeliveryService {
public boolean hasUndeliveredPackages(String player) {
_deliveryLock.readLock().lock();
try {
return _undeliveredDeliverables.containsKey(player);
return _deliveryDAO.hasUndeliveredPackages(player);
} finally {
_deliveryLock.readLock().unlock();
}
@@ -50,7 +37,7 @@ public class DeliveryService {
public Map<String, ? extends CardCollection> consumePackages(Player player) {
_deliveryLock.writeLock().lock();
try {
return _undeliveredDeliverables.remove(player.getName());
return _deliveryDAO.consumeUndeliveredPackages(player.getName());
} finally {
_deliveryLock.writeLock().unlock();
}

View File

@@ -0,0 +1,138 @@
package com.gempukku.lotro.db;
import com.gempukku.lotro.collection.CollectionSerializer;
import com.gempukku.lotro.collection.DeliveryDAO;
import com.gempukku.lotro.game.CardCollection;
import com.gempukku.lotro.game.DefaultCardCollection;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
public class DbDeliveryDAO implements DeliveryDAO {
private DbAccess _dbAccess;
private CollectionSerializer _collectionSerializer;
public DbDeliveryDAO(DbAccess dbAccess, CollectionSerializer collectionSerializer) {
_dbAccess = dbAccess;
_collectionSerializer = collectionSerializer;
}
@Override
public void addPackage(String player, String reason, String name, CardCollection itemCollection) {
try {
Connection connection = _dbAccess.getDataSource().getConnection();
try {
String sql = "insert into delivery (player, reason, name, date, collection, delivered) values (?, ?, ?, ?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
try {
statement.setString(1, player);
statement.setString(2, reason);
statement.setString(3, name);
statement.setLong(4, System.currentTimeMillis());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
_collectionSerializer.serializeCollection(itemCollection, baos);
statement.setBlob(5, new ByteArrayInputStream(baos.toByteArray()));
statement.setInt(6, 0);
statement.execute();
} finally {
statement.close();
}
} finally {
connection.close();
}
} catch (SQLException exp) {
throw new RuntimeException("Unable to insert new delivery", exp);
} catch (IOException exp) {
throw new RuntimeException("Unable to insert new delivery", exp);
}
}
@Override
public boolean hasUndeliveredPackages(String player) {
try {
Connection connection = _dbAccess.getDataSource().getConnection();
try {
String sql = "select count(*) from delivery where player=? and delivered=0";
PreparedStatement statement = connection.prepareStatement(sql);
try {
statement.setString(1, player);
ResultSet resultSet = statement.executeQuery();
try {
if (resultSet.next())
return resultSet.getInt(1) > 0;
else
return false;
} finally {
resultSet.close();
}
} finally {
statement.close();
}
} finally {
connection.close();
}
} catch (SQLException exp) {
throw new RuntimeException("Unable to check if there are any undelivered packages", exp);
}
}
@Override
public Map<String, ? extends CardCollection> consumeUndeliveredPackages(String player) {
try {
Connection connection = _dbAccess.getDataSource().getConnection();
try {
String sql = "select name, collection from delivery where player=? and delivered=0";
PreparedStatement statement = connection.prepareStatement(sql);
try {
statement.setString(1, player);
ResultSet resultSet = statement.executeQuery();
try {
Map<String, DefaultCardCollection> result = new HashMap<String, DefaultCardCollection>();
while (resultSet.next()) {
String name = resultSet.getString(1);
DefaultCardCollection cardCollection = result.get(name);
if (cardCollection == null)
cardCollection = new DefaultCardCollection();
Blob blob = resultSet.getBlob(2);
try {
InputStream inputStream = blob.getBinaryStream();
try {
CardCollection retrieved = _collectionSerializer.deserializeCollection(inputStream);
cardCollection.addCurrency(retrieved.getCurrency());
for (CardCollection.Item item : retrieved.getAll().values())
cardCollection.addItem(item.getBlueprintId(), item.getCount());
} finally {
inputStream.close();
}
} finally {
blob.free();
}
result.put(name, cardCollection);
}
return result;
} finally {
resultSet.close();
}
} finally {
statement.close();
}
} finally {
connection.close();
}
} catch (SQLException exp) {
throw new RuntimeException("Unable to consume undelivered packages", exp);
} catch (IOException exp) {
throw new RuntimeException("Unable to consume undelivered packages", exp);
}
}
}

View File

@@ -101,7 +101,7 @@ public class SingleEliminationRecurringQueue implements TournamentQueue {
public synchronized void leavePlayer(CollectionsManager collectionsManager, Player player) {
if (_players.contains(player.getName())) {
if (_cost > 0)
collectionsManager.addCurrencyToPlayerCollection(player, _currencyCollection, _cost);
collectionsManager.addCurrencyToPlayerCollection(player, "Return for leaving queue", _currencyCollection, _cost);
_players.remove(player.getName());
_playerDecks.remove(player.getName());
}
@@ -111,7 +111,7 @@ public class SingleEliminationRecurringQueue implements TournamentQueue {
public synchronized void leaveAllPlayers(CollectionsManager collectionsManager) {
if (_cost > 0) {
for (String player : _players)
collectionsManager.addCurrencyToPlayerCollection(player, _currencyCollection, _cost);
collectionsManager.addCurrencyToPlayerCollection(player, "Return for leaving queue", _currencyCollection, _cost);
}
_players.clear();
_playerDecks.clear();

View File

@@ -36,11 +36,11 @@ public abstract class AbstractResource {
Integer lastReward = player.getLastLoginReward();
if (lastReward == null) {
_playerDao.setLastReward(player, latestMonday);
_collectionManager.addCurrencyToPlayerCollection(player, new CollectionType("permanent", "My cards"), 20000);
_collectionManager.addCurrencyToPlayerCollection(player, "Initial currency balance", new CollectionType("permanent", "My cards"), 20000);
} else {
if (latestMonday != lastReward) {
if (_playerDao.updateLastReward(player, lastReward, latestMonday))
_collectionManager.addCurrencyToPlayerCollection(player, new CollectionType("permanent", "My cards"), 5000);
_collectionManager.addCurrencyToPlayerCollection(player, "Weekly currency reward", new CollectionType("permanent", "My cards"), 5000);
}
}
}

View File

@@ -1,6 +1,7 @@
package com.gempukku.lotro.server.provider;
import com.gempukku.lotro.collection.CollectionSerializer;
import com.gempukku.lotro.collection.DeliveryDAO;
import com.gempukku.lotro.db.*;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.tournament.TournamentDAO;
@@ -28,5 +29,6 @@ public class DaoBuilder {
objectMap.put(DeckDAO.class, new DbDeckDAO(dbAccess, library));
objectMap.put(CollectionDAO.class, new DbCollectionDAO(dbAccess, collectionSerializer));
objectMap.put(PlayerDAO.class, new DbPlayerDAO(dbAccess));
objectMap.put(DeliveryDAO.class, new DbDeliveryDAO(dbAccess, collectionSerializer));
}
}

View File

@@ -2,6 +2,7 @@ package com.gempukku.lotro.server.provider;
import com.gempukku.lotro.chat.ChatServer;
import com.gempukku.lotro.collection.CollectionsManager;
import com.gempukku.lotro.collection.DeliveryDAO;
import com.gempukku.lotro.collection.DeliveryService;
import com.gempukku.lotro.db.*;
import com.gempukku.lotro.game.GameHistoryService;
@@ -33,7 +34,8 @@ public class ServerBuilder {
extract(objectMap, GameHistoryService.class)));
objectMap.put(DeliveryService.class,
new DeliveryService());
new DeliveryService(
extract(objectMap, DeliveryDAO.class)));
objectMap.put(CollectionsManager.class,
new CollectionsManager(