    001    /*
    002     @license.text@
    003     */
    004    package com.hammurapi.reasoning.tutorial.objectmodel;
    005
    006
    007    public class Relative implements Comparable<Relative> {
    008
    009            private Person subject;
    010            private Person object;
    011
    012            public Relative(Person subject, Person object) {
    013                    this.subject = subject;
    014                    this.object = object;
    015            }
    016
    017            public String toString() {
    018                    StringBuffer ret = new StringBuffer(getSubject().toString());
    019                    ret.append(" is a ");
    020
    021                    int idx = getClass().getName().lastIndexOf('.');
    022                    ret.append(idx == -1 ? getClass().getName() : getClass().getName().substring(idx + 1));
    023                    ret.append(" of ");
    024                    ret.append(getObject().toString());
    025                    ret.append(" (");
    026    //              ret.append(Integer.toString(System.identityHashCode(this), Character.MAX_RADIX));
    027                    ret.append(")");
    028    //              ret.append(" (");
    029    //              ret.append(getDepth());
    030    //              ret.append("/");
    031    //              ret.append(getCardinality());
    032    //              ret.append(")");
    033                    return ret.toString();
    034            }
    035
    036            public Person getSubject() {
    037                    return subject;
    038            }
    039
    040            public Person getObject() {
    041                    return object;
    042            }
    043
    044            public int compareTo(Relative o) {
    045                    if (this==o || this.equals(o)) {
    046                            return 0;
    047                    }
    048
    049                    int subjectCompare = getSubject().compareTo(o.getSubject());
    050                    if (subjectCompare!=0) {
    051                            return subjectCompare;
    052                    }
    053
    054                    int objectCompare = getObject().compareTo(o.getObject());
    055                    if (objectCompare!=0) {
    056                            return objectCompare;
    057                    }
    058
    059                    int typeCompare = getClass().getName().compareTo(o.getClass().getName());
    060                    if (typeCompare!=0) {
    061                            return typeCompare;
    062                    }
    063
    064                    return hashCode() - o.hashCode();
    065            }
    066
    067            @Override
    068            public int hashCode() {
    069                    final int prime = 31;
    070                    int result = 1;
    071                    result = prime * result + ((object == null) ? 0 : object.hashCode());
    072                    result = prime * result + ((subject == null) ? 0 : subject.hashCode());
    073                    return result;
    074            }
    075
    076            @Override
    077            public boolean equals(Object obj) {
    078                    if (this == obj) {
    079                            return true;
    080                    }
    081                    if (obj == null) {
    082                            return false;
    083                    }
    084                    if (getClass() != obj.getClass()) {
    085                            return false;
    086                    }
    087                    Relative other = (Relative) obj;
    088                    if (object == null) {
    089                            if (other.object != null) {
    090                                    return false;
    091                            }
    092                    } else if (!object.equals(other.object)) {
    093                            return false;
    094                    }
    095                    if (subject == null) {
    096                            if (other.subject != null) {
    097                                    return false;
    098                            }
    099                    } else if (!subject.equals(other.subject)) {
    100                            return false;
    101                    }
    102                    return true;
    103            }
    104
    105    }