package de.rwth.idsg.bikeman.ixsi.processor.subscription.complete; import de.rwth.idsg.bikeman.domain.Booking; import de.rwth.idsg.bikeman.ixsi.ErrorFactory; import de.rwth.idsg.bikeman.ixsi.dto.BookingDTO; import de.rwth.idsg.bikeman.ixsi.store.ConsumptionStore; import de.rwth.idsg.bikeman.ixsi.processor.api.SubscriptionRequestMessageProcessor; import de.rwth.idsg.bikeman.ixsi.service.ConsumptionPushService; import de.rwth.idsg.bikeman.repository.BookingRepository; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import xjc.schema.ixsi.CompleteConsumptionRequestType; import xjc.schema.ixsi.CompleteConsumptionResponseType; import xjc.schema.ixsi.ConsumptionType; import xjc.schema.ixsi.ErrorType; import java.util.ArrayList; import java.util.List; /** * @author Sevket Goekay <goekay@dbis.rwth-aachen.de> * @since 18.11.2014 */ @Component public class CompleteConsumptionRequestProcessor implements SubscriptionRequestMessageProcessor<CompleteConsumptionRequestType, CompleteConsumptionResponseType> { @Autowired private ConsumptionStore consumptionStore; @Autowired private BookingRepository bookingRepository; @Autowired private ConsumptionPushService consumptionPushService; @Override public Class<CompleteConsumptionRequestType> getProcessingClass() { return CompleteConsumptionRequestType.class; } @Override public CompleteConsumptionResponseType process(CompleteConsumptionRequestType request, String systemId) { try { List<String> bookingIdListString = consumptionStore.getSubscriptions(systemId); if (bookingIdListString.isEmpty()) { return buildError(ErrorFactory.Sys.invalidRequest("No subscriptions", null)); } List<ConsumptionType> consumptionList = new ArrayList<>(); List<Booking> closedList = bookingRepository.findClosedBookings(bookingIdListString); for (Booking b : closedList) { consumptionList.add(consumptionPushService.createConsumption(b)); } List<BookingDTO> notUsedList = bookingRepository.findNotUsedAndExpiredBookings(bookingIdListString); for (BookingDTO b : notUsedList) { String ixsiBookingId = b.getIxsiBookingId(); DateTime dt = b.getReservationStart(); consumptionList.add(consumptionPushService.createEmptyConsumption(ixsiBookingId, dt)); } // for now, assume that client system is always able to process the full message // therefore do not split messages! return new CompleteConsumptionResponseType() .withLast(true) .withMessageBlockID("none") .withConsumption(consumptionList); } catch (Exception e) { return buildError(ErrorFactory.Sys.backendFailed(e.getMessage(), null)); } } @Override public CompleteConsumptionResponseType buildError(ErrorType e) { return new CompleteConsumptionResponseType() .withError(e) .withMessageBlockID("none"); } }