2 * Copyright (C) The Arvados Authors. All rights reserved.
4 * SPDX-License-Identifier: AGPL-3.0 OR Apache-2.0
8 package org.arvados.client.logic.collection;
10 import org.arvados.client.api.client.GroupsApiClient;
11 import org.arvados.client.api.client.UsersApiClient;
12 import org.arvados.client.exception.ArvadosApiException;
13 import org.arvados.client.api.model.Collection;
14 import org.arvados.client.common.Patterns;
15 import org.arvados.client.config.FileConfigProvider;
16 import org.arvados.client.config.ConfigProvider;
17 import org.arvados.client.exception.ArvadosClientException;
20 import java.time.LocalDateTime;
21 import java.time.format.DateTimeFormatter;
22 import java.util.List;
23 import java.util.Optional;
25 public class CollectionFactory {
27 private ConfigProvider config;
28 private UsersApiClient usersApiClient;
29 private GroupsApiClient groupsApiClient;
31 private final String name;
32 private final String projectUuid;
33 private final List<File> manifestFiles;
34 private final List<String> manifestLocators;
36 private CollectionFactory(ConfigProvider config, String name, String projectUuid, List<File> manifestFiles, List<String> manifestLocators) {
38 this.projectUuid = projectUuid;
39 this.manifestFiles = manifestFiles;
40 this.manifestLocators = manifestLocators;
45 public static CollectionFactoryBuilder builder() {
46 return new CollectionFactoryBuilder();
49 private void setApiClients() {
50 if(this.config == null) this.config = new FileConfigProvider();
52 this.usersApiClient = new UsersApiClient(config);
53 this.groupsApiClient = new GroupsApiClient(config);
56 public Collection create() {
57 ManifestFactory manifestFactory = ManifestFactory.builder()
59 .locators(manifestLocators)
61 String manifest = manifestFactory.create();
63 Collection newCollection = new Collection();
64 newCollection.setName(getNameOrDefault(name));
65 newCollection.setManifestText(manifest);
66 newCollection.setOwnerUuid(getDesiredProjectUuid(projectUuid));
71 private String getNameOrDefault(String name) {
72 return Optional.ofNullable(name).orElseGet(() -> {
73 LocalDateTime dateTime = LocalDateTime.now();
74 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("Y-MM-dd HH:mm:ss.SSS");
75 return String.format("New Collection (%s)", dateTime.format(formatter));
79 public String getDesiredProjectUuid(String projectUuid) {
81 if (projectUuid == null || projectUuid.length() == 0){
82 return usersApiClient.current().getUuid();
83 } else if (projectUuid.matches(Patterns.USER_UUID_PATTERN)) {
84 return usersApiClient.get(projectUuid).getUuid();
85 } else if (projectUuid.matches(Patterns.GROUP_UUID_PATTERN)) {
86 return groupsApiClient.get(projectUuid).getUuid();
88 } catch (ArvadosApiException e) {
89 throw new ArvadosClientException(String.format("An error occurred while getting project by UUID %s", projectUuid));
91 throw new ArvadosClientException(String.format("No project with %s UUID found", projectUuid));
94 public static class CollectionFactoryBuilder {
95 private ConfigProvider config;
97 private String projectUuid;
98 private List<File> manifestFiles;
99 private List<String> manifestLocators;
101 CollectionFactoryBuilder() {
104 public CollectionFactoryBuilder config(ConfigProvider config) {
105 this.config = config;
109 public CollectionFactoryBuilder name(String name) {
114 public CollectionFactoryBuilder projectUuid(String projectUuid) {
115 this.projectUuid = projectUuid;
119 public CollectionFactoryBuilder manifestFiles(List<File> manifestFiles) {
120 this.manifestFiles = manifestFiles;
124 public CollectionFactoryBuilder manifestLocators(List<String> manifestLocators) {
125 this.manifestLocators = manifestLocators;
129 public CollectionFactory build() {
130 return new CollectionFactory(config, name, projectUuid, manifestFiles, manifestLocators);