Search in sources :

Example 56 with Project

use of de.tudarmstadt.ukp.clarin.webanno.model.Project in project webanno by webanno.

the class RemoteApiController method sourceDocumentCreate.

/**
 * Upload a source document into project where user has "ADMIN" role
 *
 * Test when running in Eclipse, use the Linux "curl" command.
 *
 * curl -v -F 'file=@test.txt' -F 'filetype=text'
 * 'http://USERNAME:PASSWORD@localhost:8080/webanno-webapp/api/projects/{aProjectId}/sourcedocs/
 * '
 *
 * @param aFile
 *            File for {@link SourceDocument}.
 * @param aProjectId
 *            {@link Project} id.
 * @param aFileType
 *            Extension of the file.
 * @return returns JSON string with id to the created source document.
 * @throws Exception
 *             if there was an error.
 */
@RequestMapping(value = "/" + PROJECTS + "/{" + PARAM_PROJECT_ID + "}/" + DOCUMENTS, method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> sourceDocumentCreate(@RequestParam(PARAM_FILE) MultipartFile aFile, @RequestParam(PARAM_FILETYPE) String aFileType, @PathVariable(PARAM_PROJECT_ID) long aProjectId) throws Exception {
    // Get current user
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    User user = userRepository.get(username);
    if (user == null) {
        return ResponseEntity.badRequest().body("User [" + username + "] not found.");
    }
    // Get project
    Project project;
    try {
        project = projectRepository.getProject(aProjectId);
    } catch (NoResultException e) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Project [" + aProjectId + "] not found.");
    }
    // Check for the access
    boolean hasAccess = SecurityUtil.isProjectAdmin(project, projectRepository, user) || SecurityUtil.isSuperAdmin(projectRepository, user);
    if (!hasAccess) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User [" + username + "] is not allowed to access project [" + aProjectId + "]");
    }
    // Existing project
    if (documentRepository.existsSourceDocument(project, aFile.getOriginalFilename())) {
        return ResponseEntity.status(HttpStatus.CONFLICT).body("A document with name [" + aFile.getOriginalFilename() + "] already exists");
    }
    // Check if file already present or not
    try (InputStream is = aFile.getInputStream()) {
        uploadSourceDocumentFile(is, aFile.getOriginalFilename(), project, aFileType);
    }
    // add id of added source document in return json string
    JSONObject returnJSON = new JSONObject();
    returnJSON.put("id", documentRepository.getSourceDocument(project, aFile.getOriginalFilename()).getId());
    return ResponseEntity.ok(returnJSON.toString());
}
Also used : Project(de.tudarmstadt.ukp.clarin.webanno.model.Project) User(de.tudarmstadt.ukp.clarin.webanno.security.model.User) JSONObject(org.apache.wicket.ajax.json.JSONObject) BufferedInputStream(java.io.BufferedInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) NoResultException(javax.persistence.NoResultException) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 57 with Project

use of de.tudarmstadt.ukp.clarin.webanno.model.Project in project webanno by webanno.

the class RemoteApiController method projectCreate.

/**
 * Create a new project.
 *
 * To test when running in Eclipse, use the Linux "curl" command.
 *
 * curl -v -F 'file=@test.zip' -F 'name=Test' -F 'filetype=tcf'
 * 'http://USERNAME:PASSWORD@localhost:8080/webanno-webapp/api/projects'
 *
 * @param aName
 *            the name of the project to create.
 * @param aFileType
 *            the type of the files contained in the ZIP. The possible file types are configured
 *            in the formats.properties configuration file of WebAnno.
 * @param aFile
 *            a ZIP file containing the project data.
 * @throws Exception if there was an error.
 */
