package eu.eudat.managers; import eu.eudat.builders.model.models.ProjectBuilder; import eu.eudat.dao.entities.ProjectDao; import eu.eudat.dao.entities.UserInfoDao; import eu.eudat.models.HintedModelFactory; import eu.eudat.models.external.ExternalSourcesItemModel; import eu.eudat.models.external.ProjectsExternalSourcesModel; import eu.eudat.models.helpers.common.DataTableData; import eu.eudat.models.project.Project; import eu.eudat.models.project.ProjectCriteriaRequest; import eu.eudat.models.project.ProjectListingModel; import eu.eudat.models.project.ProjectTableRequest; import eu.eudat.models.security.Principal; import eu.eudat.proxy.config.exceptions.HugeResultSet; import eu.eudat.proxy.config.exceptions.NoURLFound; import eu.eudat.proxy.fetching.RemoteFetcher; import eu.eudat.queryable.QueryableList; import eu.eudat.services.ApiContext; import java.text.ParseException; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; public class ProjectManager { public DataTableData getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest) throws Exception { QueryableList items = projectRepository.getWithCriteria(projectTableRequest.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, projectTableRequest); DataTableData dataTable = new DataTableData(); CompletableFuture projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).selectAsync(item -> new ProjectListingModel().fromDataModel(item)).whenComplete((results, throwable) -> { dataTable.setData(results); }); CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); CompletableFuture.allOf(projectsFuture, countFuture).join(); return dataTable; } public eu.eudat.models.project.Project getSingle(ProjectDao projectRepository, String id) throws InstantiationException, IllegalAccessException { eu.eudat.models.project.Project project = new eu.eudat.models.project.Project(); project.fromDataModel(projectRepository.find(UUID.fromString(id))); return project; } public eu.eudat.entities.Project inactivate(ProjectDao projectRepository, String id) throws InstantiationException, IllegalAccessException { eu.eudat.entities.Project project = projectRepository.find(UUID.fromString(id)); project.setStatus(eu.eudat.entities.Project.Status.DELETED.getValue()); project = projectRepository.createOrUpdate(project); return project; } public List getCriteriaWithExternal(ApiContext apiContext, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getWithCriteria(projectCriteria.getCriteria()); List projects = items.select(item -> new Project().fromDataModel(item)); List> remoteRepos = remoteFetcher.getProjects(projectCriteria.getCriteria().getLike()); ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : projectsExternalSourcesModel) { eu.eudat.models.project.Project project = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ProjectBuilder.class) .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) .description(externalListingItem.getDescription()).uri(externalListingItem.getUri()) .abbreviation(externalListingItem.getAbbreviation()).status(eu.eudat.entities.Project.Status.fromInteger(0)) .build(); projects.add(project); } return projects; } public List getCriteria(ProjectDao projectRepository, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { QueryableList items = projectRepository.getWithCriteria(projectCriteria.getCriteria()); List projects = items.select(item -> new Project().fromDataModel(item)); return projects; } public static void createOrUpdate(ProjectDao projectRepository, UserInfoDao userInfoRepository, eu.eudat.models.project.Project project, Principal principal) throws ParseException { eu.eudat.entities.Project projectEntity = project.toDataModel(); projectEntity.setCreationUser(userInfoRepository.find(principal.getId())); projectRepository.createOrUpdate(projectEntity); } }