package org.appfuse.model;

import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.Date;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 *  @hibernate.class table="weblog"
 */
public class Weblog {
	private Long weblogId;

	private String username;

	private String blogTitle;

	private Date dateCreated;

	private List entries;

	private Set users = new HashSet();

	/**
	 * @return Returns the blogTitle.
	 * 
	 * @hibernate.property column="blog_title" not-null="true"
	 */
	public String getBlogTitle() {
		return blogTitle;
	}

	/**
	 * @param blogTitle
	 *            The blogTitle to set.
	 */
	public void setBlogTitle(String blogTitle) {
		this.blogTitle = blogTitle;
	}

	/**
	 * @return Returns the dateCreated.
	 * 
	 * @hibernate.property column="date_created"
	 */
	public Date getDateCreated() {
		return dateCreated;
	}

	/**
	 * @param dateCreated
	 *            The dateCreated to set.
	 */
	public void setDateCreated(Date dateCreated) {
		this.dateCreated = dateCreated;
	}

	/**
	 * @return Returns the entries.
	 * 
	 * @hibernate.bag name="entries" lazy="true" inverse="true" cascade="none"
     * @hibernate.collection-key column="weblog_id"
     * @hibernate.collection-one-to-many class="org.appfuse.model.Entry"
	 */
	public List getEntries() {
		return entries;
	}

	/**
	 * @param entries
	 *            The entries to set.
	 */
	public void setEntries(List entries) {
		this.entries = entries;
	}

	/**
	 * @return Returns the username.
	 * 
	 * @hibernate.property column="username" not-null="true"
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @param username
	 *            The username to set.
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @return Returns the users.
	 * 
	 * @hibernate.set table="weblog_user" cascade="none" lazy="false"
     * @hibernate.collection-key column="weblog_id"
     * @hibernate.collection-many-to-many class="org.appfuse.model.User" column="username"
	 */
	public Set getUsers() {
		return users;
	}
	/**
	 * Adds a user for the weblog
	 * 
	 * @param user
	 */
	public void addUser(User user) {
        getUsers().add(user);
    }
	/**
	 * @param users
	 *            The users to set.
	 */
	public void setUsers(Set users) {
		this.users = users;
	}

	/**
	 * @return Returns the weblogId.
	 * 
	 * @hibernate.id column="weblog_id" unsaved-value="null"
     *               generator-class="native"
	 */
	public Long getWeblogId() {
		return weblogId;
	}

	/**
	 * @param weblogId
	 *            The weblogId to set.
	 */
	public void setWeblogId(Long weblogId) {
		this.weblogId = weblogId;
	}

	/**
	 * @see java.lang.Object#equals(Object)
	 */
	public boolean equals(Object object) {
		if (!(object instanceof Weblog)) {
			return false;
		}
		Weblog rhs = (Weblog) object;
		return new EqualsBuilder().append(this.users, rhs.users).append(
				this.blogTitle, rhs.blogTitle).append(this.weblogId,
				rhs.weblogId).append(this.username, rhs.username).append(
				this.entries, rhs.entries).append(this.dateCreated,
				rhs.dateCreated).isEquals();
	}

	/**
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode() {
		return new HashCodeBuilder(-1769938895, -2120812053).append(this.users)
				.append(this.blogTitle).append(this.weblogId).append(
						this.username).append(this.entries).append(
						this.dateCreated).toHashCode();
	}

	/**
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
				.append("weblogId", this.weblogId).append("users", this.users)
				.append("username", this.username).append("blogTitle",
						this.blogTitle).append("entries", this.entries).append(
						"dateCreated", this.dateCreated).toString();
	}
}
