diff --git a/api/src/com/cloud/api/commands/ListAccountsCmd.java b/api/src/com/cloud/api/commands/ListAccountsCmd.java index eac7d1b9e09..6e0a524cc93 100755 --- a/api/src/com/cloud/api/commands/ListAccountsCmd.java +++ b/api/src/com/cloud/api/commands/ListAccountsCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.AccountResponse; import com.cloud.api.response.ListResponse; import com.cloud.user.Account; +import com.cloud.utils.Pair; @Implementation(description="Lists accounts and provides detailed account information for listed accounts", responseObject=AccountResponse.class) public class ListAccountsCmd extends BaseListDomainResourcesCmd { @@ -91,15 +92,15 @@ public class ListAccountsCmd extends BaseListDomainResourcesCmd { @Override public void execute(){ - List accounts = _accountService.searchForAccounts(this); + Pair, Integer> accounts = _accountService.searchForAccounts(this); ListResponse response = new ListResponse(); List accountResponses = new ArrayList(); - for (Account account : accounts) { + for (Account account : accounts.first()) { AccountResponse acctResponse = _responseGenerator.createAccountResponse(account); acctResponse.setObjectName("account"); accountResponses.add(acctResponse); } - response.setResponses(accountResponses); + response.setResponses(accountResponses, accounts.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/com/cloud/api/commands/ListAlertsCmd.java b/api/src/com/cloud/api/commands/ListAlertsCmd.java index 15040936195..1f6c7b3e413 100644 --- a/api/src/com/cloud/api/commands/ListAlertsCmd.java +++ b/api/src/com/cloud/api/commands/ListAlertsCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.response.AlertResponse; import com.cloud.api.response.ListResponse; +import com.cloud.utils.Pair; @Implementation(description = "Lists all alerts.", responseObject = AlertResponse.class) public class ListAlertsCmd extends BaseListCmd { @@ -71,10 +72,10 @@ public class ListAlertsCmd extends BaseListCmd { @Override public void execute() { - List result = _mgr.searchForAlerts(this); + Pair, Integer> result = _mgr.searchForAlerts(this); ListResponse response = new ListResponse(); List alertResponseList = new ArrayList(); - for (Alert alert : result) { + for (Alert alert : result.first()) { AlertResponse alertResponse = new AlertResponse(); alertResponse.setId(alert.getId()); alertResponse.setAlertType(alert.getType()); @@ -85,7 +86,7 @@ public class ListAlertsCmd extends BaseListCmd { alertResponseList.add(alertResponse); } - response.setResponses(alertResponseList); + response.setResponses(alertResponseList, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListAsyncJobsCmd.java b/api/src/com/cloud/api/commands/ListAsyncJobsCmd.java index bd6e80bd094..e0520cd63a9 100644 --- a/api/src/com/cloud/api/commands/ListAsyncJobsCmd.java +++ b/api/src/com/cloud/api/commands/ListAsyncJobsCmd.java @@ -27,6 +27,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.AsyncJobResponse; import com.cloud.api.response.ListResponse; import com.cloud.async.AsyncJob; +import com.cloud.utils.Pair; @Implementation(description="Lists all pending asynchronous jobs for the account.", responseObject=AsyncJobResponse.class) public class ListAsyncJobsCmd extends BaseListAccountResourcesCmd { @@ -58,14 +59,14 @@ public class ListAsyncJobsCmd extends BaseListAccountResourcesCmd { @Override public void execute(){ - List result = _mgr.searchForAsyncJobs(this); + Pair, Integer> result = _mgr.searchForAsyncJobs(this); ListResponse response = new ListResponse(); List jobResponses = new ArrayList(); - for (AsyncJob job : result) { + for (AsyncJob job : result.first()) { jobResponses.add(_responseGenerator.createAsyncJobResponse(job)); } - response.setResponses(jobResponses); + response.setResponses(jobResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListDomainChildrenCmd.java b/api/src/com/cloud/api/commands/ListDomainChildrenCmd.java index d5b3f6cbc44..bb0dd7f7e83 100644 --- a/api/src/com/cloud/api/commands/ListDomainChildrenCmd.java +++ b/api/src/com/cloud/api/commands/ListDomainChildrenCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.DomainResponse; import com.cloud.api.response.ListResponse; import com.cloud.domain.Domain; +import com.cloud.utils.Pair; @Implementation(description="Lists all children domains belonging to a specified domain", responseObject=DomainResponse.class) public class ListDomainChildrenCmd extends BaseListCmd { @@ -84,16 +85,16 @@ public class ListDomainChildrenCmd extends BaseListCmd { @Override public void execute(){ - List result = _domainService.searchForDomainChildren(this); + Pair, Integer> result = _domainService.searchForDomainChildren(this); ListResponse response = new ListResponse(); List domainResponses = new ArrayList(); - for (Domain domain : result) { + for (Domain domain : result.first()) { DomainResponse domainResponse = _responseGenerator.createDomainResponse(domain); domainResponse.setObjectName("domain"); domainResponses.add(domainResponse); } - response.setResponses(domainResponses); + response.setResponses(domainResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListDomainsCmd.java b/api/src/com/cloud/api/commands/ListDomainsCmd.java index 9cefe9b48dd..93d1570d6df 100644 --- a/api/src/com/cloud/api/commands/ListDomainsCmd.java +++ b/api/src/com/cloud/api/commands/ListDomainsCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.DomainResponse; import com.cloud.api.response.ListResponse; import com.cloud.domain.Domain; +import com.cloud.utils.Pair; @Implementation(description="Lists domains and provides detailed information for listed domains", responseObject=DomainResponse.class) public class ListDomainsCmd extends BaseListCmd { @@ -84,16 +85,16 @@ public class ListDomainsCmd extends BaseListCmd { @Override public void execute(){ - List result = _domainService.searchForDomains(this); + Pair, Integer> result = _domainService.searchForDomains(this); ListResponse response = new ListResponse(); List domainResponses = new ArrayList(); - for (Domain domain : result) { + for (Domain domain : result.first()) { DomainResponse domainResponse = _responseGenerator.createDomainResponse(domain); domainResponse.setObjectName("domain"); domainResponses.add(domainResponse); } - response.setResponses(domainResponses); + response.setResponses(domainResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListFirewallRulesCmd.java b/api/src/com/cloud/api/commands/ListFirewallRulesCmd.java index 66dcc4d8e35..c136266b85f 100644 --- a/api/src/com/cloud/api/commands/ListFirewallRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListFirewallRulesCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.FirewallResponse; import com.cloud.api.response.ListResponse; import com.cloud.network.rules.FirewallRule; +import com.cloud.utils.Pair; @Implementation(description="Lists all firewall rules for an IP address.", responseObject=FirewallResponse.class) public class ListFirewallRulesCmd extends BaseListTaggedResourcesCmd { @@ -69,16 +70,16 @@ public class ListFirewallRulesCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List result = _firewallService.listFirewallRules(this); + Pair, Integer> result = _firewallService.listFirewallRules(this); ListResponse response = new ListResponse(); List fwResponses = new ArrayList(); - for (FirewallRule fwRule : result) { + for (FirewallRule fwRule : result.first()) { FirewallResponse ruleData = _responseGenerator.createFirewallResponse(fwRule); ruleData.setObjectName("firewallrule"); fwResponses.add(ruleData); } - response.setResponses(fwResponses); + response.setResponses(fwResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java b/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java index f385fe04c79..fedbac0d177 100644 --- a/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java @@ -22,7 +22,6 @@ import java.util.List; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; -import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.BaseListProjectAndAccountResourcesCmd; import com.cloud.api.IdentityMapper; import com.cloud.api.Implementation; @@ -32,6 +31,7 @@ import com.cloud.api.response.IpForwardingRuleResponse; import com.cloud.api.response.ListResponse; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.StaticNatRule; +import com.cloud.utils.Pair; @Implementation(description="List the ip forwarding rules", responseObject=FirewallRuleResponse.class) public class ListIpForwardingRulesCmd extends BaseListProjectAndAccountResourcesCmd { @@ -82,17 +82,18 @@ public class ListIpForwardingRulesCmd extends BaseListProjectAndAccountResources @Override public void execute(){ - List result = _rulesService.searchStaticNatRules(publicIpAddressId, id, vmId, this.getStartIndex(), this.getPageSizeVal(), this.getAccountName(), this.getDomainId(), this.getProjectId(), this.isRecursive(), this.listAll()); + Pair, Integer> result = _rulesService.searchStaticNatRules(publicIpAddressId, id, vmId, + this.getStartIndex(), this.getPageSizeVal(), this.getAccountName(), this.getDomainId(), this.getProjectId(), this.isRecursive(), this.listAll()); ListResponse response = new ListResponse(); List ipForwardingResponses = new ArrayList(); - for (FirewallRule rule : result) { + for (FirewallRule rule : result.first()) { StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule, false); IpForwardingRuleResponse resp = _responseGenerator.createIpForwardingRuleResponse(staticNatRule); if (resp != null) { ipForwardingResponses.add(resp); } } - response.setResponses(ipForwardingResponses); + response.setResponses(ipForwardingResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java b/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java index 43b05402269..8413f607a6b 100644 --- a/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.LoadBalancerResponse; import com.cloud.network.rules.LoadBalancer; +import com.cloud.utils.Pair; @Implementation(description = "Lists load balancer rules.", responseObject = LoadBalancerResponse.class) public class ListLoadBalancerRulesCmd extends BaseListTaggedResourcesCmd { @@ -94,17 +95,17 @@ public class ListLoadBalancerRulesCmd extends BaseListTaggedResourcesCmd { @Override public void execute() { - List loadBalancers = _lbService.searchForLoadBalancers(this); + Pair, Integer> loadBalancers = _lbService.searchForLoadBalancers(this); ListResponse response = new ListResponse(); List lbResponses = new ArrayList(); if (loadBalancers != null) { - for (LoadBalancer loadBalancer : loadBalancers) { + for (LoadBalancer loadBalancer : loadBalancers.first()) { LoadBalancerResponse lbResponse = _responseGenerator.createLoadBalancerResponse(loadBalancer); lbResponse.setObjectName("loadbalancerrule"); lbResponses.add(lbResponse); } } - response.setResponses(lbResponses); + response.setResponses(lbResponses, loadBalancers.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListNetworkACLsCmd.java b/api/src/com/cloud/api/commands/ListNetworkACLsCmd.java index 3529558de71..bdb3c3b733b 100644 --- a/api/src/com/cloud/api/commands/ListNetworkACLsCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworkACLsCmd.java @@ -31,6 +31,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.NetworkACLResponse; import com.cloud.network.rules.FirewallRule; +import com.cloud.utils.Pair; @Implementation(description="Lists all network ACLs", responseObject=NetworkACLResponse.class) public class ListNetworkACLsCmd extends BaseListTaggedResourcesCmd { @@ -79,15 +80,15 @@ public class ListNetworkACLsCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List result = _networkACLService.listNetworkACLs(this); + Pair,Integer> result = _networkACLService.listNetworkACLs(this); ListResponse response = new ListResponse(); List aclResponses = new ArrayList(); - for (FirewallRule acl : result) { + for (FirewallRule acl : result.first()) { NetworkACLResponse ruleData = _responseGenerator.createNetworkACLResponse(acl); aclResponses.add(ruleData); } - response.setResponses(aclResponses); + response.setResponses(aclResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java b/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java index 499a574bffb..0315a12d1a5 100644 --- a/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.FirewallRuleResponse; import com.cloud.api.response.ListResponse; import com.cloud.network.rules.PortForwardingRule; +import com.cloud.utils.Pair; @Implementation(description="Lists all port forwarding rules for an IP address.", responseObject=FirewallRuleResponse.class) public class ListPortForwardingRulesCmd extends BaseListTaggedResourcesCmd { @@ -71,16 +72,16 @@ public class ListPortForwardingRulesCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List result = _rulesService.listPortForwardingRules(this); + Pair, Integer> result = _rulesService.listPortForwardingRules(this); ListResponse response = new ListResponse(); List fwResponses = new ArrayList(); - for (PortForwardingRule fwRule : result) { + for (PortForwardingRule fwRule : result.first()) { FirewallRuleResponse ruleData = _responseGenerator.createPortForwardingRuleResponse(fwRule); ruleData.setObjectName("portforwardingrule"); fwResponses.add(ruleData); } - response.setResponses(fwResponses); + response.setResponses(fwResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListPrivateGatewaysCmd.java b/api/src/com/cloud/api/commands/ListPrivateGatewaysCmd.java index 203d51745d6..389df5e3880 100644 --- a/api/src/com/cloud/api/commands/ListPrivateGatewaysCmd.java +++ b/api/src/com/cloud/api/commands/ListPrivateGatewaysCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.PrivateGatewayResponse; import com.cloud.network.vpc.PrivateGateway; +import com.cloud.utils.Pair; @Implementation(description="List private gateways", responseObject=PrivateGatewayResponse.class) public class ListPrivateGatewaysCmd extends BaseListProjectAndAccountResourcesCmd{ @@ -91,14 +92,14 @@ public class ListPrivateGatewaysCmd extends BaseListProjectAndAccountResourcesCm @Override public void execute() { - List gateways = _vpcService.listPrivateGateway(this); + Pair, Integer> gateways = _vpcService.listPrivateGateway(this); ListResponse response = new ListResponse(); List projectResponses = new ArrayList(); - for (PrivateGateway gateway : gateways) { + for (PrivateGateway gateway : gateways.first()) { PrivateGatewayResponse gatewayResponse = _responseGenerator.createPrivateGatewayResponse(gateway); projectResponses.add(gatewayResponse); } - response.setResponses(projectResponses); + response.setResponses(projectResponses, gateways.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java b/api/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java index c6acf97c214..a49c5fe6b79 100644 --- a/api/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java +++ b/api/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java @@ -30,6 +30,7 @@ import com.cloud.api.response.IPAddressResponse; import com.cloud.api.response.ListResponse; import com.cloud.async.AsyncJob; import com.cloud.network.IpAddress; +import com.cloud.utils.Pair; @Implementation(description="Lists all public ip addresses", responseObject=IPAddressResponse.class) @@ -141,16 +142,16 @@ public class ListPublicIpAddressesCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List result = _mgr.searchForIPAddresses(this); + Pair, Integer> result = _mgr.searchForIPAddresses(this); ListResponse response = new ListResponse(); List ipAddrResponses = new ArrayList(); - for (IpAddress ipAddress : result) { + for (IpAddress ipAddress : result.first()) { IPAddressResponse ipResponse = _responseGenerator.createIPAddressResponse(ipAddress); ipResponse.setObjectName("publicipaddress"); ipAddrResponses.add(ipResponse); } - response.setResponses(ipAddrResponses); + response.setResponses(ipAddrResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListRemoteAccessVpnsCmd.java b/api/src/com/cloud/api/commands/ListRemoteAccessVpnsCmd.java index 4260e3a3ee3..9dd16448086 100644 --- a/api/src/com/cloud/api/commands/ListRemoteAccessVpnsCmd.java +++ b/api/src/com/cloud/api/commands/ListRemoteAccessVpnsCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.RemoteAccessVpnResponse; import com.cloud.network.RemoteAccessVpn; +import com.cloud.utils.Pair; @Implementation(description="Lists remote access vpns", responseObject=RemoteAccessVpnResponse.class) public class ListRemoteAccessVpnsCmd extends BaseListProjectAndAccountResourcesCmd { @@ -64,15 +65,15 @@ public class ListRemoteAccessVpnsCmd extends BaseListProjectAndAccountResourcesC @Override public void execute(){ - List vpns = _ravService.searchForRemoteAccessVpns(this); + Pair, Integer> vpns = _ravService.searchForRemoteAccessVpns(this); ListResponse response = new ListResponse(); List vpnResponses = new ArrayList(); - if (vpns != null && !vpns.isEmpty()) { - for (RemoteAccessVpn vpn : vpns) { + if (vpns.first() != null && !vpns.first().isEmpty()) { + for (RemoteAccessVpn vpn : vpns.first()) { vpnResponses.add(_responseGenerator.createRemoteAccessVpnResponse(vpn)); } } - response.setResponses(vpnResponses); + response.setResponses(vpnResponses, vpns.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListRoutersCmd.java b/api/src/com/cloud/api/commands/ListRoutersCmd.java index 72a9144edda..8bf9ba818dd 100644 --- a/api/src/com/cloud/api/commands/ListRoutersCmd.java +++ b/api/src/com/cloud/api/commands/ListRoutersCmd.java @@ -30,6 +30,7 @@ import com.cloud.api.response.DomainRouterResponse; import com.cloud.api.response.ListResponse; import com.cloud.async.AsyncJob; import com.cloud.network.router.VirtualRouter; +import com.cloud.utils.Pair; @Implementation(description="List routers.", responseObject=DomainRouterResponse.class) public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd { @@ -129,16 +130,16 @@ public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd { @Override public void execute(){ - List result = _mgr.searchForRouters(this); + Pair, Integer> result = _mgr.searchForRouters(this); ListResponse response = new ListResponse(); List routerResponses = new ArrayList(); - for (VirtualRouter router : result) { + for (VirtualRouter router : result.first()) { DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(router); routerResponse.setObjectName("router"); routerResponses.add(routerResponse); } - response.setResponses(routerResponses); + response.setResponses(routerResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListSnapshotsCmd.java b/api/src/com/cloud/api/commands/ListSnapshotsCmd.java index d7b2c9e05f9..cc2aad8f0e1 100644 --- a/api/src/com/cloud/api/commands/ListSnapshotsCmd.java +++ b/api/src/com/cloud/api/commands/ListSnapshotsCmd.java @@ -30,6 +30,7 @@ import com.cloud.api.response.ListResponse; import com.cloud.api.response.SnapshotResponse; import com.cloud.async.AsyncJob; import com.cloud.storage.Snapshot; +import com.cloud.utils.Pair; @Implementation(description="Lists all available snapshots for the account.", responseObject=SnapshotResponse.class) @@ -98,15 +99,15 @@ public class ListSnapshotsCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List result = _snapshotService.listSnapshots(this); + Pair, Integer> result = _snapshotService.listSnapshots(this); ListResponse response = new ListResponse(); List snapshotResponses = new ArrayList(); - for (Snapshot snapshot : result) { + for (Snapshot snapshot : result.first()) { SnapshotResponse snapshotResponse = _responseGenerator.createSnapshotResponse(snapshot); snapshotResponse.setObjectName("snapshot"); snapshotResponses.add(snapshotResponse); } - response.setResponses(snapshotResponses); + response.setResponses(snapshotResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/com/cloud/api/commands/ListStaticRoutesCmd.java b/api/src/com/cloud/api/commands/ListStaticRoutesCmd.java index 3cd828678f3..93b533e6f6f 100644 --- a/api/src/com/cloud/api/commands/ListStaticRoutesCmd.java +++ b/api/src/com/cloud/api/commands/ListStaticRoutesCmd.java @@ -26,6 +26,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.StaticRouteResponse; import com.cloud.network.vpc.StaticRoute; +import com.cloud.utils.Pair; @Implementation(description="Lists all static routes", responseObject=StaticRouteResponse.class) public class ListStaticRoutesCmd extends BaseListTaggedResourcesCmd { @@ -68,15 +69,15 @@ public class ListStaticRoutesCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List result = _vpcService.listStaticRoutes(this); + Pair, Integer> result = _vpcService.listStaticRoutes(this); ListResponse response = new ListResponse(); List routeResponses = new ArrayList(); - for (StaticRoute route : result) { + for (StaticRoute route : result.first()) { StaticRouteResponse ruleData = _responseGenerator.createStaticRouteResponse(route); routeResponses.add(ruleData); } - response.setResponses(routeResponses); + response.setResponses(routeResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListTagsCmd.java b/api/src/com/cloud/api/commands/ListTagsCmd.java index 7206b1c882c..b832b423fd0 100644 --- a/api/src/com/cloud/api/commands/ListTagsCmd.java +++ b/api/src/com/cloud/api/commands/ListTagsCmd.java @@ -27,6 +27,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.ResourceTagResponse; import com.cloud.server.ResourceTag; +import com.cloud.utils.Pair; @Implementation(description = "List resource tag(s)", responseObject = ResourceTagResponse.class, since = "Burbank") public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd{ @@ -55,14 +56,14 @@ public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd{ @Override public void execute() { - List tags = _taggedResourceService.listTags(this); + Pair, Integer> tags = _taggedResourceService.listTags(this); ListResponse response = new ListResponse(); List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { + for (ResourceTag tag : tags.first()) { ResourceTagResponse tagResponse = _responseGenerator.createResourceTagResponse(tag, false); tagResponses.add(tagResponse); } - response.setResponses(tagResponses); + response.setResponses(tagResponses, tags.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/com/cloud/api/commands/ListUsersCmd.java b/api/src/com/cloud/api/commands/ListUsersCmd.java index ec3a1bb54f1..03db56d7187 100644 --- a/api/src/com/cloud/api/commands/ListUsersCmd.java +++ b/api/src/com/cloud/api/commands/ListUsersCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.UserResponse; import com.cloud.user.UserAccount; +import com.cloud.utils.Pair; @Implementation(description="Lists user accounts", responseObject=UserResponse.class) public class ListUsersCmd extends BaseListAccountResourcesCmd { @@ -85,14 +86,14 @@ public class ListUsersCmd extends BaseListAccountResourcesCmd { @Override public void execute(){ - List result = _accountService.searchForUsers(this); + Pair, Integer> result = _accountService.searchForUsers(this); ListResponse response = new ListResponse(); List userResponses = new ArrayList(); - for (UserAccount user : result) { + for (UserAccount user : result.first()) { UserResponse userResponse = _responseGenerator.createUserResponse(user); userResponses.add(userResponse); } - response.setResponses(userResponses); + response.setResponses(userResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListVMsCmd.java b/api/src/com/cloud/api/commands/ListVMsCmd.java index 37dfcd32620..2f6f9886563 100755 --- a/api/src/com/cloud/api/commands/ListVMsCmd.java +++ b/api/src/com/cloud/api/commands/ListVMsCmd.java @@ -33,6 +33,8 @@ import com.cloud.api.response.UserVmResponse; import com.cloud.async.AsyncJob; import com.cloud.exception.InvalidParameterValueException; import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; + @Implementation(description="List the virtual machines owned by the account.", responseObject=UserVmResponse.class) public class ListVMsCmd extends BaseListTaggedResourcesCmd { @@ -197,17 +199,17 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List result = _userVmService.searchForUserVMs(this); + Pair, Integer> result = _userVmService.searchForUserVMs(this); ListResponse response = new ListResponse(); EnumSet details = getDetails(); List vmResponses; if (details.contains(VMDetails.all)){ // for all use optimized version - vmResponses = _responseGenerator.createUserVmResponse("virtualmachine", result.toArray(new UserVm[result.size()])); + vmResponses = _responseGenerator.createUserVmResponse("virtualmachine", result.first().toArray(new UserVm[result.first().size()])); } else { - vmResponses = _responseGenerator.createUserVmResponse("virtualmachine", getDetails(), result.toArray(new UserVm[result.size()])); + vmResponses = _responseGenerator.createUserVmResponse("virtualmachine", getDetails(), result.first().toArray(new UserVm[result.first().size()])); } - response.setResponses(vmResponses); + response.setResponses(vmResponses, result.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListVolumesCmd.java b/api/src/com/cloud/api/commands/ListVolumesCmd.java index e0393a9b76b..7875c83aced 100755 --- a/api/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/api/src/com/cloud/api/commands/ListVolumesCmd.java @@ -30,6 +30,7 @@ import com.cloud.api.response.ListResponse; import com.cloud.api.response.VolumeResponse; import com.cloud.async.AsyncJob; import com.cloud.storage.Volume; +import com.cloud.utils.Pair; @Implementation(description="Lists all volumes.", responseObject=VolumeResponse.class) @@ -117,17 +118,17 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - List volumes = _storageService.searchForVolumes(this); + Pair, Integer> volumes = _storageService.searchForVolumes(this); ListResponse response = new ListResponse(); List volResponses = new ArrayList(); - for (Volume volume : volumes) { + for (Volume volume : volumes.first()) { VolumeResponse volResponse = _responseGenerator.createVolumeResponse(volume); volResponse.setObjectName("volume"); volResponses.add(volResponse); } - response.setResponses(volResponses); + response.setResponses(volResponses, volumes.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListVpnUsersCmd.java b/api/src/com/cloud/api/commands/ListVpnUsersCmd.java index 9bc77ffb805..9280ed59f0a 100644 --- a/api/src/com/cloud/api/commands/ListVpnUsersCmd.java +++ b/api/src/com/cloud/api/commands/ListVpnUsersCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.Parameter; import com.cloud.api.response.ListResponse; import com.cloud.api.response.VpnUsersResponse; import com.cloud.network.VpnUser; +import com.cloud.utils.Pair; @Implementation(description="Lists vpn users", responseObject=VpnUsersResponse.class) public class ListVpnUsersCmd extends BaseListProjectAndAccountResourcesCmd { @@ -69,15 +70,15 @@ public class ListVpnUsersCmd extends BaseListProjectAndAccountResourcesCmd { @Override public void execute(){ - List vpnUsers = _ravService.searchForVpnUsers(this); + Pair, Integer> vpnUsers = _ravService.searchForVpnUsers(this); ListResponse response = new ListResponse(); List vpnResponses = new ArrayList(); - for (VpnUser vpnUser : vpnUsers) { + for (VpnUser vpnUser : vpnUsers.first()) { vpnResponses.add(_responseGenerator.createVpnUserResponse(vpnUser)); } - response.setResponses(vpnResponses); + response.setResponses(vpnResponses, vpnUsers.second()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/response/ListResponse.java b/api/src/com/cloud/api/response/ListResponse.java index 47f76a52afa..ebba4020ccb 100644 --- a/api/src/com/cloud/api/response/ListResponse.java +++ b/api/src/com/cloud/api/response/ListResponse.java @@ -22,6 +22,7 @@ import com.cloud.api.ResponseObject; public class ListResponse extends BaseResponse { List responses; + private transient Integer count; public List getResponses() { return responses; @@ -30,12 +31,22 @@ public class ListResponse extends BaseResponse { public void setResponses(List responses) { this.responses = responses; } + + public void setResponses(List responses, Integer count) { + this.responses = responses; + this.count = count; + } + public Integer getCount() { + if (count != null) { + return count; + } + if (responses != null) { return responses.size(); - } else { - return null; } + + return null; } } diff --git a/api/src/com/cloud/network/firewall/FirewallService.java b/api/src/com/cloud/network/firewall/FirewallService.java index 6eb9f9943ac..07c2fb5a838 100644 --- a/api/src/com/cloud/network/firewall/FirewallService.java +++ b/api/src/com/cloud/network/firewall/FirewallService.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.network.firewall; + import java.util.List; import com.cloud.api.commands.ListFirewallRulesCmd; @@ -23,11 +24,12 @@ import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.rules.FirewallRule; import com.cloud.user.Account; +import com.cloud.utils.Pair; public interface FirewallService { FirewallRule createFirewallRule(FirewallRule rule) throws NetworkRuleConflictException; - List listFirewallRules(ListFirewallRulesCmd cmd); + Pair, Integer> listFirewallRules(ListFirewallRulesCmd cmd); /** * Revokes a firewall rule diff --git a/api/src/com/cloud/network/firewall/NetworkACLService.java b/api/src/com/cloud/network/firewall/NetworkACLService.java index 1977088881c..10896b6dc74 100644 --- a/api/src/com/cloud/network/firewall/NetworkACLService.java +++ b/api/src/com/cloud/network/firewall/NetworkACLService.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.network.firewall; + import java.util.List; import com.cloud.api.commands.ListNetworkACLsCmd; @@ -23,6 +24,7 @@ import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.rules.FirewallRule; import com.cloud.user.Account; +import com.cloud.utils.Pair; public interface NetworkACLService { FirewallRule getNetworkACL(long ruleId); @@ -43,6 +45,6 @@ public interface NetworkACLService { * @param listNetworkACLsCmd * @return */ - List listNetworkACLs(ListNetworkACLsCmd cmd); + Pair, Integer> listNetworkACLs(ListNetworkACLsCmd cmd); } diff --git a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java index d30195db5b9..0cf2ef94ace 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java @@ -30,6 +30,8 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.rules.LoadBalancer; import com.cloud.network.rules.StickinessPolicy; import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; + public interface LoadBalancingRulesService { /** @@ -90,7 +92,7 @@ public interface LoadBalancingRulesService { * by id, name, public ip, and vm instance id * @return list of load balancers that match the criteria */ - List searchForLoadBalancers(ListLoadBalancerRulesCmd cmd); + Pair, Integer> searchForLoadBalancers(ListLoadBalancerRulesCmd cmd); /** * List stickiness policies based on the given criteria @@ -105,4 +107,4 @@ public interface LoadBalancingRulesService { LoadBalancer findById(long LoadBalancer); -} +} \ No newline at end of file diff --git a/api/src/com/cloud/network/rules/RulesService.java b/api/src/com/cloud/network/rules/RulesService.java index 9dd602bc330..8eadfba7712 100644 --- a/api/src/com/cloud/network/rules/RulesService.java +++ b/api/src/com/cloud/network/rules/RulesService.java @@ -23,9 +23,10 @@ import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; +import com.cloud.utils.Pair; public interface RulesService { - List searchStaticNatRules(Long ipId, Long id, Long vmId, Long start, Long size, String accountName, Long domainId, Long projectId, boolean isRecursive, boolean listAll); + Pair, Integer> searchStaticNatRules(Long ipId, Long id, Long vmId, Long start, Long size, String accountName, Long domainId, Long projectId, boolean isRecursive, boolean listAll); /** * Creates a port forwarding rule between two ip addresses or between @@ -60,7 +61,7 @@ public interface RulesService { * the command object holding the criteria for listing port forwarding rules (the ipAddress) * @return list of port forwarding rules on the given address, empty list if no rules exist */ - public List listPortForwardingRules(ListPortForwardingRulesCmd cmd); + public Pair, Integer> listPortForwardingRules(ListPortForwardingRulesCmd cmd); boolean applyPortForwardingRules(long ipAdddressId, Account caller) throws ResourceUnavailableException; diff --git a/api/src/com/cloud/network/security/SecurityGroupService.java b/api/src/com/cloud/network/security/SecurityGroupService.java index bace6bbcd26..4a4b1712aba 100644 --- a/api/src/com/cloud/network/security/SecurityGroupService.java +++ b/api/src/com/cloud/network/security/SecurityGroupService.java @@ -18,13 +18,13 @@ package com.cloud.network.security; import java.util.List; -import com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd; import com.cloud.api.commands.AuthorizeSecurityGroupEgressCmd; +import com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd; import com.cloud.api.commands.CreateSecurityGroupCmd; import com.cloud.api.commands.DeleteSecurityGroupCmd; import com.cloud.api.commands.ListSecurityGroupsCmd; -import com.cloud.api.commands.RevokeSecurityGroupIngressCmd; import com.cloud.api.commands.RevokeSecurityGroupEgressCmd; +import com.cloud.api.commands.RevokeSecurityGroupIngressCmd; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceInUseException; diff --git a/api/src/com/cloud/network/vpc/VpcService.java b/api/src/com/cloud/network/vpc/VpcService.java index 7d8de553897..c13e37f1b55 100644 --- a/api/src/com/cloud/network/vpc/VpcService.java +++ b/api/src/com/cloud/network/vpc/VpcService.java @@ -34,6 +34,7 @@ import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.user.Account; import com.cloud.user.User; +import com.cloud.utils.Pair; public interface VpcService { @@ -190,7 +191,7 @@ public interface VpcService { * @param listPrivateGatewaysCmd * @return */ - public List listPrivateGateway(ListPrivateGatewaysCmd listPrivateGatewaysCmd); + public Pair, Integer> listPrivateGateway(ListPrivateGatewaysCmd listPrivateGatewaysCmd); /** * @param routeId @@ -223,7 +224,7 @@ public interface VpcService { * @param listStaticRoutesCmd * @return */ - public List listStaticRoutes(ListStaticRoutesCmd cmd); + public Pair, Integer> listStaticRoutes(ListStaticRoutesCmd cmd); /** * @param id diff --git a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java index b2fb34b6831..2f956374bfd 100644 --- a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java +++ b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java @@ -24,6 +24,7 @@ import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; +import com.cloud.utils.Pair; public interface RemoteAccessVpnService { @@ -37,8 +38,8 @@ public interface RemoteAccessVpnService { List listVpnUsers(long vpnOwnerId, String userName); boolean applyVpnUsers(long vpnOwnerId, String userName); - List searchForRemoteAccessVpns(ListRemoteAccessVpnsCmd cmd); - List searchForVpnUsers(ListVpnUsersCmd cmd); + Pair, Integer> searchForRemoteAccessVpns(ListRemoteAccessVpnsCmd cmd); + Pair, Integer> searchForVpnUsers(ListVpnUsersCmd cmd); List listRemoteAccessVpns(long networkId); diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index 8dcc3983599..d1a789edbec 100755 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -184,7 +184,7 @@ public interface ManagementService { * @param cmd * @return List of DomainRouters. */ - List searchForRouters(ListRoutersCmd cmd); + Pair, Integer> searchForRouters(ListRoutersCmd cmd); /** * Obtains a list of IP Addresses by the specified search criteria. Can search by: "userId", "dataCenterId", @@ -194,7 +194,7 @@ public interface ManagementService { * the command that wraps the search criteria * @return List of IPAddresses */ - List searchForIPAddresses(ListPublicIpAddressesCmd cmd); + Pair, Integer> searchForIPAddresses(ListPublicIpAddressesCmd cmd); /** * Obtains a list of all guest OS. @@ -235,7 +235,7 @@ public interface ManagementService { * @param c * @return List of Alerts */ - List searchForAlerts(ListAlertsCmd cmd); + Pair, Integer> searchForAlerts(ListAlertsCmd cmd); /** * list all the capacity rows in capacity operations table @@ -363,7 +363,7 @@ public interface ManagementService { * the command specifying the account and start date parameters * @return the list of async jobs that match the criteria */ - List searchForAsyncJobs(ListAsyncJobsCmd cmd); + Pair, Integer> searchForAsyncJobs(ListAsyncJobsCmd cmd); /** * Generates a random password that will be used (initially) by newly created and started virtual machines diff --git a/api/src/com/cloud/server/TaggedResourceService.java b/api/src/com/cloud/server/TaggedResourceService.java index dd1b1c6b4ee..dce799e5ca2 100644 --- a/api/src/com/cloud/server/TaggedResourceService.java +++ b/api/src/com/cloud/server/TaggedResourceService.java @@ -21,6 +21,7 @@ import java.util.Map; import com.cloud.api.commands.ListTagsCmd; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.utils.Pair; public interface TaggedResourceService { @@ -46,7 +47,7 @@ public interface TaggedResourceService { * @param listTagsCmd * @return */ - List listTags(ListTagsCmd listTagsCmd); + Pair, Integer> listTags(ListTagsCmd listTagsCmd); /** * @param resourceIds diff --git a/api/src/com/cloud/storage/StorageService.java b/api/src/com/cloud/storage/StorageService.java index 4fb3b55f057..1649e159deb 100644 --- a/api/src/com/cloud/storage/StorageService.java +++ b/api/src/com/cloud/storage/StorageService.java @@ -32,6 +32,7 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceInUseException; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.utils.Pair; public interface StorageService{ /** @@ -114,7 +115,7 @@ public interface StorageService{ Volume migrateVolume(Long volumeId, Long storagePoolId) throws ConcurrentOperationException; - List searchForVolumes(ListVolumesCmd cmd); + Pair, Integer> searchForVolumes(ListVolumesCmd cmd); /** * Uploads the volume to secondary storage diff --git a/api/src/com/cloud/storage/snapshot/SnapshotService.java b/api/src/com/cloud/storage/snapshot/SnapshotService.java index 0c0e9b6c7e2..84388e9cfe6 100644 --- a/api/src/com/cloud/storage/snapshot/SnapshotService.java +++ b/api/src/com/cloud/storage/snapshot/SnapshotService.java @@ -28,6 +28,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.storage.Snapshot; import com.cloud.storage.Volume; import com.cloud.user.Account; +import com.cloud.utils.Pair; public interface SnapshotService { @@ -39,7 +40,7 @@ public interface SnapshotService { * @return list of snapshots * @throws PermissionDeniedException */ - List listSnapshots(ListSnapshotsCmd cmd); + Pair, Integer> listSnapshots(ListSnapshotsCmd cmd); /** * Delete specified snapshot from the specified. If no other policies are assigned it calls destroy snapshot. This diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java index 53383d3c7c3..90e35519578 100755 --- a/api/src/com/cloud/user/AccountService.java +++ b/api/src/com/cloud/user/AccountService.java @@ -191,9 +191,9 @@ public interface AccountService { public String[] createApiKeyAndSecretKey(RegisterCmd cmd); - List searchForAccounts(ListAccountsCmd cmd); + Pair, Integer> searchForAccounts(ListAccountsCmd cmd); - List searchForUsers(ListUsersCmd cmd) + Pair, Integer> searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException; UserAccount getUserByApiKey(String apiKey); diff --git a/api/src/com/cloud/user/DomainService.java b/api/src/com/cloud/user/DomainService.java index 362f87ea0be..83f362264b0 100644 --- a/api/src/com/cloud/user/DomainService.java +++ b/api/src/com/cloud/user/DomainService.java @@ -22,6 +22,7 @@ import com.cloud.api.commands.ListDomainChildrenCmd; import com.cloud.api.commands.ListDomainsCmd; import com.cloud.domain.Domain; import com.cloud.exception.PermissionDeniedException; +import com.cloud.utils.Pair; public interface DomainService { @@ -39,10 +40,10 @@ public interface DomainService { boolean deleteDomain(long domainId, Boolean cleanup); - List searchForDomains(ListDomainsCmd cmd) + Pair, Integer> searchForDomains(ListDomainsCmd cmd) throws PermissionDeniedException; - List searchForDomainChildren(ListDomainChildrenCmd cmd) + Pair, Integer> searchForDomainChildren(ListDomainChildrenCmd cmd) throws PermissionDeniedException; } diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java index 6635657042f..02682b0c6f3 100755 --- a/api/src/com/cloud/vm/UserVmService.java +++ b/api/src/com/cloud/vm/UserVmService.java @@ -53,6 +53,7 @@ import com.cloud.storage.Volume; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; import com.cloud.utils.exception.ExecutionException; public interface UserVmService { @@ -378,7 +379,7 @@ public interface UserVmService { * the API command that wraps the search criteria * @return List of UserVMs. */ - List searchForUserVMs(ListVMsCmd cmd); + Pair, Integer> searchForUserVMs(ListVMsCmd cmd); HypervisorType getHypervisorTypeOfUserVM(long vmid); diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 3fac7a74a7d..1d6ba4f9ec5 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -322,7 +322,8 @@ public class ApiDBUtils { } public static List searchForUserVMs(Criteria c, List permittedAccounts) { - return _userVmMgr.searchForUserVMs(c, _accountDao.findById(Account.ACCOUNT_ID_SYSTEM), null, false, permittedAccounts, false, null, null); + return _userVmMgr.searchForUserVMs(c, _accountDao.findById(Account.ACCOUNT_ID_SYSTEM), + null, false, permittedAccounts, false, null, null).first(); } public static List searchForStoragePools(Criteria c) { diff --git a/server/src/com/cloud/api/response/ApiResponseSerializer.java b/server/src/com/cloud/api/response/ApiResponseSerializer.java index 124bee1f2e3..1429d14ed58 100644 --- a/server/src/com/cloud/api/response/ApiResponseSerializer.java +++ b/server/src/com/cloud/api/response/ApiResponseSerializer.java @@ -80,9 +80,9 @@ public class ApiResponseSerializer { jsonStr = unescape(jsonStr); if (count != null && count != 0) { - sb.append("{ \"" + ApiConstants.COUNT + "\":" + ((ListResponse) result).getCount() + " ,\"" + responses.get(0).getObjectName() + "\" : [ " + jsonStr); + sb.append("{ \"" + ApiConstants.COUNT + "\":" + count + " ,\"" + responses.get(0).getObjectName() + "\" : [ " + jsonStr); } - for (int i = 1; i < count; i++) { + for (int i = 1; i < ((ListResponse) result).getResponses().size(); i++) { jsonStr = gson.toJson(responses.get(i)); jsonStr = unescape(jsonStr); sb.append(", " + jsonStr); diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java index 82aa9d25809..6e3805bac59 100644 --- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java +++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java @@ -66,6 +66,8 @@ import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.DomainManager; import com.cloud.user.UserContext; +import com.cloud.utils.IdentityProxy; +import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; @@ -206,7 +208,7 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma } @Override - public List listFirewallRules(ListFirewallRulesCmd cmd) { + public Pair, Integer> listFirewallRules(ListFirewallRulesCmd cmd) { Long ipId = cmd.getIpAddressId(); Long id = cmd.getId(); Map tags = cmd.getTags(); @@ -272,7 +274,8 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma sc.setParameters("purpose", Purpose.Firewall); - return _firewallDao.search(sc, filter); + Pair, Integer> result = _firewallDao.searchAndCount(sc, filter); + return new Pair, Integer>(result.first(), result.second()); } @Override diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index ba9923f47da..ba4b0976181 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -95,6 +95,8 @@ import com.cloud.user.DomainService; import com.cloud.user.UserContext; import com.cloud.user.dao.AccountDao; import com.cloud.uservm.UserVm; +import com.cloud.utils.IdentityProxy; +import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; @@ -1237,7 +1239,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa } @Override - public List searchForLoadBalancers(ListLoadBalancerRulesCmd cmd) { + public Pair, Integer> searchForLoadBalancers(ListLoadBalancerRulesCmd cmd) { Long ipId = cmd.getPublicIpId(); Long zoneId = cmd.getZoneId(); Long id = cmd.getId(); @@ -1328,7 +1330,8 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa } } - return _lbDao.search(sc, searchFilter); + Pair, Integer> result = _lbDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 2383366850c..a4e0722c0b2 100755 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -61,6 +61,8 @@ import com.cloud.user.AccountManager; import com.cloud.user.DomainManager; import com.cloud.user.UserContext; import com.cloud.uservm.UserVm; +import com.cloud.utils.IdentityProxy; +import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; @@ -686,7 +688,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } @Override - public List listPortForwardingRules(ListPortForwardingRulesCmd cmd) { + public Pair, Integer> listPortForwardingRules(ListPortForwardingRulesCmd cmd) { Long ipId = cmd.getIpAddressId(); Long id = cmd.getId(); Map tags = cmd.getTags(); @@ -752,7 +754,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { sc.setParameters("purpose", Purpose.PortForwarding); - return _portForwardingDao.search(sc, filter); + Pair, Integer> result = _portForwardingDao.searchAndCount(sc, filter); + return new Pair, Integer>(result.first(), result.second()); } @Override @@ -902,7 +905,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } @Override - public List searchStaticNatRules(Long ipId, Long id, Long vmId, Long start, Long size, String accountName, Long domainId, Long projectId, boolean isRecursive, boolean listAll) { + public Pair, Integer> searchStaticNatRules(Long ipId, Long id, Long vmId, Long start, Long size, String accountName, Long domainId, Long projectId, boolean isRecursive, boolean listAll) { Account caller = UserContext.current().getCaller(); List permittedAccounts = new ArrayList(); @@ -950,7 +953,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { sc.setJoinParameters("ipSearch", "associatedWithVmId", vmId); } - return _firewallDao.search(sc, filter); + Pair, Integer> result = _firewallDao.searchAndCount(sc, filter); + return new Pair, Integer>(result.first(), result.second()); } @Override diff --git a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java index e3483a00418..ce1b768e9f8 100644 --- a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java +++ b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java @@ -51,6 +51,8 @@ import com.cloud.tags.dao.ResourceTagDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.UserContext; +import com.cloud.utils.IdentityProxy; +import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; @@ -346,7 +348,7 @@ public class NetworkACLManagerImpl implements Manager,NetworkACLManager{ @Override - public List listNetworkACLs(ListNetworkACLsCmd cmd) { + public Pair,Integer> listNetworkACLs(ListNetworkACLsCmd cmd) { Long networkId = cmd.getNetworkId(); Long id = cmd.getId(); String trafficType = cmd.getTrafficType(); @@ -411,7 +413,8 @@ public class NetworkACLManagerImpl implements Manager,NetworkACLManager{ sc.setParameters("purpose", Purpose.NetworkACL); - return _firewallDao.search(sc, filter); + Pair, Integer> result = _firewallDao.searchAndCount(sc, filter); + return new Pair, Integer>(result.first(), result.second()); } diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 675ae593fa7..987bd45ed54 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -95,6 +95,7 @@ import com.cloud.user.ResourceLimitService; import com.cloud.user.User; import com.cloud.user.UserContext; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; @@ -1387,7 +1388,7 @@ public class VpcManagerImpl implements VpcManager, Manager{ } @Override - public List listPrivateGateway(ListPrivateGatewaysCmd cmd) { + public Pair, Integer> listPrivateGateway(ListPrivateGatewaysCmd cmd) { String ipAddress = cmd.getIpAddress(); String vlan = cmd.getVlan(); Long vpcId = cmd.getVpcId(); @@ -1441,14 +1442,14 @@ public class VpcManagerImpl implements VpcManager, Manager{ if (vlan != null) { sc.setJoinParameters("networkSearch", "vlan", BroadcastDomainType.Vlan.toUri(vlan)); } - - List vos = _vpcGatewayDao.search(sc, searchFilter); - List privateGtws = new ArrayList(vos.size()); - for (VpcGateway vo : vos) { + + Pair, Integer> vos = _vpcGatewayDao.searchAndCount(sc, searchFilter); + List privateGtws = new ArrayList(vos.first().size()); + for (VpcGateway vo : vos.first()) { privateGtws.add(getPrivateGatewayProfile(vo)); } - - return privateGtws; + + return new Pair, Integer>(privateGtws, vos.second()); } @Override @@ -1608,7 +1609,7 @@ public class VpcManagerImpl implements VpcManager, Manager{ } @Override - public List listStaticRoutes(ListStaticRoutesCmd cmd) { + public Pair, Integer> listStaticRoutes(ListStaticRoutesCmd cmd) { Long id = cmd.getId(); Long gatewayId = cmd.getGatewayId(); Long vpcId = cmd.getVpcId(); @@ -1673,10 +1674,11 @@ public class VpcManagerImpl implements VpcManager, Manager{ count++; } } - - return _staticRouteDao.search(sc, searchFilter); + + Pair, Integer> result = _staticRouteDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } - + protected void detectRoutesConflict(StaticRoute newRoute) throws NetworkRuleConflictException { List routes = _staticRouteDao.listByGatewayIdAndNotRevoked(newRoute.getVpcGatewayId()); assert (routes.size() >= 1) : "For static routes, we now always first persist the route and then check for " + diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java index c01dc6e91fe..0556e8e40aa 100755 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java @@ -497,10 +497,9 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag } @Override - public List searchForVpnUsers(ListVpnUsersCmd cmd) { + public Pair, Integer> searchForVpnUsers(ListVpnUsersCmd cmd) { String username = cmd.getUsername(); Long id = cmd.getId(); - Account caller = UserContext.current().getCaller(); List permittedAccounts = new ArrayList(); @@ -532,11 +531,12 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag sc.setParameters("username", username); } - return _vpnUsersDao.search(sc, searchFilter); + Pair, Integer> result = _vpnUsersDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override - public List searchForRemoteAccessVpns(ListRemoteAccessVpnsCmd cmd) { + public Pair, Integer> searchForRemoteAccessVpns(ListRemoteAccessVpnsCmd cmd) { // do some parameter validation Account caller = UserContext.current().getCaller(); Long ipAddressId = cmd.getPublicIpId(); @@ -579,7 +579,8 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag sc.setParameters("serverAddressId", ipAddressId); } - return _remoteAccessVpnDao.search(sc, filter); + Pair, Integer> result = _remoteAccessVpnDao.searchAndCount(sc, filter); + return new Pair, Integer> (result.first(), result.second()); } @Override diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index d043ab17b59..a698c93e208 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -98,6 +98,7 @@ import com.cloud.api.commands.UpdateVMGroupCmd; import com.cloud.api.commands.UpgradeSystemVMCmd; import com.cloud.api.commands.UploadCustomCertificateCmd; import com.cloud.api.response.ExtractResponse; +import com.cloud.async.AsyncJob; import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobResult; @@ -159,11 +160,13 @@ import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao; import com.cloud.info.ConsoleProxyInfo; import com.cloud.keystore.KeystoreManager; import com.cloud.network.IPAddressVO; +import com.cloud.network.IpAddress; import com.cloud.network.LoadBalancerVO; import com.cloud.network.NetworkVO; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; +import com.cloud.network.router.VirtualRouter; import com.cloud.org.Cluster; import com.cloud.org.Grouping.AllocationState; import com.cloud.projects.Project; @@ -1612,7 +1615,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List searchForRouters(ListRoutersCmd cmd) { + public Pair, Integer> searchForRouters(ListRoutersCmd cmd) { Long id = cmd.getId(); String name = cmd.getRouterName(); String state = cmd.getState(); @@ -1707,11 +1710,12 @@ public class ManagementServerImpl implements ManagementServer { sc.setParameters("vpcId", vpcId); } - return _routerDao.search(sc, searchFilter); + Pair, Integer> result = _routerDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override - public List searchForIPAddresses(ListPublicIpAddressesCmd cmd) { + public Pair, Integer> searchForIPAddresses(ListPublicIpAddressesCmd cmd) { Object keyword = cmd.getKeyword(); Long physicalNetworkId = cmd.getPhysicalNetworkId(); Long associatedNetworkId = cmd.getAssociatedNetworkId(); @@ -1858,7 +1862,8 @@ public class ManagementServerImpl implements ManagementServer { sc.setParameters("associatedNetworkIdEq", associatedNetworkId); } - return _publicIpAddressDao.search(sc, searchFilter); + Pair, Integer> result = _publicIpAddressDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override @@ -2076,7 +2081,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List searchForAlerts(ListAlertsCmd cmd) { + public Pair, Integer> searchForAlerts(ListAlertsCmd cmd) { Filter searchFilter = new Filter(AlertVO.class, "lastSent", false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchCriteria sc = _alertDao.createSearchCriteria(); @@ -2103,7 +2108,8 @@ public class ManagementServerImpl implements ManagementServer { sc.addAnd("type", SearchCriteria.Op.EQ, type); } - return _alertDao.search(sc, searchFilter); + Pair, Integer> result =_alertDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override @@ -2539,7 +2545,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List searchForAsyncJobs(ListAsyncJobsCmd cmd) { + public Pair, Integer> searchForAsyncJobs(ListAsyncJobsCmd cmd) { Account caller = UserContext.current().getCaller(); @@ -2609,7 +2615,8 @@ public class ManagementServerImpl implements ManagementServer { sc.addAnd("created", SearchCriteria.Op.GTEQ, startDate); } - return _jobDao.search(sc, searchFilter); + Pair, Integer> result = _jobDao.searchAndCount(sc, searchFilter); + return new Pair, Integer> (result.first(), result.second()); } @ActionEvent(eventType = EventTypes.EVENT_SSVM_START, eventDescription = "starting secondary storage Vm", async = true) diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index fc6fb5bfa60..7ec50f9ff27 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -3825,7 +3825,7 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag } @Override - public List searchForVolumes(ListVolumesCmd cmd) { + public Pair, Integer> searchForVolumes(ListVolumesCmd cmd) { Account caller = UserContext.current().getCaller(); List permittedAccounts = new ArrayList(); @@ -3937,8 +3937,10 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag // Only return volumes that are not destroyed sc.setParameters("state", Volume.State.Destroy); + + Pair, Integer> volumes = _volumeDao.searchAndCount(sc, searchFilter); - return _volumeDao.search(sc, searchFilter); + return new Pair, Integer>(volumes.first(), volumes.second()); } @Override diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index 2410d085684..32e37e63c0d 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -853,7 +853,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } @Override - public List listSnapshots(ListSnapshotsCmd cmd) { + public Pair, Integer> listSnapshots(ListSnapshotsCmd cmd) { Long volumeId = cmd.getVolumeId(); String name = cmd.getSnapshotName(); Long id = cmd.getId(); @@ -954,7 +954,8 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma sc.setParameters("snapshotTypeNEQ", Snapshot.Type.TEMPLATE.ordinal()); } - return _snapshotDao.search(sc, searchFilter); + Pair, Integer> result = _snapshotDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } diff --git a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java index db32f2cd41f..237a6774675 100644 --- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java +++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java @@ -322,7 +322,7 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager } @Override - public List listTags(ListTagsCmd cmd) { + public Pair, Integer> listTags(ListTagsCmd cmd) { Account caller = UserContext.current().getCaller(); List permittedAccounts = new ArrayList(); String key = cmd.getKey(); @@ -334,54 +334,56 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), - cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - Filter searchFilter = new Filter(ResourceTagVO.class, "resourceType", false, cmd.getStartIndex(), cmd.getPageSizeVal()); - - SearchBuilder sb = _resourceTagDao.createSearchBuilder(); - _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - sb.and("key", sb.entity().getKey(), SearchCriteria.Op.EQ); - sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ); - - if (resourceId != null) { - sb.and().op("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ); - sb.or("resourceUuid", sb.entity().getResourceUuid(), SearchCriteria.Op.EQ); - sb.cp(); - } - - sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ); - sb.and("customer", sb.entity().getCustomer(), SearchCriteria.Op.EQ); - - // now set the SC criteria... - SearchCriteria sc = sb.create(); - _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (key != null) { - sc.setParameters("key", key); - } - - if (value != null) { - sc.setParameters("value", value); - } - - if (resourceId != null) { - sc.setParameters("resourceId", resourceId); - sc.setParameters("resourceUuid", resourceId); - } - - if (resourceType != null) { - sc.setParameters("resourceType", resourceType); - } - - if (customerName != null) { - sc.setParameters("customer", customerName); - } - - return _resourceTagDao.search(sc, searchFilter); + _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), + cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + Filter searchFilter = new Filter(ResourceTagVO.class, "resourceType", false, cmd.getStartIndex(), cmd.getPageSizeVal()); + + SearchBuilder sb = _resourceTagDao.createSearchBuilder(); + _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + sb.and("key", sb.entity().getKey(), SearchCriteria.Op.EQ); + sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ); + + if (resourceId != null) { + sb.and().op("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ); + sb.or("resourceUuid", sb.entity().getResourceUuid(), SearchCriteria.Op.EQ); + sb.cp(); + } + + sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ); + sb.and("customer", sb.entity().getCustomer(), SearchCriteria.Op.EQ); + + // now set the SC criteria... + SearchCriteria sc = sb.create(); + _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (key != null) { + sc.setParameters("key", key); + } + + if (value != null) { + sc.setParameters("value", value); + } + + if (resourceId != null) { + sc.setParameters("resourceId", resourceId); + sc.setParameters("resourceUuid", resourceId); + } + + if (resourceType != null) { + sc.setParameters("resourceType", resourceType); + } + + if (customerName != null) { + sc.setParameters("customer", customerName); + } + + Pair, Integer> result = _resourceTagDao.searchAndCount(sc, searchFilter); + return new Pair, Integer> (result.first(), result.second()); } @Override diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index dcca74e2c27..62d21bed5d3 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -1980,7 +1980,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } @Override - public List searchForAccounts(ListAccountsCmd cmd) { + public Pair, Integer> searchForAccounts(ListAccountsCmd cmd) { Account caller = UserContext.current().getCaller(); Long domainId = cmd.getDomainId(); Long accountId = cmd.getId(); @@ -2095,11 +2095,12 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } } - return _accountDao.search(sc, searchFilter); + Pair, Integer> result = _accountDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override - public List searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { + public Pair, Integer> searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { Account caller = UserContext.current().getCaller(); Long domainId = cmd.getDomainId(); @@ -2129,7 +2130,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag if (id != null && id == 1) { // system user should NOT be searchable List emptyList = new ArrayList(); - return emptyList; + return new Pair, Integer>(emptyList, 0); } else if (id != null) { sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); } else { @@ -2192,7 +2193,8 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag sc.setParameters("state", state); } - return _userAccountDao.search(sc, searchFilter); + Pair, Integer> result = _userAccountDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override diff --git a/server/src/com/cloud/user/DomainManagerImpl.java b/server/src/com/cloud/user/DomainManagerImpl.java index 8905be0b722..c2346162028 100644 --- a/server/src/com/cloud/user/DomainManagerImpl.java +++ b/server/src/com/cloud/user/DomainManagerImpl.java @@ -47,6 +47,7 @@ import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.user.dao.AccountDao; +import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; import com.cloud.utils.db.DB; @@ -349,7 +350,7 @@ public class DomainManagerImpl implements DomainManager, DomainService, Manager } @Override - public List searchForDomains(ListDomainsCmd cmd) { + public Pair, Integer> searchForDomains(ListDomainsCmd cmd) { Account caller = UserContext.current().getCaller(); Long domainId = cmd.getId(); boolean listAll = cmd.listAll(); @@ -407,11 +408,12 @@ public class DomainManagerImpl implements DomainManager, DomainService, Manager // return only Active domains to the API sc.setParameters("state", Domain.State.Active); - return _domainDao.search(sc, searchFilter); + Pair, Integer> result = _domainDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); } @Override - public List searchForDomainChildren(ListDomainChildrenCmd cmd) throws PermissionDeniedException { + public Pair, Integer> searchForDomainChildren(ListDomainChildrenCmd cmd) throws PermissionDeniedException { Long domainId = cmd.getId(); String domainName = cmd.getDomainName(); Boolean isRecursive = cmd.isRecursive(); @@ -433,12 +435,12 @@ public class DomainManagerImpl implements DomainManager, DomainService, Manager } Filter searchFilter = new Filter(DomainVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); - List domainList = searchForDomainChildren(searchFilter, domainId, domainName, keyword, path, true); + Pair, Integer> result = searchForDomainChildren(searchFilter, domainId, domainName, keyword, path, true); - return domainList; + return new Pair, Integer>(result.first(), result.second()); } - private List searchForDomainChildren(Filter searchFilter, Long domainId, String domainName, Object keyword, String path, boolean listActiveOnly) { + private Pair, Integer> searchForDomainChildren(Filter searchFilter, Long domainId, String domainName, Object keyword, String path, boolean listActiveOnly) { SearchCriteria sc = _domainDao.createSearchCriteria(); if (keyword != null) { @@ -465,7 +467,7 @@ public class DomainManagerImpl implements DomainManager, DomainService, Manager sc.addAnd("state", SearchCriteria.Op.EQ, Domain.State.Active); } - return _domainDao.search(sc, searchFilter); + return _domainDao.searchAndCount(sc, searchFilter); } } diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java index 11d2c64016f..4ce9bfee86d 100755 --- a/server/src/com/cloud/vm/UserVmManager.java +++ b/server/src/com/cloud/vm/UserVmManager.java @@ -96,9 +96,9 @@ public interface UserVmManager extends VirtualMachineGuru, UserVmServi * @param listAll TODO * @param listProjectResourcesCriteria TODO * @param tags TODO - * @return List of UserVMs. + * @return List of UserVMs + count */ - List searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags); + Pair, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags); String getChecksum(Long hostId, String templatePath); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index dbcbeb8bfa2..a2a548fee44 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2996,7 +2996,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } @Override - public List searchForUserVMs(ListVMsCmd cmd) { + public Pair, Integer> searchForUserVMs(ListVMsCmd cmd) { Account caller = UserContext.current().getCaller(); List permittedAccounts = new ArrayList(); String hypervisor = cmd.getHypervisor(); @@ -3045,11 +3045,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } c.addCriteria(Criteria.ISADMIN, _accountMgr.isAdmin(caller.getType())); - return searchForUserVMs(c, caller, domainId, isRecursive, permittedAccounts, listAll, listProjectResourcesCriteria, tags); + Pair, Integer> result = searchForUserVMs(c, caller, domainId, isRecursive, + permittedAccounts, listAll, listProjectResourcesCriteria, tags); + return new Pair, Integer>(result.first(), result.second()); } @Override - public List searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, + public Pair, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { Filter searchFilter = new Filter(UserVmVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); @@ -3240,7 +3242,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } sc.setParameters("hostIdIN", (Object[]) hostIds); } else { - return new ArrayList(); + return new Pair, Integer>(new ArrayList(), 0); } } } @@ -3248,8 +3250,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (storageId != null) { sc.setJoinParameters("volumeSearch", "poolId", storageId); } - s_logger.debug("THE WHERE CLAUSE IS:" + sc.getWhereClause()); - return _vmDao.search(sc, searchFilter); + + return _vmDao.searchAndCount(sc, searchFilter); } @Override diff --git a/server/test/com/cloud/user/MockAccountManagerImpl.java b/server/test/com/cloud/user/MockAccountManagerImpl.java index 0d15cd7de0a..08234fda0a0 100644 --- a/server/test/com/cloud/user/MockAccountManagerImpl.java +++ b/server/test/com/cloud/user/MockAccountManagerImpl.java @@ -298,13 +298,13 @@ public class MockAccountManagerImpl implements Manager, AccountManager, AccountS } @Override - public List searchForAccounts(ListAccountsCmd cmd) { + public Pair, Integer> searchForAccounts(ListAccountsCmd cmd) { // TODO Auto-generated method stub return null; } @Override - public List searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { + public Pair, Integer> searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { // TODO Auto-generated method stub return null; } diff --git a/server/test/com/cloud/user/MockDomainManagerImpl.java b/server/test/com/cloud/user/MockDomainManagerImpl.java index e99e4d94265..4266f3553e5 100644 --- a/server/test/com/cloud/user/MockDomainManagerImpl.java +++ b/server/test/com/cloud/user/MockDomainManagerImpl.java @@ -29,6 +29,7 @@ import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.exception.PermissionDeniedException; import com.cloud.utils.component.Manager; +import com.cloud.utils.Pair; @Local(value = { DomainManager.class }) public class MockDomainManagerImpl implements Manager, DomainManager { @@ -58,14 +59,14 @@ public class MockDomainManagerImpl implements Manager, DomainManager { } @Override - public List searchForDomains(ListDomainsCmd cmd) + public Pair, Integer> searchForDomains(ListDomainsCmd cmd) throws PermissionDeniedException { // TODO Auto-generated method stub return null; } @Override - public List searchForDomainChildren( + public Pair, Integer> searchForDomainChildren( ListDomainChildrenCmd cmd) throws PermissionDeniedException { // TODO Auto-generated method stub return null; diff --git a/server/test/com/cloud/vm/MockUserVmManagerImpl.java b/server/test/com/cloud/vm/MockUserVmManagerImpl.java index efc6916ab40..35ee1396504 100644 --- a/server/test/com/cloud/vm/MockUserVmManagerImpl.java +++ b/server/test/com/cloud/vm/MockUserVmManagerImpl.java @@ -192,7 +192,7 @@ public class MockUserVmManagerImpl implements UserVmManager, UserVmService, Mana } @Override - public List searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { + public Pair, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { // TODO Auto-generated method stub return null; } @@ -401,7 +401,7 @@ public class MockUserVmManagerImpl implements UserVmManager, UserVmService, Mana } @Override - public List searchForUserVMs(ListVMsCmd cmd) { + public Pair, Integer> searchForUserVMs(ListVMsCmd cmd) { // TODO Auto-generated method stub return null; } diff --git a/server/test/com/cloud/vpc/MockVpcManagerImpl.java b/server/test/com/cloud/vpc/MockVpcManagerImpl.java index fc10a466087..22693397e57 100644 --- a/server/test/com/cloud/vpc/MockVpcManagerImpl.java +++ b/server/test/com/cloud/vpc/MockVpcManagerImpl.java @@ -49,6 +49,7 @@ import com.cloud.network.vpc.VpcService; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.user.User; +import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Manager; import com.cloud.vm.DomainRouterVO; @@ -244,7 +245,7 @@ public class MockVpcManagerImpl implements VpcManager, Manager{ * @see com.cloud.network.vpc.VpcService#listPrivateGateway(com.cloud.api.commands.ListPrivateGatewaysCmd) */ @Override - public List listPrivateGateway(ListPrivateGatewaysCmd listPrivateGatewaysCmd) { + public Pair, Integer> listPrivateGateway(ListPrivateGatewaysCmd listPrivateGatewaysCmd) { // TODO Auto-generated method stub return null; } @@ -289,7 +290,7 @@ public class MockVpcManagerImpl implements VpcManager, Manager{ * @see com.cloud.network.vpc.VpcService#listStaticRoutes(com.cloud.api.commands.ListStaticRoutesCmd) */ @Override - public List listStaticRoutes(ListStaticRoutesCmd cmd) { + public Pair, Integer> listStaticRoutes(ListStaticRoutesCmd cmd) { // TODO Auto-generated method stub return null; } diff --git a/utils/src/com/cloud/utils/db/GenericDao.java b/utils/src/com/cloud/utils/db/GenericDao.java index 3ab319ea830..f36c4d80164 100755 --- a/utils/src/com/cloud/utils/db/GenericDao.java +++ b/utils/src/com/cloud/utils/db/GenericDao.java @@ -22,6 +22,8 @@ import java.util.Map; import javax.naming.ConfigurationException; +import com.cloud.utils.Pair; + /** * a uniform method for persisting and finding db entities. **/ @@ -260,4 +262,11 @@ public interface GenericDao { * @return */ Class getEntityBeanType(); + + /** + * @param sc + * @param filter + * @return + */ + Pair, Integer> searchAndCount(SearchCriteria sc, Filter filter); } diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java index 3df83747f31..8d5cb96abc9 100755 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@ -130,6 +130,7 @@ public abstract class GenericDaoBase implements Gene protected StringBuilder _discriminatorClause; protected Map _discriminatorValues; protected String _selectByIdSql; + protected String _count; protected Field _idField; @@ -201,6 +202,7 @@ public abstract class GenericDaoBase implements Gene final SqlGenerator generator = new SqlGenerator(_entityBeanType); _partialSelectSql = generator.buildSelectSql(false); + _count = generator.buildCountSql(); _partialQueryCacheSelectSql = generator.buildSelectSql(true); _embeddedFields = generator.getEmbeddedFields(); _insertSqls = generator.buildInsertSqls(); @@ -1211,6 +1213,13 @@ public abstract class GenericDaoBase implements Gene public List search(final SearchCriteria sc, final Filter filter) { return search(sc, filter, null, false); } + + @Override @DB(txn=false) + public Pair, Integer> searchAndCount(final SearchCriteria sc, final Filter filter) { + List objects = search(sc, filter, null, false); + Integer count = getCount(sc); + return new Pair, Integer>(objects, count); + } @Override @DB(txn=false) public List search(final SearchCriteria sc, final Filter filter, final boolean enable_query_cache) { @@ -1769,4 +1778,71 @@ public abstract class GenericDaoBase implements Gene factory.setCallback(0, sc); return sc; } + + public Integer getCount(SearchCriteria sc) { + String clause = sc != null ? sc.getWhereClause() : null; + if (clause != null && clause.length() == 0) { + clause = null; + } + + final StringBuilder str = createCountSelect(sc, clause != null); + if (clause != null) { + str.append(clause); + } + + Collection>> joins = null; + if (sc != null) { + joins = sc.getJoins(); + if (joins != null) { + addJoins(str, joins); + } + } + + List groupByValues = addGroupBy(str, sc); + final Transaction txn = Transaction.currentTxn(); + final String sql = str.toString(); + + PreparedStatement pstmt = null; + try { + pstmt = txn.prepareAutoCloseStatement(sql); + int i = 0; + if (clause != null) { + for (final Pair value : sc.getValues()) { + prepareAttribute(++i, pstmt, value.first(), value.second()); + } + } + + if (joins != null) { + i = addJoinAttributes(i, pstmt, joins); + } + + if (groupByValues != null) { + for (Object value : groupByValues) { + pstmt.setObject(i++, value); + } + } + + final ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + return rs.getInt(1); + } + return 0; + } catch (final SQLException e) { + throw new CloudRuntimeException("DB Exception on: " + pstmt, e); + } catch (final Throwable e) { + throw new CloudRuntimeException("Caught: " + pstmt, e); + } + } + + @DB(txn=false) + protected StringBuilder createCountSelect(SearchCriteria sc, final boolean whereClause) { + StringBuilder sql = new StringBuilder(_count); + + if (!whereClause) { + sql.delete(sql.length() - (_discriminatorClause == null ? 6 : 4), sql.length()); + } + + return sql; + } + } diff --git a/utils/src/com/cloud/utils/db/SqlGenerator.java b/utils/src/com/cloud/utils/db/SqlGenerator.java index 3b2d8cdf15e..e48fee5c73e 100755 --- a/utils/src/com/cloud/utils/db/SqlGenerator.java +++ b/utils/src/com/cloud/utils/db/SqlGenerator.java @@ -659,4 +659,11 @@ public class SqlGenerator { public Field[] getEmbeddedFields() { return _embeddeds.toArray(new Field[_embeddeds.size()]); } + + public String buildCountSql() { + StringBuilder sql = new StringBuilder(); + + return sql.append("SELECT COUNT(*) FROM ").append(buildTableReferences()). + append(" WHERE ").append(buildDiscriminatorClause().first()).toString(); + } }