@RequestMapping(value = ("/" + PROJECTS), method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> projectCreate(@RequestParam(PARAM_FILE) MultipartFile aFile, @RequestParam(PARAM_NAME) String aName, @RequestParam(PARAM_FILETYPE) String aFileType) throws Exception {
    // Get current user
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    User user = userRepository.get(username);
    if (user == null) {
        return ResponseEntity.badRequest().body("User [" + username + "] not found.");
    }
    // Check for the access
    boolean hasAccess = SecurityUtil.isProjectCreator(projectRepository, user) || SecurityUtil.isSuperAdmin(projectRepository, user);
    if (!hasAccess) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User [" + username + "] is not allowed to create projects");
    }
    // Existing project
    if (projectRepository.existsProject(aName)) {
        return ResponseEntity.status(HttpStatus.CONFLICT).body("A project with name [" + aName + "] already exists");
    }
    // Check archive
    try (InputStream is = new BufferedInputStream(aFile.getInputStream())) {
        if (!ZipUtils.isZipStream(is)) {
            return ResponseEntity.badRequest().body("Invalid ZIP file");
        }
    }
    // Create the project and initialize tags
    LOG.info("Creating project [" + aName + "]");
    Project project = new Project();
    project.setName(aName);
    projectRepository.createProject(project);
    annotationService.initializeProject(project);
    // Create permission for the project creator
    projectRepository.createProjectPermission(new ProjectPermission(project, username, PermissionLevel.ADMIN));
    projectRepository.createProjectPermission(new ProjectPermission(project, username, PermissionLevel.CURATOR));
    projectRepository.createProjectPermission(new ProjectPermission(project, username, PermissionLevel.USER));
    // Iterate through all the files in the ZIP
    // If the current filename does not start with "." and is in the root folder of the ZIP,
    // import it as a source document
    File zipFile = File.createTempFile(aFile.getOriginalFilename(), ".zip");
    aFile.transferTo(zipFile);
    ZipFile zip = new ZipFile(zipFile);
    for (Enumeration<?> zipEnumerate = zip.entries(); zipEnumerate.hasMoreElements(); ) {
        // Get ZipEntry which is a file or a directory
        ZipEntry entry = (ZipEntry) zipEnumerate.nextElement();
        // If it is the zip name, ignore it
        if ((FilenameUtils.removeExtension(aFile.getOriginalFilename()) + "/").equals(entry.toString())) {
            continue;
        } else // project meta data
        if (entry.toString().replace("/", "").equals((META_INF + "webanno/source-meta-data.properties").replace("/", ""))) {
            InputStream zipStream = zip.getInputStream(entry);
            projectRepository.savePropertiesFile(project, zipStream, entry.toString());
        } else // META-INF/webanno/source-meta-data.properties
        if (StringUtils.countMatches(entry.toString(), "/") > 1) {
            continue;
        } else // ZIP, import it as a source document
        if (!FilenameUtils.getExtension(entry.toString()).equals("") && !FilenameUtils.getName(entry.toString()).equals(".")) {
            uploadSourceDocument(zip, entry, project, aFileType);
        }
    }
    LOG.info("Successfully created project [" + aName + "] for user [" + username + "]");
    JSONObject projectJSON = new JSONObject();
    long pId = projectRepository.getProject(aName).getId();
    projectJSON.append(aName, pId);
    return ResponseEntity.ok(projectJSON.toString());
}
Also used : User(de.tudarmstadt.ukp.clarin.webanno.security.model.User) BufferedInputStream(java.io.BufferedInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) ZipEntry(java.util.zip.ZipEntry) Project(de.tudarmstadt.ukp.clarin.webanno.model.Project) ZipFile(java.util.zip.ZipFile) JSONObject(org.apache.wicket.ajax.json.JSONObject) BufferedInputStream(java.io.BufferedInputStream) ProjectPermission(de.tudarmstadt.ukp.clarin.webanno.model.ProjectPermission) ZipFile(java.util.zip.ZipFile) File(java.io.File) MultipartFile(org.springframework.web.multipart.MultipartFile) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 58 with Project

use of de.tudarmstadt.ukp.clarin.webanno.model.Project in project webanno by webanno.

the class RemoteApiController method projectList.

/**
 * List all the projects for a given user with their roles
 *
 * Test when running in Eclipse: Open your browser, paste following URL with appropriate values
 * for username and password:
 *
 * http://USERNAME:PASSWORD@localhost:8080/webanno-webapp/api/projects
 *
 * @return JSON string of project where user has access to and respective roles in the project.
 * @throws Exception
 *             if there was an error.
 */
@RequestMapping(value = ("/" + PROJECTS), method = RequestMethod.GET)
public ResponseEntity<String> projectList() throws Exception {
    // Get current user
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    User user = userRepository.get(username);
    if (user == null) {
        return ResponseEntity.badRequest().body("User [" + username + "] not found.");
    }
    // Get projects with permission
    List<Project> accessibleProjects = projectRepository.listAccessibleProjects(user);
    // Add permissions for each project into JSON array and store in JSON object
    JSONObject returnJSONObj = new JSONObject();
    for (Project project : accessibleProjects) {
        String projectId = Long.toString(project.getId());
        List<ProjectPermission> projectPermissions = projectRepository.listProjectPermissionLevel(user, project);
        JSONArray permissionArr = new JSONArray();
        JSONObject projectJSON = new JSONObject();
        for (ProjectPermission p : projectPermissions) {
            permissionArr.put(p.getLevel().getName());
        }
        projectJSON.put(project.getName(), permissionArr);
        returnJSONObj.put(projectId, projectJSON);
    }
    return ResponseEntity.ok(returnJSONObj.toString());
}
Also used : Project(de.tudarmstadt.ukp.clarin.webanno.model.Project) User(de.tudarmstadt.ukp.clarin.webanno.security.model.User) JSONObject(org.apache.wicket.ajax.json.JSONObject) ProjectPermission(de.tudarmstadt.ukp.clarin.webanno.model.ProjectPermission) JSONArray(org.apache.wicket.ajax.json.JSONArray) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 59 with Project

