/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.api;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import com.emc.sa.asset.AssetOptionsContext;
import com.emc.sa.asset.AssetOptionsManager;
import com.emc.storageos.security.authentication.StorageOSUser;
import com.emc.storageos.services.util.SecurityUtils;
import com.emc.vipr.client.exceptions.ViPRHttpException;
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;
@Path("/catalog/asset-options")
public class AssetOptionService extends CatalogResourceService {
private static final Logger log = Logger.getLogger(AssetOptionService.class);
@Autowired
private AssetOptionsManager assetOptionsManager;
@PostConstruct
public void init() {
log.info("Initializing AssetOptions");
}
private AssetOptionsContext createAssetOptionsContext(AssetOptionsRequest request) {
StorageOSUser user = getUserFromContext();
AssetOptionsContext context = assetOptionsManager.createDefaultContext(user);
// Override the tenant if specified in the request
URI tenantId = request.getTenantId();
if (tenantId != null) {
verifyAuthorizedInTenantOrg(tenantId, user);
context.setTenant(tenantId);
}
return context;
}
@POST
@Path("/{assetType}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public AssetOptionsResponse getAssetOptions(@PathParam("assetType") String assetType, AssetOptionsRequest request) {
final Map<String, String> availableAssets = request.getAvailableAssets();
final AssetOptionsContext context = createAssetOptionsContext(request);
final Map<String, String> sanitizedAvailableAssets = SecurityUtils.stripMapXSS(availableAssets);
final String sanitizedAssetType = SecurityUtils.stripXSS(assetType);
log.info("Retrieving asset options for " + sanitizedAssetType + " with available assets : "
+ StringUtils.join(sanitizedAvailableAssets.keySet(), ", "));
try {
List<AssetOption> options = assetOptionsManager.getOptions(context, sanitizedAssetType, sanitizedAvailableAssets);
AssetOptionsResponse response = new AssetOptionsResponse();
response.setAssetType(sanitizedAssetType);
response.setAvailableAssets(sanitizedAvailableAssets);
response.setOptions(options);
return response;
} catch (IllegalStateException e) {
Response response = Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).type(MediaType.TEXT_PLAIN).build();
throw new WebApplicationException(response);
} catch (ViPRHttpException e) {
if (e.getHttpCode() == 404) {
Response response = Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).type(MediaType.TEXT_PLAIN).build();
throw new WebApplicationException(response);
}
throw new WebApplicationException(e);
}
}
@POST
@Path("/{assetType}/dependencies")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public AssetDependencyResponse getAssetDependencies(@PathParam("assetType") String assetType,
AssetDependencyRequest request) {
final Set<String> availableAssetTypes = request.getAvailableAssetTypes();
final String sanitizedAssetType = SecurityUtils.stripXSS(assetType);
log.info("Retrieving asset dependencies for " + sanitizedAssetType + " with available assets : "
+ StringUtils.join(availableAssetTypes, ", "));
List<String> dependencies = assetOptionsManager.getAssetDependencies(sanitizedAssetType, availableAssetTypes);
AssetDependencyResponse response = new AssetDependencyResponse();
response.setAssetType(sanitizedAssetType);
response.setAssetDependencies(dependencies);
return response;
}
}