// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.api.query; import java.util.ArrayList; import java.util.EnumSet; import java.util.Hashtable; import java.util.List; import org.apache.cloudstack.api.ApiConstants.HostDetails; import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.AsyncJobResponse; import org.apache.cloudstack.api.response.DiskOfferingResponse; import org.apache.cloudstack.api.response.DomainRouterResponse; import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.ProjectAccountResponse; import org.apache.cloudstack.api.response.ProjectInvitationResponse; import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.log4j.Logger; import com.cloud.api.ApiDBUtils; import com.cloud.api.query.vo.AccountJoinVO; import com.cloud.api.query.vo.AsyncJobJoinVO; import com.cloud.api.query.vo.DataCenterJoinVO; import com.cloud.api.query.vo.DiskOfferingJoinVO; import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.api.query.vo.EventJoinVO; import com.cloud.api.query.vo.HostJoinVO; import com.cloud.api.query.vo.InstanceGroupJoinVO; import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.api.query.vo.ProjectInvitationJoinVO; import com.cloud.api.query.vo.ProjectJoinVO; import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.api.query.vo.ServiceOfferingJoinVO; import com.cloud.api.query.vo.StoragePoolJoinVO; import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.query.vo.VolumeJoinVO; import com.cloud.user.Account; import com.cloud.user.UserContext; /** * Helper class to generate response from DB view VO objects. * */ public class ViewResponseHelper { public static final Logger s_logger = Logger.getLogger(ViewResponseHelper.class); public static List createUserResponse(UserAccountJoinVO... users) { List respList = new ArrayList(); for (UserAccountJoinVO vt : users){ respList.add(ApiDBUtils.newUserResponse(vt)); } return respList; } public static List createEventResponse(EventJoinVO... events) { List respList = new ArrayList(); for (EventJoinVO vt : events){ respList.add(ApiDBUtils.newEventResponse(vt)); } return respList; } public static List createResourceTagResponse(boolean keyValueOnly, ResourceTagJoinVO... tags) { List respList = new ArrayList(); for (ResourceTagJoinVO vt : tags){ respList.add(ApiDBUtils.newResourceTagResponse(vt, keyValueOnly)); } return respList; } public static List createInstanceGroupResponse(InstanceGroupJoinVO... groups) { List respList = new ArrayList(); for (InstanceGroupJoinVO vt : groups){ respList.add(ApiDBUtils.newInstanceGroupResponse(vt)); } return respList; } public static List createUserVmResponse(String objectName, UserVmJoinVO... userVms) { return createUserVmResponse(objectName, EnumSet.of(VMDetails.all), userVms); } public static List createUserVmResponse(String objectName, EnumSet details, UserVmJoinVO... userVms) { Account caller = UserContext.current().getCaller(); Hashtable vmDataList = new Hashtable(); // Initialise the vmdatalist with the input data for (UserVmJoinVO userVm : userVms) { UserVmResponse userVmData = vmDataList.get(userVm.getId()); if ( userVmData == null ){ // first time encountering this vm userVmData = ApiDBUtils.newUserVmResponse(objectName, userVm, details, caller); } else{ // update nics, securitygroups, tags for 1 to many mapping fields userVmData = ApiDBUtils.fillVmDetails(userVmData, userVm); } vmDataList.put(userVm.getId(), userVmData); } return new ArrayList(vmDataList.values()); } public static List createDomainRouterResponse(DomainRouterJoinVO... routers) { Account caller = UserContext.current().getCaller(); Hashtable vrDataList = new Hashtable(); // Initialise the vrdatalist with the input data for (DomainRouterJoinVO vr : routers) { DomainRouterResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ){ // first time encountering this vm vrData = ApiDBUtils.newDomainRouterResponse(vr, caller); } else{ // update nics for 1 to many mapping fields vrData = ApiDBUtils.fillRouterDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createSecurityGroupResponses(List securityGroups) { Account caller = UserContext.current().getCaller(); Hashtable vrDataList = new Hashtable(); // Initialise the vrdatalist with the input data for (SecurityGroupJoinVO vr : securityGroups) { SecurityGroupResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ) { // first time encountering this sg vrData = ApiDBUtils.newSecurityGroupResponse(vr, caller); } else { // update rules for 1 to many mapping fields vrData = ApiDBUtils.fillSecurityGroupDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createProjectResponse(ProjectJoinVO... projects) { Hashtable prjDataList = new Hashtable(); // Initialise the prjdatalist with the input data for (ProjectJoinVO p : projects) { ProjectResponse pData = prjDataList.get(p.getId()); if ( pData == null ){ // first time encountering this vm pData = ApiDBUtils.newProjectResponse(p); } else{ // update those 1 to many mapping fields pData = ApiDBUtils.fillProjectDetails(pData, p); } prjDataList.put(p.getId(), pData); } return new ArrayList(prjDataList.values()); } public static List createProjectAccountResponse(ProjectAccountJoinVO... projectAccounts) { List responseList = new ArrayList(); for (ProjectAccountJoinVO proj : projectAccounts){ ProjectAccountResponse resp = ApiDBUtils.newProjectAccountResponse(proj); // update user list List users = ApiDBUtils.findUserViewByAccountId(proj.getAccountId()); resp.setUsers(ViewResponseHelper.createUserResponse(users.toArray(new UserAccountJoinVO[users.size()]))); responseList.add(resp); } return responseList; } public static List createProjectInvitationResponse(ProjectInvitationJoinVO... invites) { List respList = new ArrayList(); for (ProjectInvitationJoinVO v : invites){ respList.add(ApiDBUtils.newProjectInvitationResponse(v)); } return respList; } public static List createHostResponse(EnumSet details, HostJoinVO... hosts) { Hashtable vrDataList = new Hashtable(); // Initialise the vrdatalist with the input data for (HostJoinVO vr : hosts) { HostResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ){ // first time encountering this vm vrData = ApiDBUtils.newHostResponse(vr, details); } else{ // update tags vrData = ApiDBUtils.fillHostDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createVolumeResponse(VolumeJoinVO... volumes) { Hashtable vrDataList = new Hashtable(); for (VolumeJoinVO vr : volumes) { VolumeResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ){ // first time encountering this volume vrData = ApiDBUtils.newVolumeResponse(vr); } else{ // update tags vrData = ApiDBUtils.fillVolumeDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createStoragePoolResponse(StoragePoolJoinVO... pools) { Hashtable vrDataList = new Hashtable(); // Initialise the vrdatalist with the input data for (StoragePoolJoinVO vr : pools) { StoragePoolResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ){ // first time encountering this vm vrData = ApiDBUtils.newStoragePoolResponse(vr); } else{ // update tags vrData = ApiDBUtils.fillStoragePoolDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createAccountResponse(AccountJoinVO... accounts) { List respList = new ArrayList(); for (AccountJoinVO vt : accounts){ respList.add(ApiDBUtils.newAccountResponse(vt)); } return respList; } public static List createAsyncJobResponse(AsyncJobJoinVO... jobs) { List respList = new ArrayList(); for (AsyncJobJoinVO vt : jobs){ respList.add(ApiDBUtils.newAsyncJobResponse(vt)); } return respList; } public static List createDiskOfferingResponse(DiskOfferingJoinVO... offerings) { List respList = new ArrayList(); for (DiskOfferingJoinVO vt : offerings){ respList.add(ApiDBUtils.newDiskOfferingResponse(vt)); } return respList; } public static List createServiceOfferingResponse(ServiceOfferingJoinVO... offerings) { List respList = new ArrayList(); for (ServiceOfferingJoinVO vt : offerings){ respList.add(ApiDBUtils.newServiceOfferingResponse(vt)); } return respList; } public static List createDataCenterResponse(Boolean showCapacities, DataCenterJoinVO... dcs) { List respList = new ArrayList(); for (DataCenterJoinVO vt : dcs){ respList.add(ApiDBUtils.newDataCenterResponse(vt, showCapacities)); } return respList; } }