Tweak test script no issue #
[arvados.git] / src / main / java / org / arvados / client / logic / keep / KeepLocator.java
1 /*
2  * Copyright (C) The Arvados Authors. All rights reserved.
3  *
4  * SPDX-License-Identifier: AGPL-3.0 OR Apache-2.0
5  *
6  */
7
8 package org.arvados.client.logic.keep;
9
10 import org.arvados.client.exception.ArvadosClientException;
11
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;
22
23 import static org.arvados.client.common.Patterns.HINT_PATTERN;
24
25 public class KeepLocator {
26
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;
32
33     public KeepLocator(String locatorString) {
34         LinkedList<String> pieces = new LinkedList<>(Arrays.asList(locatorString.split("\\+")));
35
36         md5sum = pieces.poll();
37         size = Integer.valueOf(Objects.requireNonNull(pieces.poll()));
38
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);
44             } else {
45                 hints.add(hint);
46             }
47         }
48     }
49
50     public List<String> getHints() {
51         return hints;
52     }
53
54     public String getMd5sum() {
55         return md5sum;
56     }
57
58     @Override
59     public String toString() {
60         return Stream.concat(Stream.of(md5sum, size.toString(), permissionHint()), hints.stream())
61                 .filter(Objects::nonNull)
62                 .collect(Collectors.joining("+"));
63     }
64
65     public String stripped() {
66         return size != null ? String.format("%s+%d", md5sum, size) : md5sum;
67     }
68
69     public String permissionHint() {
70         if (permSig == null || permExpiry == null) {
71             return null;
72         }
73
74         long timestamp = permExpiry.toEpochSecond(ZoneOffset.UTC);
75         String signTimestamp = Long.toHexString(timestamp);
76         return String.format("A%s@%s", permSig, signTimestamp);
77     }
78
79     private void parsePermissionHint(String hint) {
80         String[] hintSplit = hint.substring(1).split("@", 2);
81         permSig = hintSplit[0];
82
83         int permExpiryDecimal = Integer.parseInt(hintSplit[1], 16);
84         permExpiry = LocalDateTime.ofInstant(Instant.ofEpochSecond(permExpiryDecimal), ZoneOffset.UTC);
85     }
86 }