/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FenixEdu Academic 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Created on Feb 6, 2006
* by mrsp
*/
package org.fenixedu.academic.domain.organizationalStructure;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.bennu.core.domain.Bennu;
import org.joda.time.YearMonthDay;
public class UnitUtils {
public static List<Unit> readAllExternalInstitutionUnits() {
List<Unit> allExternalUnits = new ArrayList<Unit>();
allExternalUnits.addAll(readExternalInstitutionUnit().getAllSubUnits());
return allExternalUnits;
}
public static Unit readExternalInstitutionUnitByName(String name) {
for (Unit unit : readAllExternalInstitutionUnits()) {
if (unit.getName().equals(name)) {
return unit;
}
}
return null;
}
public static List<Unit> readAllUnitsWithoutParents() {
List<Unit> allUnitsWithoutParent = new ArrayList<Unit>();
for (Party party : Bennu.getInstance().getPartysSet()) {
if (party.isUnit()) {
Unit unit = (Unit) party;
if (unit.getParentUnits().isEmpty()) {
allUnitsWithoutParent.add(unit);
}
}
}
return allUnitsWithoutParent;
}
public static List<Unit> readAllInternalActiveUnitsThatCanBeResponsibleOfSpaces() {
List<Unit> result = new ArrayList<Unit>();
final YearMonthDay now = new YearMonthDay();
Unit institutionUnit = readInstitutionUnit();
if (institutionUnit != null) {
if (institutionUnit.getCanBeResponsibleOfSpaces() && institutionUnit.isActive(now)) {
result.add(institutionUnit);
}
for (Unit subUnit : institutionUnit.getSubUnits()) {
if (subUnit.getCanBeResponsibleOfSpaces() && subUnit.isActive(now)) {
result.add(subUnit);
}
readAllInternalActiveSubUnitsThatCanBeResponsibleOfSpaces(result, subUnit, now);
}
}
return result;
}
private static void readAllInternalActiveSubUnitsThatCanBeResponsibleOfSpaces(List<Unit> result, Unit subUnit,
YearMonthDay now) {
for (Unit unit : subUnit.getSubUnits()) {
if (unit.getCanBeResponsibleOfSpaces() && unit.isActive(now)) {
result.add(unit);
}
readAllInternalActiveSubUnitsThatCanBeResponsibleOfSpaces(result, unit, now);
}
}
public static List<Unit> readAllActiveUnitsByType(PartyTypeEnum type) {
final List<Unit> result = new ArrayList<Unit>();
final YearMonthDay now = new YearMonthDay();
PartyType partyType = PartyType.readPartyTypeByType(type);
if (partyType != null) {
Collection<Party> parties = partyType.getPartiesSet();
for (Party party : parties) {
if (party.isUnit()) {
Unit unit = (Unit) party;
if (unit.isActive(now)) {
result.add(unit);
}
}
}
}
return result;
}
public static List<Unit> readAllActiveUnitsByClassification(UnitClassification unitClassification) {
final List<Unit> result = new ArrayList<Unit>();
final YearMonthDay now = new YearMonthDay();
if (unitClassification != null) {
for (Party party : Bennu.getInstance().getPartysSet()) {
if (party.isUnit()) {
Unit unit = (Unit) party;
if (unit.getClassification() != null && unit.getClassification().equals(unitClassification)
&& unit.isActive(now)) {
result.add(unit);
}
}
}
}
return result;
}
public static List<DepartmentUnit> readAllDepartmentUnits() {
List<DepartmentUnit> result = new ArrayList<DepartmentUnit>();
List<Unit> readAllActiveUnitsByType = readAllActiveUnitsByType(PartyTypeEnum.DEPARTMENT);
for (Unit unit : readAllActiveUnitsByType) {
result.add((DepartmentUnit) unit);
}
return result;
}
public static Unit readUnitWithoutParentstByAcronym(String acronym) {
for (Unit topUnit : readAllUnitsWithoutParents()) {
if (topUnit.getAcronym() != null && topUnit.getAcronym().equals(acronym)) {
return topUnit;
}
}
return null;
}
public static Unit readExternalInstitutionUnit() {
return Bennu.getInstance().getExternalInstitutionUnit();
}
public static Unit readInstitutionUnit() {
return Bennu.getInstance().getInstitutionUnit();
}
public static Unit readEarthUnit() {
return Bennu.getInstance().getEarthUnit();
}
public static Set<Unit> readExternalUnitsByNameAndTypes(final String unitName, List<PartyTypeEnum> types) {
if (unitName == null) {
return Collections.emptySet();
}
final Collection<UnitName> units = UnitName.findExternalUnit(unitName.replace('%', ' '), Integer.MAX_VALUE);
final Set<Unit> result = new HashSet<Unit>();
for (final UnitName un : units) {
final Unit unit = un.getUnit();
if (types.contains(unit.getType())) {
result.add(unit);
}
}
return result;
}
public static List<Unit> getUnitFullPath(final Unit unit, final List<AccountabilityTypeEnum> validAccountabilityTypes) {
final Collection<Unit> parentUnits = unit.getParentUnits(validAccountabilityTypes);
if (parentUnits.isEmpty()) {
return Collections.emptyList();
}
if (parentUnits.size() == 1) {
final List<Unit> result = new ArrayList<Unit>();
result.add(unit);
result.addAll(0, getUnitFullPath(parentUnits.iterator().next(), validAccountabilityTypes));
return result;
}
throw new DomainException("error.unitUtils.unit.full.path.has.more.than.one.parent");
}
public static StringBuilder getUnitFullPathName(final Unit unit, final List<AccountabilityTypeEnum> validAccountabilityTypes) {
if (unit == readEarthUnit()) {
return new StringBuilder(0);
}
final Collection<Unit> parentUnits = unit.getParentUnits(validAccountabilityTypes);
if (parentUnits.isEmpty()) {
return new StringBuilder(unit.getName());
}
if (parentUnits.size() == 1) {
final StringBuilder builder = new StringBuilder();
builder.append(parentUnits.iterator().next() == readEarthUnit() ? "" : " > ").append(unit.getName());
builder.insert(0, getUnitFullPathName(parentUnits.iterator().next(), validAccountabilityTypes));
return builder;
}
throw new DomainException("error.unitUtils.unit.full.path.has.more.than.one.parent");
}
public static List<Unit> readExternalUnitsByNameAndTypesStartingAtEarth(final String unitName, final List<PartyTypeEnum> types) {
if (unitName == null) {
return Collections.emptyList();
}
final String nameToSearch = unitName.replaceAll("%", ".*").toLowerCase();
final List<Unit> result = new ArrayList<Unit>();
for (final UnitName name : Bennu.getInstance().getUnitNameSet()) {
if (name.getName().toLowerCase().matches(nameToSearch) && name.getIsExternalUnit()
&& types.contains(name.getUnit().getType())) {
result.add(name.getUnit());
}
}
return result;
}
public static Collection<Unit> readAllUnitsWithClassification(UnitClassification classification) {
List<Unit> result = new ArrayList<Unit>();
for (Party party : Bennu.getInstance().getPartysSet()) {
if (party.isUnit()) {
Unit unit = (Unit) party;
UnitClassification unitClassification = unit.getClassification();
if (unitClassification != null && unitClassification.equals(classification)) {
result.add(unit);
}
}
}
return result;
}
}