package org.zstack.compute.vm; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.transaction.annotation.Transactional; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.image.ImageStatus; import org.zstack.header.storage.backup.BackupStorageStatus; import javax.persistence.TypedQuery; import java.util.List; /** * Created by frank on 10/17/2015. */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class ImageBackupStorageSelector { @Autowired private DatabaseFacade dbf; private String imageUuid; private String zoneUuid; private boolean checkStatus = true; public boolean isCheckStatus() { return checkStatus; } public void setCheckStatus(boolean checkStatus) { this.checkStatus = checkStatus; } public String getImageUuid() { return imageUuid; } public void setImageUuid(String imageUuid) { this.imageUuid = imageUuid; } public String getZoneUuid() { return zoneUuid; } public void setZoneUuid(String zoneUuid) { this.zoneUuid = zoneUuid; } @Transactional(readOnly = true) public String select() { assert imageUuid != null : "imageUuid cannot be null"; assert zoneUuid != null : "zoneUuid cannot be null"; TypedQuery<String> q; if (checkStatus) { String sql = "select bs.uuid from BackupStorageVO bs, BackupStorageZoneRefVO bsRef, ImageBackupStorageRefVO iref where" + " bs.uuid = bsRef.backupStorageUuid and bsRef.zoneUuid = :zoneUuid and iref.backupStorageUuid = bs.uuid and" + " bs.status = :bsStatus and iref.imageUuid = :imageUuid and iref.status != :refStatus"; q = dbf.getEntityManager().createQuery(sql, String.class); q.setParameter("zoneUuid", zoneUuid); q.setParameter("bsStatus", BackupStorageStatus.Connected); q.setParameter("imageUuid", imageUuid); q.setParameter("refStatus", ImageStatus.Deleted); } else { String sql = "select bs.uuid from BackupStorageVO bs, BackupStorageZoneRefVO bsRef, ImageBackupStorageRefVO iref where" + " bs.uuid = bsRef.backupStorageUuid and bsRef.zoneUuid = :zoneUuid and iref.backupStorageUuid = bs.uuid and" + " iref.imageUuid = :imageUuid and iref.status != :refStatus"; q = dbf.getEntityManager().createQuery(sql, String.class); q.setParameter("zoneUuid", zoneUuid); q.setParameter("imageUuid", imageUuid); q.setParameter("refStatus", ImageStatus.Deleted); } List<String> bsUuids = q.getResultList(); if (bsUuids.isEmpty()) { return null; } return bsUuids.get(0); } }