com.netflix.genie.server.resources.ApplicationConfigResource.java Source code

Java tutorial

Introduction

Here is the source code for com.netflix.genie.server.resources.ApplicationConfigResource.java

Source

/*
 *
 *  Copyright 2015 Netflix, Inc.
 *
 *     Licensed 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.netflix.genie.server.resources;

import com.netflix.genie.common.exceptions.GenieException;
import com.netflix.genie.common.model.Application;
import com.netflix.genie.common.model.ApplicationStatus;
import com.netflix.genie.common.model.CommandStatus;
import com.netflix.genie.common.model.Command;
import com.netflix.genie.server.services.ApplicationConfigService;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;

import java.net.HttpURLConnection;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Code for ApplicationConfigResource - REST end-point for supporting
 * Application.
 *
 * @author amsharma
 * @author tgianos
 */
@Named
@Path("/v2/config/applications")
@Api(value = "/v2/config/applications", tags = "applications", description = "Manage the available applications")
@Produces(MediaType.APPLICATION_JSON)
public final class ApplicationConfigResource {

    private static final Logger LOG = LoggerFactory.getLogger(ApplicationConfigResource.class);

    /**
     * The application service.
     */
    private final ApplicationConfigService applicationConfigService;

    /**
     * To get URI information for return codes.
     */
    @Context
    private UriInfo uriInfo;

    /**
     * Constructor.
     *
     * @param applicationConfigService The application configuration service to use.
     */
    @Inject
    public ApplicationConfigResource(final ApplicationConfigService applicationConfigService) {
        this.applicationConfigService = applicationConfigService;
    }

