Make Sone and element ID optional
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Id.java
index f32627c..2283447 100644 (file)
@@ -1,7 +1,10 @@
 package net.pterodactylus.sone.data;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import com.google.common.base.Charsets;
 import com.google.common.base.Objects;
+import com.google.common.base.Optional;
 import com.google.common.hash.HashFunction;
 import com.google.common.hash.Hashing;
 
@@ -12,33 +15,49 @@ import com.google.common.hash.Hashing;
  */
 public class Id {
 
-       private static final HashFunction HASH_FUNCTION = Hashing.sha256();
-       public static final int LENGTH = HASH_FUNCTION.bits() / 4;
+       private static final HashFunction sha256 = Hashing.sha256();
 
-       private final HashFunction sha256 = HASH_FUNCTION;
        private final String soneId;
        private final String elementId;
+       private final String externalId;
+
+       private Id(String externalId) {
+               this(null, null, checkNotNull(externalId));
+       }
 
        private Id(String soneId, String elementId) {
+               this(checkNotNull(soneId), checkNotNull(elementId), calculateExternalId(soneId, elementId));
+       }
+
+       private Id(String soneId, String elementId, String externalId) {
                this.soneId = soneId;
                this.elementId = elementId;
+               this.externalId = externalId;
        }
 
-       public String getSoneId() {
-               return soneId;
+       public Optional<String> getSoneId() {
+               return Optional.fromNullable(soneId);
        }
 
-       public String getElementId() {
-               return elementId;
+       public Optional<String> getElementId() {
+               return Optional.fromNullable(elementId);
        }
 
        public String getExternal() {
+               return externalId;
+       }
+
+       private static String calculateExternalId(String soneId, String elementId) {
                return sha256.newHasher()
                                .putBytes(soneId.getBytes(Charsets.UTF_8))
                                .putBytes(elementId.getBytes(Charsets.UTF_8))
                                .hash().toString();
        }
 
+       public static Id from(String externalId) {
+               return new Id(externalId);
+       }
+
        public static Id from(String soneId, String elementId) {
                return new Id(soneId, elementId);
        }
@@ -49,13 +68,12 @@ public class Id {
                        return false;
                }
                Id id = (Id) o;
-               return Objects.equal(soneId, id.soneId)
-                               && Objects.equal(elementId, id.elementId);
+               return Objects.equal(externalId, id.externalId);
        }
 
        @Override
        public int hashCode() {
-               return Objects.hashCode(soneId, elementId);
+               return Objects.hashCode(externalId);
        }
 
        @Override