package de.rwth.idsg.bikeman.ixsi.service; import de.rwth.idsg.bikeman.domain.Booking; import de.rwth.idsg.bikeman.domain.Transaction; import de.rwth.idsg.bikeman.ixsi.IXSIConstants; import de.rwth.idsg.bikeman.ixsi.endpoint.Producer; import de.rwth.idsg.bikeman.ixsi.store.ConsumptionStore; import lombok.extern.slf4j.Slf4j; import org.joda.time.DateTime; import org.joda.time.LocalDateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import xjc.schema.ixsi.ConsumptionPushMessageType; import xjc.schema.ixsi.ConsumptionType; import xjc.schema.ixsi.IxsiMessageType; import xjc.schema.ixsi.SubscriptionMessageType; import xjc.schema.ixsi.TextType; import xjc.schema.ixsi.TimePeriodType; import java.util.Set; /** * @author Sevket Goekay <goekay@dbis.rwth-aachen.de> * @since 18.11.2014 */ @Slf4j @Service public class ConsumptionPushService { @Autowired private Producer producer; @Autowired private ConsumptionStore consumptionStore; private static final TextType USED = new TextType().withLanguage(IXSIConstants.DEFAULT_LANGUAGE) .withText("Pedelec Ausleih von Velocity"); private static final TextType NOT_USED = new TextType().withLanguage(IXSIConstants.DEFAULT_LANGUAGE) .withText("Das gebuchte Pedelec wurde nicht benutzt"); // ------------------------------------------------------------------------- // USED // ------------------------------------------------------------------------- public void report(Booking booking) { Set<String> systemIdSet = consumptionStore.getSubscribedSystems(booking.getIxsiBookingId()); if (systemIdSet.isEmpty()) { log.debug("Will not push. There is no subscribed system for bookingId '{}'", booking.getBookingId()); return; } proceed(createConsumption(booking), systemIdSet); } public ConsumptionType createConsumption(Booking booking) { Transaction t = booking.getTransaction(); LocalDateTime start = t.getStartDateTime(); LocalDateTime end = t.getEndDateTime(); TimePeriodType timePeriod = new TimePeriodType() .withBegin(start.toDateTime()) .withEnd(end.toDateTime()); return new ConsumptionType() .withBookingID(booking.getIxsiBookingId()) .withType(IXSIConstants.consumptionClass) .withDescription(USED) .withFinal(true) .withTimePeriod(timePeriod); } // ------------------------------------------------------------------------- // NOT USED // ------------------------------------------------------------------------- public void reportNotUsed(String ixsiBookingId, DateTime reservationEnd) { Set<String> systemIdSet = consumptionStore.getSubscribedSystems(ixsiBookingId); if (systemIdSet.isEmpty()) { log.debug("Will not push. There is no subscribed system for ixsiBookingId '{}'", ixsiBookingId); return; } proceed(createEmptyConsumption(ixsiBookingId, reservationEnd), systemIdSet); } public ConsumptionType createEmptyConsumption(String ixsiBookingId, DateTime reservationEnd) { // Important! Both are set to the same value TimePeriodType timePeriod = new TimePeriodType() .withBegin(reservationEnd) .withEnd(reservationEnd); return new ConsumptionType() .withBookingID(ixsiBookingId) .withType(IXSIConstants.consumptionClass) .withDescription(NOT_USED) .withFinal(true) .withTimePeriod(timePeriod); } // ------------------------------------------------------------------------- // Private helpers // ------------------------------------------------------------------------- private void proceed(ConsumptionType consumption, Set<String> systemIdSet) { ConsumptionPushMessageType c = new ConsumptionPushMessageType().withConsumption(consumption); SubscriptionMessageType sub = new SubscriptionMessageType().withPushMessageGroup(c); IxsiMessageType ixsi = new IxsiMessageType().withSubscriptionMessage(sub); producer.send(ixsi, systemIdSet); } }