org.kuali.coeus.common.impl.unit.UnitServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.coeus.common.impl.unit.UnitServiceImpl.java

Source

/*
 * Kuali Coeus, a comprehensive research administration system for higher education.
 * 
 * Copyright 2005-2015 Kuali, Inc.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program 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 Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.kuali.coeus.common.impl.unit;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.coeus.common.framework.unit.Unit;
import org.kuali.coeus.common.framework.unit.UnitService;
import org.kuali.coeus.common.framework.unit.admin.UnitAdministrator;
import org.kuali.coeus.common.framework.unit.crrspndnt.UnitCorrespondent;
import org.kuali.kra.iacuc.bo.IacucUnitCorrespondent;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.KRADConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * The Unit Service Implementation.
 *
 * @author Kuali Research Administration Team (kualidev@oncourse.iu.edu)
 */
@Component("unitService")
public class UnitServiceImpl implements UnitService {

    private static final Logger LOGGER = Logger.getLogger(UnitServiceImpl.class);
    private static final String COLUMN = ":";
    private static final String SEPARATOR = ";1;";
    private static final String DASH = "-";
    private static final String UNIT_NUMBER = "unitNumber";
    private static final String PARENT_UNIT_NUMBER = "parentUnitNumber";
    public static final String ACTIVE = "active";
    public static final String ACTIVE_YES = "Y";

    @Autowired
    @Qualifier("unitLookupDao")
    private UnitLookupDao unitLookupDao;

    @Autowired
    @Qualifier("businessObjectService")
    private BusinessObjectService businessObjectService;

    @Override
    public Unit getUnitCaseInsensitive(String unitNumber) {
        Unit unit = null;
        if (StringUtils.isNotEmpty(unitNumber)) {
            unit = getUnitLookupDao().findUnitbyNumberCaseInsensitive(unitNumber);
        }
        return unit;
    }

    @Override
    public String getUnitName(String unitNumber) {
        final Unit unit = getUnit(unitNumber);
        return unit != null ? unit.getUnitName() : null;
    }

    @Override
    public List<Unit> getUnits() {
        return new ArrayList<>(getBusinessObjectService().findAll(Unit.class));
    }

    @Override
    public Unit getUnit(String unitNumber) {

        if (StringUtils.isNotEmpty(unitNumber)) {
            return getBusinessObjectService().findBySinglePrimaryKey(Unit.class, unitNumber);
        }

        return null;
    }

    @Override
    public List<Unit> getSubUnits(String unitNumber) {
        List<Unit> units = new ArrayList<>();
        Map<String, Object> fieldValues = new HashMap<>();
        fieldValues.put(PARENT_UNIT_NUMBER, unitNumber);
        units.addAll(getBusinessObjectService().findMatching(Unit.class, fieldValues));
        return units;
    }

    @Override
    public List<Unit> getActiveSubUnits(String unitNumber) {
        List<Unit> units = new ArrayList<>();
        Map<String, Object> fieldValues = new HashMap<>();
        fieldValues.put(ACTIVE, ACTIVE_YES);
        fieldValues.put(PARENT_UNIT_NUMBER, unitNumber);
        units.addAll(getBusinessObjectService().findMatching(Unit.class, fieldValues));
        return units;
    }

    @Override
    public List<Unit> getAllSubUnits(final String unitNumber) {
        return findUnitsWithDirectParent(getUnits(), unitNumber);
    }

    protected List<Unit> findUnitsWithDirectParent(List<Unit> units, final String directParent) {
        if (CollectionUtils.isNotEmpty(units)) {
            final List<Unit> matched = ListUtils.select(units, new Predicate<Unit>() {
                @Override
                public boolean evaluate(Unit input) {
                    return input.getParentUnitNumber() != null && input.getParentUnitNumber().equals(directParent);
                }
            });

            final List<Unit> totalMatched = new ArrayList<>(matched);
            for (Unit child : matched) {
                totalMatched.addAll(findUnitsWithDirectParent(units, child.getUnitNumber()));
            }
            return totalMatched;
        }
        return Collections.emptyList();
    }

