org.mifos.application.master.persistence.LegacyMasterDao.java Source code

Java tutorial

Introduction

Here is the source code for org.mifos.application.master.persistence.LegacyMasterDao.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.application.master.persistence;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.mifos.application.NamedQueryConstants;
import org.mifos.application.master.MessageLookup;
import org.mifos.application.master.business.CustomValueDto;
import org.mifos.application.master.business.CustomValueListElementDto;
import org.mifos.application.master.business.LookUpEntity;
import org.mifos.application.master.business.LookUpValueEntity;
import org.mifos.application.master.business.LookUpValueLocaleEntity;
import org.mifos.application.master.business.MasterDataEntity;
import org.mifos.application.servicefacade.ApplicationContextProvider;
import org.mifos.config.Localization;
import org.mifos.customers.persistence.CustomerDao;
import org.mifos.dto.domain.ValueListElement;
import org.mifos.framework.exceptions.PersistenceException;
import org.mifos.framework.exceptions.SystemException;
import org.mifos.framework.hibernate.helper.StaticHibernateUtil;
import org.mifos.framework.hibernate.helper.Transactional;
import org.mifos.framework.persistence.LegacyGenericDao;
import org.mifos.framework.util.helpers.SearchUtils;
import org.mifos.security.activity.DynamicLookUpValueCreationTypes;

/**
 * This class is mostly used to look up instances of (a subclass of)
 * {@link MasterDataEntity} in the database. Most of what is here can better be
 * accomplished by enums and by {@link MessageLookup}.
 */
public class LegacyMasterDao extends LegacyGenericDao {

    protected LegacyMasterDao() {
    }

    /**
     * Only two non-test usages, one that may never be called and one for getting labels.
     */
    @Transactional
    public CustomValueDto getLookUpEntity(final String entityName) throws SystemException {
        Session session = getSession();
        Query queryEntity = session.getNamedQuery("masterdata.entityvalue");
        queryEntity.setString("entityType", entityName);
        CustomValueDto entity = (CustomValueDto) queryEntity.uniqueResult();
        entity.setCustomValueListElements(lookUpValue(entityName, session));
        return entity;
    }

    @SuppressWarnings("unchecked")
    private List<CustomValueListElementDto> lookUpValue(final String entityName, final Session session) {
        Query queryEntity = session.getNamedQuery("masterdata.entitylookupvalue");
        queryEntity.setString("entityType", entityName);
        List<CustomValueListElementDto> entityList = queryEntity.list();
        return entityList;
    }

    /**
     * Used once in getMasterData, otherwise, test usage and one other method
     * MifosPropertyMessageResources.getCustomValueListElements (and that method may never be called)
     */
    public CustomValueDto getCustomValueList(final String entityName, final String classPath, final String column)
            throws SystemException {
        Session session = null;
        session = getSession();
        Query queryEntity = session.getNamedQuery("masterdata.entityvalue");
        queryEntity.setString("entityType", entityName);
        CustomValueDto entity = (CustomValueDto) queryEntity.uniqueResult();
        List<CustomValueListElementDto> listElements = getCustomValueListElements(entityName, classPath, column,
                session);
        entity.setCustomValueListElements(listElements);
        return entity;
    }

    @SuppressWarnings("unchecked")
    private List<CustomValueListElementDto> getCustomValueListElements(final String entityName,
            final String entityClass, final String column, final Session session) {
        Query queryEntity = session
                .createQuery("select new org.mifos.application.master.business.CustomValueListElementDto("
                        + "mainTable." + column + " ,lookup.lookUpId,lookupvalue.lookUpValue,lookup.lookUpName) "
                        + "from org.mifos.application.master.business.LookUpValueEntity lookup,"
                        + "org.mifos.application.master.business.LookUpValueLocaleEntity lookupvalue," + entityClass
                        + " mainTable " + "where mainTable.lookUpId = lookup.lookUpId"
                        + " and lookup.lookUpEntity.entityType = ?" + " and lookup.lookUpId = lookupvalue.lookUpId"
                        + " and lookupvalue.localeId = ?");
        queryEntity.setString(0, entityName);
        queryEntity.setShort(1, (short) 1);
        List<CustomValueListElementDto> entityList = queryEntity.list();

        return entityList;
    }

    /**
     * use Dao specific calls - see feeDao.doRetrieveFeeCategories
     */
    @SuppressWarnings("unchecked")
    @Deprecated
    public <T extends MasterDataEntity> List<T> findMasterDataEntitiesWithLocale(final Class<T> type) {
        Session session = getSession();
        List<T> masterEntities = session.createQuery("from " + type.getName()).list();
        for (MasterDataEntity masterData : masterEntities) {
            Hibernate.initialize(masterData.getNames());
        }
        return masterEntities;
    }

    @SuppressWarnings("unchecked")
    public <T extends MasterDataEntity> T findMasterDataEntityWithLocale(final Class<T> entityType,
            final Short entityId) throws PersistenceException {
        Session session = getSession();
        List<T> masterEntities = session
                .createQuery("from " + entityType.getName() + " masterEntity where masterEntity.id = " + entityId)
                .list();
        if (masterEntities != null && masterEntities.size() > 0) {
            T masterDataEntity = masterEntities.get(0);
            Hibernate.initialize(masterDataEntity.getNames());
            return masterDataEntity;
        }
        throw new PersistenceException("errors.entityNotFound");
    }

