X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FProfile.java;h=61cf2911f372e93aa33b329ee9a81e14353689af;hb=0a4b6fc252003c71f4bdef09560e87982838d9c8;hp=2a1c416b1521f7df744c6c721e37f25ce25d54a2;hpb=c1a038857688b13861214d8d08a29363cc5366df;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/data/Profile.java b/src/main/java/net/pterodactylus/sone/data/Profile.java index 2a1c416..61cf291 100644 --- a/src/main/java/net/pterodactylus/sone/data/Profile.java +++ b/src/main/java/net/pterodactylus/sone/data/Profile.java @@ -17,15 +17,18 @@ 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; import java.util.Collections; import java.util.List; -import java.util.UUID; import com.google.common.base.Optional; import com.google.common.hash.Hasher; @@ -42,16 +45,8 @@ public class Profile implements Fingerprintable { /** The Sone this profile belongs to. */ private final Sone sone; - private volatile Name name; - - /** The day of the birth date. */ - private volatile Integer birthDay; - - /** The month of the birth date. */ - private volatile Integer birthMonth; - - /** The year of the birth date. */ - private volatile Integer birthYear; + private volatile Name name = new Name(); + private volatile BirthDate birthDate = new BirthDate(); /** The ID of the avatar image. */ private volatile String avatar; @@ -78,9 +73,7 @@ public class Profile implements Fingerprintable { public Profile(Profile profile) { this.sone = profile.sone; this.name = profile.name; - this.birthDay = profile.birthDay; - this.birthMonth = profile.birthMonth; - this.birthYear = profile.birthYear; + this.birthDate = profile.birthDate; this.avatar = profile.avatar; this.fields.addAll(profile.fields); } @@ -98,241 +91,110 @@ public class Profile implements Fingerprintable { return sone; } - /** - * Returns the first name. - * - * @return The first name - */ public String getFirstName() { return name.getFirst().orNull(); } - /** - * Returns the middle name(s). - * - * @return The middle name - */ public String getMiddleName() { return name.getMiddle().orNull(); } - /** - * Returns the last name. - * - * @return The last name - */ public String getLastName() { return name.getLast().orNull(); } - /** - * Returns the day of the birth date. - * - * @return The day of the birth date (from 1 to 31) - */ public Integer getBirthDay() { - return birthDay; - } - - /** - * Sets the day of the birth date. - * - * @param birthDay - * The day of the birth date (from 1 to 31) - * @return This profile (for method chaining) - */ - public Profile setBirthDay(Integer birthDay) { - this.birthDay = birthDay; - return this; + return birthDate.getDay().orNull(); } - /** - * Returns the month of the birth date. - * - * @return The month of the birth date (from 1 to 12) - */ public Integer getBirthMonth() { - return birthMonth; + return birthDate.getMonth().orNull(); } - /** - * Sets the month of the birth date. - * - * @param birthMonth - * The month of the birth date (from 1 to 12) - * @return This profile (for method chaining) - */ - public Profile setBirthMonth(Integer birthMonth) { - this.birthMonth = birthMonth; - return this; - } - - /** - * Returns the year of the birth date. - * - * @return The year of the birth date - */ public Integer getBirthYear() { - return birthYear; + return birthDate.getYear().orNull(); } - /** - * Returns the ID of the currently selected avatar image. - * - * @return The ID of the currently selected avatar image, or {@code null} if - * no avatar is selected. - */ public String getAvatar() { return avatar; } - /** - * Sets the avatar image. - * - * @param avatar - * The new avatar image, or {@code null} to not select an avatar - * image. - * @return This Sone - */ - public Profile setAvatar(Image avatar) { - if (avatar == null) { - this.avatar = null; - return this; - } - checkArgument(avatar.getSone().equals(sone), "avatar must belong to Sone"); - this.avatar = avatar.getId(); + public Profile setAvatar(Optional avatarId) { + this.avatar = avatarId.orNull(); return this; } - /** - * Sets the year of the birth date. - * - * @param birthYear - * The year of the birth date - * @return This profile (for method chaining) - */ - public Profile setBirthYear(Integer birthYear) { - this.birthYear = birthYear; - return this; - } - - /** - * Returns the fields of this profile. - * - * @return The fields of this profile - */ public List getFields() { return new ArrayList(fields); } - /** - * Returns whether this profile contains the given field. - * - * @param field - * The field to check for - * @return {@code true} if this profile contains the field, false otherwise - */ public boolean hasField(Field field) { 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 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 getFieldByName(String fieldName) { for (Field field : fields) { if (field.getName().equals(fieldName)) { - return field; + return of(field); } } - return null; + return absent(); } - /** - * Appends a new field to the list of fields. - * - * @param fieldName - * The name of the new field - * @return The new field - * @throws IllegalArgumentException - * if the name is not valid - */ 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"); + checkArgument(!getFieldByName(fieldName).isPresent(), "fieldName must be unique"); @SuppressWarnings("synthetic-access") - Field field = new Field().setName(fieldName); + Field field = new Field(fieldName); fields.add(field); return field; } - /** - * 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 renameField(Field field, String newName) { + int indexOfField = getFieldIndex(field); + if (indexOfField == -1) { + return; + } + fields.set(indexOfField, new Field(field.getId(), newName, field.getValue())); + } + + public void setField(Field field, String newValue) { + int indexOfField = getFieldIndex(field); + if (indexOfField == -1) { + return; + } + fields.set(indexOfField, new Field(field.getId(), field.getName(), newValue)); + } + 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); } @@ -341,6 +203,9 @@ public class Profile implements Fingerprintable { private Optional firstName = name.getFirst(); private Optional middleName = name.getMiddle(); private Optional lastName = name.getLast(); + private Optional birthYear = birthDate.getYear(); + private Optional birthMonth = birthDate.getMonth(); + private Optional birthDay = birthDate.getDay(); @Override public Modifier setFirstName(String firstName) { @@ -361,8 +226,27 @@ public class Profile implements Fingerprintable { } @Override + public Modifier setBirthYear(Integer birthYear) { + this.birthYear = fromNullable(birthYear); + return this; + } + + @Override + public Modifier setBirthMonth(Integer birthMonth) { + this.birthMonth = fromNullable(birthMonth); + return this; + } + + @Override + public Modifier setBirthDay(Integer birthDay) { + this.birthDay = fromNullable(birthDay); + return this; + } + + @Override public Profile update() { Profile.this.name = new Name(firstName, middleName, lastName); + Profile.this.birthDate = new BirthDate(birthYear, birthMonth, birthDay); return Profile.this; } }; @@ -373,6 +257,9 @@ public class Profile implements Fingerprintable { Modifier setFirstName(String firstName); Modifier setMiddleName(String middleName); Modifier setLastName(String lastName); + Modifier setBirthYear(Integer birthYear); + Modifier setBirthMonth(Integer birthMonth); + Modifier setBirthDay(Integer birthDay); Profile update(); } @@ -397,29 +284,20 @@ public class Profile implements Fingerprintable { // INTERFACE Fingerprintable // - /** - * {@inheritDoc} - */ @Override public String getFingerprint() { Hasher hash = Hashing.sha256().newHasher(); hash.putString("Profile("); hash.putString(name.getFingerprint()); - if (birthDay != null) { - hash.putString("BirthDay(").putInt(birthDay).putString(")"); - } - if (birthMonth != null) { - hash.putString("BirthMonth(").putInt(birthMonth).putString(")"); - } - if (birthYear != null) { - hash.putString("BirthYear(").putInt(birthYear).putString(")"); - } + hash.putString(birthDate.getFingerprint()); if (avatar != null) { hash.putString("Avatar(").putString(avatar).putString(")"); } 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(")"); @@ -432,98 +310,38 @@ public class Profile implements Fingerprintable { * * @author David ‘Bombe’ Roden */ - public class Field { + public static class Field { - /** The ID of the field. */ private final String id; + private final String name; + private final String value; - /** The name of the field. */ - private String name; - - /** The value of the field. */ - private String value; + public Field(String name) { + this(name, null); + } - /** - * Creates a new field with a random ID. - */ - private Field() { - this(UUID.randomUUID().toString()); + public Field(String name, String value) { + this(randomUUID().toString(), name, value); } - /** - * Creates a new field with the given ID. - * - * @param id - * The ID of the field - */ - private Field(String id) { + public Field(String id, String name, String value) { this.id = checkNotNull(id, "id must not be null"); + this.name = name; + this.value = value; } - /** - * Returns the ID of this field. - * - * @return The ID of this field - */ public String getId() { return id; } - /** - * Returns the name of this field. - * - * @return The name of this field - */ public String getName() { return name; } - /** - * Sets the name of this field. The name must not be {@code null} and - * must not match any other fields in this profile but my match the name - * of this field. - * - * @param name - * The new name of this field - * @return This field - */ - public Field setName(String name) { - checkNotNull(name, "name must not be null"); - checkArgument(getFieldByName(name) == null, "name must be unique"); - this.name = name; - return this; - } - - /** - * Returns the value of this field. - * - * @return The value of this field - */ public String getValue() { return value; } - /** - * Sets the value of this field. While {@code null} is allowed, no - * guarantees are made that {@code null} values are correctly persisted - * across restarts of the plugin! - * - * @param value - * The new value of this field - * @return This field - */ - public Field setValue(String value) { - this.value = value; - return this; - } - - // - // OBJECT METHODS - // - - /** - * {@inheritDoc} - */ @Override public boolean equals(Object object) { if (!(object instanceof Field)) { @@ -533,9 +351,6 @@ public class Profile implements Fingerprintable { return id.equals(field.id); } - /** - * {@inheritDoc} - */ @Override public int hashCode() { return id.hashCode(); @@ -549,6 +364,10 @@ public class Profile implements Fingerprintable { private final Optional middle; private final Optional last; + public Name() { + this(Optional.absent(), Optional.absent(), Optional.absent()); + } + public Name(Optional first, Optional middle, Optional last) { this.first = first; this.middle = middle; @@ -586,4 +405,51 @@ public class Profile implements Fingerprintable { } + public static class BirthDate implements Fingerprintable { + + private final Optional year; + private final Optional month; + private final Optional day; + + public BirthDate() { + this(Optional.absent(), Optional.absent(), Optional.absent()); + } + + public BirthDate(Optional year, Optional month, Optional day) { + this.year = year; + this.month = month; + this.day = day; + } + + public Optional getYear() { + return year; + } + + public Optional getMonth() { + return month; + } + + public Optional getDay() { + return day; + } + + @Override + public String getFingerprint() { + Hasher hash = Hashing.sha256().newHasher(); + hash.putString("Birthdate("); + if (year.isPresent()) { + hash.putString("Year(").putInt(year.get()).putString(")"); + } + if (month.isPresent()) { + hash.putString("Month(").putInt(month.get()).putString(")"); + } + if (day.isPresent()) { + hash.putString("Day(").putInt(day.get()).putString(")"); + } + hash.putString(")"); + return hash.hash().toString(); + } + + } + }