diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java index 8d7ff171dee8f6c5a6348270bb51dc3484c6f317..4e1cb28e8895f1d23f26ea4d39cace0a6aace908 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java @@ -1459,26 +1459,26 @@ public class ProjectService implements IProjectService { userService.updateUser(dbUser); user.setAnnotationSchema(annotationSchema); } - + @Override public List<UserAnnotatorsParam> getAnnotatorsParams(User user) { - User dbUser = userDao.getById(user.getId()); - UserAnnotationSchema annotationSchema = dbUser.getAnnotationSchema(); - if (annotationSchema == null) { - annotationSchema = new UserAnnotationSchema(); - dbUser.setAnnotationSchema(annotationSchema); - } - - /* - * Hibernate lazy loads collections so each element needs to be accessed - * to be loaded now or otherwise the data might not be available - * when accessed because the session might not be available at that time. - */ - List<UserAnnotatorsParam> aps = new ArrayList<>(); - for (UserAnnotatorsParam ap: annotationSchema.getAnnotatorsParams()){ - aps.add(ap); - } - return aps; + User dbUser = userDao.getById(user.getId()); + UserAnnotationSchema annotationSchema = dbUser.getAnnotationSchema(); + if (annotationSchema == null) { + annotationSchema = new UserAnnotationSchema(); + dbUser.setAnnotationSchema(annotationSchema); + } + + /* + * Hibernate lazy loads collections so each element needs to be accessed to be + * loaded now or otherwise the data might not be available when accessed because + * the session might not be available at that time. + */ + List<UserAnnotatorsParam> aps = new ArrayList<>(); + for (UserAnnotatorsParam ap : annotationSchema.getAnnotatorsParams()) { + aps.add(ap); + } + return aps; } /** @@ -1627,4 +1627,9 @@ public class ProjectService implements IProjectService { this.taxonomyBackend = taxonomyBackend; } + @Override + public List<Project> getAllProjects() { + return projectDao.getAll(); + } + } diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IProjectService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IProjectService.java index 9d504bffe34a272052035caa6d0d4d04fdee4830..b802cfe8897af65cc9a6d99b1b2af672d19c5806 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IProjectService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IProjectService.java @@ -22,180 +22,184 @@ import lcsb.mapviewer.services.view.ProjectView; */ public interface IProjectService { - /** - * Returns a project with a give {@link Project#projectId project identifier}. - * - * @param projectId - * {@link Project#projectId project identifier} - * @return project with an identifier given as parameter. Null if such project - * doesn't exist. - */ - Project getProjectByProjectId(String projectId, AuthenticationToken token) throws UserAccessException; - - /** - * Checks if project with a given {@link Project#projectId identifier} exists. - * - * @param projectId - * {@link Project#projectId project identifier} - * @return <code>true</code> if the project with the given name exists, - * <code>false</code> otherwise - */ - boolean projectExists(String projectId); - - /** - * Returns list of all projects. - * - * @return list of all projects. - */ - List<Project> getAllProjects(AuthenticationToken token); - - /** - * Returns a list of Project views for all projects. - * - * @return list of Project views for all projects - */ - List<ProjectView> getAllProjectViews(AuthenticationToken token); - - /** - * Updates project. - * - * @param projectView - * project view with the data to update - */ - void updateProject(ProjectView projectView); - - /** - * Removes project from the system. - * - * @param homeDir - * directory where the system is deployed - * - * @param projectView - * information about project to remove - * @param async - * should the operation be done asynchronously - * @throws UserAccessException - */ - void removeProject(ProjectView projectView, String homeDir, boolean async, AuthenticationToken token) throws UserAccessException; - - /** - * Removes project from the system. - * - * @param homeDir - * directory where the system is deployed - * @param project - * object to remove - * @param async - * should the operation be done asynchronously - * @throws UserAccessException - */ - void removeProject(Project project, String homeDir, boolean async, AuthenticationToken token) throws UserAccessException; - - /** - * Gets view of the project by the {@link Project#projectId project - * identifier}. - * - * @param projectId - * {@link Project#projectId project identifier} - * @return view of the project - * @throws UserAccessException - */ - ProjectView getProjectViewByProjectId(String projectId, AuthenticationToken token) throws UserAccessException; - - /** - * Adds project to the system. - * - * @param project - * object to add - */ - void addProject(Project project); - - /** - * Return the view of the project identified by database identifier. - * - * @param id - * database identifier of the project - * @return project view - * @throws UserAccessException - */ - ProjectView getProjectViewById(Integer id, AuthenticationToken token) throws UserAccessException; - - /** - * Creates project using give parameters. See {@link CreateProjectParams}. - * - * @param params - * information about project to create - * @throws SecurityException - */ - void createProject(CreateProjectParams params) throws SecurityException; - - /** - * Creates empty {@link ProjectView}. - * - * @return empty {@link ProjectView} - */ - ProjectView createEmpty(); - - /** - * Creates {@link TreeNode} that contains information about all classes that - * can be annotated and associate set of - * {@link lcsb.mapviewer.annotation.services.annotators.ElementAnnotator - * ElementAnnotator} valid for these classes. - * - * @param user - * for which information should be retrieved - * @return {@link TreeNode} that contains information about all classes that - * can be annotated - */ - TreeNode createClassAnnotatorTree(User user); - - /** - * Update default set of annotators, lists of required/valid annotations for a - * given user and default params used when creating project. - * - * @param user - * user for which we updte information - * @param sbgnFormat - * new - * {@link lcsb.mapviewer.model.user.UserAnnotationSchema#sbgnFormat} - * value - * @param networkLayoutAsDefault - * new - * {@link lcsb.mapviewer.model.user.UserAnnotationSchema#networkLayoutAsDefault} - * value - * @param annotatorsTree - * {@link TreeNode} that contains information about all classes that - * can be annotated - */ - void updateClassAnnotatorTreeForUser(User user, TreeNode annotatorsTree, boolean sbgnFormat, boolean networkLayoutAsDefault); - - /** - * Method that updates information about raw {@link Project} object. - * - * @param project - * project to update - */ - void updateProject(Project project); - - /** - * Returns content of the file that was used to create project given in the - * parameter. - * - * @param projectView - * view of the {@link Project} for which we are looking for an - * original source file - * @return content of the file that was used to create project given in the - * parameter - */ - byte[] getInputDataForProject(ProjectView projectView); - - UserAnnotationSchema prepareUserAnnotationSchema(User user); - - /** - * Retrieves list of annotators {@link UserAnnotatorsParam parameters} - * @return - * list of annotators parameters - */ - List<UserAnnotatorsParam> getAnnotatorsParams(User user); + /** + * Returns a project with a give {@link Project#projectId project identifier}. + * + * @param projectId + * {@link Project#projectId project identifier} + * @return project with an identifier given as parameter. Null if such project + * doesn't exist. + */ + Project getProjectByProjectId(String projectId, AuthenticationToken token) throws UserAccessException; + + /** + * Checks if project with a given {@link Project#projectId identifier} exists. + * + * @param projectId + * {@link Project#projectId project identifier} + * @return <code>true</code> if the project with the given name exists, + * <code>false</code> otherwise + */ + boolean projectExists(String projectId); + + /** + * Returns list of all projects. + * + * @return list of all projects. + */ + List<Project> getAllProjects(AuthenticationToken token); + + /** + * Returns a list of Project views for all projects. + * + * @return list of Project views for all projects + */ + List<ProjectView> getAllProjectViews(AuthenticationToken token); + + /** + * Updates project. + * + * @param projectView + * project view with the data to update + */ + void updateProject(ProjectView projectView); + + /** + * Removes project from the system. + * + * @param homeDir + * directory where the system is deployed + * + * @param projectView + * information about project to remove + * @param async + * should the operation be done asynchronously + * @throws UserAccessException + */ + void removeProject(ProjectView projectView, String homeDir, boolean async, AuthenticationToken token) + throws UserAccessException; + + /** + * Removes project from the system. + * + * @param homeDir + * directory where the system is deployed + * @param project + * object to remove + * @param async + * should the operation be done asynchronously + * @throws UserAccessException + */ + void removeProject(Project project, String homeDir, boolean async, AuthenticationToken token) + throws UserAccessException; + + /** + * Gets view of the project by the {@link Project#projectId project identifier}. + * + * @param projectId + * {@link Project#projectId project identifier} + * @return view of the project + * @throws UserAccessException + */ + ProjectView getProjectViewByProjectId(String projectId, AuthenticationToken token) throws UserAccessException; + + /** + * Adds project to the system. + * + * @param project + * object to add + */ + void addProject(Project project); + + /** + * Return the view of the project identified by database identifier. + * + * @param id + * database identifier of the project + * @return project view + * @throws UserAccessException + */ + ProjectView getProjectViewById(Integer id, AuthenticationToken token) throws UserAccessException; + + /** + * Creates project using give parameters. See {@link CreateProjectParams}. + * + * @param params + * information about project to create + * @throws SecurityException + */ + void createProject(CreateProjectParams params) throws SecurityException; + + /** + * Creates empty {@link ProjectView}. + * + * @return empty {@link ProjectView} + */ + ProjectView createEmpty(); + + /** + * Creates {@link TreeNode} that contains information about all classes that can + * be annotated and associate set of + * {@link lcsb.mapviewer.annotation.services.annotators.ElementAnnotator + * ElementAnnotator} valid for these classes. + * + * @param user + * for which information should be retrieved + * @return {@link TreeNode} that contains information about all classes that can + * be annotated + */ + TreeNode createClassAnnotatorTree(User user); + + /** + * Update default set of annotators, lists of required/valid annotations for a + * given user and default params used when creating project. + * + * @param user + * user for which we updte information + * @param sbgnFormat + * new + * {@link lcsb.mapviewer.model.user.UserAnnotationSchema#sbgnFormat} + * value + * @param networkLayoutAsDefault + * new + * {@link lcsb.mapviewer.model.user.UserAnnotationSchema#networkLayoutAsDefault} + * value + * @param annotatorsTree + * {@link TreeNode} that contains information about all classes that + * can be annotated + */ + void updateClassAnnotatorTreeForUser(User user, TreeNode annotatorsTree, boolean sbgnFormat, + boolean networkLayoutAsDefault); + + /** + * Method that updates information about raw {@link Project} object. + * + * @param project + * project to update + */ + void updateProject(Project project); + + /** + * Returns content of the file that was used to create project given in the + * parameter. + * + * @param projectView + * view of the {@link Project} for which we are looking for an original + * source file + * @return content of the file that was used to create project given in the + * parameter + */ + byte[] getInputDataForProject(ProjectView projectView); + + UserAnnotationSchema prepareUserAnnotationSchema(User user); + + /** + * Retrieves list of annotators {@link UserAnnotatorsParam parameters} + * + * @return list of annotators parameters + */ + List<UserAnnotatorsParam> getAnnotatorsParams(User user); + + List<Project> getAllProjects(); } diff --git a/web/src/main/java/lcsb/mapviewer/bean/utils/StartupBean.java b/web/src/main/java/lcsb/mapviewer/bean/utils/StartupBean.java index 27d28c8d53f74fe1064a7edf21ae6852d5fbb540..20dad609ea8eccaf77c5e4527fd8ef37ba478f65 100644 --- a/web/src/main/java/lcsb/mapviewer/bean/utils/StartupBean.java +++ b/web/src/main/java/lcsb/mapviewer/bean/utils/StartupBean.java @@ -31,137 +31,144 @@ import lcsb.mapviewer.services.interfaces.IReferenceGenomeService; @ApplicationScoped public class StartupBean { - /** - * Default class logger. - */ - private final transient Logger logger = Logger.getLogger(StartupBean.class); - - /** - * Dao used to access information about projects. - * - */ - @ManagedProperty(value = "#{ProjectDao}") - private transient ProjectDao projectDao; - - /** - * Service used to access configuration params from db. - * - * @see IProjectService - */ - @ManagedProperty(value = "#{ConfigurationService}") - private transient IConfigurationService configurationService; - - /** - * Service used to access information about reference genomes. - * - * @see IReferenceGenomeService - */ - @ManagedProperty(value = "#{ReferenceGenomeService}") - private transient IReferenceGenomeService referenceGenomeService; - - /** - * Method that process initial script of application. - */ - @PostConstruct - public void init() { - logger.debug("Application startup script starts"); - try { - setInterruptedProjectsStatuses(); - Configuration.setxFrameDomain(configurationService.getConfigurationValue(ConfigurationElementType.X_FRAME_DOMAIN)); - - removeInterruptedReferenceGenomeDownloads(); - } catch (Exception e) { - logger.error("Problem running init script...", e); - } - logger.debug("Application startup script ends"); - } - - /** - * Removes downloads of reference genomes that were interrupted by tomcat - * restart. - */ - private void removeInterruptedReferenceGenomeDownloads() { - for (ReferenceGenome genome : referenceGenomeService.getDownloadedGenomes()) { - if (genome.getDownloadProgress() < IProgressUpdater.MAX_PROGRESS) { - logger.warn("Removing genome that was interrupted: " + genome); - try { - referenceGenomeService.removeGenome(genome); - } catch (IOException e) { - logger.error("Problem with removing genome: " + genome); - } - } - } - } - - /** - * Set {@link ProjectStatus#FAIL} statuses to projects that were uploading - * when application was shutdown. - */ - private void setInterruptedProjectsStatuses() { - for (Project project : projectDao.getAll()) { - if (!ProjectStatus.DONE.equals(project.getStatus()) && !ProjectStatus.FAIL.equals(project.getStatus())) { - String errors = project.getErrors(); - if (errors == null || errors.trim().isEmpty()) { - errors = ""; - } else { - errors = errors.trim() + "\n"; - } - errors += "Project uploading was interrupted by application restart (at the stage: " + project.getStatus() + ")."; - project.setStatus(ProjectStatus.FAIL); - project.setErrors(errors); - projectDao.update(project); - logger.info("Status of project: " + project.getProjectId() + " changed to fail. Errors: " + errors); - } - } - } - - /** - * @return the configurationService - * @see #configurationService - */ - public IConfigurationService getConfigurationService() { - return configurationService; - } - - /** - * @param configurationService - * the configurationService to set - * @see #configurationService - */ - public void setConfigurationService(IConfigurationService configurationService) { - this.configurationService = configurationService; - } - - /** - * @return the referenceGenomeService - * @see #referenceGenomeService - */ - public IReferenceGenomeService getReferenceGenomeService() { - return referenceGenomeService; - } - - /** - * @param referenceGenomeService - * the referenceGenomeService to set - * @see #referenceGenomeService - */ - public void setReferenceGenomeService(IReferenceGenomeService referenceGenomeService) { - this.referenceGenomeService = referenceGenomeService; - } - - /** - * @return the projectDao - * @see #projectDao - */ - public ProjectDao getProjectDao() { - return projectDao; - } - - /** - * @param projectDao the projectDao to set - * @see #projectDao - */ - public void setProjectDao(ProjectDao projectDao) { - this.projectDao = projectDao; - } + /** + * Default class logger. + */ + private final transient Logger logger = Logger.getLogger(StartupBean.class); + + /** + * Dao used to access information about projects. + * + */ + @ManagedProperty(value = "#{ProjectService}") + private transient IProjectService projectService; + + /** + * Service used to access configuration params from db. + * + * @see IProjectService + */ + @ManagedProperty(value = "#{ConfigurationService}") + private transient IConfigurationService configurationService; + + /** + * Service used to access information about reference genomes. + * + * @see IReferenceGenomeService + */ + @ManagedProperty(value = "#{ReferenceGenomeService}") + private transient IReferenceGenomeService referenceGenomeService; + + /** + * Method that process initial script of application. + */ + @PostConstruct + public void init() { + logger.debug("Application startup script starts"); + setInterruptedProjectsStatuses(); + modifyXFrameDomain(); + removeInterruptedReferenceGenomeDownloads(); + logger.debug("Application startup script ends"); + } + + private void modifyXFrameDomain() { + try { + Configuration + .setxFrameDomain(configurationService.getConfigurationValue(ConfigurationElementType.X_FRAME_DOMAIN)); + } catch (Exception e) { + logger.error("Problem with modyfing x frame domain...", e); + } + } + + /** + * Removes downloads of reference genomes that were interrupted by tomcat + * restart. + */ + private void removeInterruptedReferenceGenomeDownloads() { + try { + for (ReferenceGenome genome : referenceGenomeService.getDownloadedGenomes()) { + if (genome.getDownloadProgress() < IProgressUpdater.MAX_PROGRESS) { + logger.warn("Removing genome that was interrupted: " + genome); + try { + referenceGenomeService.removeGenome(genome); + } catch (IOException e) { + logger.error("Problem with removing genome: " + genome); + } + } + } + } catch (Exception e) { + logger.error("Problem with removing interrupted downloads...", e); + } + + } + + /** + * Set {@link ProjectStatus#FAIL} statuses to projects that were uploading when + * application was shutdown. + */ + private void setInterruptedProjectsStatuses() { + try { + for (Project project : projectService.getAllProjects()) { + if (!ProjectStatus.DONE.equals(project.getStatus()) && !ProjectStatus.FAIL.equals(project.getStatus())) { + String errors = project.getErrors(); + if (errors == null || errors.trim().isEmpty()) { + errors = ""; + } else { + errors = errors.trim() + "\n"; + } + errors += "Project uploading was interrupted by application restart (at the stage: " + project.getStatus() + + ")."; + project.setStatus(ProjectStatus.FAIL); + project.setErrors(errors); + projectService.updateProject(project); + logger.info("Status of project: " + project.getProjectId() + " changed to fail. Errors: " + errors); + } + } + } catch (Exception e) { + logger.error("Problem with changing project status ...", e); + } + } + + /** + * @return the configurationService + * @see #configurationService + */ + public IConfigurationService getConfigurationService() { + return configurationService; + } + + /** + * @param configurationService + * the configurationService to set + * @see #configurationService + */ + public void setConfigurationService(IConfigurationService configurationService) { + this.configurationService = configurationService; + } + + /** + * @return the referenceGenomeService + * @see #referenceGenomeService + */ + public IReferenceGenomeService getReferenceGenomeService() { + return referenceGenomeService; + } + + /** + * @param referenceGenomeService + * the referenceGenomeService to set + * @see #referenceGenomeService + */ + public void setReferenceGenomeService(IReferenceGenomeService referenceGenomeService) { + this.referenceGenomeService = referenceGenomeService; + } + + public IProjectService getProjectService() { + return projectService; + } + + public void setProjectService(IProjectService projectService) { + this.projectService = projectService; + } + }