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.keep;
10 import org.arvados.client.exception.ArvadosClientException;
12 import java.time.Instant;
13 import java.time.LocalDateTime;
14 import java.time.ZoneOffset;
15 import java.util.ArrayList;
16 import java.util.Arrays;
17 import java.util.LinkedList;
18 import java.util.List;
19 import java.util.Objects;
20 import java.util.stream.Collectors;
21 import java.util.stream.Stream;
23 import static org.arvados.client.common.Patterns.HINT_PATTERN;
25 public class KeepLocator {
27 private final List<String> hints = new ArrayList<>();
28 private String permSig;
29 private LocalDateTime permExpiry;
30 private final String md5sum;
31 private final Integer size;
33 public KeepLocator(String locatorString) {
34 LinkedList<String> pieces = new LinkedList<>(Arrays.asList(locatorString.split("\\+")));
36 md5sum = pieces.poll();
37 size = Integer.valueOf(Objects.requireNonNull(pieces.poll()));
39 for (String hint : pieces) {
40 if (!hint.matches(HINT_PATTERN)) {
41 throw new ArvadosClientException(String.format("invalid hint format: %s", hint));
42 } else if (hint.startsWith("A")) {
43 parsePermissionHint(hint);
50 public List<String> getHints() {
54 public String getMd5sum() {
59 public String toString() {
60 return Stream.concat(Stream.of(md5sum, size.toString(), permissionHint()), hints.stream())
61 .filter(Objects::nonNull)
62 .collect(Collectors.joining("+"));
65 public String stripped() {
66 return size != null ? String.format("%s+%d", md5sum, size) : md5sum;
69 public String permissionHint() {
70 if (permSig == null || permExpiry == null) {
74 long timestamp = permExpiry.toEpochSecond(ZoneOffset.UTC);
75 String signTimestamp = Long.toHexString(timestamp);
76 return String.format("A%s@%s", permSig, signTimestamp);
79 private void parsePermissionHint(String hint) {
80 String[] hintSplit = hint.substring(1).split("@", 2);
81 permSig = hintSplit[0];
83 int permExpiryDecimal = Integer.parseInt(hintSplit[1], 16);
84 permExpiry = LocalDateTime.ofInstant(Instant.ofEpochSecond(permExpiryDecimal), ZoneOffset.UTC);