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 }