Merge branch 'release/0.9-rc1'
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Profile.java
index 4b4e0f4..4970cf9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Profile.java - Copyright © 2010–2012 David Roden
+ * Sone - Profile.java - Copyright © 2010–2013 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,6 +26,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+
 /**
  * A profile stores personal information about a {@link Sone}. All information
  * is optional and can be {@code null}.
@@ -322,10 +325,14 @@ public class Profile implements Fingerprintable {
         */
        public Field addField(String fieldName) throws IllegalArgumentException {
                checkNotNull(fieldName, "fieldName must not be null");
-               checkArgument(fieldName.length() > 0, "fieldName must not be empty");
-               checkState(getFieldByName(fieldName) == null, "fieldName must be unique");
+               if (fieldName.length() == 0) {
+                       throw new EmptyFieldName();
+               }
+               if (getFieldByName(fieldName) != null) {
+                       throw new DuplicateField();
+               }
                @SuppressWarnings("synthetic-access")
-               Field field = new Field().setName(fieldName);
+               Field field = new Field().setName(fieldName).setValue("");
                fields.add(field);
                return field;
        }
@@ -401,37 +408,37 @@ public class Profile implements Fingerprintable {
         */
        @Override
        public String getFingerprint() {
-               StringBuilder fingerprint = new StringBuilder();
-               fingerprint.append("Profile(");
+               Hasher hash = Hashing.sha256().newHasher();
+               hash.putString("Profile(");
                if (firstName != null) {
-                       fingerprint.append("FirstName(").append(firstName).append(')');
+                       hash.putString("FirstName(").putString(firstName).putString(")");
                }
                if (middleName != null) {
-                       fingerprint.append("MiddleName(").append(middleName).append(')');
+                       hash.putString("MiddleName(").putString(middleName).putString(")");
                }
                if (lastName != null) {
-                       fingerprint.append("LastName(").append(lastName).append(')');
+                       hash.putString("LastName(").putString(lastName).putString(")");
                }
                if (birthDay != null) {
-                       fingerprint.append("BirthDay(").append(birthDay).append(')');
+                       hash.putString("BirthDay(").putInt(birthDay).putString(")");
                }
                if (birthMonth != null) {
-                       fingerprint.append("BirthMonth(").append(birthMonth).append(')');
+                       hash.putString("BirthMonth(").putInt(birthMonth).putString(")");
                }
                if (birthYear != null) {
-                       fingerprint.append("BirthYear(").append(birthYear).append(')');
+                       hash.putString("BirthYear(").putInt(birthYear).putString(")");
                }
                if (avatar != null) {
-                       fingerprint.append("Avatar(").append(avatar).append(')');
+                       hash.putString("Avatar(").putString(avatar).putString(")");
                }
-               fingerprint.append("ContactInformation(");
+               hash.putString("ContactInformation(");
                for (Field field : fields) {
-                       fingerprint.append(field.getName()).append('(').append(field.getValue()).append(')');
+                       hash.putString(field.getName()).putString("(").putString(field.getValue()).putString(")");
                }
-               fingerprint.append(")");
-               fingerprint.append(")");
+               hash.putString(")");
+               hash.putString(")");
 
-               return fingerprint.toString();
+               return hash.hash().toString();
        }
 
        /**
@@ -550,4 +557,18 @@ public class Profile implements Fingerprintable {
 
        }
 
+       /**
+        * Exception that signals the addition of a field with an empty name.
+        *
+        * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+        */
+       public static class EmptyFieldName extends IllegalArgumentException { }
+
+       /**
+        * Exception that signals the addition of a field that already exists.
+        *
+        * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+        */
+       public static class DuplicateField extends IllegalArgumentException { }
+
 }