package net.pterodactylus.sone.data.impl;
+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}.
*
* The interface implemented and exposed by the builder
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
-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;
+public abstract class AbstractReplyBuilder<B extends ReplyBuilder<B>> implements ReplyBuilder<B> {
- /** 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;
}
- /**
- * {@inheritDoc}
- */
@Override
@SuppressWarnings("unchecked")
public B withId(String id) {
- this.id = id;
+ this.id = fromNullable(id);
return (B) this;
}
- /**
- * {@inheritDoc}
- */
@Override
@SuppressWarnings("unchecked")
- public B from(String senderId) {
- this.senderId = senderId;
+ public B withTime(long time) {
+ this.time = of(time);
return (B) this;
}
- /**
- * {@inheritDoc}
- */
@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");
}
}