001    // Copyright 2007 Google Inc. All Rights Reserved.
002    
003    package org.shiftone.jrat.core;
004    
005    import java.io.Serializable;
006    import java.util.*;
007    
008    /**
009     * @author jeff@shiftone.org (Jeff Drost)
010     */
011    public class ClassKey implements Serializable, Comparable {
012        private static final long serialVersionUID = 1;
013        private String packageName;
014        private String className;
015        private int hashCode;
016    
017        private static final Map CACHE = new HashMap();  //<String, ClassKey>
018    
019        public static ClassKey getInstance(String fullyQualifiedClassName) {
020            ClassKey classKey = (ClassKey) CACHE.get(fullyQualifiedClassName);
021            if (classKey == null) {
022                classKey = new ClassKey(fullyQualifiedClassName);
023            }
024            return classKey;
025        }
026    
027        private ClassKey(String fullyQualifiedClassName) {
028    
029            int dot = fullyQualifiedClassName.lastIndexOf('.');
030            this.packageName = (dot == -1)
031                    ? ""
032                    : fullyQualifiedClassName.substring(0, dot).intern();
033    
034            this.className = (dot == -1)
035                    ? fullyQualifiedClassName
036                    : fullyQualifiedClassName.substring(dot + 1);
037    
038            hashCode = packageName.hashCode();
039            hashCode = (29 * hashCode) + className.hashCode();
040        }
041    
042    
043        /**
044         * Gets the package's name in pieces.
045         */
046        public String[] getPackageNameParts() {
047            String[] result = new String[0];
048            if (packageName.length() != 0) {
049                StringTokenizer st = new StringTokenizer(packageName, ".");
050                List parts = new ArrayList();
051                while (st.hasMoreTokens()) {
052                    parts.add(st.nextToken());
053                }
054                result = (String[]) parts.toArray(new String[parts.size()]);
055            }
056            return result;
057        }
058    
059        public String getPackageName() {
060            return packageName;
061        }
062    
063        public final String getFullyQualifiedClassName() {
064            return (packageName.length() == 0)
065                    ? className
066                    : packageName + "." + className;
067        }
068    
069        public String getClassName() {
070            return className;
071        }
072    
073        public final boolean equals(Object o) {
074    
075            if (this == o) {
076                return true;
077            }
078    
079            if (!(o instanceof ClassKey)) {
080                return false;
081            }
082    
083            final ClassKey other = (ClassKey) o;
084    
085            if (!other.equals(other)) {
086                return false;
087            }
088    
089            if (!className.equals(other.className)) {
090                return false;
091            }
092    
093            if (!packageName.equals(other.packageName)) {
094                return false;
095            }
096    
097            return true;
098        }
099    
100        public int hashCode() {
101            return hashCode;
102        }
103    
104        public int compareTo(Object o) {
105            ClassKey other = (ClassKey) o;
106            int c = packageName.compareTo(other.packageName);
107            if (c == 0) {
108                c = className.compareTo(other.className);
109            }
110            return c;
111        }
112    
113    }