package de.rwth.idsg.bikeman.ixsi.service;
import de.rwth.idsg.bikeman.ixsi.IXSIConstants;
import de.rwth.idsg.bikeman.ixsi.endpoint.Producer;
import de.rwth.idsg.bikeman.ixsi.store.PlaceAvailabilityStore;
import de.rwth.idsg.bikeman.ixsi.repository.QueryIXSIRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import xjc.schema.ixsi.IxsiMessageType;
import xjc.schema.ixsi.PlaceAvailabilityPushMessageType;
import xjc.schema.ixsi.PlaceAvailabilityType;
import xjc.schema.ixsi.ProviderPlaceIDType;
import xjc.schema.ixsi.SubscriptionMessageType;
import java.util.Arrays;
import java.util.Set;
/**
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
* @since 10.11.2014
*/
@Slf4j
@Service
public class PlaceAvailabilityPushService {
@Autowired private Producer producer;
@Autowired private PlaceAvailabilityStore placeAvailabilityStore;
@Autowired private QueryIXSIRepository queryIXSIRepository;
public void reportChange(String placeID) {
Set<String> systemIdSet = placeAvailabilityStore.getSubscribedSystems(placeID);
if (systemIdSet.isEmpty()) {
log.debug("Will not push. There is no subscribed system for placeID '{}'", placeID);
return;
}
Integer freeSlots = queryIXSIRepository.placeAvailability(Arrays.asList(placeID))
.get(0)
.getAvailableSlots();
ProviderPlaceIDType placeIDType = new ProviderPlaceIDType()
.withPlaceID(placeID)
.withProviderID(IXSIConstants.Provider.id);
PlaceAvailabilityType avail = new PlaceAvailabilityType()
.withAvailability(freeSlots)
.withID(placeIDType);
PlaceAvailabilityPushMessageType push = new PlaceAvailabilityPushMessageType().withPlaceAvailability(avail);
SubscriptionMessageType sub = new SubscriptionMessageType().withPushMessageGroup(push);
IxsiMessageType ixsi = new IxsiMessageType().withSubscriptionMessage(sub);
producer.send(ixsi, systemIdSet);
}
}