package org.zstack.identity; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.header.identity.AccountConstant; import org.zstack.header.query.APIQueryMessage; import org.zstack.header.search.Inventory; import org.zstack.query.AbstractMysqlQuerySubQueryExtension; import org.zstack.query.MysqlQuerySubQueryExtension; import org.zstack.query.QueryUtils; import org.zstack.utils.FieldUtils; import javax.persistence.Id; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; /** */ public class AccountSubQueryExtension extends AbstractMysqlQuerySubQueryExtension { @Autowired private AccountManager acntMgr; @Override public String makeSubquery(APIQueryMessage msg, Class inventoryClass) { if (AccountConstant.INITIAL_SYSTEM_ADMIN_UUID.equals(msg.getSession().getAccountUuid()) && IdentityGlobalConfig.SHOW_ALL_RESOURCE_TO_ADMIN.value(Boolean.class)) { return null; } Class entityClass = QueryUtils.getEntityClassFromInventoryClass(inventoryClass); if (!acntMgr.isResourceHavingAccountReference(entityClass)) { return null; } String priKey = QueryUtils.getPrimaryKeyNameFromEntityClass(entityClass); return String.format("(%s.%s in (select accountresourcerefvo.resourceUuid from AccountResourceRefVO accountresourcerefvo where accountresourcerefvo.ownerAccountUuid = '%s'" + " and accountresourcerefvo.resourceType = '%s') or %s.%s in (select sharedresourcevo.resourceUuid from SharedResourceVO sharedresourcevo where" + " (sharedresourcevo.receiverAccountUuid = '%s' or sharedresourcevo.toPublic = 1) and sharedresourcevo.resourceType = '%s'))", inventoryClass.getSimpleName().toLowerCase(), priKey, msg.getSession().getAccountUuid(), entityClass.getSimpleName(), inventoryClass.getSimpleName().toLowerCase(), priKey, msg.getSession().getAccountUuid(), entityClass.getSimpleName()); /* return String.format("%s.%s in (select resourceUuid from (select accountresourcerefvo.resourceUuid from AccountResourceRefVO accountresourcerefvo where accountresourcerefvo.ownerAccountUuid = '%s'" + " and accountresourcerefvo.resourceType = '%s' union select sharedresourcevo.resourceUuid from SharedResourceVO sharedresourcevo where" + " (sharedresourcevo.receiverAccountUuid = '%s' or sharedresourcevo.toPublic = 1) and sharedresourcevo.resourceType = '%s') as accountsubtable)", inventoryClass.getSimpleName().toLowerCase(), priKey, msg.getSession().getAccountUuid(), entityClass.getSimpleName(), msg.getSession().getAccountUuid(), entityClass.getSimpleName()); */ } }