package org.openstack.atlas.api.resources;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openstack.atlas.api.helpers.ResponseFactory;
import org.openstack.atlas.api.repository.ValidatorRepository;
import org.openstack.atlas.api.resources.providers.CommonDependencyProvider;
import org.openstack.atlas.api.validation.context.HttpRequestType;
import org.openstack.atlas.api.validation.results.ValidatorResult;
import org.openstack.atlas.docs.loadbalancers.api.v1.Metadata;
import org.openstack.atlas.service.domain.entities.LoadBalancer;
import org.openstack.atlas.service.domain.entities.LoadbalancerMeta;
import org.openstack.atlas.service.domain.exceptions.BadRequestException;
import javax.ws.rs.*;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static javax.ws.rs.core.MediaType.*;
public class LoadbalancerMetadataResource extends CommonDependencyProvider {
private final Log LOG = LogFactory.getLog(LoadbalancerMetadataResource.class);
private LoadbalancerMetaResource loadbalancerMetaResource;
private HttpHeaders requestHeaders;
private Integer accountId;
private Integer loadBalancerId;
@POST
@Consumes({APPLICATION_XML, APPLICATION_JSON})
public Response createMetadata(Metadata metadata) {
ValidatorResult result = ValidatorRepository.getValidatorFor(Metadata.class).validate(metadata, HttpRequestType.POST);
if (!result.passedValidation()) {
return getValidationFaultResponse(result);
}
try {
loadBalancerService.get(loadBalancerId, accountId);
List<LoadbalancerMeta> domainLoadbalancerMetaList = new ArrayList<LoadbalancerMeta>();
for (org.openstack.atlas.docs.loadbalancers.api.v1.Meta meta : metadata.getMetas()) {
domainLoadbalancerMetaList.add(dozerMapper.map(meta, LoadbalancerMeta.class));
}
Set<LoadbalancerMeta> dbMetadata = loadbalancerMetadataService.createLoadbalancerMetadata(accountId, loadBalancerId, domainLoadbalancerMetaList);
org.openstack.atlas.docs.loadbalancers.api.v1.Metadata returnMetadata = new org.openstack.atlas.docs.loadbalancers.api.v1.Metadata();
for (LoadbalancerMeta loadbalancerMeta : dbMetadata) {
returnMetadata.getMetas().add(dozerMapper.map(loadbalancerMeta, org.openstack.atlas.docs.loadbalancers.api.v1.Meta.class));
}
return Response.status(Response.Status.OK).entity(returnMetadata).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@GET
@Produces({APPLICATION_XML, APPLICATION_JSON, APPLICATION_ATOM_XML})
public Response retrieveMetadata(){
Set<LoadbalancerMeta> domainLoadbalancerMetaSet;
org.openstack.atlas.docs.loadbalancers.api.v1.Metadata returnMetadata = new org.openstack.atlas.docs.loadbalancers.api.v1.Metadata();
try {
domainLoadbalancerMetaSet = loadbalancerMetadataService.getLoadbalancerMetadataByAccountIdLoadBalancerId(accountId, loadBalancerId);
for (LoadbalancerMeta domainLoadbalancerMeta : domainLoadbalancerMetaSet) {
returnMetadata.getMetas().add(dozerMapper.map(domainLoadbalancerMeta, org.openstack.atlas.docs.loadbalancers.api.v1.Meta.class));
}
return Response.status(Response.Status.OK).entity(returnMetadata).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@DELETE
@Produces({APPLICATION_XML, APPLICATION_JSON})
public Response deleteMetadata(@QueryParam("id") List<Integer> metaIds) {
List<String> validationErrors;
Collections.sort(metaIds);
LoadBalancer dlb = new LoadBalancer();
dlb.setId(loadBalancerId);
dlb.setAccountId(accountId);
try {
if (metaIds.isEmpty()) {
BadRequestException badRequestException = new BadRequestException("Must supply one or more id's to process this request.");
return ResponseFactory.getErrorResponse(badRequestException, null, null);
}
validationErrors = loadbalancerMetadataService.prepareForLoadbalancerMetadataDeletion(accountId, loadBalancerId, metaIds);
if (!validationErrors.isEmpty()) {
return getValidationFaultResponse(validationErrors);
}
loadbalancerMetadataService.deleteMetadata(dlb, metaIds);
} catch (Exception ex) {
return ResponseFactory.getErrorResponse(ex, null, null);
}
return Response.status(200).build();
}
@Path("{id: [-+]?[1-9][0-9]*}")
public LoadbalancerMetaResource retrieveNodeResource(@PathParam("id") int id) {
loadbalancerMetaResource.setRequestHeaders(requestHeaders);
loadbalancerMetaResource.setId(id);
loadbalancerMetaResource.setAccountId(accountId);
loadbalancerMetaResource.setLoadBalancerId(loadBalancerId);
return loadbalancerMetaResource;
}
public void setLoadbalancerMetaResource(LoadbalancerMetaResource loadbalancerMetaResource) {
this.loadbalancerMetaResource = loadbalancerMetaResource;
}
public void setRequestHeaders(HttpHeaders requestHeaders) {
this.requestHeaders = requestHeaders;
}
public void setAccountId(Integer accountId) {
this.accountId = accountId;
}
public void setLoadBalancerId(Integer loadBalancerId) {
this.loadBalancerId = loadBalancerId;
}
}