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.Meta; import org.openstack.atlas.docs.loadbalancers.api.v1.Metadata; import org.openstack.atlas.service.domain.entities.Node; import org.openstack.atlas.service.domain.exceptions.BadRequestException; import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException; import org.openstack.atlas.service.domain.exceptions.ImmutableEntityException; import org.openstack.atlas.service.domain.exceptions.UnprocessableEntityException; 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 static javax.ws.rs.core.MediaType.*; public class NodeMetadataResource extends CommonDependencyProvider { private final Log LOG = LogFactory.getLog(NodeMetadataResource.class); private NodeMetaResource nodeMetaResource; private HttpHeaders requestHeaders; private Integer loadbalancerId; private Integer accountId; private Integer nodeId; @POST @Consumes({APPLICATION_XML, APPLICATION_JSON}) public Response createMetadata(Metadata Metadata) throws EntityNotFoundException, BadRequestException, ImmutableEntityException, UnprocessableEntityException { List<org.openstack.atlas.service.domain.entities.NodeMeta> domainNodeMetas = new ArrayList<org.openstack.atlas.service.domain.entities.NodeMeta>(); for (Meta meta : Metadata.getMetas()) { ValidatorResult result = ValidatorRepository.getValidatorFor(Meta.class).validate(meta, HttpRequestType.POST); if (!result.passedValidation()) { return getValidationFaultResponse(result); } else { domainNodeMetas.add(dozerMapper.map(meta, org.openstack.atlas.service.domain.entities.NodeMeta.class)); } } Metadata retNodeMetadata = new Metadata(); try { for (org.openstack.atlas.service.domain.entities.NodeMeta meta : nodeMetadataService.createNodeMetadata(accountId, loadbalancerId, nodeId, domainNodeMetas)) { retNodeMetadata.getMetas().add(dozerMapper.map(meta, Meta.class)); } } catch (Exception e) { return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build(); } return Response.status(Response.Status.OK).entity(retNodeMetadata).build(); } @GET @Produces({APPLICATION_XML, APPLICATION_JSON, APPLICATION_ATOM_XML}) public Response retrieveMetadata() { List<org.openstack.atlas.service.domain.entities.NodeMeta> domainNodeMetaSet; Metadata returnMetadata = new Metadata(); try { domainNodeMetaSet = nodeMetadataService.getNodeMetadataByAccountIdNodeId(accountId, nodeId); for (org.openstack.atlas.service.domain.entities.NodeMeta domainMeta : domainNodeMetaSet) { returnMetadata.getMetas().add(dozerMapper.map(domainMeta, Meta.class, "NODE_META_DATA")); } 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); Node node; try { node = nodeService.getNodeByAccountIdLoadBalancerIdNodeId(accountId, loadbalancerId, nodeId); } catch(Exception e) { return Response.status(Response.Status.BAD_REQUEST).entity("Could not find node " + nodeId + ".").build(); } 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 = nodeMetadataService.prepareForNodeMetadataDeletion(accountId, loadbalancerId, nodeId, metaIds); if (!validationErrors.isEmpty()) { return Response.status(Response.Status.BAD_REQUEST).entity(validationErrors).build(); } nodeMetadataService.deleteNodeMetadata(node, metaIds); } catch (Exception ex) { return ResponseFactory.getErrorResponse(ex, null, null); } return Response.status(Response.Status.OK).build(); } @Path("{id: [-+]?[1-9][0-9]*}") public NodeMetaResource retrieveNodeResource(@PathParam("id") int id) { nodeMetaResource.setRequestHeaders(requestHeaders); nodeMetaResource.setAccountId(accountId); nodeMetaResource.setLoadbalancerId(loadbalancerId); nodeMetaResource.setNodeId(nodeId); nodeMetaResource.setId(id); return nodeMetaResource; } public void setNodeMetaResource(NodeMetaResource nodeMetaResource) { this.nodeMetaResource = nodeMetaResource; } public void setRequestHeaders(HttpHeaders requestHeaders) { this.requestHeaders = requestHeaders; } public void setAccountId(Integer accountId) { this.accountId = accountId; } public void setLoadbalancerId(Integer loadbalancerId) { this.loadbalancerId = loadbalancerId; } public void setNodeId(Integer nodeId) { this.nodeId = nodeId; } }