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 { try {
setPlayerCollection(player, collectionType.getCode(), cardCollection); setPlayerCollection(player, collectionType.getCode(), cardCollection);
if (cardCollection.getAll().size() > 0) if (cardCollection.getAll().size() > 0)
addPackage(player, collectionType, cardCollection); addPackage(player, "New collection", collectionType, cardCollection);
} finally { } finally {
_readWriteLock.writeLock().unlock(); _readWriteLock.writeLock().unlock();
} }
@@ -189,7 +189,7 @@ public class CollectionsManager {
final CardCollection packContents = mutableCardCollection.openPack(packId, selection, packsStorage); final CardCollection packContents = mutableCardCollection.openPack(packId, selection, packsStorage);
if (packContents != null) { if (packContents != null) {
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection); setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
addPackage(player, collectionType, packContents); addPackage(player, "Opened pack", collectionType, packContents);
} }
return packContents; return packContents;
} finally { } finally {
@@ -210,7 +210,7 @@ public class CollectionsManager {
} }
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection); setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
addPackage(player, collectionType, addedCards); addPackage(player, "Items added to collection", collectionType, addedCards);
} }
} finally { } finally {
_readWriteLock.writeLock().unlock(); _readWriteLock.writeLock().unlock();
@@ -234,6 +234,12 @@ public class CollectionsManager {
mutableCardCollection.addItem(blueprintId2, count2); mutableCardCollection.addItem(blueprintId2, count2);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection); setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
DefaultCardCollection newCards = new DefaultCardCollection();
newCards.addItem(blueprintId2, count2);
addPackage(player, "Trading items", collectionType, newCards);
return true; return true;
} }
return false; return false;
@@ -253,6 +259,11 @@ public class CollectionsManager {
mutableCardCollection.addItem(blueprintId, 1); mutableCardCollection.addItem(blueprintId, 1);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection); setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
DefaultCardCollection newCards = new DefaultCardCollection();
newCards.addItem(blueprintId, 1);
addPackage(player, "Items bought", collectionType, newCards);
return true; return true;
} }
return false; return false;
@@ -272,6 +283,10 @@ public class CollectionsManager {
mutableCardCollection.addCurrency(currency); mutableCardCollection.addCurrency(currency);
setPlayerCollection(player, collectionType.getCode(), mutableCardCollection); setPlayerCollection(player, collectionType.getCode(), mutableCardCollection);
DefaultCardCollection newCurrency = new DefaultCardCollection();
newCurrency.addCurrency(currency);
addPackage(player, "Selling items", collectionType, newCurrency);
return true; return true;
} }
return false; return false;
@@ -280,22 +295,29 @@ public class CollectionsManager {
} }
} }
public void addCurrencyToPlayerCollection(String player, CollectionType collectionType, int currency) { public void addCurrencyToPlayerCollection(String player, String reason, CollectionType collectionType, int currency) {
addCurrencyToPlayerCollection(_playerDAO.getPlayer(player), collectionType, currency); addCurrencyToPlayerCollection(_playerDAO.getPlayer(player), reason, collectionType, currency);
} }
public void addCurrencyToPlayerCollection(Player player, CollectionType collectionType, int currency) { public void addCurrencyToPlayerCollection(Player player, String reason, CollectionType collectionType, int currency) {
_readWriteLock.writeLock().lock(); if (currency > 0) {
try { _readWriteLock.writeLock().lock();
final CardCollection playerCollection = getPlayerCollection(player, collectionType.getCode()); try {
if (playerCollection != null) { final CardCollection playerCollection = getPlayerCollection(player, collectionType.getCode());
MutableCardCollection mutableCardCollection = new DefaultCardCollection(playerCollection); if (playerCollection != null) {
mutableCardCollection.addCurrency(currency); 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) { private void addPackage(Player player, String reason, CollectionType collectionType, CardCollection cards) {
_deliveryService.addPackage(player, collectionType.getFullName(), 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; package com.gempukku.lotro.collection;
import com.gempukku.lotro.game.CardCollection; 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 com.gempukku.lotro.game.Player;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
public class DeliveryService { 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); 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(); _deliveryLock.writeLock().lock();
try { try {
Map<String, MutableCardCollection> playerDeliverables = _undeliveredDeliverables.get(player.getName()); _deliveryDAO.addPackage(player.getName(), reason, packageName, itemCollection);
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);
}
} finally { } finally {
_deliveryLock.writeLock().unlock(); _deliveryLock.writeLock().unlock();
} }
@@ -41,7 +28,7 @@ public class DeliveryService {
public boolean hasUndeliveredPackages(String player) { public boolean hasUndeliveredPackages(String player) {
_deliveryLock.readLock().lock(); _deliveryLock.readLock().lock();
try { try {
return _undeliveredDeliverables.containsKey(player); return _deliveryDAO.hasUndeliveredPackages(player);
} finally { } finally {
_deliveryLock.readLock().unlock(); _deliveryLock.readLock().unlock();
} }
@@ -50,7 +37,7 @@ public class DeliveryService {
public Map<String, ? extends CardCollection> consumePackages(Player player) { public Map<String, ? extends CardCollection> consumePackages(Player player) {
_deliveryLock.writeLock().lock(); _deliveryLock.writeLock().lock();
try { try {
return _undeliveredDeliverables.remove(player.getName()); return _deliveryDAO.consumeUndeliveredPackages(player.getName());
} finally { } finally {
_deliveryLock.writeLock().unlock(); _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) { public synchronized void leavePlayer(CollectionsManager collectionsManager, Player player) {
if (_players.contains(player.getName())) { if (_players.contains(player.getName())) {
if (_cost > 0) if (_cost > 0)
collectionsManager.addCurrencyToPlayerCollection(player, _currencyCollection, _cost); collectionsManager.addCurrencyToPlayerCollection(player, "Return for leaving queue", _currencyCollection, _cost);
_players.remove(player.getName()); _players.remove(player.getName());
_playerDecks.remove(player.getName()); _playerDecks.remove(player.getName());
} }
@@ -111,7 +111,7 @@ public class SingleEliminationRecurringQueue implements TournamentQueue {
public synchronized void leaveAllPlayers(CollectionsManager collectionsManager) { public synchronized void leaveAllPlayers(CollectionsManager collectionsManager) {
if (_cost > 0) { if (_cost > 0) {
for (String player : _players) for (String player : _players)
collectionsManager.addCurrencyToPlayerCollection(player, _currencyCollection, _cost); collectionsManager.addCurrencyToPlayerCollection(player, "Return for leaving queue", _currencyCollection, _cost);
} }
_players.clear(); _players.clear();
_playerDecks.clear(); _playerDecks.clear();

View File

@@ -36,11 +36,11 @@ public abstract class AbstractResource {
Integer lastReward = player.getLastLoginReward(); Integer lastReward = player.getLastLoginReward();
if (lastReward == null) { if (lastReward == null) {
_playerDao.setLastReward(player, latestMonday); _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 { } else {
if (latestMonday != lastReward) { if (latestMonday != lastReward) {
if (_playerDao.updateLastReward(player, lastReward, latestMonday)) 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; package com.gempukku.lotro.server.provider;
import com.gempukku.lotro.collection.CollectionSerializer; import com.gempukku.lotro.collection.CollectionSerializer;
import com.gempukku.lotro.collection.DeliveryDAO;
import com.gempukku.lotro.db.*; import com.gempukku.lotro.db.*;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.tournament.TournamentDAO; import com.gempukku.lotro.tournament.TournamentDAO;
@@ -28,5 +29,6 @@ public class DaoBuilder {
objectMap.put(DeckDAO.class, new DbDeckDAO(dbAccess, library)); objectMap.put(DeckDAO.class, new DbDeckDAO(dbAccess, library));
objectMap.put(CollectionDAO.class, new DbCollectionDAO(dbAccess, collectionSerializer)); objectMap.put(CollectionDAO.class, new DbCollectionDAO(dbAccess, collectionSerializer));
objectMap.put(PlayerDAO.class, new DbPlayerDAO(dbAccess)); 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.chat.ChatServer;
import com.gempukku.lotro.collection.CollectionsManager; import com.gempukku.lotro.collection.CollectionsManager;
import com.gempukku.lotro.collection.DeliveryDAO;
import com.gempukku.lotro.collection.DeliveryService; import com.gempukku.lotro.collection.DeliveryService;
import com.gempukku.lotro.db.*; import com.gempukku.lotro.db.*;
import com.gempukku.lotro.game.GameHistoryService; import com.gempukku.lotro.game.GameHistoryService;
@@ -33,7 +34,8 @@ public class ServerBuilder {
extract(objectMap, GameHistoryService.class))); extract(objectMap, GameHistoryService.class)));
objectMap.put(DeliveryService.class, objectMap.put(DeliveryService.class,
new DeliveryService()); new DeliveryService(
extract(objectMap, DeliveryDAO.class)));
objectMap.put(CollectionsManager.class, objectMap.put(CollectionsManager.class,
new CollectionsManager( new CollectionsManager(