org.key2gym.business.services.ClientsServiceBean.java Source code

Java tutorial

Introduction

Here is the source code for org.key2gym.business.services.ClientsServiceBean.java

Source

package org.key2gym.business.services;

/*
 * Copyright 2012-2013 Danylo Vashchilenko
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

import org.joda.time.DateMidnight;
import org.key2gym.business.api.*;
import org.key2gym.business.api.dtos.ClientDTO;
import org.key2gym.business.api.dtos.Debtor;
import org.key2gym.business.api.services.ClientsService;
import org.key2gym.business.entities.Client;
import org.key2gym.business.resources.ResourcesManager;
import org.springframework.stereotype.Service;
import scala.math.BigDecimal;
import scala.math.BigDecimal$;

import javax.annotation.security.RolesAllowed;
import javax.persistence.NoResultException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Danylo Vashchilenko
 */
@Service("org.key2gym.business.api.services.ClientsService")
@RolesAllowed({ SecurityRoles.JUNIOR_ADMINISTRATOR, SecurityRoles.SENIOR_ADMINISTRATOR, SecurityRoles.MANAGER })
public class ClientsServiceBean extends BasicBean implements ClientsService {

    @Override
    public ClientDTO getTemplateClient() {
        ClientDTO client = new ClientDTO();

        client.setId(getNextId());
        client.setAttendancesBalance(0);
        client.setExpirationDate(new DateMidnight());
        client.setMoneyBalance(BigDecimal$.MODULE$.apply(0).setScale(2).underlying());
        client.setRegistrationDate(new DateMidnight());

        return client;
    }

    @Override
    public Integer registerClient(ClientDTO client, Boolean useSecuredProperties)
            throws BusinessException, ValidationException, SecurityViolationException {

        if (client == null) {
            throw new NullPointerException("The client is null."); //NOI18N
        }

        if (useSecuredProperties == null) {
            throw new NullPointerException("The useSecuredPropeties is null."); //NOI18N
        }

        Client newClient = new Client();

        /*
         * Validation
         */
        newClient.setFullName(client.getFullName());

        getCardValidator().validate(client.getCard());
        newClient.setCard(client.getCard());

        newClient.setNote(client.getNote());

        newClient.setRegistrationDate(new Date());

        if (useSecuredProperties && !callerHasRole(SecurityRoles.MANAGER)) {
            throw new SecurityViolationException(getString("Security.Client.UpdateSecuredProperties.Denied"));
        }

        if (useSecuredProperties) {
            newClient.setAttendancesBalance(client.getAttendancesBalance());
            newClient.setMoneyBalance(new BigDecimal(client.getMoneyBalance()));
            newClient.setExpirationDate(client.getExpirationDate().toDate());
        } else {
            newClient.setAttendancesBalance(0);
            newClient.setMoneyBalance(BigDecimal$.MODULE$.apply(0));
            newClient.setExpirationDate(client.getRegistrationDate().toDate());
        }

        em.persist(newClient);
        em.flush();

        return newClient.getId();
    }

    @Override
    public ClientDTO getById(Integer clientId) throws ValidationException {

        if (clientId == null) {
            throw new NullPointerException("The clientId is null."); //NOI18N
        }

        Client client = em.find(Client.class, clientId);

        if (client == null) {
            throw new ValidationException(getString("Invalid.Client.ID"));
        }

        ClientDTO clientDTO = new ClientDTO();
        clientDTO.setId(clientId);
        clientDTO.setFullName(client.getFullName());
        clientDTO.setAttendancesBalance(client.getAttendancesBalance());
        clientDTO.setMoneyBalance(client.getMoneyBalance().underlying());
        clientDTO.setRegistrationDate(new DateMidnight(client.getRegistrationDate()));
        clientDTO.setExpirationDate(new DateMidnight(client.getExpirationDate()));
        clientDTO.setNote(client.getNote());
        clientDTO.setCard(client.getCard());

        return clientDTO;
    }

    @Override
    public Integer findByCard(Integer card) {

        if (card == null) {
            throw new NullPointerException("The card is null."); //NOI18N
        }

        try {
            Client client = (Client) em.createNamedQuery("Client.findByCard") //NOI18N
                    .setParameter("card", card) //NOI18N
                    .setMaxResults(1).getSingleResult();
            return client.getId();
        } catch (NoResultException ex) {
            return null;
        }
    }

