diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionsManager.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionsManager.java index c91caf0c9..9afefed11 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionsManager.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionsManager.java @@ -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); } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryDAO.java new file mode 100644 index 000000000..0d83d6fb2 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryDAO.java @@ -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 consumeUndeliveredPackages(String player); +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryService.java index 9fc7f2eef..c459ddb3c 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryService.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryService.java @@ -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> _undeliveredDeliverables = new HashMap>(); + 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 playerDeliverables = _undeliveredDeliverables.get(player.getName()); - if (playerDeliverables == null) { - playerDeliverables = new HashMap(); - _undeliveredDeliverables.put(player.getName(), playerDeliverables); - } - MutableCardCollection deliverablesInCollection = playerDeliverables.get(packageName); - if (deliverablesInCollection == null) { - deliverablesInCollection = new DefaultCardCollection(); - playerDeliverables.put(packageName, deliverablesInCollection); - } - for (Map.Entry 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 consumePackages(Player player) { _deliveryLock.writeLock().lock(); try { - return _undeliveredDeliverables.remove(player.getName()); + return _deliveryDAO.consumeUndeliveredPackages(player.getName()); } finally { _deliveryLock.writeLock().unlock(); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbDeliveryDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbDeliveryDAO.java new file mode 100644 index 000000000..07ba0ae36 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbDeliveryDAO.java @@ -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 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 result = new HashMap(); + 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); + } + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueue.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueue.java index 02960e866..f94906cf2 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueue.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationRecurringQueue.java @@ -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(); diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java index 473bf8b29..c39ba8ea5 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java @@ -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); } } } diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/DaoBuilder.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/DaoBuilder.java index 9f0a9c475..c813cd521 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/DaoBuilder.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/DaoBuilder.java @@ -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)); } } diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerBuilder.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerBuilder.java index 857e1e818..be99bb0e8 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerBuilder.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/provider/ServerBuilder.java @@ -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(