Rename post and reply implementations; use builder to create replies.
[Sone.git] / src / main / java / net / pterodactylus / sone / data / impl / AbstractReplyBuilder.java
index 25dd1e1..389eb85 100644 (file)
 
 package net.pterodactylus.sone.data.impl;
 
-import net.pterodactylus.sone.data.ReplyBuilder;
+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.checkState;
+import static java.lang.System.currentTimeMillis;
+import static java.util.UUID.randomUUID;
+
+import net.pterodactylus.sone.database.ReplyBuilder;
+
+import com.google.common.base.Optional;
+import org.apache.commons.lang.StringUtils;
 
 /**
  * Abstract implementation of a {@link ReplyBuilder}.
@@ -28,32 +38,13 @@ import net.pterodactylus.sone.data.ReplyBuilder;
  */
 public class AbstractReplyBuilder<B extends ReplyBuilder<B>> implements ReplyBuilder<B> {
 
-       /** Whether to use a random ID for the reply. */
-       protected boolean randomId;
-
-       /** The ID of the reply. */
-       protected String id;
-
-       /** The sender of the reply. */
-       protected String senderId;
-
-       /** Whether to use the current time when creating the reply. */
-       protected boolean currentTime;
-
-       /** The time of the reply. */
-       protected long time;
-
-       /** The text of the reply. */
+       protected final String senderId;
+       protected Optional<String> id = absent();
+       protected Optional<Long> time = absent();
        protected String text;
 
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       @SuppressWarnings("unchecked")
-       public B randomId() {
-               this.randomId = true;
-               return (B) this;
+       protected AbstractReplyBuilder(String senderId) {
+               this.senderId = senderId;
        }
 
        /**
@@ -62,7 +53,7 @@ public class AbstractReplyBuilder<B extends ReplyBuilder<B>> implements ReplyBui
        @Override
        @SuppressWarnings("unchecked")
        public B withId(String id) {
-               this.id = id;
+               this.id = fromNullable(id);
                return (B) this;
        }
 
@@ -71,8 +62,8 @@ public class AbstractReplyBuilder<B extends ReplyBuilder<B>> implements ReplyBui
         */
        @Override
        @SuppressWarnings("unchecked")
-       public B from(String senderId) {
-               this.senderId = senderId;
+       public B withTime(long time) {
+               this.time = of(time);
                return (B) this;
        }
 
@@ -81,29 +72,28 @@ public class AbstractReplyBuilder<B extends ReplyBuilder<B>> implements ReplyBui
         */
        @Override
        @SuppressWarnings("unchecked")
-       public B currentTime() {
-               this.currentTime = true;
+       public B withText(String text) {
+               this.text = text;
                return (B) this;
        }
 
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       @SuppressWarnings("unchecked")
-       public B withTime(long time) {
-               this.time = time;
-               return (B) this;
+       protected String getId() {
+               return id.isPresent() ? id.get() : randomUUID().toString();
+       }
+
+       protected long getTime() {
+               return time.isPresent() ? time.get() : currentTimeMillis();
        }
 
        /**
-        * {@inheritDoc}
+        * Validates the state of this post reply builder.
+        *
+        * @throws IllegalStateException
+        *             if the state is not valid for building a new post reply
         */
-       @Override
-       @SuppressWarnings("unchecked")
-       public B withText(String text) {
-               this.text = text;
-               return (B) this;
+       protected void validate() throws IllegalStateException {
+               checkState(senderId != null, "sender must not be null");
+               checkState(!StringUtils.isBlank(text), "text must not be empty");
        }
 
 }