    /**
     * Create an Application.
     *
     * @param app The application to create
     * @return The created application configuration
     * @throws GenieException For any error
     */
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Create an application", notes = "Create an application from the supplied information.", response = Application.class)
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_CREATED, message = "Application created successfully.", response = Application.class),
            @ApiResponse(code = HttpURLConnection.HTTP_CONFLICT, message = "An application with the supplied id already exists"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "A precondition failed"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Response createApplication(
            @ApiParam(value = "The application to create.", required = true) final Application app)
            throws GenieException {
        LOG.info("Called to create new application");
        final Application createdApp = this.applicationConfigService.createApplication(app);
        return Response.created(this.uriInfo.getAbsolutePathBuilder().path(createdApp.getId()).build())
                .entity(createdApp).build();
    }

    /**
     * Get Application for given id.
     *
     * @param id unique id for application configuration
     * @return The application configuration
     * @throws GenieException For any error
     */
    @GET
    @Path("/{id}")
    @ApiOperation(value = "Find an application by id", notes = "Get the application by id if it exists", response = Application.class)
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_OK, message = "OK", response = Application.class),
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid id supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Application getApplication(
            @ApiParam(value = "Id of the application to get.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Called to get Application for id " + id);
        return this.applicationConfigService.getApplication(id);
    }

    /**
     * Get Applications based on user parameters.
     *
     * @param name       name for configuration (optional)
     * @param userName   The user who created the application (optional)
     * @param statuses   The statuses of the applications (optional)
     * @param tags       The set of tags you want the command for.
     * @param page       The page to start one (optional)
     * @param limit      the max number of results to return per page (optional)
     * @param descending Whether results returned in descending or ascending order (optional)
     * @param orderBys   The fields to order the results by (optional)
     * @return All applications matching the criteria
     * @throws GenieException For any error
     */
    @GET
    @ApiOperation(value = "Find applications", notes = "Find applications by the submitted criteria.", response = Application.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "If status is invalid."),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public List<Application> getApplications(
            @ApiParam(value = "Name of the application.") @QueryParam("name") final String name,
            @ApiParam(value = "User who created the application.") @QueryParam("userName") final String userName,
            @ApiParam(value = "The status of the applications to get.", allowableValues = "ACTIVE, DEPRECATED, INACTIVE") @QueryParam("status") final Set<String> statuses,
            @ApiParam(value = "Tags for the cluster.") @QueryParam("tag") final Set<String> tags,
            @ApiParam(value = "The page to start on.") @QueryParam("page") @DefaultValue("0") final int page,
            @ApiParam(value = "Max number of results per page.") @QueryParam("limit") @DefaultValue("1024") final int limit,
            @ApiParam(value = "Whether results should be sorted in descending or ascending order. Defaults to descending") @QueryParam("descending") @DefaultValue("true") final boolean descending,
            @ApiParam(value = "The fields to order the results by. Must not be collection fields. Default is updated.") @QueryParam("orderBy") final Set<String> orderBys)
            throws GenieException {
        LOG.info("Called [name | userName | status | tags | page | limit | descending | orderBys]");
        LOG.info(name + " | " + userName + " | " + statuses + " | " + tags + " | " + page + " | " + limit + " | "
                + descending + " | " + orderBys);
        Set<ApplicationStatus> enumStatuses = null;
        if (!statuses.isEmpty()) {
            enumStatuses = EnumSet.noneOf(ApplicationStatus.class);
            for (final String status : statuses) {
                if (StringUtils.isNotBlank(status)) {
                    enumStatuses.add(ApplicationStatus.parse(status));
                }
            }
        }
        return this.applicationConfigService.getApplications(name, userName, enumStatuses, tags, page, limit,
                descending, orderBys);
    }

    /**
     * Update application.
     *
     * @param id        unique id for configuration to update
     * @param updateApp contains the application information to update
     * @return successful response, or one with an HTTP error code
     * @throws GenieException For any error
     */
    @PUT
    @Path("/{id}")
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Update an application", notes = "Update an application from the supplied information.", response = Application.class)
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application to update not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Application updateApplication(
            @ApiParam(value = "Id of the application to update.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The application information to update.", required = true) final Application updateApp)
            throws GenieException {
        LOG.info("called to update application config with info " + updateApp.toString());
        return this.applicationConfigService.updateApplication(id, updateApp);
    }

    /**
     * Delete all applications from database.
     *
     * @return All The deleted applications
     * @throws GenieException For any error
     */
    @DELETE
    @ApiOperation(value = "Delete all applications", notes = "Delete all available applications and get them back.", response = Application.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public List<Application> deleteAllApplications() throws GenieException {
        LOG.info("Delete all Applications");
        return this.applicationConfigService.deleteAllApplications();
    }

    /**
     * Delete an application configuration from database.
     *
     * @param id unique id of configuration to delete
     * @return The deleted application configuration
     * @throws GenieException For any error
     */
    @DELETE
    @Path("/{id}")
    @ApiOperation(value = "Delete an application", notes = "Delete an application with the supplied id.", response = Application.class)
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Application deleteApplication(
            @ApiParam(value = "Id of the application to delete.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Delete an application with id " + id);
        return this.applicationConfigService.deleteApplication(id);
    }

    /**
     * Add new configuration files to a given application.
     *
     * @param id      The id of the application to add the configuration file to. Not
     *                null/empty/blank.
     * @param configs The configuration files to add. Not null/empty/blank.
     * @return The active configurations for this application.
     * @throws GenieException For any error
     */
    @POST
    @Path("/{id}/configs")
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Add new configuration files to an application", notes = "Add the supplied configuration files to the application with the supplied id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> addConfigsToApplication(
            @ApiParam(value = "Id of the application to add configuration to.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The configuration files to add.", required = true) final Set<String> configs)
            throws GenieException {
        LOG.info("Called with id " + id + " and config " + configs);
        return this.applicationConfigService.addConfigsToApplication(id, configs);
    }

    /**
     * Get all the configuration files for a given application.
     *
     * @param id The id of the application to get the configuration files for.
     *           Not NULL/empty/blank.
     * @return The active set of configuration files.
     * @throws GenieException For any error
     */
    @GET
    @Path("/{id}/configs")
    @ApiOperation(value = "Get the configuration files for an application", notes = "Get the configuration files for the application with the supplied id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> getConfigsForApplication(
            @ApiParam(value = "Id of the application to get configurations for.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Called with id " + id);
        return this.applicationConfigService.getConfigsForApplication(id);
    }

    /**
     * Update the configuration files for a given application.
     *
     * @param id      The id of the application to update the configuration files
     *                for. Not null/empty/blank.
     * @param configs The configuration files to replace existing configuration
     *                files with. Not null/empty/blank.
     * @return The new set of application configurations.
     * @throws GenieException For any error
     */
    @PUT
    @Path("/{id}/configs")
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Update configuration files for an application", notes = "Replace the existing configuration files for application with given id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> updateConfigsForApplication(
            @ApiParam(value = "Id of the application to update configurations for.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The configuration files to replace existing with.", required = true) final Set<String> configs)
            throws GenieException {
        LOG.info("Called with id " + id + " and configs " + configs);
        return this.applicationConfigService.updateConfigsForApplication(id, configs);
    }

    /**
     * Delete the all configuration files from a given application.
     *
     * @param id The id of the application to delete the configuration files
     *           from. Not null/empty/blank.
     * @return Empty set if successful
     * @throws GenieException For any error
     */
    @DELETE
    @Path("/{id}/configs")
    @ApiOperation(value = "Remove all configuration files from an application", notes = "Remove all the configuration files from the application with given id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> removeAllConfigsForApplication(
            @ApiParam(value = "Id of the application to delete from.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Called with id " + id);
        return this.applicationConfigService.removeAllConfigsForApplication(id);
    }

    /**
     * Add new jar files for a given application.
     *
     * @param id   The id of the application to add the jar file to. Not
     *             null/empty/blank.
     * @param jars The jar files to add. Not null.
     * @return The active set of application jars.
     * @throws GenieException For any error
     */
    @POST
    @Path("/{id}/jars")
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Add new jar files to an application", notes = "Add the supplied jar files to the applicaiton with the supplied id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> addJarsForApplication(
            @ApiParam(value = "Id of the application to add jar to.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The jar files to add.", required = true) final Set<String> jars)
            throws GenieException {
        LOG.info("Called with id " + id + " and jars " + jars);
        return this.applicationConfigService.addJarsForApplication(id, jars);
    }

    /**
     * Get all the jar files for a given application.
     *
     * @param id The id of the application to get the jar files for. Not
     *           NULL/empty/blank.
     * @return The set of jar files.
     * @throws GenieException For any error
     */
    @GET
    @Path("/{id}/jars")
    @ApiOperation(value = "Get the jars for an application", notes = "Get the jars for the application with the supplied id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> getJarsForApplication(
            @ApiParam(value = "Id of the application to get the jars for.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Called with id " + id);
        return this.applicationConfigService.getJarsForApplication(id);
    }

    /**
     * Update the jar files for a given application.
     *
     * @param id   The id of the application to update the jar files for. Not
     *             null/empty/blank.
     * @param jars The jar files to replace existing jar files with. Not
     *             null/empty/blank.
     * @return The active set of application jars
     * @throws GenieException For any error
     */
    @PUT
    @Path("/{id}/jars")
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Update jar files for an application", notes = "Replace the existing jar files for application with given id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> updateJarsForApplication(
            @ApiParam(value = "Id of the application to update configurations for.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The jar files to replace existing with.", required = true) final Set<String> jars)
            throws GenieException {
        LOG.info("Called with id " + id + " and jars " + jars);
        return this.applicationConfigService.updateJarsForApplication(id, jars);
    }

    /**
     * Delete the all jar files from a given application.
     *
     * @param id The id of the application to delete the jar files from. Not
     *           null/empty/blank.
     * @return Empty set if successful
     * @throws GenieException For any error
     */
    @DELETE
    @Path("/{id}/jars")
    @ApiOperation(value = "Remove all jar files from an application", notes = "Remove all the jar files from the application with given id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> removeAllJarsForApplication(
            @ApiParam(value = "Id of the application to delete from.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Called with id " + id);
        return this.applicationConfigService.removeAllJarsForApplication(id);
    }

    /**
     * Add new tags to a given application.
     *
     * @param id   The id of the application to add the tags to. Not
     *             null/empty/blank.
     * @param tags The tags to add. Not null/empty/blank.
     * @return The active tags for this application.
     * @throws GenieException For any error
     */
    @POST
    @Path("/{id}/tags")
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Add new tags to a application", notes = "Add the supplied tags to the application with the supplied id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> addTagsForApplication(
            @ApiParam(value = "Id of the application to add configuration to.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The tags to add.", required = true) final Set<String> tags) throws GenieException {
        LOG.info("Called with id " + id + " and config " + tags);
        return this.applicationConfigService.addTagsForApplication(id, tags);
    }

    /**
     * Get all the tags for a given application.
     *
     * @param id The id of the application to get the tags for. Not
     *           NULL/empty/blank.
     * @return The active set of tags.
     * @throws GenieException For any error
     */
    @GET
    @Path("/{id}/tags")
    @ApiOperation(value = "Get the tags for a application", notes = "Get the tags for the application with the supplied id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> getTagsForApplication(
            @ApiParam(value = "Id of the application to get tags for.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Called with id " + id);
        return this.applicationConfigService.getTagsForApplication(id);
    }

    /**
     * Update the tags for a given application.
     *
     * @param id   The id of the application to update the tags for.
     *             Not null/empty/blank.
     * @param tags The tags to replace existing configuration
     *             files with. Not null/empty/blank.
     * @return The new set of application tags.
     * @throws GenieException For any error
     */
    @PUT
    @Path("/{id}/tags")
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Update tags for a application", notes = "Replace the existing tags for application with given id.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> updateTagsForApplication(
            @ApiParam(value = "Id of the application to update tags for.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The tags to replace existing with.", required = true) final Set<String> tags)
            throws GenieException {
        LOG.info("Called with id " + id + " and tags " + tags);
        return this.applicationConfigService.updateTagsForApplication(id, tags);
    }

    /**
     * Delete the all tags from a given application.
     *
     * @param id The id of the application to delete the tags from.
     *           Not null/empty/blank.
     * @return Empty set if successful
     * @throws GenieException For any error
     */
    @DELETE
    @Path("/{id}/tags")
    @ApiOperation(value = "Remove all tags from a application", notes = "Remove all the tags from the application with given id.  Note that the genie name space tags"
            + "prefixed with genie.id and genie.name cannot be deleted.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> removeAllTagsForApplication(
            @ApiParam(value = "Id of the application to delete from.", required = true) @PathParam("id") final String id)
            throws GenieException {
        LOG.info("Called with id " + id);
        return this.applicationConfigService.removeAllTagsForApplication(id);
    }

    /**
     * Get all the commands this application is associated with.
     *
     * @param id       The id of the application to get the commands for. Not
     *                 NULL/empty/blank.
     * @param statuses The various statuses of the commands to retrieve
     * @return The set of commands.
     * @throws GenieException For any error
     */
    @GET
    @Path("/{id}/commands")
    @ApiOperation(value = "Get the commands this application is associated with", notes = "Get the commands which this application supports.", response = Command.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public List<Command> getCommandsForApplication(
            @ApiParam(value = "Id of the application to get the commands for.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The statuses of the commands to find.", allowableValues = "ACTIVE, DEPRECATED, INACTIVE") @QueryParam("status") final Set<String> statuses)
            throws GenieException {
        LOG.info("Called with id " + id);

        Set<CommandStatus> enumStatuses = null;
        if (!statuses.isEmpty()) {
            enumStatuses = EnumSet.noneOf(CommandStatus.class);
            for (final String status : statuses) {
                if (StringUtils.isNotBlank(status)) {
                    enumStatuses.add(CommandStatus.parse(status));
                }
            }
        }
        return this.applicationConfigService.getCommandsForApplication(id, enumStatuses);
    }

    /**
     * Remove an tag from a given application.
     *
     * @param id  The id of the application to delete the tag from. Not
     *            null/empty/blank.
     * @param tag The tag to remove. Not null/empty/blank.
     * @return The active set of tags for the application.
     * @throws GenieException For any error
     */
    @DELETE
    @Path("/{id}/tags/{tag}")
    @ApiOperation(value = "Remove a tag from a application", notes = "Remove the given tag from the application with given id. Note that the genie name space tags"
            + "prefixed with genie.id and genie.name cannot be deleted.", response = String.class, responseContainer = "List")
    @ApiResponses(value = {
            @ApiResponse(code = HttpURLConnection.HTTP_NOT_FOUND, message = "Application not found"),
            @ApiResponse(code = HttpURLConnection.HTTP_PRECON_FAILED, message = "Invalid ID supplied"),
            @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = "Genie Server Error due to Unknown Exception") })
    public Set<String> removeTagForApplication(
            @ApiParam(value = "Id of the application to delete from.", required = true) @PathParam("id") final String id,
            @ApiParam(value = "The tag to remove.", required = true) @PathParam("tag") final String tag)
            throws GenieException {
        LOG.info("Called with id " + id + " and tag " + tag);
        return this.applicationConfigService.removeTagForApplication(id, tag);
    }
}