org.mifos.customers.personnel.business.service.PersonnelServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.mifos.customers.personnel.business.service.PersonnelServiceImpl.java

Source

/*
 * Copyright (c) 2005-2011 Grameen Foundation USA
 * All rights reserved.
 *
 * 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.
 *
 * See also http://www.apache.org/licenses/LICENSE-2.0.html for an
 * explanation of the license and how it is applied.
 */

package org.mifos.customers.personnel.business.service;

import java.util.ArrayList;
import java.util.Date;

import org.joda.time.LocalDateTime;
import org.mifos.accounts.util.helpers.AccountExceptionConstants;
import org.mifos.config.PasswordRules;
import org.mifos.core.MifosRuntimeException;
import org.mifos.customers.personnel.business.PersonnelBO;
import org.mifos.customers.personnel.business.PersonnelUsedPasswordEntity;
import org.mifos.customers.personnel.persistence.PersonnelDao;
import org.mifos.framework.hibernate.helper.HibernateTransactionHelper;
import org.mifos.framework.hibernate.helper.HibernateTransactionHelperForStaticHibernateUtil;
import org.mifos.security.authentication.EncryptionService;
import org.mifos.security.util.UserContext;
import org.mifos.service.BusinessRuleException;
import org.springframework.beans.factory.annotation.Autowired;

public class PersonnelServiceImpl implements PersonnelService {

    private final PersonnelDao personnelDao;
    private final HibernateTransactionHelper hibernateTransactionHelper = new HibernateTransactionHelperForStaticHibernateUtil();

    @Autowired
    public PersonnelServiceImpl(PersonnelDao personnelDao) {
        this.personnelDao = personnelDao;
    }

    @Override
    public void changePassword(PersonnelBO user, String newPassword, boolean setPasswordChanged) {

        UserContext userContext = new UserContext();
        userContext.setId(user.getPersonnelId());
        userContext.setName(user.getUserName());
        user.updateDetails(userContext);

        validateIfPasswordIsRecentlyUsed(user, newPassword);

        byte[] newEncPass = EncryptionService.getInstance().createEncryptedPassword(newPassword);

        PersonnelUsedPasswordEntity personnelUsedPassword;
        int passwordHistoryCount = PasswordRules.getPasswordHistoryCount();

        if (user.getPersonnelUsedPasswords().size() >= passwordHistoryCount) {
            personnelUsedPassword = new ArrayList<PersonnelUsedPasswordEntity>(user.getPersonnelUsedPasswords())
                    .get(0);
            personnelUsedPassword.setUsedPassword(newEncPass);
            personnelUsedPassword.setDateChanged(new LocalDateTime().toDateTime().toDate());
        } else {
            personnelUsedPassword = new PersonnelUsedPasswordEntity();
            personnelUsedPassword.setPersonnel(user);
            personnelUsedPassword.setUsedPassword(newEncPass);
            personnelUsedPassword.setDateChanged(new LocalDateTime().toDateTime().toDate());
            user.getPersonnelUsedPasswords().add(personnelUsedPassword);
        }

        try {
            hibernateTransactionHelper.startTransaction();
            hibernateTransactionHelper.beginAuditLoggingFor(user);

            user.changePasswordTo(newPassword, user.getPersonnelId(), setPasswordChanged);
            this.personnelDao.save(user);

            hibernateTransactionHelper.commitTransaction();
        } catch (Exception e) {
            hibernateTransactionHelper.rollbackTransaction();
            throw new MifosRuntimeException(e);
        } finally {
            hibernateTransactionHelper.closeSession();
        }
    }

    private void validateIfPasswordIsRecentlyUsed(PersonnelBO user, String newPassword) {

        for (PersonnelUsedPasswordEntity usedPass : user.getPersonnelUsedPasswords()) {
            if (EncryptionService.getInstance().verifyPassword(newPassword, usedPass.getUsedPassword())) {
                throw new BusinessRuleException(AccountExceptionConstants.PASSWORD_USED_EXCEPTION);
            }
        }

    }

    @Override
    public void changePasswordExpirationDate(PersonnelBO user, Date passwordExpirationDate) {
        UserContext userContext = new UserContext();
        userContext.setId(user.getPersonnelId());
        userContext.setName(user.getUserName());
        user.updateDetails(userContext);

        try {
            hibernateTransactionHelper.startTransaction();
            hibernateTransactionHelper.beginAuditLoggingFor(user);
            user.setPasswordExpirationDate(passwordExpirationDate);
            this.personnelDao.save(user);

            hibernateTransactionHelper.commitTransaction();
        } catch (Exception e) {
            hibernateTransactionHelper.rollbackTransaction();
            throw new MifosRuntimeException(e);
        } finally {
            hibernateTransactionHelper.closeSession();
        }
    }
}