Make Sone and element ID optional
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Id.java
1 package net.pterodactylus.sone.data;
2
3 import static com.google.common.base.Preconditions.checkNotNull;
4
5 import com.google.common.base.Charsets;
6 import com.google.common.base.Objects;
7 import com.google.common.base.Optional;
8 import com.google.common.hash.HashFunction;
9 import com.google.common.hash.Hashing;
10
11 /**
12  * Container for a combined ID, originally computed from a {@link Sone}’s ID and an element’s ID.
13  *
14  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
15  */
16 public class Id {
17
18         private static final HashFunction sha256 = Hashing.sha256();
19
20         private final String soneId;
21         private final String elementId;
22         private final String externalId;
23
24         private Id(String externalId) {
25                 this(null, null, checkNotNull(externalId));
26         }
27
28         private Id(String soneId, String elementId) {
29                 this(checkNotNull(soneId), checkNotNull(elementId), calculateExternalId(soneId, elementId));
30         }
31
32         private Id(String soneId, String elementId, String externalId) {
33                 this.soneId = soneId;
34                 this.elementId = elementId;
35                 this.externalId = externalId;
36         }
37
38         public Optional<String> getSoneId() {
39                 return Optional.fromNullable(soneId);
40         }
41
42         public Optional<String> getElementId() {
43                 return Optional.fromNullable(elementId);
44         }
45
46         public String getExternal() {
47                 return externalId;
48         }
49
50         private static String calculateExternalId(String soneId, String elementId) {
51                 return sha256.newHasher()
52                                 .putBytes(soneId.getBytes(Charsets.UTF_8))
53                                 .putBytes(elementId.getBytes(Charsets.UTF_8))
54                                 .hash().toString();
55         }
56
57         public static Id from(String externalId) {
58                 return new Id(externalId);
59         }
60
61         public static Id from(String soneId, String elementId) {
62                 return new Id(soneId, elementId);
63         }
64
65         @Override
66         public boolean equals(Object o) {
67                 if (o == null || getClass() != o.getClass()) {
68                         return false;
69                 }
70                 Id id = (Id) o;
71                 return Objects.equal(externalId, id.externalId);
72         }
73
74         @Override
75         public int hashCode() {
76                 return Objects.hashCode(externalId);
77         }
78
79         @Override
80         public String toString() {
81                 return getExternal();
82         }
83
84 }