AbstractEntity.java
/*
* This software was designed and created by Jason Carroll.
* Copyright (c) 2002, 2003, 2004 Jason Carroll.
* The author can be reached at jcarroll@cowsultants.com
* ITracker website: http://www.cowsultants.com
* ITracker forums: http://www.cowsultants.com/phpBB/index.php
*
* This program is free software; you can redistribute it and/or modify
* it only under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package org.itracker.model;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import java.io.Serializable;
import java.util.Comparator;
import java.util.Date;
/**
* This is a POJO Business Domain Object. Hibernate Bean.
* <p/>
* <p>
* All entities are Java Beans and should inherit this class to make sure they
* are Serializable and Cloneable and have the following fields : an id, a
* creation date and a last modifiation date.
* </p>
*
* @author ready
*/
public abstract class AbstractEntity implements Entity {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final Comparator<Entity> ID_COMPARATOR = new IdComparator();
public static final Comparator<AbstractEntity> CREATE_DATE_COMPARATOR = new CreateDateComparator();
public static final Comparator<AbstractEntity> LAST_MODIFIED_DATE_COMPARATOR = new LastModifiedDateComparator();
/**
* System ID
*/
private Integer id;
/**
* Creation date and time.
*/
private Date createDate = new Date();
/**
* Last modification date and time.
*/
private Date lastModifiedDate = new Date();
/**
* Default constructor (required by Hibernate).
*/
public AbstractEntity() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
* @return creation time stamp or <tt>null</tt> for transient entities
*/
public Date getCreateDate() {
if (null == createDate)
createDate = new Date();
return new Date(createDate.getTime());
}
/**
* Sets the creation date and time.
* <p/>
* <p>
* The persistence framework automatically sets this property when a new
* entity is persisted. <br>
* Note that the value is managed by the persistence framework and may be
* generated by the database in the future.
* </p>
* <p/>
* <p>
* The creation time stamp should never change once initialized.
* </p>
*
* @param dateTime creation time stamp
*/
public void setCreateDate(Date dateTime) {
if (null == dateTime)
return;
this.createDate = new Date(dateTime.getTime());
}
/**
* @return last modification time stamp or <tt>null</tt> for transient
* entities
*/
public Date getLastModifiedDate() {
if (null == this.lastModifiedDate)
this.lastModifiedDate = new Date();
return new Date(lastModifiedDate.getTime());
}
/**
* Sets the last modification date and time.
* <p/>
* <p>
* The persistence framework automatically sets this property to the same
* value as the createDate property when persisting a new entity and
* automatically updates it when saving an existing one. <br>
* Note that the value is managed by the persistence framework and may be
* generated by the database in the future.
* </p>
*
* @param dateTime last modification time stamp
*/
public void setLastModifiedDate(Date dateTime) {
if (null == dateTime)
return;
this.lastModifiedDate = new Date(dateTime.getTime());
}
/**
* Returns whether this instance represents a new transient instance.
*
* @return <tt>true</tt> if <code>id</code> is <tt>null</tt>
*/
public boolean isNew() {
return (this.getId() == null);
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
/**
* Compares 2 instances by ID.
*/
protected static class IdComparator implements Comparator<Entity>, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public int compare(Entity a, Entity b) {
return new CompareToBuilder().append(a.getId(), b.getId())
.toComparison();
}
}
protected static class CreateDateComparator implements
Comparator<AbstractEntity>, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public int compare(AbstractEntity a, AbstractEntity b) {
return new CompareToBuilder().append(a.getCreateDate(),
b.getCreateDate()).toComparison();
}
}
/**
* Compares 2 instances by last modified date.
*/
protected static class LastModifiedDateComparator implements
Comparator<AbstractEntity>, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public int compare(AbstractEntity a, AbstractEntity b) {
return new CompareToBuilder().append(a.getLastModifiedDate(),
b.getLastModifiedDate()).toComparison();
}
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (isNew() || null == obj) {
return false;
}
if (getClass().equals(obj.getClass())) {
Entity o = (Entity) obj;
return new EqualsBuilder()
.append(getId(), o.getId()).isEquals();
}
return false;
}
public final int compareTo(Entity o) {
if (this.equals(o)) {
return 0;
}
return new CompareToBuilder().append(getClass(), o.getClass(), AbstractEntity.CLASS_COMPARATOR).append(
getId(), o.getId()).toComparison();
}
@Override
public final int hashCode() {
return new HashCodeBuilder().append(getClass()).append(getId()).toHashCode();
}
private static final Comparator<Class<?>> CLASS_COMPARATOR = new Comparator<Class<?>>() {
public int compare(Class<?> o1, Class<?> o2) {
return new CompareToBuilder().append(o1.getSimpleName(), o2.getSimpleName()).append(o1.hashCode(), hashCode()).toComparison();
}
};
}