    /**
     * This method is used to retrieve both custom and fixed value list
     * elements.
     * @deprecated - use specific methods on {@link CustomerDao}
     * @see CustomerDao#retrieveSalutations()
     */
    @SuppressWarnings("unchecked")
    @Deprecated
    public List<ValueListElement> findValueListElements(final String entityName) {
        Query query = getSession().getNamedQuery(NamedQueryConstants.MASTERDATA_MIFOS_ENTITY_VALUE);
        query.setParameter("entityType", entityName);
        return query.list();

    }

    /*
     * @param entityId - the primary key of a LookUpValueEntity
     */
    public String getMessageForLookupEntity(final Integer entityId) throws PersistenceException {
        LookUpValueEntity lookupValue = getPersistentObject(LookUpValueEntity.class, entityId);
        return ApplicationContextProvider.getBean(MessageLookup.class).lookup(lookupValue);
    }

    @SuppressWarnings("unchecked")
    public <T extends MasterDataEntity> List<T> findMasterDataEntities(final Class<T> clazz) {
        List<MasterDataEntity> queryResult = getSession().createQuery("from " + clazz.getName()).list();
        return (List<T>) queryResult;
    }

    /**
     * Update the String value of a LookUpValueLocaleEntity.
     *
     * @param lookupValueEntityId
     *            - the database id of the LookUpValueLocaleEntity object
     *            representing a ValueListElement
     */
    public void updateValueListElementForLocale(final Integer lookupValueEntityId, final String newValue)
            throws PersistenceException {
        LookUpValueEntity lookupValueEntity = getPersistentObject(LookUpValueEntity.class, lookupValueEntityId);
        Set<LookUpValueLocaleEntity> lookUpValueLocales = lookupValueEntity.getLookUpValueLocales();
        if (lookUpValueLocales != null) {
            for (LookUpValueLocaleEntity entity : lookUpValueLocales) {
                if (entity.getLookUpId().equals(lookupValueEntityId)) {
                    entity.setLookUpValue(newValue);
                    createOrUpdate(entity);
                    ApplicationContextProvider.getBean(MessageLookup.class)
                            .updateLookupValueInCache(lookupValueEntity.getLookUpName(), newValue);
                    StaticHibernateUtil.commitTransaction();
                    break;
                }
            }
        }

    }

    public LookUpValueEntity addValueListElementForLocale(final DynamicLookUpValueCreationTypes type,
            final Short lookupEnityId, final String newElementText) throws PersistenceException {

        String lookUpName = SearchUtils.generateLookupName(type.name(), newElementText);
        return addValueListElementForLocale(lookupEnityId, newElementText, lookUpName);
    }

    /**
     * Create a new list element for a single locale.
     *
     * It would be nicer for this to operate on objects rather than ids, but it
     * is a first step that works.
     */
    public LookUpValueEntity addValueListElementForLocale(final Short lookupEnityId, final String newElementText,
            final String lookUpName) throws PersistenceException {
        LookUpEntity lookUpEntity = getPersistentObject(LookUpEntity.class, lookupEnityId);
        LookUpValueEntity lookUpValueEntity = new LookUpValueEntity();
        lookUpValueEntity.setLookUpEntity(lookUpEntity);
        lookUpValueEntity.setLookUpName(lookUpName);
        createOrUpdate(lookUpValueEntity);

        LookUpValueLocaleEntity lookUpValueLocaleEntity = new LookUpValueLocaleEntity();
        lookUpValueLocaleEntity.setLocaleId(Localization.ENGLISH_LOCALE_ID);
        lookUpValueLocaleEntity.setLookUpValue(newElementText);
        lookUpValueLocaleEntity.setLookUpId(lookUpValueEntity.getLookUpId());
        createOrUpdate(lookUpValueLocaleEntity);

        // MifosConfiguration.getInstance().updateKey(lookUpValueEntity,
        // newElementText);
        ApplicationContextProvider.getBean(MessageLookup.class).updateLookupValueInCache(lookUpValueEntity,
                newElementText);

        return lookUpValueEntity;
    }

    /**
     * This method is intended to delete a single LookUpValueEntity and all its
     * associated LookUpValueLocaleEntity objects. The primary purpose is for
     * test script cleanup, since deletion of LookUpValueEntity elements is not
     * allowed in the main app.
     *
     * It would be nicer for this to operate on objects rather than ids, but it
     * is a first step that works.
     */
    public void deleteValueListElement(final Integer lookupValueEntityId) throws PersistenceException {
        LookUpValueEntity lookUpValueEntity = getPersistentObject(LookUpValueEntity.class, lookupValueEntityId);
        delete(lookUpValueEntity);
        ApplicationContextProvider.getBean(MessageLookup.class).deleteKey(lookUpValueEntity.getLookUpName());
    }

    public void addLookUpEntity(final LookUpEntity lookUpEntity) throws PersistenceException {
        createOrUpdate(lookUpEntity);
    }

    public LookUpValueLocaleEntity retrieveOneLookUpValueLocaleEntity(final short localeId, final int lookUpId)
            throws PersistenceException {
        Map<String, Object> queryParameters = new HashMap<String, Object>();
        queryParameters.put("aLocaleId", Short.valueOf(localeId));
        queryParameters.put("aLookUpId", lookUpId);
        Object obj = execUniqueResultNamedQuery(NamedQueryConstants.GETLOOKUPVALUELOCALE, queryParameters);
        if (null != obj) {
            return (LookUpValueLocaleEntity) obj;
        }
        return null;
    }
}