Don’t use the fingerprint of a field that has a null value.
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Profile.java
index 3e446fd..2b6991a 100644 (file)
 
 package net.pterodactylus.sone.data;
 
+import static com.google.common.base.Optional.absent;
 import static com.google.common.base.Optional.fromNullable;
+import static com.google.common.base.Optional.of;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static java.lang.Math.max;
+import static java.lang.Math.min;
 import static java.util.UUID.randomUUID;
 
 import java.util.ArrayList;
@@ -184,39 +188,23 @@ public class Profile implements Fingerprintable {
                return fields.contains(field);
        }
 
-       /**
-        * Returns the field with the given ID.
-        *
-        * @param fieldId
-        *            The ID of the field to get
-        * @return The field, or {@code null} if this profile does not contain a
-        *         field with the given ID
-        */
-       public Field getFieldById(String fieldId) {
+       public Optional<Field> getFieldById(String fieldId) {
                checkNotNull(fieldId, "fieldId must not be null");
                for (Field field : fields) {
                        if (field.getId().equals(fieldId)) {
-                               return field;
+                               return of(field);
                        }
                }
-               return null;
+               return absent();
        }
 
-       /**
-        * Returns the field with the given name.
-        *
-        * @param fieldName
-        *            The name of the field to get
-        * @return The field, or {@code null} if this profile does not contain a
-        *         field with the given name
-        */
-       public Field getFieldByName(String fieldName) {
+       public Optional<Field> getFieldByName(String fieldName) {
                for (Field field : fields) {
                        if (field.getName().equals(fieldName)) {
-                               return field;
+                               return of(field);
                        }
                }
-               return null;
+               return absent();
        }
 
        /**
@@ -231,7 +219,7 @@ 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");
+               checkState(!getFieldByName(fieldName).isPresent(), "fieldName must be unique");
                @SuppressWarnings("synthetic-access")
                Field field = new Field(fieldName);
                fields.add(field);
@@ -254,49 +242,24 @@ public class Profile implements Fingerprintable {
                fields.set(indexOfField, new Field(field.getId(), field.getName(), newValue));
        }
 
-       /**
-        * Moves the given field up one position in the field list. The index of the
-        * field to move must be greater than {@code 0} (because you obviously can
-        * not move the first field further up).
-        *
-        * @param field
-        *            The field to move up
-        */
        public void moveFieldUp(Field field) {
                checkNotNull(field, "field must not be null");
                checkArgument(hasField(field), "field must belong to this profile");
-               checkArgument(getFieldIndex(field) > 0, "field index must be > 0");
                int fieldIndex = getFieldIndex(field);
                fields.remove(field);
-               fields.add(fieldIndex - 1, field);
+               fields.add(max(fieldIndex - 1, 0), field);
        }
 
-       /**
-        * Moves the given field down one position in the field list. The index of
-        * the field to move must be less than the index of the last field (because
-        * you obviously can not move the last field further down).
-        *
-        * @param field
-        *            The field to move down
-        */
        public void moveFieldDown(Field field) {
                checkNotNull(field, "field must not be null");
                checkArgument(hasField(field), "field must belong to this profile");
-               checkArgument(getFieldIndex(field) < fields.size() - 1, "field index must be < " + (fields.size() - 1));
                int fieldIndex = getFieldIndex(field);
                fields.remove(field);
-               fields.add(fieldIndex + 1, field);
+               fields.add(min(fieldIndex + 1, fields.size()), field);
        }
 
-       /**
-        * Removes the given field.
-        *
-        * @param field
-        *            The field to remove
-        */
        public void removeField(Field field) {
                checkNotNull(field, "field must not be null");
-               checkArgument(hasField(field), "field must belong to this profile");
                fields.remove(field);
        }
 
@@ -400,7 +363,9 @@ public class Profile implements Fingerprintable {
                }
                hash.putString("ContactInformation(");
                for (Field field : fields) {
-                       hash.putString(field.getName()).putString("(").putString(field.getValue()).putString(")");
+                       if (field.getValue() != null) {
+                               hash.putString(field.getName()).putString("(").putString(field.getValue()).putString(")");
+                       }
                }
                hash.putString(")");
                hash.putString(")");