package org.ovirt.engine.core.bll.profiles; import java.util.Collection; import java.util.List; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.common.businessentities.Nameable; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.profiles.ProfileBase; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.profiles.ProfilesDao; import org.ovirt.engine.core.utils.ReplacementUtils; public abstract class ProfileValidator<T extends ProfileBase> { private final Guid profileId; private T profile; private T profileFromDb; public ProfileValidator(T profile) { this(profile != null ? profile.getId() : null); this.profile = profile; } public ProfileValidator(Guid profileId) { this.profileId = profileId; } protected DbFacade getDbFacade() { return DbFacade.getInstance(); } public ValidationResult profileIsSet() { return getProfile() == null ? new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_PROFILE_MISSING) : ValidationResult.VALID; } public ValidationResult profileExists() { return getProfileFromDb() == null ? new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_PROFILE_NOT_EXISTS) : ValidationResult.VALID; } public ValidationResult qosExistsOrNull() { return getProfile().getQosId() == null || getDbFacade().getStorageQosDao().get(getProfile().getQosId()) != null ? ValidationResult.VALID : new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_QOS_NOT_FOUND); } public ValidationResult profileNameNotUsed() { for (T profile : getProfilesByParentEntity()) { if (profile.getName().equals(getProfile().getName()) && !profile.getId().equals(getProfile().getId())) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_PROFILE_NAME_IN_USE); } } return ValidationResult.VALID; } public ValidationResult profileNotUsed() { ValidationResult vmsErrorMsg = profileNotUsed(getVmsUsingProfile(), EngineMessage.VAR__ENTITIES__VMS); if (!vmsErrorMsg.isValid()) { return vmsErrorMsg; } return profileNotUsed(getTemplatesUsingProfile(), EngineMessage.VAR__ENTITIES__VM_TEMPLATES); } protected ValidationResult profileNotUsed(List<? extends Nameable> entities, EngineMessage entitiesReplacement) { if (entities.isEmpty()) { return ValidationResult.VALID; } Collection<String> replacements = ReplacementUtils.replaceWithNameable("ENTITIES_USING_PROFILE", entities); replacements.add(entitiesReplacement.name()); return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_PROFILE_IN_USE, replacements); } public T getProfile() { if (profile == null) { profile = getProfileDao().get(profileId); } return profile; } protected T getProfileFromDb() { if (profileFromDb == null) { profileFromDb = getProfileDao().get(profile.getId()); } return profileFromDb; } public abstract ValidationResult parentEntityExists(); public abstract ValidationResult parentEntityNotChanged(); public abstract ValidationResult isLastProfileInParentEntity(); protected abstract List<T> getProfilesByParentEntity(); protected abstract ProfilesDao<T> getProfileDao(); protected abstract List<VmTemplate> getTemplatesUsingProfile(); protected abstract List<VM> getVmsUsingProfile(); }