// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.domain.v0_6;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.openstreetmap.osmosis.core.domain.common.SimpleTimestampContainer;
import org.openstreetmap.osmosis.core.domain.common.TimestampContainer;
import org.openstreetmap.osmosis.core.store.Storeable;
import org.openstreetmap.osmosis.core.util.LongAsInt;
/**
* Provides facilities to specify the contents of entity and create new instances. Entities
* themselves are immutable to support concurrent access, this class provides a means of
* manipulating them.
*
* @author Brett Henderson
*
* @param <T>
* The type of entity to be built.
*
* @deprecated Builder classes are not required because entities are now writeable.
*/
@Deprecated
public abstract class EntityBuilder<T extends Entity> implements Storeable {
/**
* The unique entity identifier.
*/
protected long id;
/**
* The current entity version.
*/
protected int version;
/**
* The entity timestamp container.
*/
protected TimestampContainer timestampContainer;
/**
* The user who created the entity.
*/
protected OsmUser user;
/**
* The entity changeset identifier.
*/
protected int changesetId;
/**
* The tags describing the entity.
*/
protected Collection<Tag> tags;
/**
* Creates a new instance.
*/
public EntityBuilder() {
tags = new ArrayList<Tag>();
}
/**
* Creates a new instance.
*
* @param entity
* The entity to initialise to.
*/
public EntityBuilder(Entity entity) {
this();
initialize(entity);
}
/**
* Creates a new instance.
*
* @param id
* The unique identifier.
* @param version
* The version of the entity.
* @param timestamp
* The last updated timestamp.
* @param user
* The user that last modified this entity.
* @param changesetId
* The id of the changeset that this version of the entity was created by.
*/
public EntityBuilder(long id, int version, Date timestamp, OsmUser user, long changesetId) {
this();
initialize(id, version, timestamp, user, changesetId);
}
/**
* Creates a new instance.
*
* @param id
* The unique identifier.
* @param version
* The version of the entity.
* @param timestampContainer
* The container holding the timestamp in an alternative
* timestamp representation.
* @param user
* The user that last modified this entity.
* @param changesetId
* The id of the changeset that this version of the entity was created by.
*/
public EntityBuilder(long id, int version, TimestampContainer timestampContainer, OsmUser user, long changesetId) {
this();
initialize(id, version, timestampContainer, user, changesetId);
}
/**
* Initializes the contents of the builder to the specified data.
*
* @param entity
* The entity to initialise to.
* @return This object allowing method chaining.
*/
protected EntityBuilder<T> initialize(Entity entity) {
// Delegate to the more specific method.
initialize(entity.getId(), entity.getVersion(), entity.getTimestampContainer(), entity.getUser(), entity
.getChangesetId());
tags.addAll(entity.getTags());
return this;
}
/**
* Initializes the contents of the builder to the specified data.
*
* @param newId
* The unique identifier.
* @param newVersion
* The version of the entity.
* @param newTimestamp
* The last updated timestamp.
* @param newUser
* The user that last modified this entity.
* @param newChangesetId
* The id of the changeset that this version of the entity was created by.
* @return This object allowing method chaining.
*/
protected EntityBuilder<T> initialize(long newId, int newVersion, Date newTimestamp, OsmUser newUser,
long newChangesetId) {
// Delegate to the more specific method.
initialize(newId, newVersion, new SimpleTimestampContainer(newTimestamp), newUser, newChangesetId);
return this;
}
/**
* Initializes the contents of the builder to the specified data.
*
* @param newId
* The unique identifier.
* @param newVersion
* The version of the entity.
* @param newTimestampContainer
* The container holding the timestamp in an alternative
* timestamp representation.
* @param newUser
* The user that last modified this entity.
* @param newChangesetId
* The id of the changeset that this version of the entity was created by.
* @return This object allowing method chaining.
*/
protected EntityBuilder<T> initialize(
long newId, int newVersion, TimestampContainer newTimestampContainer,
OsmUser newUser, long newChangesetId) {
this.id = newId;
this.timestampContainer = newTimestampContainer;
this.user = newUser;
this.changesetId = LongAsInt.longToInt(newChangesetId);
this.version = newVersion;
this.tags.clear();
return this;
}
/**
* Sets a new id value.
*
* @param newId
* The new id.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> setId(long newId) {
this.id = newId;
return this;
}
/**
* Gets the current id value.
*
* @return The id.
*/
public long getId() {
return id;
}
/**
* Sets a new version value.
*
* @param newVersion
* The new version.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> setVersion(int newVersion) {
this.version = newVersion;
return this;
}
/**
* Gets the current version value.
*
* @return The id.
*/
public int getVersion() {
return version;
}
/**
* Sets a new timestamp value.
*
* @param timestamp
* The new timestamp.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> setTimestamp(Date timestamp) {
this.timestampContainer = new SimpleTimestampContainer(timestamp);
return this;
}
/**
* Gets the current timestamp value.
*
* @return The timestamp.
*/
public Date getTimestamp() {
return timestampContainer.getTimestamp();
}
/**
* Sets a new timestamp value.
*
* @param newTimestampContainer
* The timestamp wrapped within a container.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> setTimestamp(TimestampContainer newTimestampContainer) {
this.timestampContainer = newTimestampContainer;
return this;
}
/**
* Gets the current timestamp value.
*
* @return The timestamp container holding the current timestamp.
*/
public TimestampContainer getTimestampContainer() {
return timestampContainer;
}
/**
* Sets a new user value.
*
* @param newUser
* The new user.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> setUser(OsmUser newUser) {
this.user = newUser;
return this;
}
/**
* Gets the current user value.
*
* @return The user.
*/
public OsmUser getUser() {
return user;
}
/**
* Gets the id of the changeset that this version of the entity was created by.
*
* @return The changeset id.
*/
public long getChangesetId() {
return changesetId;
}
/**
* Sets the id of the changeset that this version of the entity was created by.
*
* @param newChangesetId
* The changeset id.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> setChangesetId(long newChangesetId) {
this.changesetId = LongAsInt.longToInt(newChangesetId);
return this;
}
/**
* Obtains the tags.
*
* @return The tags.
*/
public Collection<Tag> getTags() {
return tags;
}
/**
* Remove all existing tags.
*
* @return This object allowing method chaining.
*/
public EntityBuilder<T> clearTags() {
tags.clear();
return this;
}
/**
* Sets a new tags value.
*
* @param newTags
* The new tags.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> setTags(Collection<Tag> newTags) {
tags.clear();
tags.addAll(newTags);
return this;
}
/**
* Adds a new tag.
*
* @param tag
* The new tag.
* @return This object allowing method chaining.
*/
public EntityBuilder<T> addTag(Tag tag) {
tags.add(tag);
return this;
}
/**
* Builds a new entity instance based on the current data.
*
* @return The new entity instance.
*/
public abstract T buildEntity();
}