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.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static java.lang.System.currentTimeMillis;
+import static java.util.UUID.randomUUID;
-import net.pterodactylus.sone.data.Post;
+import net.pterodactylus.sone.database.Database;
import net.pterodactylus.sone.database.PostBuilder;
+import com.google.common.base.Optional;
import org.apache.commons.lang.StringUtils;
/**
*/
public abstract class AbstractPostBuilder implements PostBuilder {
- /** Wether to create a post with a random ID. */
- protected boolean randomId;
+ protected final Database database;
+ protected final String senderId;
/** The ID of the post. */
- protected String id;
-
- /** The sender of the post. */
- protected String senderId;
-
- /** Whether to use the current time when creating the post. */
- protected boolean currentTime;
+ protected Optional<String> id = absent();
/** The time of the post. */
- protected long time;
+ protected Optional<Long> time = absent();
/** The text of the post. */
protected String text;
/** The (optional) recipient of the post. */
- protected String recipientId;
+ protected Optional<String> recipientId = absent();
+
+ protected AbstractPostBuilder(Database database, String soneId) {
+ this.database = checkNotNull(database, "database must not be null");
+ this.senderId = checkNotNull(soneId, "sender ID must not be null");
+ }
//
// POSTBUILDER METHODS
//
- /**
- * {@inheritDoc}
- */
- @Override
- public PostBuilder copyPost(Post post) {
- this.randomId = false;
- this.id = post.getId();
- this.senderId = post.getSone().getId();
- this.currentTime = false;
- this.time = post.getTime();
- this.text = post.getText();
- this.recipientId = post.getRecipientId().orNull();
- return this;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PostBuilder randomId() {
- randomId = true;
- return this;
- }
-
- /**
- * {@inheritDoc}
- */
@Override
public PostBuilder withId(String id) {
- this.id = id;
- return this;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PostBuilder from(String senderId) {
- this.senderId = senderId;
- return this;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public PostBuilder currentTime() {
- currentTime = true;
+ this.id = fromNullable(id);
return this;
}
- /**
- * {@inheritDoc}
- */
@Override
public PostBuilder withTime(long time) {
- this.time = time;
+ this.time = of(time);
return this;
}
- /**
- * {@inheritDoc}
- */
@Override
public PostBuilder withText(String text) {
this.text = text;
return this;
}
- /**
- * {@inheritDoc}
- */
@Override
- public PostBuilder to(String recipientId) {
+ public PostBuilder to(Optional<String> recipientId) {
this.recipientId = recipientId;
return this;
}
// PROTECTED METHODS
//
+ protected String getId() {
+ return id.isPresent() ? id.get() : randomUUID().toString();
+ }
+
+ protected long getTime() {
+ return time.isPresent() ? time.get() : currentTimeMillis();
+ }
+
/**
* Validates the state of this post builder.
*
* if the state is not valid for building a new post
*/
protected void validate() throws IllegalStateException {
- checkState((randomId && (id == null)) || (!randomId && (id != null)), "exactly one of random ID or custom ID must be set");
- checkState(senderId != null, "sender must not be null");
- checkState((currentTime && (time == 0)) || (!currentTime && (time > 0)), "one of current time or custom time must be set");
checkState(!StringUtils.isBlank(text), "text must not be empty");
- checkState((recipientId == null) || !recipientId.equals(senderId), "sender and recipient must not be the same");
+ checkState(!recipientId.isPresent() || !senderId.equals(recipientId.get()), "sender and recipient must not be the same");
}
}