protected void handle(final APIDetachBackupStorageFromZoneMsg msg) { final APIDetachBackupStorageFromZoneEvent evt = new APIDetachBackupStorageFromZoneEvent(msg.getId()); try { extpEmitter.preDetach(self, msg.getZoneUuid()); } catch (BackupStorageException e) { evt.setErrorCode(errf.instantiateErrorCode(BackupStorageErrors.DETACH_ERROR, e.getMessage())); bus.publish(evt); return; } extpEmitter.beforeDetach(self, msg.getZoneUuid()); detachHook( new Completion(msg) { @Transactional private BackupStorageVO updateDb(BackupStorageVO vo, String zoneUuid) { dbf.entityForTranscationCallback( TransactionalCallback.Operation.REMOVE, BackupStorageZoneRefVO.class); String sql = "delete from BackupStorageZoneRefVO bz where bz.zoneUuid = :zoneUuid and bz.backupStorageUuid = :bsUuid"; Query q = dbf.getEntityManager().createQuery(sql); q.setParameter("zoneUuid", zoneUuid); q.setParameter("bsUuid", vo.getUuid()); q.executeUpdate(); vo = dbf.getEntityManager().find(BackupStorageVO.class, vo.getUuid()); return vo; } @Override public void success() { self = updateDb(self, msg.getZoneUuid()); extpEmitter.afterDetach(self, msg.getZoneUuid()); evt.setInventory(getSelfInventory()); logger.debug( String.format( "successfully detached backup storage[uuid:%s] from zone[uuid:%s]", self.getUuid(), msg.getBackupStorageUuid())); bus.publish(evt); } @Override public void fail(ErrorCode errorCode) { logger.warn(errorCode.toString()); extpEmitter.failToDetach(self, msg.getZoneUuid()); evt.setErrorCode( errf.instantiateErrorCode(BackupStorageErrors.DETACH_ERROR, errorCode)); bus.publish(evt); } }); }