/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.vipr.client.catalog;
import static com.emc.vipr.client.core.util.ResourceUtils.uri;
import java.net.URI;
import java.util.*;
import com.emc.vipr.client.ViPRCatalogClient2;
import com.emc.vipr.client.catalog.impl.PathConstants;
import com.emc.vipr.client.impl.RestClient;
import com.emc.vipr.model.catalog.AssetDependencyRequest;
import com.emc.vipr.model.catalog.AssetDependencyResponse;
import com.emc.vipr.model.catalog.AssetOption;
import com.emc.vipr.model.catalog.AssetOptionsRequest;
import com.emc.vipr.model.catalog.AssetOptionsResponse;
import com.emc.vipr.model.catalog.CatalogServiceRestRep;
import com.emc.vipr.model.catalog.ServiceDescriptorRestRep;
import com.emc.vipr.model.catalog.ServiceFieldGroupRestRep;
import com.emc.vipr.model.catalog.ServiceFieldModalRestRep;
import com.emc.vipr.model.catalog.ServiceFieldRestRep;
import com.emc.vipr.model.catalog.ServiceFieldTableRestRep;
import com.emc.vipr.model.catalog.ServiceItemRestRep;
public class AssetOptions {
protected final ViPRCatalogClient2 parent;
protected final RestClient client;
public AssetOptions(ViPRCatalogClient2 parent, RestClient client) {
this.parent = parent;
this.client = client;
}
public List<AssetOption> getAssetOptions(String assetType) {
return getAssetOptions(assetType, new HashMap<String, String>());
}
public List<AssetOption> getAssetOptions(String assetType, Map<String, String> assetParameters) {
AssetOptionsRequest request = new AssetOptionsRequest();
request.setTenantId(uri(parent.getUserInfo().getTenant()));
request.setAvailableAssets(assetParameters);
return getAssetOptions(assetType, request);
}
public List<AssetOption> getAssetOptions(String assetType, AssetOptionsRequest request) {
AssetOptionsResponse response = client.post(AssetOptionsResponse.class, request, PathConstants.ASSET_OPTIONS2_OPTIONS_URL,
cleanAssetType(assetType));
return response.getOptions();
}
public List<String> getAssetDependencies(String assetType, String serviceDescriptorName) {
ServiceDescriptorRestRep serviceDescriptor = parent.serviceDescriptors().getServiceDescriptor(serviceDescriptorName);
return getAssetDependencies(assetType, serviceDescriptor);
}
public List<String> getAssetDependencies(String assetType, URI catalogServiceId) {
CatalogServiceRestRep catalogService = parent.services().get(catalogServiceId);
ServiceDescriptorRestRep serviceDescriptor = catalogService.getServiceDescriptor();
return getAssetDependencies(assetType, serviceDescriptor);
}
public List<String> getAssetDependencies(String assetType, ServiceDescriptorRestRep serviceDescriptor) {
return getAssetDependencies(assetType, getAllAssetTypes(serviceDescriptor));
}
public List<String> getAssetDependencies(String assetType, Set<String> availableAssetTypes) {
AssetDependencyRequest request = new AssetDependencyRequest();
request.setTenantId(uri(parent.getUserInfo().getTenant()));
request.setAvailableAssetTypes(availableAssetTypes);
return getAssetDependencies(assetType, request);
}
public List<String> getAssetDependencies(String assetType, AssetDependencyRequest request) {
AssetDependencyResponse response = client.post(AssetDependencyResponse.class, request, PathConstants.ASSET_OPTIONS2_DEP_URL,
cleanAssetType(assetType));
return response.getAssetDependencies();
}
private String cleanAssetType(String assetType) {
return assetType.replaceFirst("assetType\\.", "");
}
public static Set<String> getAllAssetTypes(ServiceDescriptorRestRep serviceDescriptor) {
Set<String> allAvailableAssets = new HashSet<>();
for (ServiceFieldRestRep field : getAllFields(serviceDescriptor.getItems())) {
if (field.isAsset()) {
allAvailableAssets.add(field.getAssetType());
}
}
return allAvailableAssets;
}
public static List<ServiceFieldRestRep> getAllFields(List<? extends ServiceItemRestRep> items) {
List<ServiceFieldRestRep> allFields = new ArrayList<>();
for (ServiceItemRestRep item : items) {
if (item.isField()) {
allFields.add((ServiceFieldRestRep) item);
}
else if (item.isGroup()) {
allFields.addAll(getAllFields(((ServiceFieldGroupRestRep) item).getItems()));
}
else if (item.isTable()) {
allFields.addAll(getAllFields(((ServiceFieldTableRestRep) item).getItems()));
}
else if (item.isModal()) {
allFields.addAll(getAllFields(((ServiceFieldModalRestRep) item).getItems()));
}
}
return allFields;
}
}