Search in sources :

Example 1 with StatusAwareDao

use of org.ovirt.engine.core.dao.StatusAwareDao 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;
    });
}
Also used : Serializable(java.io.Serializable) StatusAwareDao(org.ovirt.engine.core.dao.StatusAwareDao) Deserializer(org.ovirt.engine.core.utils.Deserializer) BusinessEntity(org.ovirt.engine.core.common.businessentities.BusinessEntity) TransientCompensationBusinessEntity(org.ovirt.engine.core.common.businessentities.TransientCompensationBusinessEntity) BusinessEntitySnapshot(org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot)

Aggregations

Serializable (java.io.Serializable)1 BusinessEntity (org.ovirt.engine.core.common.businessentities.BusinessEntity)1 BusinessEntitySnapshot (org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot)1 TransientCompensationBusinessEntity (org.ovirt.engine.core.common.businessentities.TransientCompensationBusinessEntity)1 StatusAwareDao (org.ovirt.engine.core.dao.StatusAwareDao)1 Deserializer (org.ovirt.engine.core.utils.Deserializer)1