blob: d2894c8b8ed836141d446c24ebfe8c25ee62525f [file] [log] [blame]
package de.ids_mannheim.korap.web.controller;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
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.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.sun.jersey.spi.container.ResourceFilters;
import de.ids_mannheim.korap.constant.VirtualCorpusAccessStatus;
import de.ids_mannheim.korap.constant.VirtualCorpusType;
import de.ids_mannheim.korap.dto.VirtualCorpusAccessDto;
import de.ids_mannheim.korap.dto.VirtualCorpusDto;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.security.context.TokenContext;
import de.ids_mannheim.korap.service.VirtualCorpusService;
import de.ids_mannheim.korap.web.KustvaktExceptionHandler;
import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
import de.ids_mannheim.korap.web.filter.BlockingFilter;
import de.ids_mannheim.korap.web.filter.PiwikFilter;
import de.ids_mannheim.korap.web.input.VirtualCorpusJson;
/** VirtualCorpusController defines web APIs related to virtual corpus (VC)
* such as creating, deleting and listing user virtual corpora.
*
* This class also includes APIs related to virtual corpus access (VCA)
* such as sharing and publishing VC. When a VC is published, it is shared
* with all users, but not always listed like system VC. It is listed for
* a user, once when he/she have searched for the VC. A VC can be published
* by creating or editing the VC.
*
* All the APIs in this class are available to logged-in users.
*
* @author margaretha
*
*/
@Controller
@Path("vc")
@ResourceFilters({ AuthenticationFilter.class, BlockingFilter.class,
PiwikFilter.class })
public class VirtualCorpusController {
@Autowired
private KustvaktExceptionHandler responseHandler;
@Autowired
private VirtualCorpusService service;
// EM: should system admins be able to create VC for other users?
/** Creates a user virtual corpus, also for system admins
*
* @see VirtualCorpusJson
*
* @param securityContext
* @param vc a JSON object describing the virtual corpus
* @return HTTP Response OK if successful
*/
@POST
@Path("create")
@Consumes("application/json")
public Response createVC (@Context SecurityContext securityContext,
VirtualCorpusJson vc) {
try {
// get user info
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
service.storeVC(vc, context.getUsername());
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
return Response.ok().build();
}
/** Edits a virtual corpus attributes including name, type and corpus
* query. Only the virtual corpus owner and system admins can edit
* a virtual corpus.
*
* @see VirtualCorpusJson
*
* @param securityContext
* @param vc a JSON object describing the virtual corpus
* @return HTTP Response OK if successful
* @throws KustvaktException
*/
@POST
@Path("edit")
@Consumes("application/json")
public Response editVC (@Context SecurityContext securityContext,
VirtualCorpusJson vc) throws KustvaktException {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
service.editVC(vc, context.getUsername());
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
return Response.ok().build();
}
/** Searches for a specific VC given the VC id.
*
* @param securityContext
* @param vcId a virtual corpus id
* @return a list of virtual corpora
*/
@GET
@Path("{vcId}")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public VirtualCorpusDto retrieveVC (@Context SecurityContext securityContext,
@PathParam("vcId") int vcId) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
return service.searchVCById(context.getUsername(), vcId);
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
}
/** Lists not only private virtual corpora but all virtual corpora
* available to a user.
*
* Users, except system admins, cannot list virtual corpora of
* other users. Thus, createdBy parameter is only relevant for
* requests from system admins.
*
* @param securityContext
* @param createdBy username of virtual corpus creator (optional)
* @return a list of virtual corpora
*/
@GET
@Path("list")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<VirtualCorpusDto> listVCByUser (
@Context SecurityContext securityContext,
@QueryParam("createdBy") String createdBy) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
return service.listVCByUser(context.getUsername(), createdBy);
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
}
/** Lists all virtual corpora created by a user
*
* @param securityContext
* @return a list of virtual corpora created by the user
* in the security context.
*/
@GET
@Path("list/user")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<VirtualCorpusDto> listUserVC (
@Context SecurityContext securityContext) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
return service.listOwnerVC(context.getUsername());
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
}
/** Lists virtual corpora by creator and type. This is a controller for
* system admin requiring valid system admin authentication.
*
* If type is not specified, retrieves virtual corpora of all types.
* If createdBy is not specified, retrieves virtual corpora of all
* users.
*
* @param securityContext
* @param createdBy username of virtual corpus creator
* @param type {@link VirtualCorpusType}
* @return a list of virtual corpora
*/
@GET
@Path("list/system-admin")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<VirtualCorpusDto> listVCByStatus (
@Context SecurityContext securityContext,
@QueryParam("createdBy") String createdBy,
@QueryParam("type") VirtualCorpusType type) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
return service.listVCByType(context.getUsername(), createdBy, type);
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
}
/** Only the VC owner and system admins can delete VC. VCA admins
* can delete VC-accesses e.g. of project VC, but not the VC
* themselves.
*
* @param securityContext
* @param vcId the id of the virtual corpus
* @return HTTP status 200, if successful
*/
@DELETE
@Path("delete/{vcId}")
public Response deleteVC (@Context SecurityContext securityContext,
@PathParam("vcId") int vcId) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
service.deleteVC(context.getUsername(), vcId);
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
return Response.ok().build();
}
/** VC can only be shared with a group, not individuals.
* Only VCA admins are allowed to share VC and
* the VC must have been created by themselves.
*
* @param securityContext
* @param vcId a virtual corpus id
* @param groupId a user group id
* @return HTTP status 200, if successful
*/
@POST
@Path("access/share")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response shareVC (@Context SecurityContext securityContext,
@FormParam("vcId") int vcId, @FormParam("groupId") int groupId) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
service.shareVC(context.getUsername(), vcId, groupId);
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
return Response.ok().build();
}
/** Only VCA Admins and system admins are allowed to delete a VC-access.
*
* @param securityContext
* @param accessId
* @return
*/
@DELETE
@Path("access/delete/{accessId}")
public Response deleteVCAccess (@Context SecurityContext securityContext,
@PathParam("accessId") int accessId) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
service.deleteVCAccess(accessId, context.getUsername());
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
return Response.ok().build();
}
/** Lists active VC accesses to the specified VC.
* Only available to VCA and system admins.
* For system admins, lists all VCA of the VC.
*
* @see VirtualCorpusAccessStatus
*
* @param securityContext
* @param vcId virtual corpus id
* @return a list of access to the specified virtual corpus
*/
@GET
@Path("access/list")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<VirtualCorpusAccessDto> listVCAccess (
@Context SecurityContext securityContext,
@QueryParam("vcId") int vcId) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
return service.listVCAccessByVC(context.getUsername(), vcId);
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
}
/** Lists active VC-accesses available for a user-group.
* Only available to VCA and system admins.
* For system admins, list all VCA for the group.
*
* @param securityContext
* @param groupId a group id
* @return a list of VC-access
*/
@GET
@Path("access/list/byGroup")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<VirtualCorpusAccessDto> listVCAccessByGroup (
@Context SecurityContext securityContext,
@QueryParam("groupId") int groupId) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
return service.listVCAccessByGroup(context.getUsername(), groupId);
}
catch (KustvaktException e) {
throw responseHandler.throwit(e);
}
}
}