/* * Copyright (c) 2010-2013 Evolveum * * 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. */ package com.evolveum.midpoint.common; import javax.xml.datatype.DatatypeConstants; import javax.xml.datatype.XMLGregorianCalendar; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TimeIntervalStatusType; /** * @author semancik * */ public class ActivationComputer { private Clock clock; public ActivationComputer() { super(); } public ActivationComputer(Clock clock) { super(); this.clock = clock; } public Clock getClock() { return clock; } public void setClock(Clock clock) { this.clock = clock; } public ActivationStatusType getEffectiveStatus(String lifecycleStatus, ActivationType activationType) { return getEffectiveStatus(lifecycleStatus, activationType, getValidityStatus(activationType)); } public ActivationStatusType getEffectiveStatus(String lifecycleStatus, ActivationType activationType, TimeIntervalStatusType validityStatus) { if (SchemaConstants.LIFECYCLE_ARCHIVED.equals(lifecycleStatus)) { return ActivationStatusType.ARCHIVED; } if (lifecycleStatus != null && !lifecycleStatus.equals(SchemaConstants.LIFECYCLE_ACTIVE) && !lifecycleStatus.equals(SchemaConstants.LIFECYCLE_DEPRECATED)) { return ActivationStatusType.DISABLED; } if (activationType == null) { return ActivationStatusType.ENABLED; } ActivationStatusType administrativeStatus = activationType.getAdministrativeStatus(); if (administrativeStatus != null) { // Explicit administrative status overrides everything return administrativeStatus; } if (validityStatus == null) { // No administrative status, no validity. Return default. return ActivationStatusType.ENABLED; } switch (validityStatus) { case AFTER: case BEFORE: return ActivationStatusType.DISABLED; case IN: return ActivationStatusType.ENABLED; } // This should not happen return null; } public TimeIntervalStatusType getValidityStatus(ActivationType activationType) { return getValidityStatus(activationType, clock.currentTimeXMLGregorianCalendar()); } public TimeIntervalStatusType getValidityStatus(ActivationType activationType, XMLGregorianCalendar referenceTime) { if (activationType == null || referenceTime == null) { return null; } XMLGregorianCalendar validFrom = activationType.getValidFrom(); XMLGregorianCalendar validTo = activationType.getValidTo(); if (validFrom == null && validTo == null) { return null; } TimeIntervalStatusType status = TimeIntervalStatusType.IN; if (validFrom != null && (referenceTime == null || referenceTime.compare(validFrom) == DatatypeConstants.LESSER)) { status = TimeIntervalStatusType.BEFORE; } if (validTo != null && referenceTime.compare(validTo) == DatatypeConstants.GREATER) { status = TimeIntervalStatusType.AFTER; } return status; } public void computeEffective(String lifecycleStatus, ActivationType activationType) { computeEffective(lifecycleStatus, activationType, clock.currentTimeXMLGregorianCalendar()); } public void computeEffective(String lifecycleStatus, ActivationType activationType, XMLGregorianCalendar referenceTime) { ActivationStatusType effectiveStatus = null; if (lifecycleStatus != null && !lifecycleStatus.equals(SchemaConstants.LIFECYCLE_ACTIVE) && !lifecycleStatus.equals(SchemaConstants.LIFECYCLE_DEPRECATED)) { effectiveStatus = ActivationStatusType.DISABLED; } if (SchemaConstants.LIFECYCLE_ARCHIVED.equals(lifecycleStatus)) { effectiveStatus = ActivationStatusType.ARCHIVED; } ActivationStatusType administrativeStatus = activationType.getAdministrativeStatus(); if (effectiveStatus == null && administrativeStatus != null) { // Explicit administrative status overrides everything effectiveStatus = administrativeStatus; } TimeIntervalStatusType validityStatus = getValidityStatus(activationType); if (effectiveStatus == null) { if (validityStatus == null) { // No administrative status, no validity. Defaults to enabled. effectiveStatus = ActivationStatusType.ENABLED; } else { switch (validityStatus) { case AFTER: case BEFORE: effectiveStatus = ActivationStatusType.DISABLED; break; case IN: effectiveStatus = ActivationStatusType.ENABLED; break; } } } activationType.setEffectiveStatus(effectiveStatus); activationType.setValidityStatus(validityStatus); } public boolean isActive(String lifecycleStatus, ActivationType activationType) { if (activationType == null) { return true; } ActivationStatusType effectiveStatus = activationType.getEffectiveStatus(); if (effectiveStatus == null) { computeEffective(lifecycleStatus, activationType); effectiveStatus = activationType.getEffectiveStatus(); } if (effectiveStatus == null) { return false; } return effectiveStatus == ActivationStatusType.ENABLED; } public boolean lifecycleHasActiveAssignments(String lifecycleStatus) { return lifecycleIsActive(lifecycleStatus); } public boolean lifecycleIsActive(String lifecycleStatus) { if (lifecycleStatus == null) { return true; } return lifecycleStatus.equals(SchemaConstants.LIFECYCLE_ACTIVE) || lifecycleStatus.equals(SchemaConstants.LIFECYCLE_DEPRECATED); } }