Java tutorial
/* * 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(); } }; }