fr.mycellar.application.booking.impl.BookingEventServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for fr.mycellar.application.booking.impl.BookingEventServiceImpl.java

Source

/*
 * Copyright 2011, MyCellar
 *
 * This file is part of MyCellar.
 *
 * MyCellar is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * MyCellar is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with MyCellar. If not, see <http://www.gnu.org/licenses/>.
 */
package fr.mycellar.application.booking.impl;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;

import jpasearch.repository.query.SearchParameters;
import jpasearch.repository.query.builder.SearchBuilder;

import org.joda.time.DateTimeConstants;
import org.joda.time.LocalDate;

import fr.mycellar.application.admin.ConfigurationService;
import fr.mycellar.application.booking.BookingEventService;
import fr.mycellar.application.booking.BookingService;
import fr.mycellar.application.shared.AbstractSearchableService;
import fr.mycellar.application.wine.WineService;
import fr.mycellar.domain.booking.Booking;
import fr.mycellar.domain.booking.BookingBottle;
import fr.mycellar.domain.booking.BookingEvent;
import fr.mycellar.domain.booking.BookingEvent_;
import fr.mycellar.domain.booking.Booking_;
import fr.mycellar.domain.shared.NamedEntity_;
import fr.mycellar.domain.shared.exception.BusinessError;
import fr.mycellar.domain.shared.exception.BusinessException;
import fr.mycellar.domain.stock.Bottle;
import fr.mycellar.domain.wine.Wine;
import fr.mycellar.infrastructure.booking.repository.BookingEventRepository;

/**
 * @author speralta
 */
@Named
@Singleton
public class BookingEventServiceImpl extends AbstractSearchableService<BookingEvent, BookingEventRepository>
        implements BookingEventService {

    private BookingEventRepository bookingEventRepository;

    private WineService wineService;
    private BookingService bookingService;
    private ConfigurationService configurationService;

    @Override
    public BookingEvent nextBookingEvent(Integer id) throws BusinessException {
        BookingEvent bookingEvent = getById(id);
        if (bookingEvent == null) {
            throw new BusinessException(BusinessError.OTHER_00003);
        }

        BookingEvent next = new BookingEvent();
        next.setName(bookingEvent.getName());

        LocalDate today = new LocalDate();
        LocalDate friday = today.withDayOfWeek(DateTimeConstants.FRIDAY);
        if (!friday.isAfter(today)) {
            friday = friday.plusWeeks(1);
        }
        next.setStart(friday);
        next.setEnd(friday.plusWeeks(1).withDayOfWeek(DateTimeConstants.WEDNESDAY));

        for (BookingBottle bookingBottle : bookingEvent.getBottles()) {
            BookingBottle copy = new BookingBottle();
            copy.setBookingEvent(next);
            copy.setBottle(new Bottle());
            copy.getBottle().setFormat(bookingBottle.getBottle().getFormat());
            Wine wine;
            Wine original = bookingBottle.getBottle().getWine();
            if (original.getVintage() == null) {
                wine = original;
            } else {
                wine = wineService.find(original.getProducer(), original.getAppellation(), original.getType(),
                        original.getColor(), original.getName(), original.getVintage() + 1);
                if (wine == null) {
                    wine = wineService
                            .createVintages(original, original.getVintage() + 1, original.getVintage() + 1).get(0);
                }
            }
            copy.getBottle().setWine(wine);
            copy.setMax(bookingBottle.getMax());
            copy.setPosition(bookingBottle.getPosition());
            copy.setPrice(bookingBottle.getPrice());
            copy.setUrl(bookingBottle.getUrl());
            next.getBottles().add(copy);
        }
        return save(next);
    }

    @Override
    public List<BookingEvent> getCurrentBookingEvents() {
        return bookingEventRepository.find(new SearchBuilder<BookingEvent>() //
                .rangeOn(BookingEvent_.start).lessThan(new LocalDate()).and() //
                .rangeOn(BookingEvent_.end).moreThan(new LocalDate()).build());
    }

    @Override
    public BookingEvent cleanSaveForBottles(BookingEvent bookingEvent) throws BusinessException {
        validate(bookingEvent);
        return bookingEventRepository.cleanSaveForBottles(bookingEvent);
    }

    @Override
    public void validate(BookingEvent entity) throws BusinessException {

    }

    @Override
    protected void validateDelete(BookingEvent entity) throws BusinessException {
        if (bookingService.count(new SearchBuilder<Booking>() //
                .on(Booking_.bookingEvent).equalsTo(entity).build()) > 0) {
            throw new BusinessException(BusinessError.BOOKINGEVENT_00001);
        }
    }

    @Override
    protected SearchParameters<BookingEvent> addTermToSearchParametersParameters(String term,
            SearchParameters<BookingEvent> search) {
        return new SearchBuilder<BookingEvent>(search) //
                .fullText(NamedEntity_.name) //
                .searchSimilarity(configurationService.getDefaultSearchSimilarity()) //
                .andMode().search(term).build();
    }

    @Override
    protected BookingEventRepository getRepository() {
        return bookingEventRepository;
    }

    @Inject
    public void setBookingEventRepository(BookingEventRepository bookingEventRepository) {
        this.bookingEventRepository = bookingEventRepository;
    }

    @Inject
    public void setBookingService(BookingService bookingService) {
        this.bookingService = bookingService;
    }

    @Inject
    public void setWineService(WineService wineService) {
        this.wineService = wineService;
    }

    @Inject
    public void setConfigurationService(ConfigurationService configurationService) {
        this.configurationService = configurationService;
    }

}