use of de.tudarmstadt.ukp.clarin.webanno.model.Project in project webanno by webanno.

the class RemoteApiController method sourceDocumentList.

/**
 * Show source documents in given project where user has ADMIN access
 *
 * http://USERNAME:PASSWORD@localhost:8080/webanno-webapp/api/projects/{aProjectId}/sourcedocs
 *
 * @param aProjectId the project ID
 * @return JSON with {@link SourceDocument} : id
 */
@RequestMapping(value = "/" + PROJECTS + "/{" + PARAM_PROJECT_ID + "}/" + DOCUMENTS, method = RequestMethod.GET)
public ResponseEntity<String> sourceDocumentList(@PathVariable(PARAM_PROJECT_ID) long aProjectId) throws Exception {
    // Get current user
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    User user = userRepository.get(username);
    if (user == null) {
        return ResponseEntity.badRequest().body("User [" + username + "] not found.");
    }
    // Get project
    Project project;
    try {
        project = projectRepository.getProject(aProjectId);
    } catch (NoResultException e) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Project [" + aProjectId + "] not found.");
    }
    // Check for the access
    boolean hasAccess = SecurityUtil.isProjectAdmin(project, projectRepository, user) || SecurityUtil.isSuperAdmin(projectRepository, user);
    if (!hasAccess) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User [" + username + "] is not allowed to access project [" + aProjectId + "]");
    }
    List<SourceDocument> srcDocumentList = documentRepository.listSourceDocuments(project);
    JSONArray sourceDocumentJSONArr = new JSONArray();
    for (SourceDocument s : srcDocumentList) {
        JSONObject sourceDocumentJSONObj = new JSONObject();
        sourceDocumentJSONObj.put("id", s.getId());
        sourceDocumentJSONObj.put("name", s.getName());
        sourceDocumentJSONObj.put("state", s.getState());
        sourceDocumentJSONArr.put(sourceDocumentJSONObj);
    }
    return ResponseEntity.ok(sourceDocumentJSONArr.toString());
}
Also used : Project(de.tudarmstadt.ukp.clarin.webanno.model.Project) User(de.tudarmstadt.ukp.clarin.webanno.security.model.User) JSONObject(org.apache.wicket.ajax.json.JSONObject) SourceDocument(de.tudarmstadt.ukp.clarin.webanno.model.SourceDocument) JSONArray(org.apache.wicket.ajax.json.JSONArray) NoResultException(javax.persistence.NoResultException) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 60 with Project

use of de.tudarmstadt.ukp.clarin.webanno.model.Project in project webanno by webanno.

the class RemoteApiController method annotationDocumentRead.

/**
 * Download annotation document with requested parameters
 *
 * Test when running in Eclipse: Open your browser, paste following URL with appropriate values:
 *
 * http://USERNAME:PASSWORD@localhost:8080/webanno-webapp/api/projects/{aProjectId}/sourcedocs/{
 * aSourceDocumentId}/annos/{annotatorName}?format="text"
 *
 * @param response
 *            HttpServletResponse.
 * @param aProjectId
 *            {@link Project} ID.
 * @param aSourceDocumentId
 *            {@link SourceDocument} ID.
 * @param annotatorName
 *            {@link User} name.
 * @param format
 *            Export format.
 * @throws Exception
 *             if there was an error.
 */
