1 package net.pterodactylus.sone.data;
3 import static com.google.common.base.Preconditions.checkNotNull;
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;
12 * Container for a combined ID, originally computed from a {@link Sone}’s ID and an element’s ID.
14 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
18 private static final HashFunction sha256 = Hashing.sha256();
20 private final String soneId;
21 private final String elementId;
22 private final String externalId;
24 private Id(String externalId) {
25 this(null, null, checkNotNull(externalId));
28 private Id(String soneId, String elementId) {
29 this(checkNotNull(soneId), checkNotNull(elementId), calculateExternalId(soneId, elementId));
32 private Id(String soneId, String elementId, String externalId) {
34 this.elementId = elementId;
35 this.externalId = externalId;
38 public Optional<String> getSoneId() {
39 return Optional.fromNullable(soneId);
42 public Optional<String> getElementId() {
43 return Optional.fromNullable(elementId);
46 public String getExternal() {
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))
57 public static Id from(String externalId) {
58 return new Id(externalId);
61 public static Id from(String soneId, String elementId) {
62 return new Id(soneId, elementId);
66 public boolean equals(Object o) {
67 if (o == null || getClass() != o.getClass()) {
71 return Objects.equal(externalId, id.externalId);
75 public int hashCode() {
76 return Objects.hashCode(externalId);
80 public String toString() {