    @Override
    public List<Unit> getUnitHierarchyForUnit(String unitNumber) {
        return getParentUnitsInclusive(getUnits(), unitNumber);
    }

    protected List<Unit> getParentUnitsInclusive(List<Unit> units, final String unit) {
        if (CollectionUtils.isNotEmpty(units)) {
            final Unit matched = CollectionUtils.find(units, new Predicate<Unit>() {
                @Override
                public boolean evaluate(Unit input) {
                    return input.getUnitNumber() != null && input.getUnitNumber().equals(unit);
                }
            });

            if (matched != null) {
                final List<Unit> totalMatched = new ArrayList<>();
                totalMatched.add(matched);
                totalMatched.addAll(getParentUnitsInclusive(units, matched.getParentUnitNumber()));
                return totalMatched;
            } else if (unit != null) {
                LOGGER.error("Invalid parent found " + unit);
            }
        }
        return Collections.emptyList();
    }

    @Override
    public String getSubUnitsForTreeView(String unitNumber) {
        // unitNumber will be like "<table width="600"><tr><td width="70%">BL-BL : BLOOMINGTON CAMPUS"
        String subUnits = null;
        int startIdx = unitNumber.indexOf("px\">", unitNumber.indexOf("<tr>"));
        for (Unit unit : getSubUnits(
                unitNumber.substring(startIdx + 4, unitNumber.indexOf(COLUMN, startIdx) - 1))) {
            if (StringUtils.isNotBlank(subUnits)) {
                subUnits = subUnits + "#SEPARATOR#" + unit.getUnitNumber() + KRADConstants.BLANK_SPACE + COLUMN
                        + KRADConstants.BLANK_SPACE + unit.getUnitName();
            } else {
                subUnits = unit.getUnitNumber() + KRADConstants.BLANK_SPACE + COLUMN + KRADConstants.BLANK_SPACE
                        + unit.getUnitName();
            }
        }
        return subUnits;

    }

    @Override
    public Unit getTopUnit() {
        return getUnitLookupDao().getTopUnit();
    }

    /**
     * Basic data structure : Get the Top node to display.
     * The node data is like following : 'parentidx-unitNumber : unitName' and separated by ';1;'
     */
    public String getInitialUnitsForUnitHierarchy() {
        Unit instituteUnit = getTopUnit();
        int parentIdx = 0;
        String subUnits = instituteUnit.getUnitNumber() + KRADConstants.BLANK_SPACE + COLUMN
                + KRADConstants.BLANK_SPACE + instituteUnit.getUnitName() + SEPARATOR;
        for (Unit unit : getSubUnits(instituteUnit.getUnitNumber())) {
            String subUnit = parentIdx + DASH + unit.getUnitNumber() + KRADConstants.BLANK_SPACE + COLUMN
                    + KRADConstants.BLANK_SPACE + unit.getUnitName();
            subUnits = subUnits + subUnit + SEPARATOR;
            for (Unit unit1 : getSubUnits(unit.getUnitNumber())) {
                subUnits = subUnits + getParentIndex(subUnits, subUnit) + DASH + unit1.getUnitNumber()
                        + KRADConstants.BLANK_SPACE + COLUMN + KRADConstants.BLANK_SPACE + unit1.getUnitName()
                        + SEPARATOR;
            }
        }
        subUnits = subUnits.substring(0, subUnits.length() - 3);

        return subUnits;

    }

