/*
* Copyright (c) 2010-2016 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.provisioning.consistency.api;
import java.util.ArrayList;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.provisioning.api.ChangeNotificationDispatcher;
import com.evolveum.midpoint.provisioning.api.ResourceOperationDescription;
import com.evolveum.midpoint.provisioning.ucf.api.GenericFrameworkException;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
public abstract class ErrorHandler {
// @Autowired(required = true)
// protected TaskManager taskManager;
@Autowired(required = true)
protected ChangeNotificationDispatcher changeNotificationDispatcher;
// @Autowired(required = true)
// protected ResourceOperationListener operationListener;
@Autowired
protected PrismContext prismContext;
public static enum FailedOperation{
ADD, DELETE, MODIFY, GET;
}
protected boolean isPostpone(ResourceType resource){
if (resource.getConsistency() == null){
return true;
}
if (resource.getConsistency().isPostpone() == null){
return true;
}
return resource.getConsistency().isPostpone();
}
public abstract <T extends ShadowType> T handleError(T shadow, FailedOperation op, Exception ex,
boolean doDiscovery, boolean compensate, Task task, OperationResult parentResult)
throws SchemaException, GenericFrameworkException, CommunicationException, ObjectNotFoundException, ObjectAlreadyExistsException, ConfigurationException, SecurityViolationException;
protected <T extends ShadowType> Collection<ItemDelta> createAttemptModification(T shadow,
Collection<ItemDelta> modifications) {
if (modifications == null) {
modifications = new ArrayList<ItemDelta>();
}
PropertyDelta attemptDelta = PropertyDelta.createReplaceDelta(shadow.asPrismObject().getDefinition(),
ShadowType.F_ATTEMPT_NUMBER, getAttemptNumber(shadow));
modifications.add(attemptDelta);
return modifications;
}
protected Integer getAttemptNumber(ShadowType shadow) {
Integer attemptNumber = (shadow.getAttemptNumber() == null ? 0 : shadow.getAttemptNumber()+1);
return attemptNumber;
}
protected ResourceOperationDescription createOperationDescription(ShadowType shadowType, Exception ex, ResourceType resource, ObjectDelta delta, Task task, OperationResult result) {
ResourceOperationDescription operationDescription = new ResourceOperationDescription();
operationDescription.setCurrentShadow(shadowType.asPrismObject());
if (resource != null){
operationDescription.setResource(resource.asPrismObject());
}
if (task != null) {
operationDescription.setSourceChannel(task.getChannel());
}
operationDescription.setObjectDelta(delta);
// fill-in the message if necessary
OperationResult storedResult = result != null ? result.clone() : new OperationResult("dummy"); // actually, the result shouldn't be null anyway
storedResult.computeStatusIfUnknown();
if (storedResult.getMessage() == null && ex != null) {
storedResult.recordStatus(storedResult.getStatus(), ex.getMessage(), ex);
}
operationDescription.setResult(storedResult);
return operationDescription;
}
}