    @Override
    public List<ClientDTO> findByFullName(String fullName, Boolean exactMatch) throws IllegalArgumentException {

        if (fullName == null) {
            throw new IllegalArgumentException("The fullName is null."); //NOI18N
        }

        if (exactMatch == null) {
            throw new IllegalArgumentException("The exactMatch is null."); //NOI18N
        }

        List<Client> clients;

        if (exactMatch == true) {
            clients = em.createNamedQuery("Client.findByFullNameExact") //NOI18N
                    .setParameter("fullName", fullName) //NOI18N
                    .getResultList();
        } else {
            clients = em.createNamedQuery("Client.findByFullNameNotExact") //NOI18N
                    .setParameter("fullName", fullName) //NOI18N
                    .getResultList(); //NOI18N
        }

        List<ClientDTO> result = new LinkedList<ClientDTO>();

        for (Client client : clients) {
            ClientDTO clientDTO = new ClientDTO();
            clientDTO.setId(client.getId());
            clientDTO.setFullName(client.getFullName());
            clientDTO.setAttendancesBalance(client.getAttendancesBalance());
            clientDTO.setMoneyBalance(client.getMoneyBalance().underlying());
            clientDTO.setRegistrationDate(new DateMidnight(client.getRegistrationDate()));
            clientDTO.setExpirationDate(new DateMidnight(client.getExpirationDate()));
            clientDTO.setNote(client.getNote());
            clientDTO.setCard(client.getCard());
            result.add(clientDTO);
        }

        return result;
    }

    @Override
    public void updateClient(ClientDTO client, Boolean useSecuredProperties)
            throws SecurityViolationException, ValidationException {

        if (client == null) {
            throw new NullPointerException("The client is null."); //NOI18N
        }

        if (client.getId() == null) {
            throw new NullPointerException("The client's ID is null."); //NOI18N
        }

        if (useSecuredProperties == null) {
            throw new NullPointerException("The useSecuredProperties is null."); //NOI18N
        }

        Client originalClient = em.find(Client.class, client.getId());

        if (originalClient == null) {
            throw new ValidationException(getString("Invalid.Client.ID"));
        }

        if (useSecuredProperties && !callerHasRole(SecurityRoles.MANAGER)) {
            throw new SecurityViolationException(getString("Security.Client.UpdateSecuredProperties.Denied"));
        }

        originalClient.setFullName(client.getFullName());

        /*
         * Validates the card, only if it was changed. Otherwise, the validator
         * will throw ValidationException for the card is already assigned to
         * this client.
         */
        if ((originalClient.getCard() != null && !originalClient.getCard().equals(client.getCard()))
                || (client.getCard() != null && !client.getCard().equals(originalClient.getCard()))) {
            getCardValidator().validate(client.getCard());
            originalClient.setCard(client.getCard());
        }

        originalClient.setNote(client.getNote());
        originalClient.setRegistrationDate(client.getRegistrationDate().toDate());

        if (useSecuredProperties) {
            originalClient.setAttendancesBalance(client.getAttendancesBalance());
            originalClient.setMoneyBalance(new BigDecimal(client.getMoneyBalance()));
            originalClient.setExpirationDate(client.getExpirationDate().toDate());
        }

    }

    @Override
    public List<Debtor> findDebtors() throws SecurityViolationException {

        if (!callerHasAnyRole(SecurityRoles.MANAGER)) {
            throw new SecurityViolationException(ResourcesManager.getString("Security.Access.Denied"));
        }

        List<org.key2gym.business.entities.Debtor> debtors = em
                .createNamedQuery("Debtor.findAll", org.key2gym.business.entities.Debtor.class).getResultList();

        List<Debtor> result = new ArrayList<>(debtors.size());

        for (org.key2gym.business.entities.Debtor debtor : debtors) {
            Debtor resultDebtor = new Debtor();
            resultDebtor.setClientId(debtor.getClientId());
            resultDebtor.setClientFullName(debtor.getFullName());
            resultDebtor.setMoneyBalance(debtor.getMoneyBalance());
            resultDebtor.setLastAttendance(debtor.getLastAttendance());
            result.add(resultDebtor);
        }

        return result;
    }

    @Override
    public Boolean hasDebt(Integer clientId) throws ValidationException {

        if (clientId == null) {
            throw new NullPointerException("The clientId is null."); //NOI18N
        }

        Client client = em.find(Client.class, clientId);
        if (client == null) {
            throw new ValidationException(getString("Invalid.Client.ID"));
        }

        return client.getMoneyBalance().compare(BigDecimal$.MODULE$.apply(0)) < 0;
    }

    @Override
    public Integer getNextId() {

        try {
            return 1 + (Integer) em.createNamedQuery("Client.findAllIdsOrderByIdDesc") //NOI18N
                    .setMaxResults(1).getSingleResult();
        } catch (NoResultException ex) {
            return 1;
        }
    }

    public Validator getCardValidator() {
        return new Validator<Integer>() {
            @Override
            public void validate(Integer value) throws ValidationException {
                // If a card is to be assigned,
                // let's make sure no one else uses it.
                if (value != null) {
                    List<Client> clients = em.createNamedQuery("Client.findByCard") //NOI18N
                            .setParameter("card", value) //NOI18N
                            .getResultList();

                    if (!clients.isEmpty()) {
                        String message = MessageFormat.format(
                                getString("Invalid.Client.Card.AlreadyInUse.withClientFullNameAndID"),
                                new Object[] { clients.get(0).getFullName(), clients.get(0).getId() });
                        throw new ValidationException(message);
                    }
                }
            }
        };
    }
}