/** * 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/>. */ package org.fenixedu.academic.domain.organizationalStructure; import java.util.HashMap; import java.util.Map; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.commons.StringNormalizer; public class UnitNamePart extends UnitNamePart_Base { public UnitNamePart(final String namePart) { super(); setRootDomainObject(Bennu.getInstance()); setNamePart(namePart); } @Override public void setNamePart(final String namePart) { if (namePart == null) { throw new DomainException("error.name.part.cannot.be.null"); } final UnitNamePart unitNamePart = find(namePart); if (unitNamePart != null && unitNamePart != this) { throw new DomainException("error.duplicate.name.part", namePart); } super.setNamePart(namePart); } public static String normalize(final String string) { return StringNormalizer.normalize(string.trim()); } public static String[] getNameParts(final String name) { return normalize(name).split(" "); } private static final Map<String, UnitNamePart> unitNamePartIndexMap = new HashMap<String, UnitNamePart>(); public static UnitNamePart find(final String namePart) { final String normalizedNamePart = StringNormalizer.normalize(namePart); final UnitNamePart indexedUnitNamePart = unitNamePartIndexMap.get(normalizedNamePart); if (indexedUnitNamePart != null) { return indexedUnitNamePart; } for (final UnitNamePart unitNamePart : Bennu.getInstance().getUnitNamePartSet()) { final String otherUnitNamePart = unitNamePart.getNamePart(); if (!unitNamePartIndexMap.containsKey(otherUnitNamePart)) { unitNamePartIndexMap.put(otherUnitNamePart, unitNamePart); } if (normalizedNamePart.equals(otherUnitNamePart)) { return unitNamePart; } } return null; } protected static UnitNamePart findAndCreateIfNotFound(final String namePart) { final UnitNamePart unitNamePart = find(namePart); return unitNamePart == null ? new UnitNamePart(namePart) : unitNamePart; } protected static void index(final UnitName unitName, final String namePart) { final UnitNamePart unitNamePart = findAndCreateIfNotFound(namePart); unitNamePart.addUnitName(unitName); } protected static void index(final UnitName unitName, final String[] nameParts) { for (final String namePart : nameParts) { index(unitName, namePart); } } protected static void index(final UnitName unitName) { index(unitName, getNameParts(unitName.getName())); } public static void reindex(final UnitName unitName) { unitName.getUnitNamePartSet().clear(); index(unitName); } public void deleteIfEmpty() { if (getUnitNameSet().isEmpty()) { setRootDomainObject(null); deleteDomainObject(); } } }