@RequestMapping(value = "/" + PROJECTS + "/{" + PARAM_PROJECT_ID + "}/" + DOCUMENTS + "/{" + PARAM_DOCUMENT_ID + "}/" + ANNOTATIONS + "/{" + PARAM_USERNAME + "}", method = RequestMethod.GET)
public void annotationDocumentRead(HttpServletResponse response, @PathVariable(PARAM_PROJECT_ID) long aProjectId, @PathVariable(PARAM_DOCUMENT_ID) long aSourceDocumentId, @PathVariable(PARAM_USERNAME) String annotatorName, @RequestParam(value = PARAM_FORMAT, required = false) String format) throws Exception {
    // Get current user
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    User user = userRepository.get(username);
    if (user == null) {
        response.sendError(HttpStatus.BAD_REQUEST.value(), "User [" + username + "] not found.");
        return;
    }
    // Get project
    Project project;
    try {
        project = projectRepository.getProject(aProjectId);
    } catch (NoResultException e) {
        response.sendError(HttpStatus.NOT_FOUND.value(), "Project" + aProjectId + "] not found.");
        return;
    }
    // Check for the access
    boolean hasAccess = SecurityUtil.isProjectAdmin(project, projectRepository, user) || SecurityUtil.isSuperAdmin(projectRepository, user);
    if (!hasAccess) {
        response.sendError(HttpStatus.FORBIDDEN.value(), "User [" + username + "] is not allowed to access project [" + aProjectId + "]");
        return;
    }
    // Get annotator user
    User annotator = userRepository.get(annotatorName);
    if (annotator == null) {
        response.sendError(HttpStatus.BAD_REQUEST.value(), "Annotator user [" + annotatorName + "] not found.");
        return;
    }
    // Get source document
    SourceDocument srcDoc;
    try {
        srcDoc = documentRepository.getSourceDocument(aProjectId, aSourceDocumentId);
    } catch (NoResultException e) {
        response.sendError(HttpStatus.NOT_FOUND.value(), "Document [" + aSourceDocumentId + "] not found in project [" + aProjectId + "].");
        return;
    }
    // Get annotation document
    AnnotationDocument annDoc;
    try {
        annDoc = documentRepository.getAnnotationDocument(srcDoc, annotator);
    } catch (NoResultException e) {
        response.sendError(HttpStatus.NOT_FOUND.value(), "Annotations for user [" + annotatorName + "] not found on document [" + aSourceDocumentId + "] in project [" + aProjectId + "].");
        return;
    }
    String formatId;
    if (format == null) {
        formatId = srcDoc.getFormat();
    } else {
        formatId = format;
    }
    Class<?> writer = importExportService.getWritableFormats().get(formatId);
    if (writer == null) {
        String msg = "[" + srcDoc.getName() + "] No writer found for format [" + formatId + "] - exporting as WebAnno TSV instead.";
        LOG.info(msg);
        writer = WebannoTsv3XWriter.class;
    }
    // Temporary file of annotation document
    File downloadableFile = importExportService.exportAnnotationDocument(srcDoc, annotatorName, writer, annDoc.getName(), Mode.ANNOTATION);
    try {
        // Set mime type
        String mimeType = URLConnection.guessContentTypeFromName(downloadableFile.getName());
        if (mimeType == null) {
            LOG.info("mimetype is not detectable, will take default");
            mimeType = "application/octet-stream";
        }
        // Set response
        response.setContentType(mimeType);
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition", "inline; filename=\"" + downloadableFile.getName() + "\"");
        response.setContentLength((int) downloadableFile.length());
        InputStream inputStream = new BufferedInputStream(new FileInputStream(downloadableFile));
        FileCopyUtils.copy(inputStream, response.getOutputStream());
    } catch (Exception e) {
        LOG.info("Exception occured" + e.getMessage());
    } finally {
        if (downloadableFile.exists()) {
            downloadableFile.delete();
        }
    }
}
Also used : User(de.tudarmstadt.ukp.clarin.webanno.security.model.User) BufferedInputStream(java.io.BufferedInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) SourceDocument(de.tudarmstadt.ukp.clarin.webanno.model.SourceDocument) AnnotationDocument(de.tudarmstadt.ukp.clarin.webanno.model.AnnotationDocument) NoResultException(javax.persistence.NoResultException) FileInputStream(java.io.FileInputStream) NoResultException(javax.persistence.NoResultException) UIMAException(org.apache.uima.UIMAException) IOException(java.io.IOException) Project(de.tudarmstadt.ukp.clarin.webanno.model.Project) BufferedInputStream(java.io.BufferedInputStream) ZipFile(java.util.zip.ZipFile) File(java.io.File) MultipartFile(org.springframework.web.multipart.MultipartFile) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Aggregations

Project (de.tudarmstadt.ukp.clarin.webanno.model.Project)68 SourceDocument (de.tudarmstadt.ukp.clarin.webanno.model.SourceDocument)23 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)23 User (de.tudarmstadt.ukp.clarin.webanno.security.model.User)22 File (java.io.File)22 RProject (de.tudarmstadt.ukp.clarin.webanno.webapp.remoteapi.v2.model.RProject)17 IOException (java.io.IOException)15 ApiOperation (io.swagger.annotations.ApiOperation)14 NoResultException (javax.persistence.NoResultException)13 AnnotationDocument (de.tudarmstadt.ukp.clarin.webanno.model.AnnotationDocument)12 ArrayList (java.util.ArrayList)12 MDC (org.slf4j.MDC)12 InputStream (java.io.InputStream)11 JCas (org.apache.uima.jcas.JCas)10 UIMAException (org.apache.uima.UIMAException)8 MultipartFile (org.springframework.web.multipart.MultipartFile)8 BufferedInputStream (java.io.BufferedInputStream)7 FileInputStream (java.io.FileInputStream)7 Transactional (org.springframework.transaction.annotation.Transactional)7 ZipFile (java.util.zip.ZipFile)6