/**
* Copyright 2014-2017 Linagora, Université Joseph Fourier, Floralis
*
* The present code is developed in the scope of the joint LINAGORA -
* Université Joseph Fourier - Floralis research program and is designated
* as a "Result" pursuant to the terms and conditions of the LINAGORA
* - Université Joseph Fourier - Floralis research program. Each copyright
* holder of Results enumerated here above fully & independently holds complete
* ownership of the complete Intellectual Property rights applicable to the whole
* of said Results, and may freely exploit it in any manner which does not infringe
* the moral rights of the other copyright holders.
*
* 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 net.roboconf.dm.rest.services.internal.resources;
import java.io.InputStream;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
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.MediaType;
import javax.ws.rs.core.Response;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;
import net.roboconf.core.model.beans.Application;
import net.roboconf.core.model.beans.ApplicationTemplate;
import net.roboconf.dm.rest.commons.UrlConstants;
/**
* The REST API to manipulate applications on the DM.
* <p>
* Implementing classes have to define the "Path" annotation
* on the class. Use {@link #PATH}.
* </p>
*
* @author Vincent Zurczak - Linagora
* @author Pierre Bourret - Université Joseph Fourier
*/
public interface IManagementResource {
String PATH = "/" + UrlConstants.APPLICATIONS;
// Application Templates
/**
* Loads an application template from an uploaded ZIP file.
* @param uploadedInputStream the uploaded archive
* @param fileDetail the file details
* @return a response
*
* @HTTP 200 Everything went fine.
* @HTTP 406 The application could not be created (e.g. invalid).
*/
@POST
@Path("/templates")
@Consumes( MediaType.MULTIPART_FORM_DATA )
@Produces( MediaType.APPLICATION_JSON )
Response loadUploadedZippedApplicationTemplate(
@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail );
/**
* Loads a zipped application template from an URL.
* <p>
* Local (file:/) and standard remote (http:/) URLs are supported.
* Maven URLs are also supported. Please, refer to PAX URL's web site for more details:
* https://ops4j1.jira.com/wiki/display/paxurl/Mvn+Protocol
* </p>
* <p>
* This operation can be invoked as an example in the scope of continuous deployments.
* </p>
*
* @param url the URL of an application template archive (ZIP file)
* @return a response
*
* @HTTP 200 Everything went fine.
* @HTTP 406 Invalid application template.
* @HTTP 403 An application template with this name already exists.
* @HTTP 401 The application template could not be registered (e.g. DM not ready).
*/
@POST
@Path("/templates/url")
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
Response loadZippedApplicationTemplate( @QueryParam( "url" ) String url );
/**
* Loads an application template from a local ZIP file.
* <p>
* A directory containing a Roboconf application (model + resources)
* could be fairly heavy (several hundreds of megabytes). We must
* consider the possibility someone uses a (S)FTP server (or some
* equivalent solution) to upload a file on the DM's machine.
* </p>
* <p>
* This operation covers this use case.<br>
* It will load an application from a file which was already uploaded
* on the DM's machine.
* </p>
*
* @param localFilePath the local file path of the application directory
* @return a response
*
* @HTTP 200 Everything went fine.
* @HTTP 406 Invalid application template.
* @HTTP 403 An application template with this name already exists.
* @HTTP 401 The application template could not be registered (e.g. DM not ready).
*/
@POST
@Path("/templates/local")
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
Response loadUnzippedApplicationTemplate( @QueryParam( "local-file-path" ) String localFilePath );
/**
* Lists the application templates.
* @param exactName if specified, only the templates with this name will be returned (null to match all)
* <p>
* We only consider the application name, not the display name.
* It means that the parameter should not contain special characters.
* </p>
*
* @param exactQualifier the exact qualifier to search (null to match all)
* @return a non-null list of application templates (with at most one element if "exactName" was set)
* @HTTP 200 Everything went fine.
*/
@GET
@Path("/templates")
@Produces( MediaType.APPLICATION_JSON )
List<ApplicationTemplate> listApplicationTemplates(
@QueryParam( "name" ) String exactName,
@QueryParam( "qualifier" ) String exactQualifier );
/**
* Lists all the application templates.
* <p>
* Java utility, equivalent to <code>listApplicationTemplates( null, null )</code>.
* We do not annotate it for Jersey as listApplicationTemplates( String, String ) already is.
* </p>
*
* @return a non-null list of application templates
* @HTTP 200 Everything went fine.
*/
List<ApplicationTemplate> listApplicationTemplates();
/**
* Deletes an application template.
* @param tplName the application template's name
* @param tplQualifier the application template's qualifier
* @return a response
*
* @HTTP 200 Everything went fine.
* @HTTP 404 The application template was not found.
* @HTTP 403 There are still applications attached to this template.
*/
@DELETE
@Path("/templates/{name}/{qualifier}")
@Produces( MediaType.APPLICATION_JSON )
Response deleteApplicationTemplate( @PathParam("name") String tplName, @PathParam("qualifier") String tplQualifier );
// Applications
/**
* Creates a new application.
* @param app an application
* @return a response
*
* @HTTP 200 Everything went fine.
* @HTTP 404 The application's template was not found.
* @HTTP 403 An application with this name already exists.
* @HTTP 401 The application could not be created (e.g. DM not ready).
*/
@POST
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
Response createApplication( Application app );
/**
* Lists applications.
* @param exactName if specified, only the application with this name will be returned in the list (null to match all)
* <p>
* We only consider the application name, not the display name.
* It means that the parameter should not contain special characters.
* </p>
*
* @return a non-null list of applications (with at most one element if "exactName" was set)
* @HTTP 200 Everything went fine.
*/
@GET
@Produces( MediaType.APPLICATION_JSON )
List<Application> listApplications( @QueryParam("name") String exactName );
/**
* Lists all the applications.
* <p>
* Java utility, equivalent to <code>listApplications( null )</code>.
* We do not annotate it for Jersey as listApplications( String ) already is.
* </p>
*
* @return a non-null list of applications
* @HTTP 200 Everything went fine.
*/
List<Application> listApplications();
/**
* Shutdowns an application.
* <p>
* Shutdown means removing everything Roboconf deployed or created.
* This operation does not delete the application from the model. It only destroys
* runtime resources.
* </p>
*
* @param applicationName the application name
* @return a response
*
* @HTTP 200 Everything went fine.
* @HTTP 404 The application was not found.
* @HTTP 403 The application could not be shutdown (e.g. messaging error).
*/
@POST
@Path("/{name}/shutdown")
@Produces( MediaType.APPLICATION_JSON )
Response shutdownApplication( @PathParam("name") String applicationName );
/**
* Deletes an application.
* @param applicationName the application name
* @return a response
*
* @HTTP 200 Everything went fine.
* @HTTP 404 The application was not found.
* @HTTP 403 The application could not be deleted (e.g. messaging error).
*/
@DELETE
@Path("/{name}")
@Produces( MediaType.APPLICATION_JSON )
Response deleteApplication( @PathParam("name") String applicationName );
// Images
/**
* Uploads an image for a template/application.
* <p>
* If an image was already set, it is overridden by the new one.
* </p>
* @param name the name of the template/application.
* @param qualifier the qualifier of the template, or {@code null} for an application.
* @param image the uploaded image.
* @param fileDetail the image details.
* @return a response.
*
* @HTTP 200 Everything went fine.
* @HTTP 400 The application was not found or the image type or extension is invalid.
*/
@POST
@Path("/image")
@Consumes(MediaType.MULTIPART_FORM_DATA)
Response setImage( @QueryParam("name") String name,
@QueryParam("qualifier") String qualifier,
@FormDataParam("file") InputStream image,
@FormDataParam("file") FormDataContentDisposition fileDetail);
}