From c95f5eb2eab3fcbe5d43d91fb84e274f44a11cb6 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Fri, 16 Dec 2011 20:44:32 +0000 Subject: [PATCH] Adding delivery service. --- .../lotro/collection/DeliveryService.java | 54 +++++++++++++++++++ .../gempukku/lotro/server/AdminResource.java | 16 ++++-- .../lotro/server/CollectionResource.java | 5 ++ .../lotro/server/DeliveryServiceProvider.java | 39 ++++++++++++++ 4 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryService.java create mode 100644 gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DeliveryServiceProvider.java 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 new file mode 100644 index 000000000..cbae29f1d --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/DeliveryService.java @@ -0,0 +1,54 @@ +package com.gempukku.lotro.collection; + +import com.gempukku.lotro.game.CardCollection; +import com.gempukku.lotro.game.Player; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +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 ReadWriteLock _deliveryLock = new ReentrantReadWriteLock(false); + + public void addPackage(Player player, String collectionType, List items) { + _deliveryLock.writeLock().lock(); + try { + Map> playerDeliverables = _undeliveredDeliverables.get(player.getName()); + if (playerDeliverables == null) { + playerDeliverables = new HashMap>(); + _undeliveredDeliverables.put(player.getName(), playerDeliverables); + } + List deliverablesInCollection = playerDeliverables.get(collectionType); + if (deliverablesInCollection == null) { + deliverablesInCollection = new LinkedList(); + playerDeliverables.put(collectionType, deliverablesInCollection); + } + deliverablesInCollection.addAll(items); + } finally { + _deliveryLock.writeLock().unlock(); + } + } + + public boolean hasUndeliveredPackages(Player player) { + _deliveryLock.readLock().lock(); + try { + return _undeliveredDeliverables.containsKey(player.getName()); + } finally { + _deliveryLock.readLock().unlock(); + } + } + + public Map> consumePackages(Player player) { + _deliveryLock.writeLock().lock(); + try { + return _undeliveredDeliverables.remove(player.getName()); + } finally { + _deliveryLock.writeLock().unlock(); + } + } +} diff --git a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/AdminResource.java b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/AdminResource.java index 2b758c218..ed6045a92 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/AdminResource.java +++ b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/AdminResource.java @@ -1,14 +1,12 @@ package com.gempukku.lotro.server; +import com.gempukku.lotro.collection.DeliveryService; import com.gempukku.lotro.db.CollectionDAO; import com.gempukku.lotro.db.DeckDAO; import com.gempukku.lotro.db.LeagueDAO; import com.gempukku.lotro.db.LeagueSerieDAO; import com.gempukku.lotro.db.vo.League; -import com.gempukku.lotro.game.DefaultCardCollection; -import com.gempukku.lotro.game.LotroCardBlueprintLibrary; -import com.gempukku.lotro.game.MutableCardCollection; -import com.gempukku.lotro.game.Player; +import com.gempukku.lotro.game.*; import com.gempukku.lotro.hall.HallServer; import com.sun.jersey.spi.resource.Singleton; @@ -26,6 +24,8 @@ public class AdminResource extends AbstractResource { @Context private CollectionDAO _collectionDao; @Context + private DeliveryService _deliveryService; + @Context private DeckDAO _deckDao; @Context private LeagueDAO _leagueDao; @@ -113,9 +113,14 @@ public class AdminResource extends AbstractResource { throw new WebApplicationException(Response.Status.NOT_FOUND); MutableCardCollection baseCollection = league.getBaseCollection(); + + List items = new LinkedList(); + List packs = getPacks(packProduct); - for (String pack : packs) + for (String pack : packs) { baseCollection.addPacks(pack, 1); + items.add(new CardCollection.Item(CardCollection.Item.Type.PACK, 1, pack)); + } _leagueDao.setBaseCollectionForLeague(league, baseCollection); Map playerCollections = _collectionDao.getPlayerCollectionsByType(leagueType); @@ -126,6 +131,7 @@ public class AdminResource extends AbstractResource { collection.addPacks(pack, 1); Player player = _playerDao.getPlayer(playerId); _collectionDao.setCollectionForPlayer(player, leagueType, collection); + _deliveryService.addPackage(player, leagueType, items); } return "OK"; diff --git a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/CollectionResource.java b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/CollectionResource.java index 44d44f4cb..045960e47 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/CollectionResource.java +++ b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/CollectionResource.java @@ -1,5 +1,6 @@ package com.gempukku.lotro.server; +import com.gempukku.lotro.collection.DeliveryService; import com.gempukku.lotro.common.Side; import com.gempukku.lotro.db.CollectionDAO; import com.gempukku.lotro.db.vo.League; @@ -31,6 +32,8 @@ public class CollectionResource extends AbstractResource { @Context private CollectionDAO _collectionDao; @Context + private DeliveryService _deliveryService; + @Context private LotroCardBlueprintLibrary _library; @Context private LeagueService _leagueService; @@ -145,6 +148,8 @@ public class CollectionResource extends AbstractResource { MutableCardCollection modifiableColleciton = (MutableCardCollection) collection; List packContents = modifiableColleciton.openPack(packId, _packStorage); + _deliveryService.addPackage(resourceOwner, collectionType, packContents); + if (packContents == null) sendError(Response.Status.NOT_FOUND); diff --git a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DeliveryServiceProvider.java b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DeliveryServiceProvider.java new file mode 100644 index 000000000..13fa102bf --- /dev/null +++ b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DeliveryServiceProvider.java @@ -0,0 +1,39 @@ +package com.gempukku.lotro.server; + +import com.gempukku.lotro.collection.DeliveryService; +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.core.spi.component.ComponentScope; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.InjectableProvider; + +import javax.ws.rs.core.Context; +import javax.ws.rs.ext.Provider; +import java.lang.reflect.Type; + +@Provider +public class DeliveryServiceProvider implements Injectable, InjectableProvider { + private DeliveryService _deliveryService; + + @Override + public Injectable getInjectable(ComponentContext ic, Context context, Type type) { + if (type.equals(DeliveryService.class)) + return this; + return null; + } + + @Override + public ComponentScope getScope() { + return ComponentScope.Singleton; + } + + private DeliveryService createDeliveryService() { + return new DeliveryService(); + } + + @Override + public synchronized DeliveryService getValue() { + if (_deliveryService == null) + _deliveryService = createDeliveryService(); + return _deliveryService; + } +}