use of org.ovirt.engine.core.utils.Deserializer in project ovirt-engine by oVirt.
the class CommandCompensator method compensate.
@SuppressWarnings({ "unchecked", "synthetic-access" })
public void compensate(Guid commandId, String commandType, CompensationContext compensationContext) {
TransactionSupport.executeInNewTransaction(() -> {
Deserializer deserializer = SerializationFactory.getDeserializer();
List<BusinessEntitySnapshot> entitySnapshots = businessEntitySnapshotDao.getAllForCommandId(commandId);
log.debug("Command [id={}]: {} compensation data.", commandId, entitySnapshots.isEmpty() ? "No" : "Going over");
for (BusinessEntitySnapshot snapshot : entitySnapshots) {
Class<Serializable> snapshotClass = (Class<Serializable>) ReflectionUtils.getClassFor(snapshot.getSnapshotClass());
Serializable snapshotData = deserializer.deserialize(snapshot.getEntitySnapshot(), snapshotClass);
log.info("Command [id={}]: Compensating {} of {}; snapshot: {}.", commandId, snapshot.getSnapshotType(), snapshot.getEntityType(), snapshot.getSnapshotType() == BusinessEntitySnapshot.SnapshotType.DELETED_OR_UPDATED_ENTITY ? "id=" + snapshot.getEntityId() : snapshotData.toString());
Class<BusinessEntity<Serializable>> entityClass = (Class<BusinessEntity<Serializable>>) ReflectionUtils.getClassFor(snapshot.getEntityType());
switch(snapshot.getSnapshotType()) {
case CHANGED_STATUS_ONLY:
BusinessEntitySnapshot.EntityStatusSnapshot entityStatusSnapshot = (BusinessEntitySnapshot.EntityStatusSnapshot) snapshotData;
((StatusAwareDao<Serializable, Enum<?>>) getDaoForEntity(entityClass)).updateStatus(entityStatusSnapshot.getId(), entityStatusSnapshot.getStatus());
break;
case DELETED_OR_UPDATED_ENTITY:
deletedOrUpdateEntity(entityClass, (BusinessEntity<Serializable>) snapshotData);
break;
case UPDATED_ONLY_ENTITY:
getDaoForEntity(entityClass).update((BusinessEntity<Serializable>) snapshotData);
break;
case NEW_ENTITY_ID:
getDaoForEntity(entityClass).remove(snapshotData);
break;
case TRANSIENT_ENTITY:
objectCompensation.compensate(commandType, (TransientCompensationBusinessEntity) snapshotData);
break;
default:
throw new IllegalArgumentException(String.format("Unknown %s value, unable to compensate value %s.", BusinessEntitySnapshot.SnapshotType.class.getName(), snapshot.getSnapshotType()));
}
}
if (compensationContext == null) {
businessEntitySnapshotDao.removeAllForCommandId(commandId);
} else {
compensationContext.afterCompensationCleanup();
}
return null;
});
}
Aggregations