    public String getInitialUnitsForUnitHierarchy(int depth) {
        Unit instituteUnit = getTopUnit();
        int parentIdx = 0;
        String subUnits = instituteUnit.getUnitNumber() + KRADConstants.BLANK_SPACE + COLUMN
                + KRADConstants.BLANK_SPACE + instituteUnit.getUnitName() + SEPARATOR;
        for (Unit unit : getSubUnits(instituteUnit.getUnitNumber())) {
            String subUnit = parentIdx + DASH + unit.getUnitNumber() + KRADConstants.BLANK_SPACE + COLUMN
                    + KRADConstants.BLANK_SPACE + unit.getUnitName();
            subUnits = subUnits + subUnit + SEPARATOR;
            if (depth - 2 > 0) {
                subUnits = subUnits + getSubUnits(getParentIndex(subUnits, subUnit), unit, depth - 2);
            }
        }
        subUnits = subUnits.substring(0, subUnits.length() - 3);

        return subUnits;

    }

    protected String getSubUnits(int parentIdx, Unit unit, int level) {
        String subUnits = "";
        level--;
        for (Unit unit1 : getSubUnits(unit.getUnitNumber())) {
            String subUnit = parentIdx + DASH + unit1.getUnitNumber() + KRADConstants.BLANK_SPACE + COLUMN
                    + KRADConstants.BLANK_SPACE + unit1.getUnitName();
            subUnits = subUnits + subUnit + SEPARATOR;
            ;
            if (level > 0) {
                subUnits = subUnits + getSubUnits(getParentIndex(subUnits, subUnit), unit1, level);
            }
        }
        return subUnits;
    }

    protected int getParentIndex(String subUnits, String subUnit) {
        String[] units = subUnits.split(SEPARATOR);
        int i = 0;
        for (String unit : units) {
            if (StringUtils.equals(unit, subUnit)) {
                return i;
            }
            i++;
        }
        return 0;
    }

    public List<UnitAdministrator> retrieveUnitAdministratorsByUnitNumber(String unitNumber) {
        Map<String, String> queryMap = new HashMap<>();
        queryMap.put(UNIT_NUMBER, unitNumber);
        List<UnitAdministrator> unitAdministrators = (List<UnitAdministrator>) getBusinessObjectService()
                .findMatching(UnitAdministrator.class, queryMap);
        return unitAdministrators;
    }

    @Override
    public int getMaxUnitTreeDepth() {
        /**
         * This function returns a higher number than the actual depth of the hirearchy tree.  This does not cause any problem as of yet.
         * A closer to accurate query would be:
         *      select count(distinct parent_unit_number) as counter from unit where PARENT_UNIT_NUMBER is not null
         * although this to will result in a higher number than the true depth.
         */
        //FIXME fix crap
        return getBusinessObjectService().findAll(Unit.class).size();
    }

    @Override
    public List<UnitCorrespondent> retrieveUnitCorrespondentsByUnitNumber(String unitNumber) {
        Map<String, String> queryMap = new HashMap<>();
        queryMap.put(UNIT_NUMBER, unitNumber);
        List<UnitCorrespondent> unitCorrespondents = (List<UnitCorrespondent>) getBusinessObjectService()
                .findMatching(UnitCorrespondent.class, queryMap);
        return unitCorrespondents;
    }

    @Override
    public List<IacucUnitCorrespondent> retrieveIacucUnitCorrespondentsByUnitNumber(String unitNumber) {
        Map<String, String> queryMap = new HashMap<>();
        queryMap.put(UNIT_NUMBER, unitNumber);
        List<IacucUnitCorrespondent> unitCorrespondents = (List<IacucUnitCorrespondent>) getBusinessObjectService()
                .findMatching(IacucUnitCorrespondent.class, queryMap);
        return unitCorrespondents;
    }

    public UnitLookupDao getUnitLookupDao() {
        return unitLookupDao;
    }

    public void setUnitLookupDao(UnitLookupDao unitLookupDao) {
        this.unitLookupDao = unitLookupDao;
    }

    public void setBusinessObjectService(BusinessObjectService businessObjectService) {
        this.businessObjectService = businessObjectService;
    }

    public BusinessObjectService getBusinessObjectService() {
        return this.businessObjectService;
    }

}