diff --git a/engine/schema/src/main/java/com/cloud/user/dao/AccountDao.java b/engine/schema/src/main/java/com/cloud/user/dao/AccountDao.java index b97f318fd28..d7754e1b935 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/AccountDao.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/AccountDao.java @@ -31,6 +31,8 @@ public interface AccountDao extends GenericDao { List findAccountsLike(String accountName); + Pair, Integer> findAccountsLike(String accountName, Filter filter); + List findActiveAccounts(Long maxAccountId, Filter filter); List findRecentlyDeletedAccounts(Long maxAccountId, Date earliestRemovedDate, Filter filter); diff --git a/engine/schema/src/main/java/com/cloud/user/dao/AccountDaoImpl.java b/engine/schema/src/main/java/com/cloud/user/dao/AccountDaoImpl.java index 956f8a8282e..81bd545d65d 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/AccountDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/AccountDaoImpl.java @@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; +import com.google.common.base.Strings; import com.cloud.utils.db.TransactionLegacy; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -157,9 +158,16 @@ public class AccountDaoImpl extends GenericDaoBase implements A @Override public List findAccountsLike(String accountName) { + return findAccountsLike(accountName, null).first(); + } + + @Override + public Pair, Integer> findAccountsLike(String accountName, Filter filter) { SearchCriteria sc = createSearchCriteria(); - sc.addAnd("accountName", SearchCriteria.Op.LIKE, "%" + accountName + "%"); - return listBy(sc); + if (!Strings.isNullOrEmpty(accountName)) { + sc.addAnd("accountName", SearchCriteria.Op.LIKE, "%" + accountName + "%"); + } + return searchAndCount(sc, filter); } @Override diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDao.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDao.java index d1b441b831f..ff3fb7c9046 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDao.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDao.java @@ -20,12 +20,15 @@ import java.util.List; import org.apache.cloudstack.quota.vo.QuotaAccountVO; +import com.cloud.utils.Pair; import com.cloud.utils.db.GenericDao; public interface QuotaAccountDao extends GenericDao { List listAllQuotaAccount(); + Pair,Integer> listAllQuotaAccount(Long startIndex, Long pageSize); + QuotaAccountVO findByIdQuotaAccount(Long id); QuotaAccountVO persistQuotaAccount(QuotaAccountVO entity); diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDaoImpl.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDaoImpl.java index 2e28d33b394..23df0d43cbc 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDaoImpl.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaAccountDaoImpl.java @@ -22,6 +22,8 @@ import org.apache.cloudstack.quota.vo.QuotaAccountVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import com.cloud.utils.Pair; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallback; @@ -34,10 +36,16 @@ public class QuotaAccountDaoImpl extends GenericDaoBase im @Override public List listAllQuotaAccount() { - return Transaction.execute(TransactionLegacy.USAGE_DB, new TransactionCallback>() { + return listAllQuotaAccount(null, null).first(); + } + + @Override + public Pair,Integer> listAllQuotaAccount(final Long startIndex, final Long pageSize) { + return Transaction.execute(TransactionLegacy.USAGE_DB, new TransactionCallback,Integer>>() { @Override - public List doInTransaction(final TransactionStatus status) { - return listAll(); + public Pair,Integer> doInTransaction(final TransactionStatus status) { + Filter filter = new Filter(QuotaAccountVO.class, "accountId", true, startIndex, pageSize); + return searchAndCount(null, filter); } }); } diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDao.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDao.java index fda2cf67caf..e2ed3127c05 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDao.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDao.java @@ -16,6 +16,7 @@ //under the License. package org.apache.cloudstack.quota.dao; +import com.cloud.utils.Pair; import com.cloud.utils.db.GenericDao; import org.apache.cloudstack.quota.vo.QuotaTariffVO; @@ -27,9 +28,13 @@ public interface QuotaTariffDao extends GenericDao { QuotaTariffVO findTariffPlanByUsageType(int quotaType, Date onOrBefore); - List listAllTariffPlans(); + Pair, Integer> listAllTariffPlans(); - List listAllTariffPlans(Date onOrBefore); + Pair, Integer> listAllTariffPlans(final Long startIndex, final Long pageSize); + + Pair, Integer> listAllTariffPlans(Date onOrBefore); + + Pair, Integer> listAllTariffPlans(Date onOrBefore, Long startIndex, Long pageSize); Boolean updateQuotaTariff(QuotaTariffVO plan); diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java index 76c911aebec..8b1f2c20e14 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.quota.dao; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -25,6 +26,7 @@ import org.apache.cloudstack.quota.vo.QuotaTariffVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import com.cloud.utils.Pair; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -77,20 +79,41 @@ public class QuotaTariffDaoImpl extends GenericDaoBase impl } @Override - public List listAllTariffPlans() { - return Transaction.execute(TransactionLegacy.USAGE_DB, new TransactionCallback>() { + public Pair, Integer> listAllTariffPlans() { + return listAllTariffPlans(null, null); + } + + @Override + public Pair, Integer> listAllTariffPlans(final Long startIndex, final Long pageSize) { + return Transaction.execute(TransactionLegacy.USAGE_DB, new TransactionCallback, Integer>>() { @Override - public List doInTransaction(final TransactionStatus status) { - return listAll(); + public Pair, Integer> doInTransaction(final TransactionStatus status) { + return searchAndCount(null, new Filter(QuotaTariffVO.class, "updatedOn", false, startIndex, pageSize)); } }); } + + private List paginateList(final List list, final Long startIndex, final Long pageSize) { + if (startIndex == null || pageSize == null) { + return list; + } + if (list.size() < startIndex){ + return Collections.emptyList(); + } + return list.subList(startIndex.intValue(), (int) Math.min(startIndex + pageSize, list.size())); + } + @Override - public List listAllTariffPlans(final Date effectiveDate) { - return Transaction.execute(TransactionLegacy.USAGE_DB, new TransactionCallback>() { + public Pair, Integer> listAllTariffPlans(final Date effectiveDate) { + return listAllTariffPlans(effectiveDate, null, null); + } + + @Override + public Pair, Integer> listAllTariffPlans(final Date effectiveDate, final Long startIndex, final Long pageSize) { + return Transaction.execute(TransactionLegacy.USAGE_DB, new TransactionCallback, Integer>>() { @Override - public List doInTransaction(final TransactionStatus status) { + public Pair, Integer> doInTransaction(final TransactionStatus status) { List tariffs = new ArrayList(); final Filter filter = new Filter(QuotaTariffVO.class, "updatedOn", false, 0L, 1L); final SearchCriteria sc = listAllIncludedUsageType.create(); @@ -106,7 +129,7 @@ public class QuotaTariffDaoImpl extends GenericDaoBase impl } } } - return tariffs; + return new Pair<>(paginateList(tariffs, startIndex, pageSize), tariffs.size()); } }); } diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaSummaryCmd.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaSummaryCmd.java index 21441ef233a..112014ba087 100644 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaSummaryCmd.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaSummaryCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command; import com.cloud.user.Account; +import com.cloud.utils.Pair; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; @@ -58,17 +59,17 @@ public class QuotaSummaryCmd extends BaseListCmd { @Override public void execute() { Account caller = CallContext.current().getCallingAccount(); - List responses; + Pair, Integer> responses; if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { //admin account if (getAccountName() != null && getDomainId() != null) - responses = _responseBuilder.createQuotaSummaryResponse(caller.getAccountName(), caller.getDomainId()); + responses = _responseBuilder.createQuotaSummaryResponse(getAccountName(), getDomainId()); else - responses = _responseBuilder.createQuotaSummaryResponse(isListAll()); + responses = _responseBuilder.createQuotaSummaryResponse(isListAll(), getKeyword(), getStartIndex(), getPageSizeVal()); } else { responses = _responseBuilder.createQuotaSummaryResponse(caller.getAccountName(), caller.getDomainId()); } final ListResponse response = new ListResponse(); - response.setResponses(responses); + response.setResponses(responses.first(), responses.second()); response.setResponseName(getCommandName()); setResponseObject(response); } diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffListCmd.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffListCmd.java index 9e7d1bc0206..c1368104ff3 100644 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffListCmd.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffListCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command; import com.cloud.user.Account; +import com.cloud.utils.Pair; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; @@ -54,10 +55,10 @@ public class QuotaTariffListCmd extends BaseListCmd { @Override public void execute() { - final List result = _responseBuilder.listQuotaTariffPlans(this); + final Pair, Integer> result = _responseBuilder.listQuotaTariffPlans(this); final List responses = new ArrayList(); - for (final QuotaTariffVO resource : result) { + for (final QuotaTariffVO resource : result.first()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Result desc=" + resource.getDescription() + " date=" + resource.getEffectiveOn() + " val=" + resource.getCurrencyValue()); } @@ -65,7 +66,7 @@ public class QuotaTariffListCmd extends BaseListCmd { } final ListResponse response = new ListResponse(); - response.setResponses(responses); + response.setResponses(responses, result.second()); response.setResponseName(getCommandName()); setResponseObject(response); } diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java index 0f276973eed..bde432c1f69 100644 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java @@ -29,11 +29,13 @@ import org.apache.cloudstack.quota.vo.QuotaUsageVO; import java.util.Date; import java.util.List; +import com.cloud.utils.Pair; + public interface QuotaResponseBuilder { QuotaTariffVO updateQuotaTariffPlan(QuotaTariffUpdateCmd cmd); - List listQuotaTariffPlans(QuotaTariffListCmd cmd); + Pair, Integer> listQuotaTariffPlans(QuotaTariffListCmd cmd); QuotaTariffResponse createQuotaTariffResponse(QuotaTariffVO configuration); @@ -41,9 +43,11 @@ public interface QuotaResponseBuilder { QuotaBalanceResponse createQuotaBalanceResponse(List quotaUsage, Date startDate, Date endDate); - List createQuotaSummaryResponse(Boolean listAll); + Pair, Integer> createQuotaSummaryResponse(Boolean listAll); - List createQuotaSummaryResponse(String accountName, Long domainId); + Pair, Integer> createQuotaSummaryResponse(Boolean listAll, String keyword, Long startIndex, Long pageSize); + + Pair, Integer> createQuotaSummaryResponse(String accountName, Long domainId); QuotaBalanceResponse createQuotaLastBalanceResponse(List quotaBalance, Date startDate); diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java index 0fbf50e9a8f..63455527439 100644 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java @@ -69,6 +69,8 @@ import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; +import com.cloud.utils.Pair; +import com.cloud.utils.db.Filter; @Component public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { @@ -117,7 +119,7 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { } @Override - public List createQuotaSummaryResponse(final String accountName, final Long domainId) { + public Pair, Integer> createQuotaSummaryResponse(final String accountName, final Long domainId) { List result = new ArrayList(); if (accountName != null && domainId != null) { @@ -126,20 +128,30 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { result.add(qr); } - return result; + return new Pair<>(result, result.size()); } @Override - public List createQuotaSummaryResponse(Boolean listAll) { - List result = new ArrayList(); + public Pair, Integer> createQuotaSummaryResponse(Boolean listAll) { + return createQuotaSummaryResponse(listAll, null, null, null); + } + @Override + public Pair, Integer> createQuotaSummaryResponse(Boolean listAll, final String keyword, final Long startIndex, final Long pageSize) { + List result = new ArrayList(); + Integer count = 0; if (listAll) { - for (final AccountVO account : _accountDao.listAll()) { + Filter filter = new Filter(AccountVO.class, "accountName", true, startIndex, pageSize); + Pair, Integer> data = _accountDao.findAccountsLike(keyword, filter); + count = data.second(); + for (final AccountVO account : data.first()) { QuotaSummaryResponse qr = getQuotaSummaryResponse(account); result.add(qr); } } else { - for (final QuotaAccountVO quotaAccount : _quotaAccountDao.listAllQuotaAccount()) { + Pair, Integer> data = _quotaAccountDao.listAllQuotaAccount(startIndex, pageSize); + count = data.second(); + for (final QuotaAccountVO quotaAccount : data.first()) { AccountVO account = _accountDao.findById(quotaAccount.getId()); if (account == null) { continue; @@ -148,7 +160,7 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { result.add(qr); } } - return result; + return new Pair<>(result, count); } private QuotaSummaryResponse getQuotaSummaryResponse(final Account account) { @@ -160,9 +172,9 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { BigDecimal curBalance = _quotaBalanceDao.lastQuotaBalance(account.getAccountId(), account.getDomainId(), period[1].getTime()); BigDecimal quotaUsage = _quotaUsageDao.findTotalQuotaUsage(account.getAccountId(), account.getDomainId(), null, period[0].getTime(), period[1].getTime()); - qr.setAccountId(account.getAccountId()); + qr.setAccountId(account.getUuid()); qr.setAccountName(account.getAccountName()); - qr.setDomainId(account.getDomainId()); + qr.setDomainId(domain.getUuid()); qr.setDomainName(domain.getName()); qr.setBalance(curBalance); qr.setQuotaUsage(quotaUsage); @@ -341,8 +353,8 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { } @Override - public List listQuotaTariffPlans(final QuotaTariffListCmd cmd) { - List result = new ArrayList(); + public Pair, Integer> listQuotaTariffPlans(final QuotaTariffListCmd cmd) { + Pair, Integer> result; Date effectiveDate = cmd.getEffectiveDate() == null ? new Date() : cmd.getEffectiveDate(); Date adjustedEffectiveDate = _quotaService.computeAdjustedTime(effectiveDate); if (s_logger.isDebugEnabled()) { @@ -351,10 +363,14 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { if (cmd.getUsageType() != null) { QuotaTariffVO tariffPlan = _quotaTariffDao.findTariffPlanByUsageType(cmd.getUsageType(), adjustedEffectiveDate); if (tariffPlan != null) { - result.add(tariffPlan); + List list = new ArrayList<>(); + list.add(tariffPlan); + result = new Pair<>(list, list.size()); + } else { + result = new Pair<>(new ArrayList<>(), 0); } } else { - result = _quotaTariffDao.listAllTariffPlans(adjustedEffectiveDate); + result = _quotaTariffDao.listAllTariffPlans(adjustedEffectiveDate, cmd.getStartIndex(), cmd.getPageSizeVal()); } return result; } diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaSummaryResponse.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaSummaryResponse.java index 4e6f684c606..863a0c3cd59 100644 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaSummaryResponse.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaSummaryResponse.java @@ -31,7 +31,7 @@ public class QuotaSummaryResponse extends BaseResponse { @SerializedName("accountid") @Param(description = "account id") - private Long accountId; + private String accountId; @SerializedName("account") @Param(description = "account name") @@ -39,7 +39,7 @@ public class QuotaSummaryResponse extends BaseResponse { @SerializedName("domainid") @Param(description = "domain id") - private Long domainId; + private String domainId; @SerializedName("domain") @Param(description = "domain name") @@ -73,11 +73,11 @@ public class QuotaSummaryResponse extends BaseResponse { super(); } - public Long getAccountId() { + public String getAccountId() { return accountId; } - public void setAccountId(Long accountId) { + public void setAccountId(String accountId) { this.accountId = accountId; } @@ -89,11 +89,11 @@ public class QuotaSummaryResponse extends BaseResponse { this.accountName = accountName; } - public Long getDomainId() { + public String getDomainId() { return domainId; } - public void setDomainId(Long domainId) { + public void setDomainId(String domainId) { this.domainId = domainId; } diff --git a/plugins/database/quota/src/test/java/org/apache/cloudstack/api/command/QuotaTariffListCmdTest.java b/plugins/database/quota/src/test/java/org/apache/cloudstack/api/command/QuotaTariffListCmdTest.java index 5781103f027..1cbd575df37 100644 --- a/plugins/database/quota/src/test/java/org/apache/cloudstack/api/command/QuotaTariffListCmdTest.java +++ b/plugins/database/quota/src/test/java/org/apache/cloudstack/api/command/QuotaTariffListCmdTest.java @@ -33,6 +33,8 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import com.cloud.utils.Pair; + @RunWith(MockitoJUnitRunner.class) public class QuotaTariffListCmdTest extends TestCase { @Mock @@ -53,7 +55,7 @@ public class QuotaTariffListCmdTest extends TestCase { tariff.setUsageType(QuotaTypes.MEMORY); quotaTariffVOList.add(new QuotaTariffVO()); - Mockito.when(responseBuilder.listQuotaTariffPlans(Mockito.eq(cmd))).thenReturn(quotaTariffVOList); + Mockito.when(responseBuilder.listQuotaTariffPlans(Mockito.eq(cmd))).thenReturn(new Pair<>(quotaTariffVOList, quotaTariffVOList.size())); Mockito.when(responseBuilder.createQuotaTariffResponse(Mockito.any(QuotaTariffVO.class))).thenReturn(new QuotaTariffResponse()); cmd.execute();